diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-21 02:34:55 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-21 02:34:55 +0000 |
commit | c0a313b57ca27a9bb703418f9fe6e36d8a6c565a (patch) | |
tree | e72f2849b0d732fcb1518d20eec601e019bccc71 /llvm/lib/Transforms/Scalar/Reassociate.cpp | |
parent | c6127dd6530d523fc004163496690105c8728af4 (diff) | |
download | bcm5719-llvm-c0a313b57ca27a9bb703418f9fe6e36d8a6c565a.tar.gz bcm5719-llvm-c0a313b57ca27a9bb703418f9fe6e36d8a6c565a.zip |
SROA: The alloca type isn't a candidate promotion type for vectors
The alloca's type is irrelevant, only those types which are used in a
load or store of the exact size of the slice should be considered.
This manifested as an assertion failure when we compared the various
types: we had a size mismatch.
This fixes PR21480.
llvm-svn: 222499
Diffstat (limited to 'llvm/lib/Transforms/Scalar/Reassociate.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/Reassociate.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp index 1bbaaf34603..d37eac56d51 100644 --- a/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp @@ -394,6 +394,13 @@ static BinaryOperator *LowerNegateToMultiply(Instruction *Neg) { BinaryOperator *Res = CreateMul(Neg->getOperand(1), NegOne, "", Neg, Neg); Neg->setOperand(1, Constant::getNullValue(Ty)); // Drop use of op. Res->takeName(Neg); + if (Ty->isIntegerTy()) { + bool NSW = cast<BinaryOperator>(Neg)->hasNoSignedWrap(); + bool NUW = cast<BinaryOperator>(Neg)->hasNoUnsignedWrap(); + if (NSW || NUW) + Res->setHasNoSignedWrap(true); + Res->setHasNoUnsignedWrap(NUW); + } Neg->replaceAllUsesWith(Res); Res->setDebugLoc(Neg->getDebugLoc()); return Res; |