summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-02-05 17:16:50 +0000
committerSanjay Patel <spatel@rotateright.com>2018-02-05 17:16:50 +0000
commit2329fcd293e138924d96d4b2643dab7f3d60c3f3 (patch)
tree7c5cc97070da9ce82927a4b1c9683fe4985cefae /llvm/lib/Transforms
parenteb175a00abec0b4d7fb51bf7c78b1ea75a1d265f (diff)
downloadbcm5719-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.cpp10
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;
}
OpenPOWER on IntegriCloud