[InstCombine] only allow narrow/wide evaluation of values with >1 use if that user is a binop

There was a logic hole in D42739 / rL324014 because we're not accounting for select and phi
instructions that might have repeated operands. This is likely a source of an infinite loop.
I haven't manufactured a test case to prove that, but it should be safe to speculatively limit
this transform to binops while we try to create that test.

llvm-svn: 324252
This commit is contained in:
Sanjay Patel 2018-02-05 17:16:50 +00:00
parent eb175a00ab
commit 2329fcd293
1 changed files with 6 additions and 4 deletions

View File

@ -327,12 +327,14 @@ static bool canNotEvaluateInType(Value *V, Type *Ty) {
if (!isa<Instruction>(V))
return true;
// We can't extend or shrink something that has multiple uses -- unless those
// multiple uses are all in the same instruction -- doing so would require
// duplicating the instruction which isn't profitable.
if (!V->hasOneUse())
// multiple uses are all in the same binop instruction -- doing so would
// require duplicating the instruction which isn't profitable.
if (!V->hasOneUse()) {
if (!match(V->user_back(), m_BinOp()))
return true;
if (any_of(V->users(), [&](User *U) { return U != V->user_back(); }))
return true;
}
return false;
}