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