@@ -793,26 +793,6 @@ class AccessAnalysis {
793
793
794
794
} // end anonymous namespace
795
795
796
- // / Check whether a pointer can participate in a runtime bounds check.
797
- // / If \p Assume, try harder to prove that we can compute the bounds of \p Ptr
798
- // / by adding run-time checks (overflow checks) if necessary.
799
- static bool hasComputableBounds (PredicatedScalarEvolution &PSE, Value *Ptr ,
800
- const SCEV *PtrScev, Loop *L, bool Assume) {
801
- // The bounds for loop-invariant pointer is trivial.
802
- if (PSE.getSE ()->isLoopInvariant (PtrScev, L))
803
- return true ;
804
-
805
- const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
806
-
807
- if (!AR && Assume)
808
- AR = PSE.getAsAddRec (Ptr );
809
-
810
- if (!AR)
811
- return false ;
812
-
813
- return AR->isAffine ();
814
- }
815
-
816
796
// / Try to compute the stride for \p AR. Used by getPtrStride.
817
797
static std::optional<int64_t >
818
798
getStrideFromAddRec (const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy,
@@ -859,21 +839,9 @@ static bool isNoWrapAddRec(Value *Ptr, const SCEVAddRecExpr *AR,
859
839
PredicatedScalarEvolution &PSE, const Loop *L);
860
840
861
841
// / Check whether a pointer address cannot wrap.
862
- static bool isNoWrap (PredicatedScalarEvolution &PSE,
863
- const DenseMap<Value *, const SCEV *> &Strides, Value *Ptr ,
864
- Type *AccessTy, const Loop *L, bool Assume,
842
+ static bool isNoWrap (PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,
843
+ Value *Ptr , Type *AccessTy, const Loop *L, bool Assume,
865
844
std::optional<int64_t > Stride = std::nullopt) {
866
- const SCEV *PtrScev = replaceSymbolicStrideSCEV (PSE, Strides, Ptr );
867
- if (PSE.getSE ()->isLoopInvariant (PtrScev, L))
868
- return true ;
869
-
870
- const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
871
- if (!AR) {
872
- if (!Assume)
873
- return false ;
874
- AR = PSE.getAsAddRec (Ptr );
875
- }
876
-
877
845
// The address calculation must not wrap. Otherwise, a dependence could be
878
846
// inverted.
879
847
if (isNoWrapAddRec (Ptr , AR, PSE, L))
@@ -1143,14 +1111,27 @@ bool AccessAnalysis::createCheckForAccess(RuntimePointerChecking &RtCheck,
1143
1111
SmallVector<PointerIntPair<const SCEV *, 1 , bool >> TranslatedPtrs =
1144
1112
findForkedPointer (PSE, StridesMap, Ptr , TheLoop);
1145
1113
1114
+ // / Check whether all pointers can participate in a runtime bounds check. They
1115
+ // / must either be invariant or AddRecs. If ShouldCheckWrap is true, they also
1116
+ // / must not wrap.
1146
1117
for (auto &P : TranslatedPtrs) {
1147
- if (!hasComputableBounds (PSE, Ptr , P.getPointer (), TheLoop, Assume))
1118
+ // The bounds for loop-invariant pointer is trivial.
1119
+ if (PSE.getSE ()->isLoopInvariant (P.getPointer (), TheLoop))
1120
+ continue ;
1121
+
1122
+ const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(P.getPointer ());
1123
+ if (!AR && Assume)
1124
+ AR = PSE.getAsAddRec (Ptr );
1125
+ if (!AR || !AR->isAffine ())
1148
1126
return false ;
1149
1127
1150
1128
// If there's only one option for Ptr, look it up after bounds and wrap
1151
1129
// checking, because assumptions might have been added to PSE.
1152
- if (TranslatedPtrs.size () == 1 )
1153
- P.setPointer (replaceSymbolicStrideSCEV (PSE, StridesMap, Ptr ));
1130
+ if (TranslatedPtrs.size () == 1 ) {
1131
+ AR =
1132
+ cast<SCEVAddRecExpr>(replaceSymbolicStrideSCEV (PSE, StridesMap, Ptr ));
1133
+ P.setPointer (AR);
1134
+ }
1154
1135
1155
1136
// When we run after a failing dependency check we have to make sure
1156
1137
// we don't have wrapping pointers.
@@ -1159,7 +1140,7 @@ bool AccessAnalysis::createCheckForAccess(RuntimePointerChecking &RtCheck,
1159
1140
if (TranslatedPtrs.size () > 1 )
1160
1141
return false ;
1161
1142
1162
- if (!isNoWrap (PSE, StridesMap , Ptr , AccessTy, TheLoop, Assume))
1143
+ if (!isNoWrap (PSE, AR , Ptr , AccessTy, TheLoop, Assume))
1163
1144
return false ;
1164
1145
}
1165
1146
}
@@ -1548,7 +1529,7 @@ llvm::getPtrStride(PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,
1548
1529
if (!ShouldCheckWrap || !Stride)
1549
1530
return Stride;
1550
1531
1551
- if (isNoWrap (PSE, StridesMap , Ptr , AccessTy, Lp, Assume, Stride))
1532
+ if (isNoWrap (PSE, AR , Ptr , AccessTy, Lp, Assume, Stride))
1552
1533
return Stride;
1553
1534
1554
1535
LLVM_DEBUG (
0 commit comments