@@ -851,9 +851,6 @@ getStrideFromAddRec(const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy,
851851 return Stride;
852852}
853853
854- static bool isNoWrapGEP (Value *Ptr, PredicatedScalarEvolution &PSE,
855- const Loop *L);
856-
857854// / Check whether \p AR is a non-wrapping AddRec. If \p Ptr is not nullptr, use
858855// / informating from the IR pointer value to determine no-wrap.
859856static bool isNoWrap (PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
@@ -866,11 +863,6 @@ static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
866863 if (Ptr && PSE.hasNoOverflow (Ptr, SCEVWrapPredicate::IncrementNUSW))
867864 return true ;
868865
869- // The address calculation must not wrap. Otherwise, a dependence could be
870- // inverted.
871- if (Ptr && isNoWrapGEP (Ptr, PSE, L))
872- return true ;
873-
874866 // An nusw getelementptr that is an AddRec cannot wrap. If it would wrap,
875867 // the distance between the previously accessed location and the wrapped
876868 // location will be larger than half the pointer index type space. In that
@@ -1468,49 +1460,6 @@ void AccessAnalysis::processMemAccesses() {
14681460 }
14691461}
14701462
1471- // / Check whether \p Ptr is non-wrapping GEP.
1472- static bool isNoWrapGEP (Value *Ptr, PredicatedScalarEvolution &PSE,
1473- const Loop *L) {
1474- // Scalar evolution does not propagate the non-wrapping flags to values that
1475- // are derived from a non-wrapping induction variable because non-wrapping
1476- // could be flow-sensitive.
1477- //
1478- // Look through the potentially overflowing instruction to try to prove
1479- // non-wrapping for the *specific* value of Ptr.
1480-
1481- // The arithmetic implied by an nusw GEP can't overflow.
1482- const auto *GEP = dyn_cast<GetElementPtrInst>(Ptr);
1483- if (!GEP || !GEP->hasNoUnsignedSignedWrap ())
1484- return false ;
1485-
1486- // Make sure there is only one non-const index and analyze that.
1487- Value *NonConstIndex = nullptr ;
1488- for (Value *Index : GEP->indices ())
1489- if (!isa<ConstantInt>(Index)) {
1490- if (NonConstIndex)
1491- return false ;
1492- NonConstIndex = Index;
1493- }
1494- if (!NonConstIndex)
1495- // The recurrence is on the pointer, ignore for now.
1496- return false ;
1497-
1498- // The index in GEP is signed. It is non-wrapping if it's derived from a NSW
1499- // AddRec using a NSW operation.
1500- if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(NonConstIndex))
1501- if (OBO->hasNoSignedWrap () &&
1502- // Assume constant for other the operand so that the AddRec can be
1503- // easily found.
1504- isa<ConstantInt>(OBO->getOperand (1 ))) {
1505- const SCEV *OpScev = PSE.getSCEV (OBO->getOperand (0 ));
1506-
1507- if (auto *OpAR = dyn_cast<SCEVAddRecExpr>(OpScev))
1508- return OpAR->getLoop () == L && OpAR->getNoWrapFlags (SCEV::FlagNSW);
1509- }
1510-
1511- return false ;
1512- }
1513-
15141463// / Check whether the access through \p Ptr has a constant stride.
15151464std::optional<int64_t >
15161465llvm::getPtrStride (PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,
0 commit comments