mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
make jump threading handle lexically identical compare instructions
as if they were multiple uses of the same instruction. This interacts well with the existing loadpre that j-t does to open up many new jump threads earlier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73768 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
225503a5b5
commit
79c740ff47
@ -324,10 +324,6 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
||||
}
|
||||
}
|
||||
|
||||
// If there is only a single predecessor of this block, nothing to fold.
|
||||
if (BB->getSinglePredecessor())
|
||||
return false;
|
||||
|
||||
// All the rest of our checks depend on the condition being an instruction.
|
||||
if (CondInst == 0)
|
||||
return false;
|
||||
@ -358,6 +354,23 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
||||
if (ProcessBranchOnCompare(CondCmp, BB))
|
||||
return true;
|
||||
}
|
||||
|
||||
// If we have a comparison, loop over the predecessors to see if there is
|
||||
// a condition with the same value.
|
||||
pred_iterator PI = pred_begin(BB), E = pred_end(BB);
|
||||
for (; PI != E; ++PI)
|
||||
if (BranchInst *PBI = dyn_cast<BranchInst>((*PI)->getTerminator()))
|
||||
if (PBI->isConditional() && *PI != BB) {
|
||||
if (CmpInst *CI = dyn_cast<CmpInst>(PBI->getCondition())) {
|
||||
if (CI->getOperand(0) == CondCmp->getOperand(0) &&
|
||||
CI->getOperand(1) == CondCmp->getOperand(1) &&
|
||||
CI->getPredicate() == CondCmp->getPredicate()) {
|
||||
// TODO: Could handle things like (x != 4) --> (x == 17)
|
||||
if (ProcessBranchOnDuplicateCond(*PI, BB))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check for some cases that are worth simplifying. Right now we want to look
|
||||
|
30
test/Transforms/JumpThreading/dup-cond.ll
Normal file
30
test/Transforms/JumpThreading/dup-cond.ll
Normal file
@ -0,0 +1,30 @@
|
||||
; RUN: llvm-as < %s | opt -jump-threading -die | llvm-dis | grep icmp | count 1
|
||||
|
||||
declare void @f1()
|
||||
declare void @f2()
|
||||
declare void @f3()
|
||||
|
||||
define i32 @test(i32 %A) {
|
||||
%tmp455 = icmp eq i32 %A, 42
|
||||
br i1 %tmp455, label %BB1, label %BB2
|
||||
|
||||
BB2:
|
||||
call void @f1()
|
||||
br label %BB1
|
||||
|
||||
|
||||
BB1:
|
||||
%tmp459 = icmp eq i32 %A, 42
|
||||
br i1 %tmp459, label %BB3, label %BB4
|
||||
|
||||
BB3:
|
||||
call void @f2()
|
||||
ret i32 3
|
||||
|
||||
BB4:
|
||||
call void @f3()
|
||||
ret i32 4
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user