[PATCH] CVP: Improve handling of Selects used as incoming PHI values
Björn Steinbrink
bsteinbr at gmail.com
Fri Apr 17 02:16:49 PDT 2015
Updated the patch to only apply the optimization to selects with a scalar condition.
http://reviews.llvm.org/D9051
Files:
lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
test/Transforms/CorrelatedValuePropagation/select.ll
Index: lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
===================================================================
--- lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -103,24 +103,46 @@
Value *V = LVI->getConstantOnEdge(Incoming, P->getIncomingBlock(i), BB, P);
- // Look if the incoming value is a select with a constant but LVI tells us
- // that the incoming value can never be that constant. In that case replace
- // the incoming value with the other value of the select. This often allows
- // us to remove the select later.
+ // Look if the incoming value is a select with a scalar condition for which
+ // LVI can tells us the value. In that case replace the incoming value with
+ // the appropriate value of the select. This often allows us to remove the
+ // select later.
if (!V) {
SelectInst *SI = dyn_cast<SelectInst>(Incoming);
if (!SI) continue;
- Constant *C = dyn_cast<Constant>(SI->getFalseValue());
- if (!C) continue;
+ Value *Condition = SI->getCondition();
+ if (!Condition->getType()->isVectorTy()) {
+ switch (LVI->getPredicateOnEdge(ICmpInst::ICMP_EQ, Condition,
+ ConstantInt::getTrue(Condition->getType()),
+ P->getIncomingBlock(i), BB, P)) {
+ case LazyValueInfo::True:
+ V = SI->getTrueValue();
+ break;
+ case LazyValueInfo::False:
+ V = SI->getFalseValue();
+ break;
+ default:
+ break;
+ }
+ }
- if (LVI->getPredicateOnEdge(ICmpInst::ICMP_EQ, SI, C,
- P->getIncomingBlock(i), BB, P) !=
- LazyValueInfo::False)
- continue;
+ // Look if the select has a constant but LVI tells us that the incoming
+ // value can never be that constant. In that case replace the incoming
+ // value with the other value of the select. This often allows us to
+ // remove the select later.
+ if (!V) {
+ Constant *C = dyn_cast<Constant>(SI->getFalseValue());
+ if (!C) continue;
+
+ if (LVI->getPredicateOnEdge(ICmpInst::ICMP_EQ, SI, C,
+ P->getIncomingBlock(i), BB, P) !=
+ LazyValueInfo::False)
+ continue;
+ V = SI->getTrueValue();
+ }
DEBUG(dbgs() << "CVP: Threading PHI over " << *SI << '\n');
- V = SI->getTrueValue();
}
P->setIncomingValue(i, V);
Index: test/Transforms/CorrelatedValuePropagation/select.ll
===================================================================
--- /dev/null
+++ test/Transforms/CorrelatedValuePropagation/select.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -correlated-propagation -S | FileCheck %s
+
+; CHECK-LABEL: @test(
+define void @test(i32) {
+entry:
+ br label %loop
+
+loop:
+ %idx = phi i32 [ %0, %entry ], [ %sel, %loop ]
+; CHECK: %idx = phi i32 [ %0, %entry ], [ %2, %loop ]
+ %1 = icmp eq i32 %idx, 0
+ %2 = add i32 %idx, -1
+ %sel = select i1 %1, i32 0, i32 %2
+ br i1 %1, label %out, label %loop
+
+out:
+ ret void
+}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9051.23899.patch
Type: text/x-patch
Size: 3135 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150417/bf3f6daf/attachment.bin>
More information about the llvm-commits
mailing list