diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp b/contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp index 207f4df79e45..f61806bd1dad 100644 --- a/contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/contrib/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp @@ -2319,9 +2319,13 @@ bool ScalarEvolution::willNotOverflow(Instruction::BinaryOps BinOp, bool Signed, return A == B; } -std::pair<SCEV::NoWrapFlags, bool /*Deduced*/> +Optional<SCEV::NoWrapFlags> ScalarEvolution::getStrengthenedNoWrapFlagsFromBinOp( const OverflowingBinaryOperator *OBO) { + // It cannot be done any better. + if (OBO->hasNoUnsignedWrap() && OBO->hasNoSignedWrap()) + return None; + SCEV::NoWrapFlags Flags = SCEV::NoWrapFlags::FlagAnyWrap; if (OBO->hasNoUnsignedWrap()) @@ -2331,13 +2335,10 @@ ScalarEvolution::getStrengthenedNoWrapFlagsFromBinOp( bool Deduced = false; - if (OBO->hasNoUnsignedWrap() && OBO->hasNoSignedWrap()) - return {Flags, Deduced}; - if (OBO->getOpcode() != Instruction::Add && OBO->getOpcode() != Instruction::Sub && OBO->getOpcode() != Instruction::Mul) - return {Flags, Deduced}; + return None; const SCEV *LHS = getSCEV(OBO->getOperand(0)); const SCEV *RHS = getSCEV(OBO->getOperand(1)); @@ -2356,7 +2357,9 @@ ScalarEvolution::getStrengthenedNoWrapFlagsFromBinOp( Deduced = true; } - return {Flags, Deduced}; + if (Deduced) + return Flags; + return None; } // We're trying to construct a SCEV of type `Type' with `Ops' as operands and @@ -4835,7 +4838,7 @@ public: Optional<const SCEV *> Res = compareWithBackedgeCondition(SI->getCondition()); if (Res) { - bool IsOne = cast<SCEVConstant>(Res.getValue())->getValue()->isOne(); + bool IsOne = cast<SCEVConstant>(Res.value())->getValue()->isOne(); Result = SE.getSCEV(IsOne ? SI->getTrueValue() : SI->getFalseValue()); } break; @@ -4843,7 +4846,7 @@ public: default: { Optional<const SCEV *> Res = compareWithBackedgeCondition(I); if (Res) - Result = Res.getValue(); + Result = Res.value(); break; } } @@ -6583,8 +6586,8 @@ ScalarEvolution::getRangeRef(const SCEV *S, // Check if the IR explicitly contains !range metadata. Optional<ConstantRange> MDRange = GetRangeFromMetadata(U->getValue()); if (MDRange) - ConservativeResult = ConservativeResult.intersectWith(MDRange.getValue(), - RangeType); + ConservativeResult = + ConservativeResult.intersectWith(MDRange.value(), RangeType); // Use facts about recurrences in the underlying IR. Note that add // recurrences are AddRecExprs and thus don't hit this path. This @@ -7365,6 +7368,8 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) { Ops.push_back(II->getArgOperand(1)); return nullptr; case Intrinsic::start_loop_iterations: + case Intrinsic::annotation: + case Intrinsic::ptr_annotation: Ops.push_back(II->getArgOperand(0)); return nullptr; default: @@ -7816,8 +7821,10 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) { return getAddExpr(ClampedX, Y, SCEV::FlagNUW); } case Intrinsic::start_loop_iterations: - // A start_loop_iterations is just equivalent to the first operand for - // SCEV purposes. + case Intrinsic::annotation: + case Intrinsic::ptr_annotation: + // A start_loop_iterations or llvm.annotation or llvm.prt.annotation is + // just eqivalent to the first operand for SCEV purposes. return getSCEV(II->getArgOperand(0)); default: break; @@ -9517,14 +9524,7 @@ static Constant *BuildConstantFromSCEV(const SCEV *V) { } return C; } - case scUDivExpr: { - const SCEVUDivExpr *SU = cast<SCEVUDivExpr>(V); - if (Constant *LHS = BuildConstantFromSCEV(SU->getLHS())) - if (Constant *RHS = BuildConstantFromSCEV(SU->getRHS())) - if (LHS->getType() == RHS->getType()) - return ConstantExpr::getUDiv(LHS, RHS); - return nullptr; - } + case scUDivExpr: case scSMaxExpr: case scUMaxExpr: case scSMinExpr: @@ -10632,7 +10632,7 @@ ScalarEvolution::getMonotonicPredicateType(const SCEVAddRecExpr *LHS, getMonotonicPredicateTypeImpl(LHS, ICmpInst::getSwappedPredicate(Pred)); assert(ResultSwapped && "should be able to analyze both!"); - assert(ResultSwapped.getValue() != Result.getValue() && + assert(ResultSwapped.value() != Result.value() && "monotonicity should flip as we flip the predicate"); } #endif @@ -11808,7 +11808,7 @@ bool ScalarEvolution::isImpliedViaMerge(ICmpInst::Predicate Pred, const SCEV *L = getSCEV(LPhi->getIncomingValueForBlock(IncBB)); // Make sure L does not refer to a value from a potentially previous // iteration of a loop. - if (!properlyDominates(L, IncBB)) + if (!properlyDominates(L, LBB)) return false; if (!ProvedEasily(L, RHS)) return false; |