[llvm] r340381 - [GuardWidening] Ignore guards with trivial conditions
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 21 19:40:49 PDT 2018
Author: mkazantsev
Date: Tue Aug 21 19:40:49 2018
New Revision: 340381
URL: http://llvm.org/viewvc/llvm-project?rev=340381&view=rev
Log:
[GuardWidening] Ignore guards with trivial conditions
Guard widening should not spend efforts on dealing with guards with trivial true/false conditions.
Such guards can easily be eliminated by any further cleanup pass like instcombine. However we
should not unconditionally delete them because it may be profitable to widen other conditions
into such guards.
Differential Revision: https://reviews.llvm.org/D50247
Reviewed By: fedor.sergeev
Modified:
llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp
llvm/trunk/test/Transforms/GuardWidening/basic.ll
Modified: llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp?rev=340381&r1=340380&r2=340381&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GuardWidening.cpp Tue Aug 21 19:40:49 2018
@@ -347,6 +347,12 @@ bool GuardWideningImpl::eliminateGuardVi
Instruction *GuardInst, const df_iterator<DomTreeNode *> &DFSI,
const DenseMap<BasicBlock *, SmallVector<Instruction *, 8>> &
GuardsInBlock, bool InvertCondition) {
+ // Ignore trivial true or false conditions. These instructions will be
+ // trivially eliminated by any cleanup pass. Do not erase them because other
+ // guards can possibly be widened into them.
+ if (isa<ConstantInt>(getCondition(GuardInst)))
+ return false;
+
Instruction *BestSoFar = nullptr;
auto BestScoreSoFar = WS_IllegalOrNegative;
auto *GuardInstLoop = LI.getLoopFor(GuardInst->getParent());
Modified: llvm/trunk/test/Transforms/GuardWidening/basic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GuardWidening/basic.ll?rev=340381&r1=340380&r2=340381&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GuardWidening/basic.ll (original)
+++ llvm/trunk/test/Transforms/GuardWidening/basic.ll Tue Aug 21 19:40:49 2018
@@ -379,3 +379,29 @@ left:
right:
ret void
}
+
+; Make sure we do not widen guard by trivial true conditions into something.
+define void @f_15(i1 %cond_0, i1 %cond_1) {
+; CHECK-LABEL: @f_15(
+entry:
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ]
+; CHECK: ret void
+
+ call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
+ call void(i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ]
+ ret void
+}
+
+; Make sure we do not widen guard by trivial false conditions into something.
+define void @f_16(i1 %cond_0, i1 %cond_1) {
+; CHECK-LABEL: @f_16(
+entry:
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
+; CHECK: ret void
+
+ call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
+ call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
+ ret void
+}
More information about the llvm-commits
mailing list