- // MIR for `bar` before MatchBranchSimplification
+ // MIR for `bar` after MatchBranchSimplification
  
  fn bar(_1: i32) -> (bool, bool, bool, bool) {
      debug i => _1;                       // in scope 0 at $DIR/matches_reduce_branches.rs:13:8: 13:9
      let mut _0: (bool, bool, bool, bool); // return place in scope 0 at $DIR/matches_reduce_branches.rs:13:19: 13:43
      let _2: bool;                        // in scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10
      let _6: ();                          // in scope 0 at $DIR/matches_reduce_branches.rs:19:5: 34:6
      let mut _7: bool;                    // in scope 0 at $DIR/matches_reduce_branches.rs:36:6: 36:7
      let mut _8: bool;                    // in scope 0 at $DIR/matches_reduce_branches.rs:36:9: 36:10
      let mut _9: bool;                    // in scope 0 at $DIR/matches_reduce_branches.rs:36:12: 36:13
      let mut _10: bool;                   // in scope 0 at $DIR/matches_reduce_branches.rs:36:15: 36:16
+     let mut _11: i32;                    // in scope 0 at $DIR/matches_reduce_branches.rs:20:9: 20:10
      scope 1 {
          debug a => _2;                   // in scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10
          let _3: bool;                    // in scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10
          scope 2 {
              debug b => _3;               // in scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10
              let _4: bool;                // in scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10
              scope 3 {
                  debug c => _4;           // in scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10
                  let _5: bool;            // in scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10
                  scope 4 {
                      debug d => _5;       // in scope 4 at $DIR/matches_reduce_branches.rs:17:9: 17:10
                  }
              }
          }
      }
  
      bb0: {
          StorageLive(_2);                 // scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10
          StorageLive(_3);                 // scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10
          StorageLive(_4);                 // scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10
          StorageLive(_5);                 // scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10
          StorageLive(_6);                 // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6
-         switchInt(_1) -> [7_i32: bb2, otherwise: bb1]; // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10
-     }
- 
-     bb1: {
-         _2 = const true;                 // scope 4 at $DIR/matches_reduce_branches.rs:28:13: 28:21
-         _3 = const false;                // scope 4 at $DIR/matches_reduce_branches.rs:29:13: 29:22
-         _4 = const false;                // scope 4 at $DIR/matches_reduce_branches.rs:30:13: 30:22
-         _5 = const true;                 // scope 4 at $DIR/matches_reduce_branches.rs:31:13: 31:21
-         goto -> bb3;                     // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6
-     }
- 
-     bb2: {
-         _2 = const false;                // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22
-         _3 = const true;                 // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21
+         StorageLive(_11);                // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10
+         _11 = _1;                        // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10
+         _2 = Ne(_11, const 7_i32);       // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22
+         _3 = Eq(_11, const 7_i32);       // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21
          _4 = const false;                // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:22
          _5 = const true;                 // scope 4 at $DIR/matches_reduce_branches.rs:24:13: 24:21
-         goto -> bb3;                     // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6
-     }
- 
-     bb3: {
+         StorageDead(_11);                // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10
          StorageDead(_6);                 // scope 4 at $DIR/matches_reduce_branches.rs:34:6: 34:7
          StorageLive(_7);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7
          _7 = _2;                         // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7
          StorageLive(_8);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10
          _8 = _3;                         // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10
          StorageLive(_9);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13
          _9 = _4;                         // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13
          StorageLive(_10);                // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16
          _10 = _5;                        // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16
          (_0.0: bool) = move _7;          // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17
          (_0.1: bool) = move _8;          // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17
          (_0.2: bool) = move _9;          // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17
          (_0.3: bool) = move _10;         // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17
          StorageDead(_10);                // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17
          StorageDead(_9);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17
          StorageDead(_8);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17
          StorageDead(_7);                 // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17
          StorageDead(_5);                 // scope 3 at $DIR/matches_reduce_branches.rs:37:1: 37:2
          StorageDead(_4);                 // scope 2 at $DIR/matches_reduce_branches.rs:37:1: 37:2
          StorageDead(_3);                 // scope 1 at $DIR/matches_reduce_branches.rs:37:1: 37:2
          StorageDead(_2);                 // scope 0 at $DIR/matches_reduce_branches.rs:37:1: 37:2
          return;                          // scope 0 at $DIR/matches_reduce_branches.rs:37:2: 37:2
      }
  }
  
