1
- // skip-filecheck
2
1
//@ unit-test: EarlyOtherwiseBranch
3
2
//@ compile-flags: -Zmir-enable-passes=+UnreachableEnumBranching
4
3
@@ -11,6 +10,13 @@ enum Option2<T> {
11
10
// We can't optimize it because y may be an invalid value.
12
11
// EMIT_MIR early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff
13
12
fn 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: }
14
20
match ( x, y) {
15
21
( Some ( a) , Some ( b) ) => 0 ,
16
22
_ => 1 ,
@@ -21,6 +27,13 @@ fn opt1(x: Option<u32>, y: Option<u32>) -> u32 {
21
27
// otherwise is unreachable. We can consume the UB fact to transform back to if else pattern.
22
28
// EMIT_MIR early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff
23
29
fn 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: }
24
37
match ( x, y) {
25
38
( Some ( a) , Some ( b) ) => 0 ,
26
39
( None , None ) => 2 ,
@@ -31,6 +44,14 @@ fn opt2(x: Option<u32>, y: Option<u32>) -> u32 {
31
44
// optimize despite different types
32
45
// EMIT_MIR early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff
33
46
fn 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: }
34
55
match ( x, y) {
35
56
( Option2 :: Some ( a) , Option2 :: Some ( b) ) => 0 ,
36
57
( Option2 :: None , Option2 :: None ) => 2 ,
@@ -41,6 +62,14 @@ fn opt3(x: Option2<u32>, y: Option2<bool>) -> u32 {
41
62
42
63
// EMIT_MIR early_otherwise_branch.opt4.EarlyOtherwiseBranch.diff
43
64
fn 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: }
44
73
match ( x, y) {
45
74
( Option2 :: Some ( a) , Option2 :: Some ( b) ) => 0 ,
46
75
( Option2 :: None , Option2 :: None ) => 2 ,
0 commit comments