Skip to content

Commit 9864e17

Browse files
committed
[SimplifyCFG] Use icmp eq for one case
1 parent bfc9e92 commit 9864e17

File tree

4 files changed

+24
-27
lines changed

4 files changed

+24
-27
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5877,18 +5877,22 @@ bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
58775877
Constant *NumCases = ConstantInt::get(Offset->getType(),
58785878
ContiguousCasesMax->getValue() -
58795879
ContiguousCasesMin->getValue() + 1);
5880-
5881-
Value *Sub = SI->getCondition();
5882-
if (!Offset->isNullValue())
5883-
Sub = Builder.CreateAdd(Sub, Offset, Sub->getName() + ".off");
5884-
5885-
Value *Cmp;
5880+
BranchInst *NewBI;
5881+
if (NumCases->isOneValue()) {
5882+
assert(ContiguousCasesMax->getValue() == ContiguousCasesMin->getValue());
5883+
Value *Cmp = Builder.CreateICmpEQ(SI->getCondition(), ContiguousCasesMin);
5884+
NewBI = Builder.CreateCondBr(Cmp, ContiguousDest, OtherDest);
5885+
}
58865886
// If NumCases overflowed, then all possible values jump to the successor.
5887-
if (NumCases->isNullValue() && !ContiguousCases->empty())
5888-
Cmp = ConstantInt::getTrue(SI->getContext());
5889-
else
5890-
Cmp = Builder.CreateICmpULT(Sub, NumCases, "switch");
5891-
BranchInst *NewBI = Builder.CreateCondBr(Cmp, ContiguousDest, OtherDest);
5887+
else if (NumCases->isNullValue() && !ContiguousCases->empty()) {
5888+
NewBI = Builder.CreateBr(ContiguousDest);
5889+
} else {
5890+
Value *Sub = SI->getCondition();
5891+
if (!Offset->isNullValue())
5892+
Sub = Builder.CreateAdd(Sub, Offset, Sub->getName() + ".off");
5893+
Value *Cmp = Builder.CreateICmpULT(Sub, NumCases, "switch");
5894+
NewBI = Builder.CreateCondBr(Cmp, ContiguousDest, OtherDest);
5895+
}
58925896

58935897
// Update weight for the newly-created conditional branch.
58945898
if (hasBranchWeightMD(*SI)) {

llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ cleanup2:
8080
; CHECK: cleanup2.corodispatch:
8181
; CHECK: %1 = phi i8 [ 0, %handler2 ], [ 1, %catch.dispatch.2 ]
8282
; CHECK: %2 = cleanuppad within %h1 []
83-
; CHECK: %switch = icmp ult i8 %1, 1
84-
; CHECK: br i1 %switch, label %cleanup2.from.handler2, label %cleanup2.from.catch.dispatch.2
83+
; CHECK: %3 = icmp eq i8 %1, 0
84+
; CHECK: br i1 %3, label %cleanup2.from.handler2, label %cleanup2.from.catch.dispatch.2
8585

8686
; CHECK: cleanup2.from.handler2:
8787
; CHECK: %valueB.reload = load i32, ptr %valueB.spill.addr, align 4

llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ declare void @foo(i32)
77
define void @test(i1 %a) {
88
; CHECK-LABEL: define void @test(
99
; CHECK-SAME: i1 [[A:%.*]]) {
10-
; CHECK-NEXT: [[A_OFF:%.*]] = add i1 [[A]], true
11-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i1 [[A_OFF]], true
10+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i1 [[A]], true
1211
; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1312
; CHECK: common.ret:
1413
; CHECK-NEXT: ret void
@@ -209,8 +208,7 @@ define void @test5(i8 %a) {
209208
; CHECK-SAME: i8 [[A:%.*]]) {
210209
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A]], 2
211210
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
212-
; CHECK-NEXT: [[A_OFF:%.*]] = add i8 [[A]], -1
213-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i8 [[A_OFF]], 1
211+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], 1
214212
; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]]
215213
; CHECK: common.ret:
216214
; CHECK-NEXT: ret void
@@ -243,8 +241,7 @@ define void @test6(i8 %a) {
243241
; CHECK-NEXT: [[AND:%.*]] = and i8 [[A]], -2
244242
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], -2
245243
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
246-
; CHECK-NEXT: [[A_OFF:%.*]] = add i8 [[A]], 1
247-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i8 [[A_OFF]], 1
244+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], -1
248245
; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]]
249246
; CHECK: common.ret:
250247
; CHECK-NEXT: ret void
@@ -279,8 +276,7 @@ define void @test7(i8 %a) {
279276
; CHECK-NEXT: [[AND:%.*]] = and i8 [[A]], -2
280277
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], -2
281278
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
282-
; CHECK-NEXT: [[A_OFF:%.*]] = add i8 [[A]], 1
283-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i8 [[A_OFF]], 1
279+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], -1
284280
; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]]
285281
; CHECK: common.ret:
286282
; CHECK-NEXT: ret void

llvm/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ else:
220220

221221
define i32 @wrapping_known_range_2(i8 range(i8 0, 6) %arg) {
222222
; CHECK-LABEL: @wrapping_known_range_2(
223-
; CHECK-NEXT: [[ARG_OFF:%.*]] = add i8 [[ARG:%.*]], -1
224-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i8 [[ARG_OFF]], 1
223+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[ARG:%.*]], 1
225224
; CHECK-NEXT: br i1 [[SWITCH]], label [[ELSE:%.*]], label [[IF:%.*]]
226225
; CHECK: common.ret:
227226
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[I0:%.*]], [[IF]] ], [ [[I1:%.*]], [[ELSE]] ]
@@ -338,8 +337,7 @@ else:
338337
define i32 @one_case_1(i32 %x) {
339338
; CHECK-LABEL: @one_case_1(
340339
; CHECK-NEXT: entry:
341-
; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -10
342-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 1
340+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i32 [[X:%.*]], 10
343341
; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[B:%.*]]
344342
; CHECK: common.ret:
345343
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[TMP0:%.*]], [[B]] ], [ [[TMP1:%.*]], [[A]] ]
@@ -372,8 +370,7 @@ b:
372370
define i32 @one_case_2(i32 %x) {
373371
; CHECK-LABEL: @one_case_2(
374372
; CHECK-NEXT: entry:
375-
; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -5
376-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 1
373+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i32 [[X:%.*]], 5
377374
; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[B:%.*]]
378375
; CHECK: common.ret:
379376
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[TMP0:%.*]], [[A]] ], [ [[TMP1:%.*]], [[B]] ]

0 commit comments

Comments
 (0)