Skip to content

Commit 059708d

Browse files
committed
[DA] Add test where ExactSIV misses dependency due to overflow (NFC)
1 parent 43aa6e2 commit 059708d

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,3 +807,123 @@ for.body: ; preds = %entry, %for.body
807807
for.end: ; preds = %for.body
808808
ret void
809809
}
810+
811+
;; max_i = INT64_MAX/6 // 1537228672809129301
812+
;; for (long long i = 0; i <= max_i; i++) {
813+
;; A[-6*i + INT64_MAX] = 0;
814+
;; if (i)
815+
;; A[3*i - 2] = 1;
816+
;; }
817+
;;
818+
;; FIXME: There is a loop-carried dependency between
819+
;; `A[-6*i + INT64_MAX]` and `A[3*i - 2]`. For example,
820+
;;
821+
;; | memory location | -6*i + INT64_MAX | 3*i - 2
822+
;; |------------------------|------------------------|-----------
823+
;; | A[1] | i = max_i | i = 1
824+
;; | A[4611686018427387901] | i = 768614336404564651 | i = max_i
825+
;;
826+
;; Actually,
827+
;; * 1 = -6*max_i + INT64_MAX = 3*1 - 2
828+
;; * 4611686018427387901 = -6*768614336404564651 + INT64_MAX = 3*max_i - 2
829+
;;
830+
831+
define void @exact14(ptr %A) {
832+
; CHECK-LABEL: 'exact14'
833+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
834+
; CHECK-NEXT: da analyze - none!
835+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
836+
; CHECK-NEXT: da analyze - none!
837+
; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
838+
; CHECK-NEXT: da analyze - none!
839+
;
840+
; CHECK-SIV-ONLY-LABEL: 'exact14'
841+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
842+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
843+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
844+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
845+
; CHECK-SIV-ONLY-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
846+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
847+
;
848+
entry:
849+
br label %loop.header
850+
851+
loop.header:
852+
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
853+
%subscript.0 = phi i64 [ 9223372036854775807, %entry ], [ %subscript.0.next, %loop.latch ]
854+
%subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]
855+
%idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.0
856+
store i8 0, ptr %idx.0
857+
%cond.store = icmp ne i64 %i, 0
858+
br i1 %cond.store, label %if.store, label %loop.latch
859+
860+
if.store:
861+
%idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.1
862+
store i8 1, ptr %idx.1
863+
br label %loop.latch
864+
865+
loop.latch:
866+
%i.inc = add nuw nsw i64 %i, 1
867+
%subscript.0.next = add nsw i64 %subscript.0, -6
868+
%subscript.1.next = add nsw i64 %subscript.1, 3
869+
%exitcond = icmp sgt i64 %i.inc, 1537228672809129301
870+
br i1 %exitcond, label %exit, label %loop.header
871+
872+
exit:
873+
ret void
874+
}
875+
876+
;; A generalized version of @exact14.
877+
;;
878+
;; for (long long i = 0; i <= n / 6; i++) {
879+
;; A[-6*i + n] = 0;
880+
;; if (i)
881+
;; A[3*i - 2] = 1;
882+
;; }
883+
884+
define void @exact15(ptr %A, i64 %n) {
885+
; CHECK-LABEL: 'exact15'
886+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
887+
; CHECK-NEXT: da analyze - none!
888+
; CHECK-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
889+
; CHECK-NEXT: da analyze - output [*|<]!
890+
; CHECK-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
891+
; CHECK-NEXT: da analyze - none!
892+
;
893+
; CHECK-SIV-ONLY-LABEL: 'exact15'
894+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 0, ptr %idx.0, align 1
895+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
896+
; CHECK-SIV-ONLY-NEXT: Src: store i8 0, ptr %idx.0, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
897+
; CHECK-SIV-ONLY-NEXT: da analyze - output [*|<]!
898+
; CHECK-SIV-ONLY-NEXT: Src: store i8 1, ptr %idx.1, align 1 --> Dst: store i8 1, ptr %idx.1, align 1
899+
; CHECK-SIV-ONLY-NEXT: da analyze - none!
900+
;
901+
entry:
902+
%bound = sdiv i64 %n, 6
903+
%guard = icmp sgt i64 %n, 0
904+
br i1 %guard, label %loop.header, label %exit
905+
906+
loop.header:
907+
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
908+
%subscript.0 = phi i64 [ %n, %entry ], [ %subscript.0.next, %loop.latch ]
909+
%subscript.1 = phi i64 [ -2, %entry ], [ %subscript.1.next, %loop.latch ]
910+
%idx.0 = getelementptr inbounds i8, ptr %A, i64 %subscript.0
911+
store i8 0, ptr %idx.0
912+
%cond.store = icmp ne i64 %i, 0
913+
br i1 %cond.store, label %if.store, label %loop.latch
914+
915+
if.store:
916+
%idx.1 = getelementptr inbounds i8, ptr %A, i64 %subscript.1
917+
store i8 1, ptr %idx.1
918+
br label %loop.latch
919+
920+
loop.latch:
921+
%i.inc = add nuw nsw i64 %i, 1
922+
%subscript.0.next = add nsw i64 %subscript.0, -6
923+
%subscript.1.next = add nsw i64 %subscript.1, 3
924+
%exitcond = icmp sgt i64 %i.inc, %bound
925+
br i1 %exitcond, label %exit, label %loop.header
926+
927+
exit:
928+
ret void
929+
}

0 commit comments

Comments
 (0)