@@ -115,6 +115,74 @@ fn opt7(x: Option<u32>, y: Option<u32>) -> u32 {
115115 }
116116}
117117
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+
118186fn main ( ) {
119187 opt1 ( None , Some ( 0 ) ) ;
120188 opt2 ( None , Some ( 0 ) ) ;
@@ -123,4 +191,7 @@ fn main() {
123191 opt5 ( 0 , 0 ) ;
124192 opt6 ( 0 , 0 ) ;
125193 opt7 ( None , Some ( 0 ) ) ;
194+ opt8 ( 0 , 0 ) ;
195+ opt9 ( E8 :: A , E16 :: A ) ;
196+ opt10 ( E8 :: A , E16 :: A ) ;
126197}
0 commit comments