[PATCH] D28275: [EarlyCSE] infer conditional equalities within basic blocks
Philip Reames via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 3 19:28:26 PST 2017
reames updated this revision to Diff 82994.
reames added a comment.
fix the bug I noticed immediate after uploading the first version...
https://reviews.llvm.org/D28275
Files:
lib/Transforms/Scalar/EarlyCSE.cpp
test/Transforms/EarlyCSE/guards.ll
Index: test/Transforms/EarlyCSE/guards.ll
===================================================================
--- test/Transforms/EarlyCSE/guards.ll
+++ test/Transforms/EarlyCSE/guards.ll
@@ -180,3 +180,20 @@
store i32 600, i32* %ptr
ret void
}
+
+define i32 @test7(i32 %val) {
+; After a guard has executed the condition it was guarding is known to
+; be true. Unlike test3, uses the same condition for both guards and
+; return value.
+
+; CHECK-LABEL: @test7(
+; CHECK-NEXT: %cond0 = icmp slt i32 %val, 40
+; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 %cond0) [ "deopt"() ]
+; CHECK-NEXT: ret i32 -1
+
+ %cond0 = icmp slt i32 %val, 40
+ call void(i1,...) @llvm.experimental.guard(i1 %cond0) [ "deopt"() ]
+ call void(i1,...) @llvm.experimental.guard(i1 %cond0) [ "deopt"() ]
+ %rval = sext i1 %cond0 to i32
+ ret i32 %rval
+}
Index: lib/Transforms/Scalar/EarlyCSE.cpp
===================================================================
--- lib/Transforms/Scalar/EarlyCSE.cpp
+++ lib/Transforms/Scalar/EarlyCSE.cpp
@@ -600,13 +600,6 @@
DEBUG(dbgs() << "EarlyCSE CVP: Add conditional value for '"
<< CondInst->getName() << "' as " << *ConditionalConstant
<< " in " << BB->getName() << "\n");
- // Replace all dominated uses with the known value.
- if (unsigned Count =
- replaceDominatedUsesWith(CondInst, ConditionalConstant, DT,
- BasicBlockEdge(Pred, BB))) {
- Changed = true;
- NumCSECVP = NumCSECVP + Count;
- }
}
/// LastStore - Keep track of the last non-volatile store that we saw... for
@@ -622,6 +615,23 @@
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {
Instruction *Inst = &*I++;
+ // Use the available value table to replace any operands we can. This
+ // kicks in when we've inferred a control dependent equivelence fact. Note
+ // that this does make the algorithm O(I^2) in the worst case (a series of
+ // calls which each use the previous instructions), but this was already
+ // true given we have to hash all the operands as well.
+ for (Value *V : Inst->operands())
+ if (Instruction *I = dyn_cast<Instruction>(V))
+ if (SimpleValue::canHandle(I))
+ // See if the instruction has an available value. If so, use it.
+ if (Value *Rep = AvailableValues.lookup(I)) {
+ DEBUG(dbgs() << "EarlyCSE replaced operand" << *I
+ << " with " << *Rep << " in " << *Inst << '\n');
+ Inst->replaceUsesOfWith(V, Rep);
+ Changed = true;
+ NumCSECVP++;
+ }
+
// Dead instructions should just be removed.
if (isInstructionTriviallyDead(Inst, &TLI)) {
DEBUG(dbgs() << "EarlyCSE DCE: " << *Inst << '\n');
@@ -659,8 +669,14 @@
dyn_cast<Instruction>(cast<CallInst>(Inst)->getArgOperand(0))) {
// The condition we're on guarding here is true for all dominated
// locations.
- if (SimpleValue::canHandle(CondI))
- AvailableValues.insert(CondI, ConstantInt::getTrue(BB->getContext()));
+ if (SimpleValue::canHandle(CondI)) {
+ DEBUG(dbgs() << "EarlyCSE CVP: Add conditional value for '"
+ << CondI->getName() << "' as true after "
+ << Inst->getName() << "\n");
+
+ auto *True = ConstantInt::getTrue(BB->getContext());
+ AvailableValues.insert(CondI, True);
+ }
}
// Guard intrinsics read all memory, but don't write any memory.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28275.82994.patch
Type: text/x-patch
Size: 3660 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170104/9653c54d/attachment.bin>
More information about the llvm-commits
mailing list