@@ -1558,11 +1558,7 @@ impl<'a, 'tcx> ShallowResolver<'a, 'tcx> {
1558
1558
ShallowResolver { infcx }
1559
1559
}
1560
1560
1561
- // We have this force-inlined variant of `shallow_resolve` for the one
1562
- // callsite that is extremely hot. All other callsites use the normal
1563
- // variant.
1564
- #[ inline( always) ]
1565
- pub fn inlined_shallow_resolve ( & mut self , typ : Ty < ' tcx > ) -> Ty < ' tcx > {
1561
+ pub fn shallow_resolve ( & mut self , typ : Ty < ' tcx > ) -> Ty < ' tcx > {
1566
1562
match typ. sty {
1567
1563
ty:: Infer ( ty:: TyVar ( v) ) => {
1568
1564
// Not entirely obvious: if `typ` is a type variable,
@@ -1597,6 +1593,42 @@ impl<'a, 'tcx> ShallowResolver<'a, 'tcx> {
1597
1593
_ => typ,
1598
1594
}
1599
1595
}
1596
+
1597
+ // `resolver.shallow_resolve_changed(ty)` is equivalent to
1598
+ // `resolver.shallow_resolve(ty) != ty`, but more efficient. It's always
1599
+ // inlined, despite being large, because it has a single call site that is
1600
+ // extremely hot.
1601
+ #[ inline( always) ]
1602
+ pub fn shallow_resolve_changed ( & mut self , typ : Ty < ' tcx > ) -> bool {
1603
+ match typ. sty {
1604
+ ty:: Infer ( ty:: TyVar ( v) ) => {
1605
+ use self :: type_variable:: TypeVariableValue ;
1606
+
1607
+ // See the comment in `shallow_resolve()`.
1608
+ match self . infcx . type_variables . borrow_mut ( ) . probe ( v) {
1609
+ TypeVariableValue :: Known { value : t } => self . fold_ty ( t) != typ,
1610
+ TypeVariableValue :: Unknown { .. } => false ,
1611
+ }
1612
+ }
1613
+
1614
+ ty:: Infer ( ty:: IntVar ( v) ) => {
1615
+ match self . infcx . int_unification_table . borrow_mut ( ) . probe_value ( v) {
1616
+ Some ( v) => v. to_type ( self . infcx . tcx ) != typ,
1617
+ None => false ,
1618
+ }
1619
+ }
1620
+
1621
+ ty:: Infer ( ty:: FloatVar ( v) ) => {
1622
+ match self . infcx . float_unification_table . borrow_mut ( ) . probe_value ( v) {
1623
+ Some ( v) => v. to_type ( self . infcx . tcx ) != typ,
1624
+ None => false ,
1625
+ }
1626
+ }
1627
+
1628
+ _ => false ,
1629
+ }
1630
+ }
1631
+
1600
1632
}
1601
1633
1602
1634
impl < ' a , ' tcx > TypeFolder < ' tcx > for ShallowResolver < ' a , ' tcx > {
@@ -1605,7 +1637,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for ShallowResolver<'a, 'tcx> {
1605
1637
}
1606
1638
1607
1639
fn fold_ty ( & mut self , ty : Ty < ' tcx > ) -> Ty < ' tcx > {
1608
- self . inlined_shallow_resolve ( ty)
1640
+ self . shallow_resolve ( ty)
1609
1641
}
1610
1642
1611
1643
fn fold_const ( & mut self , ct : & ' tcx ty:: Const < ' tcx > ) -> & ' tcx ty:: Const < ' tcx > {
0 commit comments