diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-02-05 17:16:50 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-02-05 17:16:50 +0000 |
commit | 2329fcd293e138924d96d4b2643dab7f3d60c3f3 (patch) | |
tree | 7c5cc97070da9ce82927a4b1c9683fe4985cefae /llvm/lib/Transforms | |
parent | eb175a00abec0b4d7fb51bf7c78b1ea75a1d265f (diff) | |
download | bcm5719-llvm-2329fcd293e138924d96d4b2643dab7f3d60c3f3.tar.gz bcm5719-llvm-2329fcd293e138924d96d4b2643dab7f3d60c3f3.zip |
[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
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 18cd0000f98..9046c36dee8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -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; } |