Skip to content

Commit 39d7f70

Browse files
authored
[ConstraintElim] Support adding facts from switch terminators. (llvm#67061)
After 4a5bcbd, switch instructions can now be handled in a straight-forward manner by adding (ICMP_EQ, ConditionVal, CaseVal) for te successor blocks per case.
1 parent c62f208 commit 39d7f70

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,18 @@ void State::addInfoFor(BasicBlock &BB) {
831831
GuaranteedToExecute &= isGuaranteedToTransferExecutionToSuccessor(&I);
832832
}
833833

834+
if (auto *Switch = dyn_cast<SwitchInst>(BB.getTerminator())) {
835+
for (auto &Case : Switch->cases()) {
836+
BasicBlock *Succ = Case.getCaseSuccessor();
837+
Value *V = Case.getCaseValue();
838+
if (!canAddSuccessor(BB, Succ))
839+
continue;
840+
WorkList.emplace_back(FactOrCheck::getConditionFact(
841+
DT.getNode(Succ), CmpInst::ICMP_EQ, Switch->getCondition(), V));
842+
}
843+
return;
844+
}
845+
834846
auto *Br = dyn_cast<BranchInst>(BB.getTerminator());
835847
if (!Br || !Br->isConditional())
836848
return;

llvm/test/Transforms/ConstraintElimination/switch.ll

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,10 @@ define i1 @simplify_based_on_switch(i8 %x) {
5757
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
5858
; CHECK-NEXT: ret i1 [[RES_1]]
5959
; CHECK: exit.2:
60-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
61-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
62-
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
60+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false
6361
; CHECK-NEXT: ret i1 [[RES_2]]
6462
; CHECK: exit.3:
65-
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[X]], 11
66-
; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[X]], 10
67-
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_2]], [[F_2]]
63+
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, false
6864
; CHECK-NEXT: ret i1 [[RES_3]]
6965
;
7066
entry:
@@ -105,9 +101,7 @@ define i1 @simplify_based_on_switch_successor_branches(i8 %x) {
105101
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
106102
; CHECK-NEXT: ret i1 [[RES_1]]
107103
; CHECK: exit.2:
108-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
109-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
110-
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
104+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false
111105
; CHECK-NEXT: call void @use(i1 [[RES_2]])
112106
; CHECK-NEXT: br label [[EXIT_3]]
113107
; CHECK: exit.3:

0 commit comments

Comments
 (0)