@@ -278,6 +278,117 @@ next:
278
278
ret void
279
279
}
280
280
281
+ define void @switch_nonzero_zext (i8 %s ) {
282
+ ; CHECK-LABEL: @switch_nonzero_zext(
283
+ ; CHECK-NEXT: entry:
284
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[S:%.*]], 0
285
+ ; CHECK-NEXT: br i1 [[CMP]], label [[SWITCH:%.*]], label [[EXIT:%.*]]
286
+ ; CHECK: switch:
287
+ ; CHECK-NEXT: [[S_EXT:%.*]] = zext i8 [[S]] to i32
288
+ ; CHECK-NEXT: switch i32 [[S_EXT]], label [[EXIT]] [
289
+ ; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
290
+ ; CHECK-NEXT: i32 1, label [[EXIT]]
291
+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
292
+ ; CHECK-NEXT: ]
293
+ ; CHECK: exit:
294
+ ; CHECK-NEXT: ret void
295
+ ; CHECK: unreachable:
296
+ ; CHECK-NEXT: ret void
297
+ ;
298
+ entry:
299
+ %cmp = icmp ne i8 %s , 0
300
+ br i1 %cmp , label %switch , label %exit
301
+
302
+ switch:
303
+ %s.ext = zext i8 %s to i32
304
+ switch i32 %s.ext , label %exit [
305
+ i32 0 , label %unreachable
306
+ i32 1 , label %exit
307
+ i32 -1 , label %exit
308
+ ]
309
+
310
+ exit:
311
+ ret void
312
+
313
+ unreachable:
314
+ ret void
315
+ }
316
+
317
+ define void @switch_assume_nonzero (i32 %s ) {
318
+ ; CHECK-LABEL: @switch_assume_nonzero(
319
+ ; CHECK-NEXT: entry:
320
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[S:%.*]], 0
321
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
322
+ ; CHECK-NEXT: switch i32 [[S]], label [[EXIT:%.*]] [
323
+ ; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
324
+ ; CHECK-NEXT: i32 1, label [[EXIT]]
325
+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
326
+ ; CHECK-NEXT: ]
327
+ ; CHECK: exit:
328
+ ; CHECK-NEXT: ret void
329
+ ; CHECK: unreachable:
330
+ ; CHECK-NEXT: ret void
331
+ ;
332
+ entry:
333
+ %cmp = icmp ne i32 %s , 0
334
+ call void @llvm.assume (i1 %cmp )
335
+ switch i32 %s , label %exit [
336
+ i32 0 , label %unreachable
337
+ i32 1 , label %exit
338
+ i32 -1 , label %exit
339
+ ]
340
+
341
+ exit:
342
+ ret void
343
+
344
+ unreachable:
345
+ ret void
346
+ }
347
+
348
+ define void @switch_nonzero_phi (i1 %cond ) {
349
+ ; CHECK-LABEL: @switch_nonzero_phi(
350
+ ; CHECK-NEXT: entry:
351
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
352
+ ; CHECK: if:
353
+ ; CHECK-NEXT: br label [[SWITCH:%.*]]
354
+ ; CHECK: else:
355
+ ; CHECK-NEXT: br label [[SWITCH]]
356
+ ; CHECK: switch:
357
+ ; CHECK-NEXT: [[S:%.*]] = phi i32 [ 1, [[IF]] ], [ -1, [[ELSE]] ]
358
+ ; CHECK-NEXT: switch i32 [[S]], label [[EXIT:%.*]] [
359
+ ; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
360
+ ; CHECK-NEXT: i32 1, label [[EXIT]]
361
+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
362
+ ; CHECK-NEXT: ]
363
+ ; CHECK: exit:
364
+ ; CHECK-NEXT: ret void
365
+ ; CHECK: unreachable:
366
+ ; CHECK-NEXT: ret void
367
+ ;
368
+ entry:
369
+ br i1 %cond , label %if , label %else
370
+
371
+ if:
372
+ br label %switch
373
+
374
+ else:
375
+ br label %switch
376
+
377
+ switch:
378
+ %s = phi i32 [ 1 , %if ], [ -1 , %else ]
379
+ switch i32 %s , label %exit [
380
+ i32 0 , label %unreachable
381
+ i32 1 , label %exit
382
+ i32 -1 , label %exit
383
+ ]
384
+
385
+ exit:
386
+ ret void
387
+
388
+ unreachable:
389
+ ret void
390
+ }
391
+
281
392
define i1 @arg_attribute (i8* nonnull %a ) {
282
393
; CHECK-LABEL: @arg_attribute(
283
394
; CHECK-NEXT: ret i1 false
@@ -966,3 +1077,4 @@ declare i32 @llvm.uadd.sat.i32(i32, i32)
966
1077
declare i32 @llvm.usub.sat.i32 (i32 , i32 )
967
1078
declare i32 @llvm.sadd.sat.i32 (i32 , i32 )
968
1079
declare i32 @llvm.ssub.sat.i32 (i32 , i32 )
1080
+ declare void @llvm.assume (i1 )
0 commit comments