aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-12 20:41:47 +0000
committerChris Lattner <sabre@nondot.org>2010-01-12 20:41:47 +0000
commit5ef95fc2d4d3c210cce4f9df069cd2b37c24e540 (patch)
tree14b5aa7e993317c77b525e35f91b3ba727458b9b
parent1da50dc6f5e5315debc5f9eabb2a82c876974f32 (diff)
downloadexternal_llvm-5ef95fc2d4d3c210cce4f9df069cd2b37c24e540.zip
external_llvm-5ef95fc2d4d3c210cce4f9df069cd2b37c24e540.tar.gz
external_llvm-5ef95fc2d4d3c210cce4f9df069cd2b37c24e540.tar.bz2
1) Use the new SimplifyInstructionsInBlock routine instead of the copy
in JT. 2) When cloning blocks for PHI or xor conditions, use instsimplify to simplify the code as we go. This allows us to squish common cases early in JT which opens up opportunities for subsequent iterations, and allows it to completely simplify the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93253 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/JumpThreading.cpp31
-rw-r--r--test/Transforms/JumpThreading/basic.ll7
2 files changed, 15 insertions, 23 deletions
diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp
index edb0412..9531311 100644
--- a/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1341,20 +1341,7 @@ bool JumpThreading::ThreadEdge(BasicBlock *BB,
// At this point, the IR is fully up to date and consistent. Do a quick scan
// over the new instructions and zap any that are constants or dead. This
// frequently happens because of phi translation.
- BI = NewBB->begin();
- for (BasicBlock::iterator E = NewBB->end(); BI != E; ) {
- Instruction *Inst = BI++;
-
- if (Value *V = SimplifyInstruction(Inst, TD)) {
- WeakVH BIHandle(BI);
- ReplaceAndSimplifyAllUses(Inst, V, TD);
- if (BIHandle == 0)
- BI = NewBB->begin();
- continue;
- }
-
- RecursivelyDeleteTriviallyDeadInstructions(Inst);
- }
+ SimplifyInstructionsInBlock(NewBB, TD);
// Threaded an edge!
++NumThreads;
@@ -1425,9 +1412,6 @@ bool JumpThreading::DuplicateCondBranchOnPHIIntoPred(BasicBlock *BB,
// mapping and using it to remap operands in the cloned instructions.
for (; BI != BB->end(); ++BI) {
Instruction *New = BI->clone();
- New->setName(BI->getName());
- PredBB->getInstList().insert(OldPredBranch, New);
- ValueMapping[BI] = New;
// Remap operands to patch up intra-block references.
for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i)
@@ -1436,6 +1420,19 @@ bool JumpThreading::DuplicateCondBranchOnPHIIntoPred(BasicBlock *BB,
if (I != ValueMapping.end())
New->setOperand(i, I->second);
}
+
+ // If this instruction can be simplified after the operands are updated,
+ // just use the simplified value instead. This frequently happens due to
+ // phi translation.
+ if (Value *IV = SimplifyInstruction(New, TD)) {
+ delete New;
+ ValueMapping[BI] = IV;
+ } else {
+ // Otherwise, insert the new instruction into the block.
+ New->setName(BI->getName());
+ PredBB->getInstList().insert(OldPredBranch, New);
+ ValueMapping[BI] = New;
+ }
}
// Check to see if the targets of the branch had PHI nodes. If so, we need to
diff --git a/test/Transforms/JumpThreading/basic.ll b/test/Transforms/JumpThreading/basic.ll
index 34b4243..503d301 100644
--- a/test/Transforms/JumpThreading/basic.ll
+++ b/test/Transforms/JumpThreading/basic.ll
@@ -407,12 +407,7 @@ T2:
F2:
ret i32 %v1
-;; FIXME: CONSTANT FOLD on clone and when phi gets eliminated.
-
-; CHECK: Entry.Merge_crit_edge:
-; CHECK-NEXT: %M1 = icmp eq i32 192, 192
-; CHECK-NEXT: %N2 = xor i1 true, %M1
-; CHECK-NEXT: br i1 %N2, label %T2, label %F2
+; CHECK: br i1 %cond, label %F2, label %Merge
; CHECK: Merge:
; CHECK-NEXT: %M = icmp eq i32 %v1, 192