@@ -115,6 +115,74 @@ fn opt7(x: Option<u32>, y: Option<u32>) -> u32 {
115
115
}
116
116
}
117
117
118
+ // EMIT_MIR early_otherwise_branch.opt8.EarlyOtherwiseBranch.diff
119
+ fn opt8 ( x : u32 , y : u64 ) -> u32 {
120
+ // CHECK-LABEL: fn opt8(
121
+ // CHECK: bb0: {
122
+ // CHECK: switchInt((_{{.*}}: u64)) -> [10: [[SWITCH_BB:bb.*]], otherwise: [[OTHERWISE:bb.*]]];
123
+ // CHECK-NEXT: }
124
+ // CHECK: [[SWITCH_BB]]:
125
+ // CHECK: switchInt((_{{.*}}: u32)) -> [1: bb{{.*}}, 2: bb{{.*}}, 3: bb{{.*}}, otherwise: [[OTHERWISE]]];
126
+ // CHECK-NEXT: }
127
+ match ( x, y) {
128
+ ( 1 , 10 ) => 4 ,
129
+ ( 2 , 10 ) => 5 ,
130
+ ( 3 , 10 ) => 6 ,
131
+ _ => 0 ,
132
+ }
133
+ }
134
+
135
+ #[ repr( u8 ) ]
136
+ enum E8 {
137
+ A ,
138
+ B ,
139
+ C ,
140
+ }
141
+
142
+ #[ repr( u16 ) ]
143
+ enum E16 {
144
+ A ,
145
+ B ,
146
+ C ,
147
+ }
148
+
149
+ // Can we add a cast instruction for transformation?
150
+ // EMIT_MIR early_otherwise_branch.opt9.EarlyOtherwiseBranch.diff
151
+ fn opt9 ( x : E8 , y : E16 ) -> u32 {
152
+ // CHECK-LABEL: fn opt9(
153
+ // CHECK: bb0: {
154
+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
155
+ // CHECK-NOT: discriminant
156
+ // CHECK: switchInt(move [[LOCAL1]]) -> [
157
+ // CHECK-NEXT: }
158
+ match ( x, y) {
159
+ ( E8 :: A , E16 :: A ) => 1 ,
160
+ ( E8 :: B , E16 :: B ) => 2 ,
161
+ ( E8 :: C , E16 :: C ) => 3 ,
162
+ _ => 0 ,
163
+ }
164
+ }
165
+
166
+ // Since the target values are the same, we can optimize.
167
+ // EMIT_MIR early_otherwise_branch.opt10.EarlyOtherwiseBranch.diff
168
+ fn opt10 ( x : E8 , y : E16 ) -> u32 {
169
+ // CHECK-LABEL: fn opt10(
170
+ // CHECK: bb0: {
171
+ // CHECK: [[LOCAL1:_.*]] = discriminant({{.*}});
172
+ // CHECK: [[LOCAL2:_.*]] = discriminant({{.*}});
173
+ // CHECK: switchInt(move [[LOCAL2]]) -> [0: [[SWITCH_BB:bb.*]], otherwise: [[OTHERWISE:bb.*]]];
174
+ // CHECK-NEXT: }
175
+ // CHECK: [[SWITCH_BB]]:
176
+ // CHECK: switchInt([[LOCAL1]]) -> [0: bb{{.*}}, 1: bb{{.*}}, 2: bb{{.*}}, otherwise: [[OTHERWISE]]];
177
+ // CHECK-NEXT: }
178
+ match ( x, y) {
179
+ ( E8 :: A , E16 :: A ) => 1 ,
180
+ ( E8 :: B , E16 :: A ) => 2 ,
181
+ ( E8 :: C , E16 :: A ) => 3 ,
182
+ _ => 0 ,
183
+ }
184
+ }
185
+
118
186
fn main ( ) {
119
187
opt1 ( None , Some ( 0 ) ) ;
120
188
opt2 ( None , Some ( 0 ) ) ;
@@ -123,4 +191,7 @@ fn main() {
123
191
opt5 ( 0 , 0 ) ;
124
192
opt6 ( 0 , 0 ) ;
125
193
opt7 ( None , Some ( 0 ) ) ;
194
+ opt8 ( 0 , 0 ) ;
195
+ opt9 ( E8 :: A , E16 :: A ) ;
196
+ opt10 ( E8 :: A , E16 :: A ) ;
126
197
}
0 commit comments