- // MIR for `identity` before JumpThreading
+ // MIR for `identity` after JumpThreading
  
  fn identity(_1: Result<i32, i32>) -> Result<i32, i32> {
      debug x => _1;
      let mut _0: std::result::Result<i32, i32>;
      let mut _2: std::ops::ControlFlow<std::result::Result<std::convert::Infallible, i32>, i32>;
      let mut _3: isize;
      let _4: std::result::Result<std::convert::Infallible, i32>;
      let _5: i32;
      scope 1 {
          debug residual => _4;
          scope 2 {
              scope 8 (inlined #[track_caller] <Result<i32, i32> as FromResidual<Result<Infallible, i32>>>::from_residual) {
                  let mut _10: isize;
                  let _11: i32;
                  let mut _12: bool;
                  scope 9 {
                      scope 10 (inlined <i32 as From<i32>>::from) {
                      }
                  }
              }
          }
      }
      scope 3 {
          debug val => _5;
          scope 4 {
          }
      }
      scope 5 (inlined <Result<i32, i32> as Try>::branch) {
          let mut _6: isize;
          let _7: i32;
          let _8: i32;
          let mut _9: std::result::Result<std::convert::Infallible, i32>;
          scope 6 {
          }
          scope 7 {
          }
      }
  
      bb0: {
          StorageLive(_2);
          StorageLive(_6);
          _6 = discriminant(_1);
          switchInt(move _6) -> [0: bb6, 1: bb5, otherwise: bb1];
      }
  
      bb1: {
          unreachable;
      }
  
      bb2: {
          _5 = copy ((_2 as Continue).0: i32);
          _0 = Result::<i32, i32>::Ok(copy _5);
          StorageDead(_2);
          return;
      }
  
      bb3: {
          StorageLive(_4);
          _4 = copy ((_2 as Break).0: std::result::Result<std::convert::Infallible, i32>);
          StorageLive(_10);
          StorageLive(_12);
          _10 = discriminant(_4);
          _12 = Eq(copy _10, const 1_isize);
          assume(move _12);
          StorageLive(_11);
          _11 = copy ((_4 as Err).0: i32);
          _0 = Result::<i32, i32>::Err(copy _11);
          StorageDead(_11);
          StorageDead(_12);
          StorageDead(_10);
          StorageDead(_4);
          StorageDead(_2);
          return;
      }
  
      bb4: {
          StorageDead(_6);
          _3 = discriminant(_2);
          switchInt(move _3) -> [0: bb2, 1: bb3, otherwise: bb1];
      }
  
      bb5: {
          StorageLive(_8);
          _8 = copy ((_1 as Err).0: i32);
          StorageLive(_9);
          _9 = Result::<Infallible, i32>::Err(copy _8);
          _2 = ControlFlow::<Result<Infallible, i32>, i32>::Break(move _9);
          StorageDead(_9);
          StorageDead(_8);
-         goto -> bb4;
+         goto -> bb7;
      }
  
      bb6: {
          StorageLive(_7);
          _7 = copy ((_1 as Ok).0: i32);
          _2 = ControlFlow::<Result<Infallible, i32>, i32>::Continue(copy _7);
          StorageDead(_7);
-         goto -> bb4;
+         goto -> bb8;
+     }
+ 
+     bb7: {
+         StorageDead(_6);
+         _3 = discriminant(_2);
+         goto -> bb3;
+     }
+ 
+     bb8: {
+         StorageDead(_6);
+         _3 = discriminant(_2);
+         goto -> bb2;
      }
  }
  
