// MIR for `match_tuple` after SimplifyCfg-initial

fn match_tuple(_1: (u32, bool, std::option::Option<i32>, u32)) -> u32 {
    debug x => _1;                       // in scope 0 at $DIR/exponential-or.rs:6:16: 6:17
    let mut _0: u32;                     // return place in scope 0 at $DIR/exponential-or.rs:6:53: 6:56
    let mut _2: isize;                   // in scope 0 at $DIR/exponential-or.rs:8:37: 8:48
    let mut _3: bool;                    // in scope 0 at $DIR/exponential-or.rs:8:70: 8:77
    let mut _4: bool;                    // in scope 0 at $DIR/exponential-or.rs:8:70: 8:77
    let mut _5: bool;                    // in scope 0 at $DIR/exponential-or.rs:8:62: 8:67
    let mut _6: bool;                    // in scope 0 at $DIR/exponential-or.rs:8:62: 8:67
    let _7: u32;                         // in scope 0 at $DIR/exponential-or.rs:8:10: 8:21
    let _8: u32;                         // in scope 0 at $DIR/exponential-or.rs:8:57: 8:78
    let mut _9: u32;                     // in scope 0 at $DIR/exponential-or.rs:8:83: 8:84
    let mut _10: u32;                    // in scope 0 at $DIR/exponential-or.rs:8:87: 8:88
    scope 1 {
        debug y => _7;                   // in scope 1 at $DIR/exponential-or.rs:8:10: 8:21
        debug z => _8;                   // in scope 1 at $DIR/exponential-or.rs:8:57: 8:78
    }

    bb0: {
        FakeRead(ForMatchedPlace, _1);   // scope 0 at $DIR/exponential-or.rs:7:11: 7:12
        switchInt((_1.0: u32)) -> [1_u32: bb2, 4_u32: bb2, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:15: 8:16
    }

    bb1: {
        _0 = const 0_u32;                // scope 0 at $DIR/exponential-or.rs:9:14: 9:15
                                         // ty::Const
                                         // + ty: u32
                                         // + val: Value(Scalar(0x00000000))
                                         // mir::Constant
                                         // + span: $DIR/exponential-or.rs:9:14: 9:15
                                         // + literal: Const { ty: u32, val: Value(Scalar(0x00000000)) }
        goto -> bb10;                    // scope 0 at $DIR/exponential-or.rs:7:5: 10:6
    }

    bb2: {
        _2 = discriminant((_1.2: std::option::Option<i32>)); // scope 0 at $DIR/exponential-or.rs:8:37: 8:48
        switchInt(move _2) -> [0_isize: bb4, 1_isize: bb3, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:37: 8:48
    }

    bb3: {
        switchInt((((_1.2: std::option::Option<i32>) as Some).0: i32)) -> [1_i32: bb4, 8_i32: bb4, otherwise: bb1]; // scope 0 at $DIR/exponential-or.rs:8:42: 8:43
    }

    bb4: {
        _5 = Le(const 6_u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67
                                         // ty::Const
                                         // + ty: u32
                                         // + val: Value(Scalar(0x00000006))
                                         // mir::Constant
                                         // + span: $DIR/exponential-or.rs:8:62: 8:67
                                         // + literal: Const { ty: u32, val: Value(Scalar(0x00000006)) }
        switchInt(move _5) -> [false: bb6, otherwise: bb5]; // scope 0 at $DIR/exponential-or.rs:8:62: 8:67
    }

    bb5: {
        _6 = Le((_1.3: u32), const 9_u32); // scope 0 at $DIR/exponential-or.rs:8:62: 8:67
                                         // ty::Const
                                         // + ty: u32
                                         // + val: Value(Scalar(0x00000009))
                                         // mir::Constant
                                         // + span: $DIR/exponential-or.rs:8:62: 8:67
                                         // + literal: Const { ty: u32, val: Value(Scalar(0x00000009)) }
        switchInt(move _6) -> [false: bb6, otherwise: bb8]; // scope 0 at $DIR/exponential-or.rs:8:62: 8:67
    }

    bb6: {
        _3 = Le(const 13_u32, (_1.3: u32)); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77
                                         // ty::Const
                                         // + ty: u32
                                         // + val: Value(Scalar(0x0000000d))
                                         // mir::Constant
                                         // + span: $DIR/exponential-or.rs:8:70: 8:77
                                         // + literal: Const { ty: u32, val: Value(Scalar(0x0000000d)) }
        switchInt(move _3) -> [false: bb1, otherwise: bb7]; // scope 0 at $DIR/exponential-or.rs:8:70: 8:77
    }

    bb7: {
        _4 = Le((_1.3: u32), const 16_u32); // scope 0 at $DIR/exponential-or.rs:8:70: 8:77
                                         // ty::Const
                                         // + ty: u32
                                         // + val: Value(Scalar(0x00000010))
                                         // mir::Constant
                                         // + span: $DIR/exponential-or.rs:8:70: 8:77
                                         // + literal: Const { ty: u32, val: Value(Scalar(0x00000010)) }
        switchInt(move _4) -> [false: bb1, otherwise: bb8]; // scope 0 at $DIR/exponential-or.rs:8:70: 8:77
    }

    bb8: {
        falseEdge -> [real: bb9, imaginary: bb1]; // scope 0 at $DIR/exponential-or.rs:8:9: 8:79
    }

    bb9: {
        StorageLive(_7);                 // scope 0 at $DIR/exponential-or.rs:8:10: 8:21
        _7 = (_1.0: u32);                // scope 0 at $DIR/exponential-or.rs:8:10: 8:21
        StorageLive(_8);                 // scope 0 at $DIR/exponential-or.rs:8:57: 8:78
        _8 = (_1.3: u32);                // scope 0 at $DIR/exponential-or.rs:8:57: 8:78
        StorageLive(_9);                 // scope 1 at $DIR/exponential-or.rs:8:83: 8:84
        _9 = _7;                         // scope 1 at $DIR/exponential-or.rs:8:83: 8:84
        StorageLive(_10);                // scope 1 at $DIR/exponential-or.rs:8:87: 8:88
        _10 = _8;                        // scope 1 at $DIR/exponential-or.rs:8:87: 8:88
        _0 = BitXor(move _9, move _10);  // scope 1 at $DIR/exponential-or.rs:8:83: 8:88
        StorageDead(_10);                // scope 1 at $DIR/exponential-or.rs:8:87: 8:88
        StorageDead(_9);                 // scope 1 at $DIR/exponential-or.rs:8:87: 8:88
        StorageDead(_8);                 // scope 0 at $DIR/exponential-or.rs:8:87: 8:88
        StorageDead(_7);                 // scope 0 at $DIR/exponential-or.rs:8:87: 8:88
        goto -> bb10;                    // scope 0 at $DIR/exponential-or.rs:7:5: 10:6
    }

    bb10: {
        return;                          // scope 0 at $DIR/exponential-or.rs:11:2: 11:2
    }
}
