Skip to content

Commit 7d510b7

Browse files
authored
[DA] Set Distance to zero when Direction is EQ (#147966)
A Dependence object has two entries: Distance and Direction. The former represents the distance of the dependence, while the latter characterizes the distance by whether the value of it is positive, negative, or zero (especially, zero is represented by EQ in DA). So it is expected that the Distance equals zero iff the Direction is EQ. However, this condition was not satisfied in some cases. This patch adds a logic to set the Distance to zero if the Direction is EQ. Although it is ideal that the Distance is updated to zero simultaneously when the Direction is set to EQ, achieving it would require changing the entire code in DA.
1 parent c0b82df commit 7d510b7

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

llvm/lib/Analysis/DependenceAnalysis.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,20 @@ static void dumpExampleDependence(raw_ostream &OS, DependenceInfo *DA,
187187
OS << " da analyze - ";
188188
if (auto D = DA->depends(&*SrcI, &*DstI,
189189
/*UnderRuntimeAssumptions=*/true)) {
190+
191+
#ifndef NDEBUG
192+
// Verify that the distance being zero is equivalent to the
193+
// direction being EQ.
194+
for (unsigned Level = 1; Level <= D->getLevels(); Level++) {
195+
const SCEV *Distance = D->getDistance(Level);
196+
bool IsDistanceZero = Distance && Distance->isZero();
197+
bool IsDirectionEQ =
198+
D->getDirection(Level) == Dependence::DVEntry::EQ;
199+
assert(IsDistanceZero == IsDirectionEQ &&
200+
"Inconsistent distance and direction.");
201+
}
202+
#endif
203+
190204
// Normalize negative direction vectors if required by clients.
191205
if (NormalizeResults && D->normalize(&SE))
192206
OS << "normalized - ";
@@ -3991,6 +4005,28 @@ DependenceInfo::depends(Instruction *Src, Instruction *Dst,
39914005
if (CompleteLoops[II])
39924006
Result.DV[II - 1].Scalar = false;
39934007

4008+
// Set the distance to zero if the direction is EQ.
4009+
// TODO: Ideally, the distance should be set to 0 immediately simultaneously
4010+
// with the corresponding direction being set to EQ.
4011+
for (unsigned II = 1; II <= Result.getLevels(); ++II) {
4012+
if (Result.getDirection(II) == Dependence::DVEntry::EQ) {
4013+
if (Result.DV[II - 1].Distance == nullptr)
4014+
Result.DV[II - 1].Distance = SE->getZero(SrcSCEV->getType());
4015+
else
4016+
assert(Result.DV[II - 1].Distance->isZero() &&
4017+
"Inconsistency between distance and direction");
4018+
}
4019+
4020+
#ifndef NDEBUG
4021+
// Check that the converse (i.e., if the distance is zero, then the
4022+
// direction is EQ) holds.
4023+
const SCEV *Distance = Result.getDistance(II);
4024+
if (Distance && Distance->isZero())
4025+
assert(Result.getDirection(II) == Dependence::DVEntry::EQ &&
4026+
"Distance is zero, but direction is not EQ");
4027+
#endif
4028+
}
4029+
39944030
if (PossiblyLoopIndependent) {
39954031
// Make sure the LoopIndependent flag is set correctly.
39964032
// All directions must include equal, otherwise no

llvm/test/Analysis/DependenceAnalysis/Banerjee.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ define void @banerjee9(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
802802
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
803803
; CHECK-NEXT: da analyze - output [* *]!
804804
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
805-
; CHECK-NEXT: da analyze - flow [<= =|<]!
805+
; CHECK-NEXT: da analyze - flow [<= 0|<]!
806806
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
807807
; CHECK-NEXT: da analyze - confused!
808808
; CHECK-NEXT: Src: %1 = load i64, ptr %arrayidx7, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
@@ -816,7 +816,7 @@ define void @banerjee9(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
816816
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
817817
; NORMALIZE-NEXT: da analyze - output [* *]!
818818
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
819-
; NORMALIZE-NEXT: da analyze - flow [<= =|<]!
819+
; NORMALIZE-NEXT: da analyze - flow [<= 0|<]!
820820
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
821821
; NORMALIZE-NEXT: da analyze - confused!
822822
; NORMALIZE-NEXT: Src: %1 = load i64, ptr %arrayidx7, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
@@ -830,7 +830,7 @@ define void @banerjee9(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
830830
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
831831
; DELIN-NEXT: da analyze - output [* *]!
832832
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
833-
; DELIN-NEXT: da analyze - flow [<= =|<]!
833+
; DELIN-NEXT: da analyze - flow [<= 0|<]!
834834
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
835835
; DELIN-NEXT: da analyze - confused!
836836
; DELIN-NEXT: Src: %1 = load i64, ptr %arrayidx7, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
@@ -888,7 +888,7 @@ define void @banerjee10(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
888888
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
889889
; CHECK-NEXT: da analyze - none!
890890
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
891-
; CHECK-NEXT: da analyze - flow [<> =]!
891+
; CHECK-NEXT: da analyze - flow [<> 0]!
892892
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
893893
; CHECK-NEXT: da analyze - confused!
894894
; CHECK-NEXT: Src: %1 = load i64, ptr %arrayidx6, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
@@ -902,7 +902,7 @@ define void @banerjee10(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
902902
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
903903
; NORMALIZE-NEXT: da analyze - none!
904904
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
905-
; NORMALIZE-NEXT: da analyze - flow [<> =]!
905+
; NORMALIZE-NEXT: da analyze - flow [<> 0]!
906906
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
907907
; NORMALIZE-NEXT: da analyze - confused!
908908
; NORMALIZE-NEXT: Src: %1 = load i64, ptr %arrayidx6, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
@@ -916,7 +916,7 @@ define void @banerjee10(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
916916
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
917917
; DELIN-NEXT: da analyze - none!
918918
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
919-
; DELIN-NEXT: da analyze - flow [<> =]!
919+
; DELIN-NEXT: da analyze - flow [<> 0]!
920920
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
921921
; DELIN-NEXT: da analyze - confused!
922922
; DELIN-NEXT: Src: %1 = load i64, ptr %arrayidx6, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
@@ -1058,7 +1058,7 @@ define void @banerjee12(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
10581058
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
10591059
; CHECK-NEXT: da analyze - none!
10601060
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
1061-
; CHECK-NEXT: da analyze - flow [= <>]!
1061+
; CHECK-NEXT: da analyze - flow [0 <>]!
10621062
; CHECK-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
10631063
; CHECK-NEXT: da analyze - confused!
10641064
; CHECK-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
@@ -1072,7 +1072,7 @@ define void @banerjee12(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
10721072
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
10731073
; NORMALIZE-NEXT: da analyze - none!
10741074
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
1075-
; NORMALIZE-NEXT: da analyze - flow [= <>]!
1075+
; NORMALIZE-NEXT: da analyze - flow [0 <>]!
10761076
; NORMALIZE-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
10771077
; NORMALIZE-NEXT: da analyze - confused!
10781078
; NORMALIZE-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
@@ -1086,7 +1086,7 @@ define void @banerjee12(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
10861086
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
10871087
; DELIN-NEXT: da analyze - none!
10881088
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
1089-
; DELIN-NEXT: da analyze - flow [= <>]!
1089+
; DELIN-NEXT: da analyze - flow [0 <>]!
10901090
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
10911091
; DELIN-NEXT: da analyze - confused!
10921092
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8

llvm/test/Analysis/DependenceAnalysis/Coupled.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ define void @couple6(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
285285
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx1, align 4 --> Dst: store i32 %conv, ptr %arrayidx1, align 4
286286
; CHECK-NEXT: da analyze - none!
287287
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
288-
; CHECK-NEXT: da analyze - flow [=|<]!
288+
; CHECK-NEXT: da analyze - flow [0|<]!
289289
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
290290
; CHECK-NEXT: da analyze - confused!
291291
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
@@ -503,7 +503,7 @@ define void @couple11(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
503503
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %conv, ptr %arrayidx2, align 4
504504
; CHECK-NEXT: da analyze - none!
505505
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
506-
; CHECK-NEXT: da analyze - flow [=|<] splitable!
506+
; CHECK-NEXT: da analyze - flow [0|<] splitable!
507507
; CHECK-NEXT: da analyze - split level = 1, iteration = 9!
508508
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
509509
; CHECK-NEXT: da analyze - confused!
@@ -636,7 +636,7 @@ define void @couple14(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
636636
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx3, align 4 --> Dst: store i32 %conv, ptr %arrayidx3, align 4
637637
; CHECK-NEXT: da analyze - none!
638638
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4
639-
; CHECK-NEXT: da analyze - flow [=|<]!
639+
; CHECK-NEXT: da analyze - flow [0|<]!
640640
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
641641
; CHECK-NEXT: da analyze - confused!
642642
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4

llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ define void @i32_subscript(ptr %a, ptr %b) {
1818
; CHECK-NEXT: Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: %0 = load i32, ptr %a.addr, align 4
1919
; CHECK-NEXT: da analyze - none!
2020
; CHECK-NEXT: Src: %0 = load i32, ptr %a.addr, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4
21-
; CHECK-NEXT: da analyze - anti [=|<]!
21+
; CHECK-NEXT: da analyze - anti [0|<]!
2222
; CHECK-NEXT: Src: store i32 %1, ptr %a.addr.2, align 4 --> Dst: store i32 %1, ptr %a.addr.2, align 4
2323
; CHECK-NEXT: da analyze - none!
2424
;

0 commit comments

Comments
 (0)