[PATCH] D98924: [IndVars] Sharpen context in eliminateIVComparison
Max Kazantsev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 19 00:38:06 PDT 2021
mkazantsev created this revision.
mkazantsev added reviewers: lebedev.ri, nikic, reames.
Herald added a subscriber: hiraditya.
mkazantsev requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
When eliminating comparisons, we can use common dominator of
all its users as context. This gives better results when ICMP is not
computed right before the branch that uses it.
https://reviews.llvm.org/D98924
Files:
llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll
Index: llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll
===================================================================
--- llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll
+++ llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll
@@ -1101,13 +1101,11 @@
; CHECK: loop:
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[IV]], 0
-; CHECK-NEXT: [[C2:%.*]] = icmp ne i32 [[IV]], 0
-; CHECK-NEXT: [[C3:%.*]] = icmp ne i32 [[IV]], 0
; CHECK-NEXT: br i1 [[C1]], label [[CHECKED_1:%.*]], label [[FAIL:%.*]]
; CHECK: checked.1:
-; CHECK-NEXT: br i1 [[C2]], label [[CHECKED_2:%.*]], label [[FAIL]]
+; CHECK-NEXT: br i1 true, label [[CHECKED_2:%.*]], label [[FAIL]]
; CHECK: checked.2:
-; CHECK-NEXT: br i1 [[C3]], label [[BACKEDGE]], label [[FAIL]]
+; CHECK-NEXT: br i1 true, label [[BACKEDGE]], label [[FAIL]]
; CHECK: backedge:
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 758394
; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond_func()
Index: llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
+++ llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
@@ -281,8 +281,11 @@
// If the condition is always true or always false in the given context,
// replace it with a constant value.
- // TODO: We can sharpen the context to common dominator of all ICmp's users.
- if (auto Ev = SE->evaluatePredicateAt(Pred, S, X, ICmp)) {
+ SmallVector <Instruction *, 4> Users;
+ for (auto *U : ICmp->users())
+ Users.push_back(cast<Instruction>(U));
+ const Instruction *CtxI = findCommonDominator(Users, *DT);
+ if (auto Ev = SE->evaluatePredicateAt(Pred, S, X, CtxI)) {
ICmp->replaceAllUsesWith(ConstantInt::getBool(ICmp->getContext(), *Ev));
DeadInsts.emplace_back(ICmp);
LLVM_DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n');
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98924.331779.patch
Type: text/x-patch
Size: 2057 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210319/92f11816/attachment.bin>
More information about the llvm-commits
mailing list