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