- // MIR for `wide_ptr_provenance` before GVN
+ // MIR for `wide_ptr_provenance` after GVN
  
  fn wide_ptr_provenance() -> () {
      let mut _0: ();
      let _1: *const dyn std::marker::Send;
      let mut _2: *const dyn std::marker::Send;
      let _3: &dyn std::marker::Send;
      let mut _4: &i32;
      let _5: &i32;
      let _6: i32;
      let mut _8: *const dyn std::marker::Send;
      let _9: &dyn std::marker::Send;
      let mut _10: &i32;
      let _11: &i32;
      let _12: i32;
      let _13: ();
      let mut _14: bool;
      let mut _15: *const dyn std::marker::Send;
      let mut _16: *const dyn std::marker::Send;
      let mut _17: *const dyn std::marker::Send;
      let _18: ();
      let mut _19: bool;
      let mut _20: *const dyn std::marker::Send;
      let mut _21: *const dyn std::marker::Send;
      let mut _22: *const dyn std::marker::Send;
      let _23: ();
      let mut _24: bool;
      let mut _25: *const dyn std::marker::Send;
      let mut _26: *const dyn std::marker::Send;
      let mut _27: *const dyn std::marker::Send;
      let _28: ();
      let mut _29: bool;
      let mut _30: *const dyn std::marker::Send;
      let mut _31: *const dyn std::marker::Send;
      let mut _32: *const dyn std::marker::Send;
      let _33: ();
      let mut _34: bool;
      let mut _35: *const dyn std::marker::Send;
      let mut _36: *const dyn std::marker::Send;
      let mut _37: *const dyn std::marker::Send;
      let _38: ();
      let mut _39: bool;
      let mut _40: *const dyn std::marker::Send;
      let mut _41: *const dyn std::marker::Send;
      let mut _42: *const dyn std::marker::Send;
      let mut _44: &i32;
      scope 1 {
          debug a => _1;
          let _7: *const dyn std::marker::Send;
          let mut _43: &i32;
          scope 2 {
              debug b => _7;
          }
      }
  
      bb0: {
          StorageLive(_1);
-         StorageLive(_2);
+         nop;
          StorageLive(_3);
          StorageLive(_4);
          StorageLive(_5);
          _44 = const wide_ptr_provenance::promoted[1];
          _5 = &(*_44);
          _4 = &(*_5);
          _3 = move _4 as &dyn std::marker::Send (PointerCoercion(Unsize, AsCast));
          StorageDead(_4);
          _2 = &raw const (*_3);
-         _1 = move _2 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
-         StorageDead(_2);
+         _1 = copy _2;
+         nop;
          StorageDead(_5);
          StorageDead(_3);
          StorageLive(_7);
-         StorageLive(_8);
+         nop;
          StorageLive(_9);
          StorageLive(_10);
          StorageLive(_11);
          _43 = const wide_ptr_provenance::promoted[0];
          _11 = &(*_43);
          _10 = &(*_11);
          _9 = move _10 as &dyn std::marker::Send (PointerCoercion(Unsize, AsCast));
          StorageDead(_10);
          _8 = &raw const (*_9);
-         _7 = move _8 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
-         StorageDead(_8);
+         _7 = copy _8;
+         nop;
          StorageDead(_11);
          StorageDead(_9);
          StorageLive(_13);
          StorageLive(_14);
          StorageLive(_15);
-         _15 = copy _1;
+         _15 = copy _2;
          StorageLive(_16);
          StorageLive(_17);
-         _17 = copy _7;
-         _16 = move _17 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _17 = copy _8;
+         _16 = copy _8;
          StorageDead(_17);
-         _14 = Eq(move _15, move _16);
+         _14 = Eq(copy _2, copy _8);
          StorageDead(_16);
          StorageDead(_15);
          _13 = opaque::<bool>(move _14) -> [return: bb1, unwind continue];
      }
  
      bb1: {
          StorageDead(_14);
          StorageDead(_13);
          StorageLive(_18);
          StorageLive(_19);
          StorageLive(_20);
-         _20 = copy _1;
+         _20 = copy _2;
          StorageLive(_21);
          StorageLive(_22);
-         _22 = copy _7;
-         _21 = move _22 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _22 = copy _8;
+         _21 = copy _8;
          StorageDead(_22);
-         _19 = Ne(move _20, move _21);
+         _19 = Ne(copy _2, copy _8);
          StorageDead(_21);
          StorageDead(_20);
          _18 = opaque::<bool>(move _19) -> [return: bb2, unwind continue];
      }
  
      bb2: {
          StorageDead(_19);
          StorageDead(_18);
          StorageLive(_23);
          StorageLive(_24);
          StorageLive(_25);
-         _25 = copy _1;
+         _25 = copy _2;
          StorageLive(_26);
          StorageLive(_27);
-         _27 = copy _7;
-         _26 = move _27 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _27 = copy _8;
+         _26 = copy _8;
          StorageDead(_27);
-         _24 = Lt(move _25, move _26);
+         _24 = Lt(copy _2, copy _8);
          StorageDead(_26);
          StorageDead(_25);
          _23 = opaque::<bool>(move _24) -> [return: bb3, unwind continue];
      }
  
      bb3: {
          StorageDead(_24);
          StorageDead(_23);
          StorageLive(_28);
          StorageLive(_29);
          StorageLive(_30);
-         _30 = copy _1;
+         _30 = copy _2;
          StorageLive(_31);
          StorageLive(_32);
-         _32 = copy _7;
-         _31 = move _32 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _32 = copy _8;
+         _31 = copy _8;
          StorageDead(_32);
-         _29 = Le(move _30, move _31);
+         _29 = Le(copy _2, copy _8);
          StorageDead(_31);
          StorageDead(_30);
          _28 = opaque::<bool>(move _29) -> [return: bb4, unwind continue];
      }
  
      bb4: {
          StorageDead(_29);
          StorageDead(_28);
          StorageLive(_33);
          StorageLive(_34);
          StorageLive(_35);
-         _35 = copy _1;
+         _35 = copy _2;
          StorageLive(_36);
          StorageLive(_37);
-         _37 = copy _7;
-         _36 = move _37 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _37 = copy _8;
+         _36 = copy _8;
          StorageDead(_37);
-         _34 = Gt(move _35, move _36);
+         _34 = Gt(copy _2, copy _8);
          StorageDead(_36);
          StorageDead(_35);
          _33 = opaque::<bool>(move _34) -> [return: bb5, unwind continue];
      }
  
      bb5: {
          StorageDead(_34);
          StorageDead(_33);
          StorageLive(_38);
          StorageLive(_39);
          StorageLive(_40);
-         _40 = copy _1;
+         _40 = copy _2;
          StorageLive(_41);
          StorageLive(_42);
-         _42 = copy _7;
-         _41 = move _42 as *const dyn std::marker::Send (PointerCoercion(Unsize, Implicit));
+         _42 = copy _8;
+         _41 = copy _8;
          StorageDead(_42);
-         _39 = Ge(move _40, move _41);
+         _39 = Ge(copy _2, copy _8);
          StorageDead(_41);
          StorageDead(_40);
          _38 = opaque::<bool>(move _39) -> [return: bb6, unwind continue];
      }
  
      bb6: {
          StorageDead(_39);
          StorageDead(_38);
          _0 = const ();
          StorageDead(_7);
          StorageDead(_1);
          return;
      }
  }
  
