Skip to content

Commit ed43207

Browse files
authored
[SimplifyCFG] Handle trunc condition in foldBranchToCommonDest. (llvm#135490)
proof: https://alive2.llvm.org/ce/z/v32Aof
1 parent 0f607f3 commit ed43207

File tree

4 files changed

+11
-16
lines changed

4 files changed

+11
-16
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4087,9 +4087,7 @@ bool llvm::foldBranchToCommonDest(BranchInst *BI, DomTreeUpdater *DTU,
40874087

40884088
Instruction *Cond = dyn_cast<Instruction>(BI->getCondition());
40894089

4090-
if (!Cond ||
4091-
(!isa<CmpInst>(Cond) && !isa<BinaryOperator>(Cond) &&
4092-
!isa<SelectInst>(Cond)) ||
4090+
if (!Cond || !isa<CmpInst, BinaryOperator, SelectInst, TruncInst>(Cond) ||
40934091
Cond->getParent() != BB || !Cond->hasOneUse())
40944092
return false;
40954093

llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,15 +1028,14 @@ define i32 @nodefaultwithholes(i32 %c) {
10281028
; CHECK-LABEL: @nodefaultwithholes(
10291029
; CHECK-NEXT: entry:
10301030
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[C:%.*]], 6
1031-
; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_HOLE_CHECK:%.*]], label [[SW_DEFAULT:%.*]]
1032-
; CHECK: sw.default:
1033-
; CHECK-NEXT: call void @exit(i32 1)
1034-
; CHECK-NEXT: unreachable
1035-
; CHECK: switch.hole_check:
10361031
; CHECK-NEXT: [[SWITCH_MASKINDEX:%.*]] = trunc i32 [[C]] to i8
10371032
; CHECK-NEXT: [[SWITCH_SHIFTED:%.*]] = lshr i8 47, [[SWITCH_MASKINDEX]]
10381033
; CHECK-NEXT: [[SWITCH_LOBIT:%.*]] = trunc i8 [[SWITCH_SHIFTED]] to i1
1039-
; CHECK-NEXT: br i1 [[SWITCH_LOBIT]], label [[SWITCH_LOOKUP:%.*]], label [[SW_DEFAULT]]
1034+
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_LOBIT]], i1 false
1035+
; CHECK-NEXT: br i1 [[OR_COND]], label [[SWITCH_LOOKUP:%.*]], label [[SW_DEFAULT:%.*]]
1036+
; CHECK: sw.default:
1037+
; CHECK-NEXT: call void @exit(i32 1)
1038+
; CHECK-NEXT: unreachable
10401039
; CHECK: switch.lookup:
10411040
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [6 x i32], ptr @switch.table.nodefaultwithholes, i32 0, i32 [[C]]
10421041
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4

llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table_big.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,16 @@ define i32 @reachable_default_holes_0to31(i32 %x, i32 %y) {
143143
; CHECK-LABEL: @reachable_default_holes_0to31(
144144
; CHECK-NEXT: entry:
145145
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X:%.*]], 32
146-
; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_HOLE_CHECK:%.*]], label [[RETURN:%.*]]
147-
; CHECK: switch.hole_check:
148146
; CHECK-NEXT: [[SWITCH_SHIFTED:%.*]] = lshr i32 -277094665, [[X]]
149147
; CHECK-NEXT: [[SWITCH_LOBIT:%.*]] = trunc i32 [[SWITCH_SHIFTED]] to i1
150-
; CHECK-NEXT: br i1 [[SWITCH_LOBIT]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN]]
148+
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_LOBIT]], i1 false
149+
; CHECK-NEXT: br i1 [[OR_COND]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
151150
; CHECK: switch.lookup:
152151
; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.reachable_default_holes_0to31, i32 0, i32 [[X]]
153152
; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
154153
; CHECK-NEXT: br label [[RETURN]]
155154
; CHECK: return:
156-
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ [[Y:%.*]], [[SWITCH_HOLE_CHECK]] ], [ [[Y]], [[ENTRY:%.*]] ]
155+
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ]
157156
; CHECK-NEXT: ret i32 [[RES]]
158157
;
159158
entry:

llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ define void @one_pred_trunc_cond(i8 %v0, i8 %v1) {
8888
; CHECK-LABEL: @one_pred_trunc_cond(
8989
; CHECK-NEXT: pred:
9090
; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
91-
; CHECK-NEXT: br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
92-
; CHECK: dispatch:
9391
; CHECK-NEXT: [[C1:%.*]] = trunc i8 [[V1:%.*]] to i1
94-
; CHECK-NEXT: br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
92+
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
93+
; CHECK-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]]
9594
; CHECK: common.ret:
9695
; CHECK-NEXT: ret void
9796
; CHECK: final_left:

0 commit comments

Comments
 (0)