Skip to content

Commit 9d8c452

Browse files
committed
[DA] Add test where ExactSIV misses dependency due to overflow (NFC)
1 parent 153b37c commit 9d8c452

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll

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

0 commit comments

Comments
 (0)