diff options
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/Reassociate.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 5 |
2 files changed, 9 insertions, 3 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; diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 6135114eb17..f9ebd75ec71 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -1691,7 +1691,7 @@ isVectorPromotionViableForSlice(const DataLayout &DL, uint64_t SliceBeginOffset, /// don't want to do the rewrites unless we are confident that the result will /// be promotable, so we have an early test here. static VectorType * -isVectorPromotionViable(const DataLayout &DL, Type *AllocaTy, +isVectorPromotionViable(const DataLayout &DL, uint64_t SliceBeginOffset, uint64_t SliceEndOffset, AllocaSlices::const_range Slices, ArrayRef<AllocaSlices::iterator> SplitUses) { @@ -1709,7 +1709,6 @@ isVectorPromotionViable(const DataLayout &DL, Type *AllocaTy, HaveCommonEltTy = false; } }; - CheckCandidateType(AllocaTy); // Consider any loads or stores that are the exact size of the slice. for (const auto &S : Slices) if (S.beginOffset() == SliceBeginOffset && @@ -3213,7 +3212,7 @@ bool SROA::rewritePartition(AllocaInst &AI, AllocaSlices &AS, VectorType *VecTy = IsIntegerPromotable ? nullptr - : isVectorPromotionViable(*DL, SliceTy, BeginOffset, EndOffset, + : isVectorPromotionViable(*DL, BeginOffset, EndOffset, AllocaSlices::const_range(B, E), SplitUses); if (VecTy) SliceTy = VecTy; |