@@ -315,3 +315,142 @@ three:
315315  ret  i32  99783 
316316}
317317
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