Remove dyn_cast + dereference pattern by replacing it with a cast and changing

the safety check to look for the same type we're going to actually cast to.
Fixes PR13180!

llvm-svn: 159110
This commit is contained in:
Nick Lewycky 2012-06-24 10:15:42 +00:00
parent fd5e6e7db1
commit 0a045bbe4e
2 changed files with 21 additions and 3 deletions

View File

@ -129,7 +129,7 @@ static bool SafeToMergeTerminators(TerminatorInst *SI1, TerminatorInst *SI2) {
///
static bool isProfitableToFoldUnconditional(BranchInst *SI1,
BranchInst *SI2,
Instruction* Cond,
Instruction *Cond,
SmallVectorImpl<PHINode*> &PhiNodes) {
if (SI1 == SI2) return false; // Can't merge with self!
assert(SI1->isUnconditional() && SI2->isConditional());
@ -156,7 +156,7 @@ static bool isProfitableToFoldUnconditional(BranchInst *SI1,
isa<PHINode>(BBI); ++BBI) {
PHINode *PN = cast<PHINode>(BBI);
if (PN->getIncomingValueForBlock(SI1BB) != Cond ||
!isa<Constant>(PN->getIncomingValueForBlock(SI2BB)))
!isa<ConstantInt>(PN->getIncomingValueForBlock(SI2BB)))
return false;
PhiNodes.push_back(PN);
}
@ -1782,7 +1782,7 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) {
} else {
// Update PHI nodes in the common successors.
for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
ConstantInt *PBI_C = dyn_cast<ConstantInt>(
ConstantInt *PBI_C = cast<ConstantInt>(
PHIs[i]->getIncomingValueForBlock(PBI->getParent()));
assert(PBI_C->getType()->isIntegerTy(1));
Instruction *MergedCond = 0;

View File

@ -50,3 +50,21 @@ c:
%o2 = phi i1 [ false, %a ], [ %phitmp, %b ], [ false, %entry ]
ret i1 %o2
}
; PR13180
define void @pr13180(i8 %p) {
entry:
%tobool = icmp eq i8 %p, 0
br i1 %tobool, label %cond.false, label %cond.true
cond.true: ; preds = %entry
br label %cond.end
cond.false: ; preds = %entry
%phitmp = icmp eq i8 %p, 0
br label %cond.end
cond.end: ; preds = %cond.false, %cond.true
%cond = phi i1 [ undef, %cond.true ], [ %phitmp, %cond.false ]
unreachable
}