1
- // skip-filecheck
2
1
//@ unit-test: EarlyOtherwiseBranch
3
2
//@ compile-flags: -Zmir-enable-passes=+UninhabitedEnumBranching
4
3
5
4
// We can't optimize it because y may be an invalid value.
6
5
// EMIT_MIR early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff
7
6
fn opt1 ( x : Option < u32 > , y : Option < u32 > ) -> u32 {
7
+ // CHECK-LABEL: fn opt1(
8
+ // CHECK: bb0: {
9
+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
10
+ // CHECK-NOT: Ne
11
+ // CHECK-NOT: discriminant
12
+ // CHECK: switchInt(move [[LOCAL1]]) -> [
13
+ // CHECK-NEXT: }
8
14
match ( x, y) {
9
15
( Some ( a) , Some ( b) ) => 0 ,
10
16
_ => 1 ,
@@ -13,6 +19,14 @@ fn opt1(x: Option<u32>, y: Option<u32>) -> u32 {
13
19
14
20
// EMIT_MIR early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff
15
21
fn opt2 ( x : Option < u32 > , y : Option < u32 > ) -> u32 {
22
+ // CHECK-LABEL: fn opt2(
23
+ // CHECK: let mut [[CMP_LOCAL:_.*]]: bool;
24
+ // CHECK: bb0: {
25
+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
26
+ // CHECK: [[LOCAL2:_.*]] = discriminant({{.*}});
27
+ // CHECK: [[CMP_LOCAL]] = Ne([[LOCAL1]], move [[LOCAL2]]);
28
+ // CHECK: switchInt(move [[CMP_LOCAL]]) -> [
29
+ // CHECK-NEXT: }
16
30
match ( x, y) {
17
31
( Some ( a) , Some ( b) ) => 0 ,
18
32
( None , None ) => 2 ,
@@ -23,6 +37,14 @@ fn opt2(x: Option<u32>, y: Option<u32>) -> u32 {
23
37
// optimize despite different types
24
38
// EMIT_MIR early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff
25
39
fn opt3 ( x : Option < u32 > , y : Option < bool > ) -> u32 {
40
+ // CHECK-LABEL: fn opt3(
41
+ // CHECK: let mut [[CMP_LOCAL:_.*]]: bool;
42
+ // CHECK: bb0: {
43
+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
44
+ // CHECK: [[LOCAL2:_.*]] = discriminant({{.*}});
45
+ // CHECK: [[CMP_LOCAL]] = Ne([[LOCAL1]], move [[LOCAL2]]);
46
+ // CHECK: switchInt(move [[CMP_LOCAL]]) -> [
47
+ // CHECK-NEXT: }
26
48
match ( x, y) {
27
49
( Some ( a) , Some ( b) ) => 0 ,
28
50
( None , None ) => 2 ,
0 commit comments