1- // skip-filecheck
21//@ unit-test: EarlyOtherwiseBranch
32//@ compile-flags: -Zmir-enable-passes=+UnreachableEnumBranching
43
@@ -11,6 +10,13 @@ enum Option2<T> {
1110// We can't optimize it because y may be an invalid value.
1211// EMIT_MIR early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff
1312fn opt1 ( x : Option < u32 > , y : Option < u32 > ) -> u32 {
13+ // CHECK-LABEL: fn opt1(
14+ // CHECK: bb0: {
15+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
16+ // CHECK-NOT: Ne
17+ // CHECK-NOT: discriminant
18+ // CHECK: switchInt(move [[LOCAL1]]) -> [
19+ // CHECK-NEXT: }
1420 match ( x, y) {
1521 ( Some ( a) , Some ( b) ) => 0 ,
1622 _ => 1 ,
@@ -21,6 +27,13 @@ fn opt1(x: Option<u32>, y: Option<u32>) -> u32 {
2127// otherwise is unreachable. We can consume the UB fact to transform back to if else pattern.
2228// EMIT_MIR early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff
2329fn opt2 ( x : Option < u32 > , y : Option < u32 > ) -> u32 {
30+ // CHECK-LABEL: fn opt2(
31+ // CHECK: bb0: {
32+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
33+ // CHECK-NOT: Ne
34+ // CHECK-NOT: discriminant
35+ // CHECK: switchInt(move [[LOCAL1]]) -> [
36+ // CHECK-NEXT: }
2437 match ( x, y) {
2538 ( Some ( a) , Some ( b) ) => 0 ,
2639 ( None , None ) => 2 ,
@@ -31,6 +44,14 @@ fn opt2(x: Option<u32>, y: Option<u32>) -> u32 {
3144// optimize despite different types
3245// EMIT_MIR early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff
3346fn opt3 ( x : Option2 < u32 > , y : Option2 < bool > ) -> u32 {
47+ // CHECK-LABEL: fn opt3(
48+ // CHECK: let mut [[CMP_LOCAL:_.*]]: bool;
49+ // CHECK: bb0: {
50+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
51+ // CHECK: [[LOCAL2:_.*]] = discriminant({{.*}});
52+ // CHECK: [[CMP_LOCAL]] = Ne([[LOCAL1]], move [[LOCAL2]]);
53+ // CHECK: switchInt(move [[CMP_LOCAL]]) -> [
54+ // CHECK-NEXT: }
3455 match ( x, y) {
3556 ( Option2 :: Some ( a) , Option2 :: Some ( b) ) => 0 ,
3657 ( Option2 :: None , Option2 :: None ) => 2 ,
@@ -41,6 +62,14 @@ fn opt3(x: Option2<u32>, y: Option2<bool>) -> u32 {
4162
4263// EMIT_MIR early_otherwise_branch.opt4.EarlyOtherwiseBranch.diff
4364fn opt4 ( x : Option2 < u32 > , y : Option2 < u32 > ) -> u32 {
65+ // CHECK-LABEL: fn opt4(
66+ // CHECK: let mut [[CMP_LOCAL:_.*]]: bool;
67+ // CHECK: bb0: {
68+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
69+ // CHECK: [[LOCAL2:_.*]] = discriminant({{.*}});
70+ // CHECK: [[CMP_LOCAL]] = Ne([[LOCAL1]], move [[LOCAL2]]);
71+ // CHECK: switchInt(move [[CMP_LOCAL]]) -> [
72+ // CHECK-NEXT: }
4473 match ( x, y) {
4574 ( Option2 :: Some ( a) , Option2 :: Some ( b) ) => 0 ,
4675 ( Option2 :: None , Option2 :: None ) => 2 ,
0 commit comments