[llvm] b6d7afe - [DA] Remove calls to the GCD MIV test from `testSIV` (#187220)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 29 17:59:04 PDT 2026
Author: Ryotaro Kasuga
Date: 2026-03-30T00:58:59Z
New Revision: b6d7afe53465517ed944a43165b6885fab460c4e
URL: https://github.com/llvm/llvm-project/commit/b6d7afe53465517ed944a43165b6885fab460c4e
DIFF: https://github.com/llvm/llvm-project/commit/b6d7afe53465517ed944a43165b6885fab460c4e.diff
LOG: [DA] Remove calls to the GCD MIV test from `testSIV` (#187220)
This patch removes all invocations of the GCD MIV test in `testSIV`
function, specifically:
- If both the source and destination are addrecs, replace the call to
the GCD MIV test with the Exact SIV test. Generally, the Exact SIV test
has a narrower applicability than the GCD MIV test (both the source and
destination must be affine addrecs), while the former likely yields a
more precise result. Therefore, in this case, there's no reason to use
the GCD MIV test. This replacement also means that previously the Exact
SIV test was called conditionally (only when the Strong and Weak
Crossing SIV tests are not applicable), but now it will be called
unconditionally when both the source and destination are addrecs.
- If either the source or the destination is loop-invariant, simply
remove the call to the GCD MIV test without replacing it with anything.
In this case, the Weak Zero SIV test will be invoked, and part of that
test performs almost the same analysis as the GCD MIV test. Therefore,
the GCD MIV test should be redundant in nearly all cases.
This patch introduces two types of changes to the analysis results.
First, it fixes several correctness issues that were caused by defects
in the GCD MIV test. Second, it makes the analysis more precise in some
cases. This improvement comes from the fact that, when both the source
and destination are affine addrecs, the Exact SIV test is now invoked
unconditionally, whereas previously it was only invoked conditionally.
Added:
Modified:
llvm/lib/Analysis/DependenceAnalysis.cpp
llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll
llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll
llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll
llvm/test/Analysis/DependenceAnalysis/rdiv-minor-algebra.ll
llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll
llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-overflow.ll
llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-addrec-wrap.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index 15634c2391255..22dfc8ba8622c 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -2088,27 +2088,23 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
"Loops in the SIV test should have the same iteration space and "
"depth");
Level = mapSrcLoop(CurSrcLoop);
- bool disproven;
+ bool disproven = false;
if (SrcCoeff == DstCoeff)
disproven = strongSIVtest(SrcAddRec, DstAddRec, Level, Result,
UnderRuntimeAssumptions);
else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))
disproven = weakCrossingSIVtest(SrcAddRec, DstAddRec, Level, Result);
- else
- disproven = exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
- return disproven || gcdMIVtest(Src, Dst, Result);
+ return disproven || exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
}
if (SrcAddRec) {
const Loop *CurSrcLoop = SrcAddRec->getLoop();
Level = mapSrcLoop(CurSrcLoop);
- return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result) ||
- gcdMIVtest(Src, Dst, Result);
+ return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result);
}
if (DstAddRec) {
const Loop *CurDstLoop = DstAddRec->getLoop();
Level = mapDstLoop(CurDstLoop);
- return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result) ||
- gcdMIVtest(Src, Dst, Result);
+ return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
}
llvm_unreachable("SIV test expected at least one AddRec");
return false;
diff --git a/llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll b/llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll
index 44a0b69bf21e9..72a928a589d45 100644
--- a/llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/WeakZeroDstSIV.ll
@@ -310,7 +310,7 @@ define void @weakzerodst6(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 - output [*]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, 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 %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
diff --git a/llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll b/llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll
index 5b8cfbb67dcc5..29fe7ef0711bf 100644
--- a/llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/WeakZeroSrcSIV.ll
@@ -308,7 +308,7 @@ define void @weakzerosrc6(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 - output [S]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, 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 %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
diff --git a/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
index 3a5be74f93091..492063c694606 100644
--- a/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/exact-siv-addrec-wrap.ll
@@ -20,25 +20,14 @@
; A[a*i] | | A[14]
; A[5*i + 14] | A[14] |
;
-; FIXME: DependenceAnalysis fails to detect the dependency between the two
-; stores.
-;
define void @exact_siv_no_nsw(ptr %A) {
-; CHECK-ALL-LABEL: 'exact_siv_no_nsw'
-; 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 - output [*]!
-; 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: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - none!
-;
-; CHECK-EXACT-SIV-LABEL: 'exact_siv_no_nsw'
-; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
-; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!
-; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-LABEL: 'exact_siv_no_nsw'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - output [*]!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.header
@@ -68,4 +57,5 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-EXACT-SIV: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll b/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
index e982e113231a5..3a43786691aa3 100644
--- a/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/exact-siv-overflow.ll
@@ -33,11 +33,11 @@ define void @exactsiv_const_ovfl(ptr %A) {
;
; CHECK-EXACT-SIV-LABEL: 'exactsiv_const_ovfl'
; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
entry:
br label %loop.header
diff --git a/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll b/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
index 9e3b5c05ab922..138aab7f5146f 100644
--- a/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/infer_affine_domain_ovlf.ll
@@ -17,21 +17,13 @@
; A[2^61*i - 2^63] | | A[0]
define void @infer_affine_domain_ovfl(ptr %A) {
-; CHECK-ALL-LABEL: 'infer_affine_domain_ovfl'
-; 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 - 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!
-;
-; CHECK-EXACT-SIV-LABEL: 'infer_affine_domain_ovfl'
-; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
-; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!
-; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-LABEL: 'infer_affine_domain_ovfl'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.header
@@ -59,4 +51,5 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-EXACT-SIV: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll b/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll
index 5ae51056e71da..50e001a476501 100644
--- a/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/non-monotonic.ll
@@ -46,7 +46,7 @@ define void @f(ptr %A) {
; DISABLE-CHECK-NEXT: Src: store i8 1, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.0, align 1
; DISABLE-CHECK-NEXT: da analyze - none!
; DISABLE-CHECK-NEXT: Src: store i8 1, ptr %idx.0, align 1 --> Dst: store i8 2, ptr %idx.1, align 1
-; DISABLE-CHECK-NEXT: da analyze - output [<>]!
+; DISABLE-CHECK-NEXT: da analyze - output [*|<]!
; DISABLE-CHECK-NEXT: Src: store i8 2, ptr %idx.1, align 1 --> Dst: store i8 2, ptr %idx.1, align 1
; DISABLE-CHECK-NEXT: da analyze - output [*]!
;
diff --git a/llvm/test/Analysis/DependenceAnalysis/rdiv-minor-algebra.ll b/llvm/test/Analysis/DependenceAnalysis/rdiv-minor-algebra.ll
index 467b36f0e835b..bd39ed65191e4 100644
--- a/llvm/test/Analysis/DependenceAnalysis/rdiv-minor-algebra.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/rdiv-minor-algebra.ll
@@ -30,13 +30,13 @@
; This is unsound.
;
define void @f(ptr %A) {
-; CHECK-ALL-LABEL: 'f'
-; 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 - output [S]!
-; 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: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-LABEL: 'f'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - output [S]!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.i.header
@@ -75,4 +75,4 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll b/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
index 140a914a133ed..f43ff23811350 100644
--- a/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/run-specific-dependence-test.ll
@@ -33,7 +33,7 @@ define void @strong_siv(ptr %a) {
;
; CHECK-EXACT-SIV-LABEL: 'strong_siv'
; CHECK-EXACT-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'strong_siv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep, align 1 --> Dst: store i8 0, ptr %gep, align 1
@@ -97,11 +97,11 @@ define void @weak_crossing_siv(ptr %a) {
;
; CHECK-EXACT-SIV-LABEL: 'weak_crossing_siv'
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!
; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_crossing_siv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -184,11 +184,11 @@ define void @exact_siv(ptr %a) {
;
; CHECK-EXACT-SIV-LABEL: 'exact_siv'
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*|<]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_siv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -210,7 +210,7 @@ define void @exact_siv(ptr %a) {
; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
; CHECK-GCD-MIV-NEXT: da analyze - output [*]!
; CHECK-GCD-MIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-GCD-MIV-NEXT: da analyze - none!
+; CHECK-GCD-MIV-NEXT: da analyze - output [*|<]!
; CHECK-GCD-MIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
; CHECK-GCD-MIV-NEXT: da analyze - output [*]!
;
@@ -276,7 +276,7 @@ define void @weak_zero_siv(ptr %a) {
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_zero_siv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -358,11 +358,11 @@ define void @exact_rdiv(ptr %a) {
;
; CHECK-EXACT-SIV-LABEL: 'exact_rdiv'
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
; CHECK-EXACT-SIV-NEXT: da analyze - output [|<]!
; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'exact_rdiv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
@@ -454,11 +454,11 @@ define void @symbolic_rdiv(ptr %a) {
;
; CHECK-EXACT-SIV-LABEL: 'symbolic_rdiv'
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
; CHECK-EXACT-SIV-NEXT: da analyze - none!
; CHECK-EXACT-SIV-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-EXACT-SIV-NEXT: da analyze - output [*]!
+; CHECK-EXACT-SIV-NEXT: da analyze - none!
;
; CHECK-WEAK-ZERO-SIV-LABEL: 'symbolic_rdiv'
; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
diff --git a/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
index 721fdeeb31624..8ae5305c3b97b 100644
--- a/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/strong-siv-addrec-wrap.ll
@@ -20,25 +20,14 @@
; A[(2^62+1)*i] | | A[4]
; A[(2^62+1)*i + 4] | A[4] |
;
-; FIXME: DependenceAnalysis fails to detect the dependency between the two
-; stores.
-;
define void @strong_siv_no_nsw(ptr %A) {
-; CHECK-ALL-LABEL: 'strong_siv_no_nsw'
-; 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 - output [*]!
-; 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: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - output [*]!
-;
-; CHECK-STRONG-SIV-LABEL: 'strong_siv_no_nsw'
-; CHECK-STRONG-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-STRONG-SIV-NEXT: da analyze - output [*]!
-; CHECK-STRONG-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-STRONG-SIV-NEXT: da analyze - output [*|<]!
-; CHECK-STRONG-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-STRONG-SIV-NEXT: da analyze - output [*]!
+; CHECK-LABEL: 'strong_siv_no_nsw'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - output [*]!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*]!
;
entry:
br label %loop.header
@@ -75,4 +64,5 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-STRONG-SIV: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll
index f46493232f0d8..0f038a436a360 100644
--- a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-addrec-wrap.ll
@@ -17,13 +17,13 @@
; A[32*i + 2^62] | | A[0] | A[2^60 - 32] |
;
define void @symbolic_rdiv_addrec_wrap(ptr %A) {
-; CHECK-ALL-LABEL: 'symbolic_rdiv_addrec_wrap'
-; 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 - 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 - output [*]!
+; CHECK-LABEL: 'symbolic_rdiv_addrec_wrap'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*]!
;
entry:
%tc = shl i64 1, 60
@@ -53,4 +53,4 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-overflow.ll b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-overflow.ll
index 7568e305b6bbe..1432ae80b0403 100644
--- a/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-overflow.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/symbolic-rdiv-overflow.ll
@@ -11,13 +11,13 @@
; There is a dependency between the two stores, for example, each store
; will access A[0] when i is 1 and 0 respectively.
define void @symbolicrdiv_prod_ovfl(ptr %A) {
-; CHECK-ALL-LABEL: 'symbolicrdiv_prod_ovfl'
-; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-ALL-NEXT: da analyze - none!
-; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - output [*|<]!
-; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-LABEL: 'symbolicrdiv_prod_ovfl'
+; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.header
@@ -67,13 +67,13 @@ exit:
; A[-i + 2^62] (offset1) | A[2^61] | | A[2^60]
;
define void @symbolicrdiv_delta_ovfl(ptr %A) {
-; CHECK-ALL-LABEL: 'symbolicrdiv_delta_ovfl'
-; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
-; CHECK-ALL-NEXT: da analyze - none!
-; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - output [*|<]!
-; CHECK-ALL-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-LABEL: 'symbolicrdiv_delta_ovfl'
+; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.0, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 2, ptr %gep.1, align 1 --> Dst: store i8 2, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - none!
;
entry:
br label %loop.header
@@ -110,4 +110,4 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
diff --git a/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-addrec-wrap.ll
index 0235acb8482ae..020f87efc7d0d 100644
--- a/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-addrec-wrap.ll
@@ -19,24 +19,14 @@
; A[-4] | A[-4] | A[-4] | A[-4]
; A[(2^62-1)*i] | | A[-4] |
;
-; FIXME: DependenceAnalysis currently misses the dependency.
-;
define void @weak_zero_src_siv_addrec_wrap(ptr %A, i64 %n) {
-; CHECK-ALL-LABEL: 'weak_zero_src_siv_addrec_wrap'
-; 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 - output [S]!
-; 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: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - output [*]!
-;
-; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_zero_src_siv_addrec_wrap'
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [S]!
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*|<]!
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]!
+; CHECK-LABEL: 'weak_zero_src_siv_addrec_wrap'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - output [S]!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*]!
;
entry:
br label %loop.header
@@ -79,24 +69,14 @@ exit:
; A[(2^62-1)*i] | | A[-4] |
; A[-4] | A[-4] | A[-4] | A[-4]
;
-; FIXME: DependenceAnalysis currently misses the dependency.
-;
define void @weak_zero_dst_siv_addrec_wrap(ptr %A, i64 %n) {
-; CHECK-ALL-LABEL: 'weak_zero_dst_siv_addrec_wrap'
-; 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 - output [*]!
-; 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: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - output [S]!
-;
-; CHECK-WEAK-ZERO-SIV-LABEL: 'weak_zero_dst_siv_addrec_wrap'
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*]!
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [*|<]!
-; CHECK-WEAK-ZERO-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-WEAK-ZERO-SIV-NEXT: da analyze - output [S]!
+; CHECK-LABEL: 'weak_zero_dst_siv_addrec_wrap'
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-NEXT: da analyze - output [*]!
+; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [*|<]!
+; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-NEXT: da analyze - output [S]!
;
entry:
br label %loop.header
@@ -124,4 +104,5 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK: {{.*}}
+; CHECK-ALL: {{.*}}
+; CHECK-WEAK-ZERO-SIV: {{.*}}
More information about the llvm-commits
mailing list