@@ -851,9 +851,6 @@ getStrideFromAddRec(const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy,
851
851
return Stride;
852
852
}
853
853
854
- static bool isNoWrapGEP (Value *Ptr, PredicatedScalarEvolution &PSE,
855
- const Loop *L);
856
-
857
854
// / Check whether \p AR is a non-wrapping AddRec. If \p Ptr is not nullptr, use
858
855
// / informating from the IR pointer value to determine no-wrap.
859
856
static bool isNoWrap (PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
@@ -866,11 +863,6 @@ static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
866
863
if (Ptr && PSE.hasNoOverflow (Ptr, SCEVWrapPredicate::IncrementNUSW))
867
864
return true ;
868
865
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
-
874
866
// An nusw getelementptr that is an AddRec cannot wrap. If it would wrap,
875
867
// the distance between the previously accessed location and the wrapped
876
868
// location will be larger than half the pointer index type space. In that
@@ -1468,49 +1460,6 @@ void AccessAnalysis::processMemAccesses() {
1468
1460
}
1469
1461
}
1470
1462
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
-
1514
1463
// / Check whether the access through \p Ptr has a constant stride.
1515
1464
std::optional<int64_t >
1516
1465
llvm::getPtrStride (PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,
0 commit comments