@@ -315,3 +315,142 @@ three:
315
315
ret i32 99783
316
316
}
317
317
318
+ define i8 @pr67842 (i32 %0 ) {
319
+ ; CHECK-LABEL: @pr67842(
320
+ ; CHECK-NEXT: start:
321
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0:%.*]], 1
322
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 255
323
+ ; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = trunc i32 [[TMP2]] to i8
324
+ ; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i8 [[SWITCH_IDX_CAST]], -1
325
+ ; CHECK-NEXT: ret i8 [[SWITCH_OFFSET]]
326
+ ;
327
+ start:
328
+ switch i32 %0 , label %bb2 [
329
+ i32 0 , label %bb5
330
+ i32 1 , label %bb4
331
+ i32 255 , label %bb1
332
+ ]
333
+
334
+ bb2: ; preds = %start
335
+ unreachable
336
+
337
+ bb4: ; preds = %start
338
+ br label %bb5
339
+
340
+ bb1: ; preds = %start
341
+ br label %bb5
342
+
343
+ bb5: ; preds = %start, %bb1, %bb4
344
+ %.0 = phi i8 [ -1 , %bb1 ], [ 1 , %bb4 ], [ 0 , %start ]
345
+ ret i8 %.0
346
+ }
347
+
348
+ define i8 @reduce_masked_common_high_bits (i32 %0 ) {
349
+ ; CHECK-LABEL: @reduce_masked_common_high_bits(
350
+ ; CHECK-NEXT: start:
351
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0:%.*]], -127
352
+ ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 127
353
+ ; CHECK-NEXT: [[SWITCH_IDX_CAST:%.*]] = trunc i32 [[TMP2]] to i8
354
+ ; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i8 [[SWITCH_IDX_CAST]], -1
355
+ ; CHECK-NEXT: ret i8 [[SWITCH_OFFSET]]
356
+ ;
357
+ start:
358
+ switch i32 %0 , label %bb2 [
359
+ i32 128 , label %bb5
360
+ i32 129 , label %bb4
361
+ i32 255 , label %bb1
362
+ ]
363
+
364
+ bb2: ; preds = %start
365
+ unreachable
366
+
367
+ bb4: ; preds = %start
368
+ br label %bb5
369
+
370
+ bb1: ; preds = %start
371
+ br label %bb5
372
+
373
+ bb5: ; preds = %start, %bb1, %bb4
374
+ %.0 = phi i8 [ -1 , %bb1 ], [ 1 , %bb4 ], [ 0 , %start ]
375
+ ret i8 %.0
376
+ }
377
+
378
+ define i8 @reduce_masked_common_high_bits_fail (i32 %0 ) {
379
+ ; CHECK-LABEL: @reduce_masked_common_high_bits_fail(
380
+ ; CHECK-NEXT: start:
381
+ ; CHECK-NEXT: switch i32 [[TMP0:%.*]], label [[BB2:%.*]] [
382
+ ; CHECK-NEXT: i32 128, label [[BB5:%.*]]
383
+ ; CHECK-NEXT: i32 129, label [[BB4:%.*]]
384
+ ; CHECK-NEXT: i32 511, label [[BB1:%.*]]
385
+ ; CHECK-NEXT: ]
386
+ ; CHECK: bb2:
387
+ ; CHECK-NEXT: unreachable
388
+ ; CHECK: bb4:
389
+ ; CHECK-NEXT: br label [[BB5]]
390
+ ; CHECK: bb1:
391
+ ; CHECK-NEXT: br label [[BB5]]
392
+ ; CHECK: bb5:
393
+ ; CHECK-NEXT: [[DOT0:%.*]] = phi i8 [ -1, [[BB1]] ], [ 1, [[BB4]] ], [ 0, [[START:%.*]] ]
394
+ ; CHECK-NEXT: ret i8 [[DOT0]]
395
+ ;
396
+ start:
397
+ switch i32 %0 , label %bb2 [
398
+ i32 128 , label %bb5
399
+ i32 129 , label %bb4
400
+ i32 511 , label %bb1
401
+ ]
402
+
403
+ bb2: ; preds = %start
404
+ unreachable
405
+
406
+ bb4: ; preds = %start
407
+ br label %bb5
408
+
409
+ bb1: ; preds = %start
410
+ br label %bb5
411
+
412
+ bb5: ; preds = %start, %bb1, %bb4
413
+ %.0 = phi i8 [ -1 , %bb1 ], [ 1 , %bb4 ], [ 0 , %start ]
414
+ ret i8 %.0
415
+ }
416
+
417
+ ; Optimization shouldn't trigger; The default block is reachable.
418
+ define i8 @reduce_masked_default_reachable (i32 %0 ) {
419
+ ; CHECK-LABEL: @reduce_masked_default_reachable(
420
+ ; CHECK-NEXT: start:
421
+ ; CHECK-NEXT: switch i32 [[TMP0:%.*]], label [[COMMON_RET:%.*]] [
422
+ ; CHECK-NEXT: i32 0, label [[BB5:%.*]]
423
+ ; CHECK-NEXT: i32 1, label [[BB4:%.*]]
424
+ ; CHECK-NEXT: i32 255, label [[BB1:%.*]]
425
+ ; CHECK-NEXT: ]
426
+ ; CHECK: common.ret:
427
+ ; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i8 [ [[DOT0:%.*]], [[BB5]] ], [ 24, [[START:%.*]] ]
428
+ ; CHECK-NEXT: ret i8 [[COMMON_RET_OP]]
429
+ ; CHECK: bb4:
430
+ ; CHECK-NEXT: br label [[BB5]]
431
+ ; CHECK: bb1:
432
+ ; CHECK-NEXT: br label [[BB5]]
433
+ ; CHECK: bb5:
434
+ ; CHECK-NEXT: [[DOT0]] = phi i8 [ -1, [[BB1]] ], [ 1, [[BB4]] ], [ 0, [[START]] ]
435
+ ; CHECK-NEXT: br label [[COMMON_RET]]
436
+ ;
437
+ start:
438
+ switch i32 %0 , label %bb2 [
439
+ i32 0 , label %bb5
440
+ i32 1 , label %bb4
441
+ i32 255 , label %bb1
442
+ ]
443
+
444
+ bb2: ; preds = %start
445
+ ret i8 24
446
+
447
+ bb4: ; preds = %start
448
+ br label %bb5
449
+
450
+ bb1: ; preds = %start
451
+ br label %bb5
452
+
453
+ bb5: ; preds = %start, %bb1, %bb4
454
+ %.0 = phi i8 [ -1 , %bb1 ], [ 1 , %bb4 ], [ 0 , %start ]
455
+ ret i8 %.0
456
+ }
0 commit comments