- // 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: i32;
      let mut _3: std::ops::ControlFlow<std::result::Result<std::convert::Infallible, i32>, i32>;
      let mut _4: std::result::Result<i32, i32>;
      let mut _5: isize;
      let _6: std::result::Result<std::convert::Infallible, i32>;
      let mut _7: !;
      let mut _8: std::result::Result<std::convert::Infallible, i32>;
      let _9: i32;
      scope 1 {
          debug residual => _6;
          scope 2 {
              scope 8 (inlined #[track_caller] <Result<i32, i32> as FromResidual<Result<Infallible, i32>>>::from_residual) {
                  let _14: i32;
                  let mut _15: i32;
                  scope 9 {
                      scope 10 (inlined <i32 as From<i32>>::from) {
                      }
                  }
              }
          }
      }
      scope 3 {
          debug val => _9;
          scope 4 {
          }
      }
      scope 5 (inlined <Result<i32, i32> as Try>::branch) {
          let mut _10: isize;
          let _11: i32;
          let _12: i32;
          let mut _13: std::result::Result<std::convert::Infallible, i32>;
          scope 6 {
          }
          scope 7 {
          }
      }
  
      bb0: {
          StorageLive(_2);
          StorageLive(_3);
          StorageLive(_4);
          _4 = _1;
          StorageLive(_10);
          StorageLive(_11);
          StorageLive(_12);
          _10 = discriminant(_4);
          switchInt(move _10) -> [0: bb7, 1: bb6, otherwise: bb1];
      }
  
      bb1: {
          unreachable;
      }
  
      bb2: {
          StorageLive(_9);
          _9 = ((_3 as Continue).0: i32);
          _2 = _9;
          StorageDead(_9);
          _0 = Result::<i32, i32>::Ok(move _2);
          StorageDead(_2);
          StorageDead(_3);
          goto -> bb4;
      }
  
      bb3: {
          StorageLive(_6);
          _6 = ((_3 as Break).0: std::result::Result<std::convert::Infallible, i32>);
          StorageLive(_8);
          _8 = _6;
          StorageLive(_14);
          _14 = move ((_8 as Err).0: i32);
          StorageLive(_15);
          _15 = move _14;
          _0 = Result::<i32, i32>::Err(move _15);
          StorageDead(_15);
          StorageDead(_14);
          StorageDead(_8);
          StorageDead(_6);
          StorageDead(_2);
          StorageDead(_3);
          goto -> bb4;
      }
  
      bb4: {
          return;
      }
  
      bb5: {
          StorageDead(_12);
          StorageDead(_11);
          StorageDead(_10);
          StorageDead(_4);
          _5 = discriminant(_3);
-         switchInt(move _5) -> [0: bb2, 1: bb3, otherwise: bb1];
+         goto -> bb2;
      }
  
      bb6: {
          _12 = move ((_4 as Err).0: i32);
          StorageLive(_13);
          _13 = Result::<Infallible, i32>::Err(_12);
          _3 = ControlFlow::<Result<Infallible, i32>, i32>::Break(move _13);
          StorageDead(_13);
-         goto -> bb5;
+         goto -> bb8;
      }
  
      bb7: {
          _11 = move ((_4 as Ok).0: i32);
          _3 = ControlFlow::<Result<Infallible, i32>, i32>::Continue(_11);
          goto -> bb5;
+     }
+ 
+     bb8: {
+         StorageDead(_12);
+         StorageDead(_11);
+         StorageDead(_10);
+         StorageDead(_4);
+         _5 = discriminant(_3);
+         goto -> bb3;
      }
  }
  
