[DA] Use ScalarEvolution::isKnownPredicate (#170919)
DA uses `DependenceInfo::isKnownPredicate` instead of `ScalarEvolution::isKnownPredicate` in several places. The former is intended to be a "wrapper" for the later. Specifically, it performs the following processes: - Replace `zext(X) cmp zext(Y)` with `X cmp Y`. - Replace `X >=s Y` with `X - Y >=s 0` - Replace `X <=s Y` with `X - Y <=s 0` - Replace `X >s Y` with `X - Y >s 0` - Replace `X <s Y` with `X - Y <s 0` The first one can return an incorrect result when the most significant bit of `X` and `Y` are different. Everything other than the first one can be incorrect when `X - Y` overflows. Actually, when a `SCEVUnknown` is involved (e.g., `%n <s %n + 1` will be `0 <s 1`), this function often returns a result that ignore the possibility of overflow. This patch removes `DependenceInfo::isKnownPredicate` and replace all uses of it with `ScalarEvolution::isKnownPredicate`. There is a degradation in some test cases, but this should be correct. Resolve #169810
This commit is contained in:
parent
301c0d91b5
commit
6934c36a86
@ -499,13 +499,6 @@ private:
|
||||
bool checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,
|
||||
SmallBitVector &Loops);
|
||||
|
||||
/// isKnownPredicate - Compare X and Y using the predicate Pred.
|
||||
/// Basically a wrapper for SCEV::isKnownPredicate,
|
||||
/// but tries harder, especially in the presence of sign and zero
|
||||
/// extensions and symbolics.
|
||||
bool isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *X,
|
||||
const SCEV *Y) const;
|
||||
|
||||
/// collectUpperBound - All subscripts are the same type (on my machine,
|
||||
/// an i64). The loop bound may be a smaller type. collectUpperBound
|
||||
/// find the bound, if available, and zero extends it to the Type T.
|
||||
|
||||
@ -1209,57 +1209,6 @@ DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,
|
||||
return Subscript::MIV;
|
||||
}
|
||||
|
||||
// A wrapper around SCEV::isKnownPredicate.
|
||||
// Looks for cases where we're interested in comparing for equality.
|
||||
// If both X and Y have been identically sign or zero extended,
|
||||
// it strips off the (confusing) extensions before invoking
|
||||
// SCEV::isKnownPredicate. Perhaps, someday, the ScalarEvolution package
|
||||
// will be similarly updated.
|
||||
//
|
||||
// If SCEV::isKnownPredicate can't prove the predicate,
|
||||
// we try simple subtraction, which seems to help in some cases
|
||||
// involving symbolics.
|
||||
bool DependenceInfo::isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *X,
|
||||
const SCEV *Y) const {
|
||||
if (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) {
|
||||
if ((isa<SCEVSignExtendExpr>(X) && isa<SCEVSignExtendExpr>(Y)) ||
|
||||
(isa<SCEVZeroExtendExpr>(X) && isa<SCEVZeroExtendExpr>(Y))) {
|
||||
const SCEVIntegralCastExpr *CX = cast<SCEVIntegralCastExpr>(X);
|
||||
const SCEVIntegralCastExpr *CY = cast<SCEVIntegralCastExpr>(Y);
|
||||
const SCEV *Xop = CX->getOperand();
|
||||
const SCEV *Yop = CY->getOperand();
|
||||
if (Xop->getType() == Yop->getType()) {
|
||||
X = Xop;
|
||||
Y = Yop;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (SE->isKnownPredicate(Pred, X, Y))
|
||||
return true;
|
||||
// If SE->isKnownPredicate can't prove the condition,
|
||||
// we try the brute-force approach of subtracting
|
||||
// and testing the difference.
|
||||
// By testing with SE->isKnownPredicate first, we avoid
|
||||
// the possibility of overflow when the arguments are constants.
|
||||
const SCEV *Delta = SE->getMinusSCEV(X, Y);
|
||||
switch (Pred) {
|
||||
case CmpInst::ICMP_EQ:
|
||||
return Delta->isZero();
|
||||
case CmpInst::ICMP_NE:
|
||||
return SE->isKnownNonZero(Delta);
|
||||
case CmpInst::ICMP_SGE:
|
||||
return SE->isKnownNonNegative(Delta);
|
||||
case CmpInst::ICMP_SLE:
|
||||
return SE->isKnownNonPositive(Delta);
|
||||
case CmpInst::ICMP_SGT:
|
||||
return SE->isKnownPositive(Delta);
|
||||
case CmpInst::ICMP_SLT:
|
||||
return SE->isKnownNegative(Delta);
|
||||
default:
|
||||
llvm_unreachable("unexpected predicate in isKnownPredicate");
|
||||
}
|
||||
}
|
||||
|
||||
// All subscripts are all the same type.
|
||||
// Loop bound may be smaller (e.g., a char).
|
||||
// Should zero extend loop bound, since it's always >= 0.
|
||||
@ -1341,11 +1290,11 @@ bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst,
|
||||
LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
|
||||
LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
|
||||
++ZIVapplications;
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) {
|
||||
LLVM_DEBUG(dbgs() << " provably dependent\n");
|
||||
return false; // provably dependent
|
||||
}
|
||||
if (isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) {
|
||||
LLVM_DEBUG(dbgs() << " provably independent\n");
|
||||
++ZIVindependence;
|
||||
return true; // provably independent
|
||||
@ -1424,7 +1373,7 @@ bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst,
|
||||
const SCEV *Product = mulSCEVNoSignedOverflow(UpperBound, AbsCoeff, *SE);
|
||||
if (!Product)
|
||||
return false;
|
||||
return isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product);
|
||||
return SE->isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product);
|
||||
}();
|
||||
if (IsDeltaLarge) {
|
||||
// Distance greater than trip count - no dependence
|
||||
@ -1611,13 +1560,13 @@ bool DependenceInfo::weakCrossingSIVtest(const SCEV *Coeff,
|
||||
const SCEV *ML =
|
||||
SE->getMulExpr(SE->getMulExpr(ConstCoeff, UpperBound), ConstantTwo);
|
||||
LLVM_DEBUG(dbgs() << "\t ML = " << *ML << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, ML)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, Delta, ML)) {
|
||||
// Delta too big, no dependence
|
||||
++WeakCrossingSIVindependence;
|
||||
++WeakCrossingSIVsuccesses;
|
||||
return true;
|
||||
}
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, Delta, ML)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, Delta, ML)) {
|
||||
// i = i' = UB
|
||||
Result.DV[Level].Direction &= ~Dependence::DVEntry::LT;
|
||||
Result.DV[Level].Direction &= ~Dependence::DVEntry::GT;
|
||||
@ -2016,7 +1965,7 @@ bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *DstCoeff,
|
||||
Result.Consistent = false;
|
||||
const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst);
|
||||
LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, SrcConst, DstConst)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, SrcConst, DstConst)) {
|
||||
if (Level < CommonLevels) {
|
||||
Result.DV[Level].Direction &= Dependence::DVEntry::GE;
|
||||
Result.DV[Level].PeelFirst = true;
|
||||
@ -2042,12 +1991,12 @@ bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *DstCoeff,
|
||||
collectUpperBound(CurSrcLoop, Delta->getType())) {
|
||||
LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");
|
||||
const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound);
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {
|
||||
++WeakZeroSIVindependence;
|
||||
++WeakZeroSIVsuccesses;
|
||||
return true;
|
||||
}
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {
|
||||
// dependences caused by last iteration
|
||||
if (Level < CommonLevels) {
|
||||
Result.DV[Level].Direction &= Dependence::DVEntry::LE;
|
||||
@ -2129,7 +2078,7 @@ bool DependenceInfo::weakZeroDstSIVtest(const SCEV *SrcCoeff,
|
||||
Result.Consistent = false;
|
||||
const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst);
|
||||
LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, DstConst, SrcConst)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, DstConst, SrcConst)) {
|
||||
if (Level < CommonLevels) {
|
||||
Result.DV[Level].Direction &= Dependence::DVEntry::LE;
|
||||
Result.DV[Level].PeelFirst = true;
|
||||
@ -2155,12 +2104,12 @@ bool DependenceInfo::weakZeroDstSIVtest(const SCEV *SrcCoeff,
|
||||
collectUpperBound(CurSrcLoop, Delta->getType())) {
|
||||
LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");
|
||||
const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound);
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {
|
||||
++WeakZeroSIVindependence;
|
||||
++WeakZeroSIVsuccesses;
|
||||
return true;
|
||||
}
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {
|
||||
// dependences caused by last iteration
|
||||
if (Level < CommonLevels) {
|
||||
Result.DV[Level].Direction &= Dependence::DVEntry::GE;
|
||||
@ -2373,7 +2322,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
// make sure that c2 - c1 <= a1*N1
|
||||
const SCEV *A1N1 = SE->getMulExpr(A1, N1);
|
||||
LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -2382,7 +2331,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
// make sure that -a2*N2 <= c2 - c1, or a2*N2 >= c1 - c2
|
||||
const SCEV *A2N2 = SE->getMulExpr(A2, N2);
|
||||
LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SLT, A2N2, C1_C2)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SLT, A2N2, C1_C2)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -2395,7 +2344,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
const SCEV *A2N2 = SE->getMulExpr(A2, N2);
|
||||
const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2);
|
||||
LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1_A2N2)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1_A2N2)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -2415,7 +2364,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
const SCEV *A2N2 = SE->getMulExpr(A2, N2);
|
||||
const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2);
|
||||
LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1_A2N2, C2_C1)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, A1N1_A2N2, C2_C1)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -2431,7 +2380,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
// make sure that a1*N1 <= c2 - c1
|
||||
const SCEV *A1N1 = SE->getMulExpr(A1, N1);
|
||||
LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1, C2_C1)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, A1N1, C2_C1)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -2440,7 +2389,7 @@ bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
|
||||
// make sure that c2 - c1 <= -a2*N2, or c1 - c2 >= a2*N2
|
||||
const SCEV *A2N2 = SE->getMulExpr(A2, N2);
|
||||
LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n");
|
||||
if (isKnownPredicate(CmpInst::ICMP_SLT, C1_C2, A2N2)) {
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SLT, C1_C2, A2N2)) {
|
||||
++SymbolicRDIVindependence;
|
||||
return true;
|
||||
}
|
||||
@ -3018,10 +2967,10 @@ bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level,
|
||||
BoundInfo *Bound, const SCEV *Delta) const {
|
||||
Bound[Level].Direction = DirKind;
|
||||
if (const SCEV *LowerBound = getLowerBound(Bound))
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta))
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta))
|
||||
return false;
|
||||
if (const SCEV *UpperBound = getUpperBound(Bound))
|
||||
if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, UpperBound))
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_SGT, Delta, UpperBound))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@ -3054,10 +3003,10 @@ void DependenceInfo::findBoundsALL(CoefficientInfo *A, CoefficientInfo *B,
|
||||
SE->getMinusSCEV(A[K].PosPart, B[K].NegPart), Bound[K].Iterations);
|
||||
} else {
|
||||
// If the difference is 0, we won't need to know the number of iterations.
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].NegPart, B[K].PosPart))
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, A[K].NegPart, B[K].PosPart))
|
||||
Bound[K].Lower[Dependence::DVEntry::ALL] =
|
||||
SE->getZero(A[K].Coeff->getType());
|
||||
if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].PosPart, B[K].NegPart))
|
||||
if (SE->isKnownPredicate(CmpInst::ICMP_EQ, A[K].PosPart, B[K].NegPart))
|
||||
Bound[K].Upper[Dependence::DVEntry::ALL] =
|
||||
SE->getZero(A[K].Coeff->getType());
|
||||
}
|
||||
|
||||
@ -425,33 +425,19 @@ for.end: ; preds = %for.body
|
||||
;; *B++ = A[i + 2*n];
|
||||
|
||||
define void @strong9(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-ALL-LABEL: 'strong9'
|
||||
; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - confused!
|
||||
; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - confused!
|
||||
; CHECK-ALL-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
;
|
||||
; CHECK-STRONG-SIV-LABEL: 'strong9'
|
||||
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - none!
|
||||
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-STRONG-SIV-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
|
||||
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - none!
|
||||
; CHECK-STRONG-SIV-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - confused!
|
||||
; CHECK-STRONG-SIV-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-STRONG-SIV-NEXT: da analyze - none!
|
||||
; CHECK-LABEL: 'strong9'
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
;
|
||||
entry:
|
||||
%cmp1 = icmp eq i64 %n, 0
|
||||
|
||||
@ -17,7 +17,7 @@ define void @symbolicrdiv0(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
|
||||
@ -86,7 +86,7 @@ define void @symbolicrdiv1(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
|
||||
@ -157,7 +157,7 @@ define void @symbolicrdiv2(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
@ -226,7 +226,7 @@ define void @symbolicrdiv3(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4
|
||||
@ -293,7 +293,7 @@ define void @symbolicrdiv4(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
@ -361,7 +361,7 @@ define void @symbolicrdiv5(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
|
||||
@ -429,7 +429,7 @@ define void @symbolicrdiv6(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ss
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - output [* *]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [* *|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.12, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
|
||||
@ -15,7 +15,7 @@ define void @symbolicsiv0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
@ -67,7 +67,7 @@ define void @symbolicsiv1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
|
||||
@ -121,7 +121,7 @@ define void @symbolicsiv2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
@ -173,7 +173,7 @@ define void @symbolicsiv3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
@ -226,7 +226,7 @@ define void @symbolicsiv4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
|
||||
@ -278,7 +278,7 @@ define void @symbolicsiv5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
; CHECK-NEXT: da analyze - none!
|
||||
; CHECK-NEXT: da analyze - flow [*|<]!
|
||||
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
|
||||
; CHECK-NEXT: da analyze - confused!
|
||||
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
|
||||
|
||||
@ -11,9 +11,6 @@
|
||||
; A[offset] = 1;
|
||||
; }
|
||||
;
|
||||
; FIXME: DependenceAnalysis curently fails to detect a dependency between the
|
||||
; two stores.
|
||||
;
|
||||
; memory access | i == 0 | i == 4
|
||||
; ------------------|--------|---------
|
||||
; A[i] | A[0] |
|
||||
@ -24,7 +21,7 @@ define void @infer_affine_domain_ovfl(ptr %A) {
|
||||
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
; CHECK-ALL-NEXT: da analyze - output [<>]!
|
||||
; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
|
||||
; CHECK-ALL-NEXT: da analyze - none!
|
||||
;
|
||||
|
||||
@ -11,8 +11,8 @@ target triple = "powerpc64le-unknown-linux-gnu"
|
||||
; }
|
||||
; }
|
||||
|
||||
; CHECK: Loop 'for.i' has cost = 20800
|
||||
; CHECK-NEXT: Loop 'for.j' has cost = 1000
|
||||
; CHECK: Loop 'for.i' has cost = 20400
|
||||
; CHECK-NEXT: Loop 'for.j' has cost = 900
|
||||
|
||||
define void @foo(i64 %n, i64 %m, ptr %A, ptr %B, ptr %C) {
|
||||
entry:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user