diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-04-24 17:24:37 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-04-24 17:24:37 +0000 |
commit | 02907f30397129dbebb2b633135c638a25c99463 (patch) | |
tree | 46232784e44651875909f7c80afa6c8df3dc4b96 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 8b37326ae2363c51ca33362cd49b28b9d624750e (diff) | |
download | bcm5719-llvm-02907f30397129dbebb2b633135c638a25c99463.tar.gz bcm5719-llvm-02907f30397129dbebb2b633135c638a25c99463.zip |
InstCombine: Fix assert when reassociating fsub with undef
There is logic to track the expected number of instructions
produced. It thought in this case an instruction would
be necessary to negate the result, but here it folded
into a ConstantExpr fneg when the non-undef value operand
was cancelled out by the second fsub.
I'm not sure why we don't fold constant FP ops with undef currently,
but I think that would also avoid this problem.
llvm-svn: 301199
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 05f34e9eaa0..e946acf84f5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -794,6 +794,11 @@ unsigned FAddCombine::calcInstrNumber(const AddendVect &Opnds) { if (Opnd->isConstant()) continue; + // The constant check above is really for a few special constant + // coefficients. + if (isa<UndefValue>(Opnd->getSymVal())) + continue; + const FAddendCoef &CE = Opnd->getCoef(); if (CE.isMinusOne() || CE.isMinusTwo()) NegOpndNum++; |