[InstCombine] Fix for assert build failures caused by r218721

The icmp-select-icmp optimization made the implicit assumption
that the select-icmp instructions are in the same block and asserted on it.
The fix explicitly checks for that condition and conservatively suppresses
the optimization when it is violated.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218735 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Gerolf Hoflehner 2014-10-01 03:24:39 +00:00
parent 9e2fe46484
commit 3adf585efe

View File

@ -2442,7 +2442,7 @@ static bool swapMayExposeCSEOpportunities(const Value * Op0,
bool InstCombiner::dominatesAllUses(const Instruction *DI,
const Instruction *UI,
const BasicBlock *DB) const {
assert(DI && DI->getParent() == UI->getParent() &&
assert(DI && UI && DI->getParent() == UI->getParent() &&
"definition and use must be in the same block");
// DominatorTree available?
if (!DT)
@ -2468,6 +2468,12 @@ static bool isChainSelectCmpBranch(const SelectInst *SI) {
auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
return false;
// FIXME: Conservatively suppress the optimization when the IC
// has a parent different from SI (including no parent). Otherwise
// the assertion in dominatesAllUses() fires and causes a build failure.
// Make the optimization safe w/o this condition.
if (SI->getParent() != IC->getParent())
return false;
return true;
}