@@ -807,3 +807,123 @@ for.body: ; preds = %entry, %for.body
807807for.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