anchor.diff:              // The compiler optimizer is aware of this function  (see use of generic_equality_withc_inner_vref in opt.fs)
               // and devirtualizes calls to it based on "T", and under the assumption that "comp" 
               // is either fsEqualityComparerNoHashingER or fsEqualityComparerNoHashingPER.
  +            //
  +            // <<manofstick>> I think the above compiler optimization is misplaced, as it means that you can end
  +            // up with differing functionality of generic and non-generic types when the IStructuralEquatable
  +            // this is doucmented here- https://github.com/Microsoft/visualfsharp/pull/513#issuecomment-117995410
               let GenericEqualityWithComparerIntrinsic (comp : System.Collections.IEqualityComparer) (x : 'T) (y : 'T) : bool =
  -                GenericSpecializeEqualsWithRelation<UnknownEquivalenceRelation,_>.Func.Invoke (comp, x, y)
  -                
  +                match comp with
  +                | c when obj.ReferenceEquals (c, fsEqualityComparerNoHashingER)  -> GenericEqualityERIntrinsic x y
  +                | c when obj.ReferenceEquals (c, fsEqualityComparerNoHashingPER) -> GenericEqualityIntrinsic   x y
  +                | c when obj.ReferenceEquals (c, EqualityComparer<'T>.Default)   -> EqualityComparer<'T>.Default.Equals (x, y)
  +                | _ -> comp.Equals (box x, box y)
   
               /// Implements generic equality between two values, with ER semantics for NaN (so equality on two NaN values returns true)
               //
  
positive.code: 
              type private EquivalenceRelation = class end
              type private PartialEquivalenceRelation = class end
              type private UnknownEquivalenceRelation = class end
  
              type GenericSpecializeEquals_Pass1<'a>() =
                  static let generalize (func:Func<IEqualityComparer,'aa,'aa,bool>) =
  
negative.code:                         | _ -> raise (Exception "invalid logic")                    
                      | f -> f
                              
                  static member Func = pass3
  
              /// Implements generic equality between two values, with PER semantics for NaN (so equality on two NaN values returns false)
              //
  