[llvm] 39d7f70 - [ConstraintElim] Support adding facts from switch terminators. (#67061)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 22 03:18:46 PDT 2023
Author: Florian Hahn
Date: 2023-09-22T11:18:42+01:00
New Revision: 39d7f700ce0103539fb00bd2841c5ca994c1a7f1
URL: https://github.com/llvm/llvm-project/commit/39d7f700ce0103539fb00bd2841c5ca994c1a7f1
DIFF: https://github.com/llvm/llvm-project/commit/39d7f700ce0103539fb00bd2841c5ca994c1a7f1.diff
LOG: [ConstraintElim] Support adding facts from switch terminators. (#67061)
After 4a5bcbd5602, switch instructions can now be handled in a
straight-forward manner by adding (ICMP_EQ, ConditionVal, CaseVal) for
te successor blocks per case.
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/switch.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 3c47d36cbc0a0bc..fd6b6b553348511 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -831,6 +831,18 @@ void State::addInfoFor(BasicBlock &BB) {
GuaranteedToExecute &= isGuaranteedToTransferExecutionToSuccessor(&I);
}
+ if (auto *Switch = dyn_cast<SwitchInst>(BB.getTerminator())) {
+ for (auto &Case : Switch->cases()) {
+ BasicBlock *Succ = Case.getCaseSuccessor();
+ Value *V = Case.getCaseValue();
+ if (!canAddSuccessor(BB, Succ))
+ continue;
+ WorkList.emplace_back(FactOrCheck::getConditionFact(
+ DT.getNode(Succ), CmpInst::ICMP_EQ, Switch->getCondition(), V));
+ }
+ return;
+ }
+
auto *Br = dyn_cast<BranchInst>(BB.getTerminator());
if (!Br || !Br->isConditional())
return;
diff --git a/llvm/test/Transforms/ConstraintElimination/switch.ll b/llvm/test/Transforms/ConstraintElimination/switch.ll
index ad3bc5c048f97fd..b104b26e83cff22 100644
--- a/llvm/test/Transforms/ConstraintElimination/switch.ll
+++ b/llvm/test/Transforms/ConstraintElimination/switch.ll
@@ -57,14 +57,10 @@ define i1 @simplify_based_on_switch(i8 %x) {
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
; CHECK-NEXT: ret i1 [[RES_1]]
; CHECK: exit.2:
-; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
-; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
-; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false
; CHECK-NEXT: ret i1 [[RES_2]]
; CHECK: exit.3:
-; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[X]], 11
-; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[X]], 10
-; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_2]], [[F_2]]
+; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, false
; CHECK-NEXT: ret i1 [[RES_3]]
;
entry:
@@ -105,9 +101,7 @@ define i1 @simplify_based_on_switch_successor_branches(i8 %x) {
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]
; CHECK-NEXT: ret i1 [[RES_1]]
; CHECK: exit.2:
-; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[X]], 7
-; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[X]], 6
-; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[T_1]], [[F_1]]
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 true, false
; CHECK-NEXT: call void @use(i1 [[RES_2]])
; CHECK-NEXT: br label [[EXIT_3]]
; CHECK: exit.3:
More information about the llvm-commits
mailing list