Skip to content

Commit dd4fdf6

Browse files
committed
[SimplifyCFG] Improve one case
1 parent 0ce3e6e commit dd4fdf6

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5838,10 +5838,24 @@ bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
58385838
bool IsWrapping = false;
58395839
SmallVectorImpl<ConstantInt *> *ContiguousCases = &CasesA;
58405840
SmallVectorImpl<ConstantInt *> *OtherCases = &CasesB;
5841+
5842+
// Only one icmp is needed when there is only one case.
5843+
if (!HasDefault && CasesA.size() == 1) {
5844+
ContiguousCasesMax = CasesA[0];
5845+
ContiguousCasesMin = CasesA[0];
5846+
ContiguousDest = DestA;
5847+
OtherDest = DestB;
5848+
} else if (CasesB.size() == 1) {
5849+
ContiguousCasesMax = CasesB[0];
5850+
ContiguousCasesMin = CasesB[0];
5851+
ContiguousDest = DestB;
5852+
OtherDest = DestA;
5853+
std::swap(ContiguousCases, OtherCases);
5854+
}
58415855
// Correctness: Cases to the default destination cannot be contiguous cases.
5842-
if (!HasDefault && !CasesA.empty() &&
5843-
casesAreContiguous(SI->getCondition(), CasesA, ContiguousCasesMin,
5844-
ContiguousCasesMax, IsWrapping)) {
5856+
else if (!HasDefault && !CasesA.empty() &&
5857+
casesAreContiguous(SI->getCondition(), CasesA, ContiguousCasesMin,
5858+
ContiguousCasesMax, IsWrapping)) {
58455859
ContiguousDest = DestA;
58465860
OtherDest = DestB;
58475861
} else if (casesAreContiguous(SI->getCondition(), CasesB, ContiguousCasesMin,

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,11 +306,11 @@ else:
306306
define i32 @one_case_1(i32 %x) {
307307
; CHECK-LABEL: @one_case_1(
308308
; CHECK-NEXT: entry:
309-
; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -5
310-
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 3
309+
; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -10
310+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 1
311311
; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[B:%.*]]
312312
; CHECK: common.ret:
313-
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[TMP0:%.*]], [[A]] ], [ [[TMP1:%.*]], [[B]] ]
313+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ [[TMP0:%.*]], [[B]] ], [ [[TMP1:%.*]], [[A]] ]
314314
; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]
315315
; CHECK: a:
316316
; CHECK-NEXT: [[TMP0]] = call i32 @f(i32 0)

0 commit comments

Comments
 (0)