[LV] Add test for incorrect runtime check generation #57315.
authorFlorian Hahn <flo@fhahn.com>
Fri, 26 Aug 2022 15:29:20 +0000 (16:29 +0100)
committerFlorian Hahn <flo@fhahn.com>
Fri, 26 Aug 2022 15:29:20 +0000 (16:29 +0100)
Test for PR57315 based on a test provided by @kpdev42.

llvm/test/Transforms/LoopVectorize/runtime-checks-difference.ll

index e214f04..c68584c 100644 (file)
@@ -171,3 +171,44 @@ loop:
 exit:
   ret void
 }
+
+; FIXME: Full no-overlap checks are required instead of difference checks, as
+; one of the add-recs used is invariant in the inner loop.
+; Test case for PR57315.
+define void @nested_loop_outer_iv_addrec_invariant_in_inner(ptr %a, ptr %b, i64 %n) {
+; CHECK-LABEL: @nested_loop_outer_iv_addrec_invariant_in_inner(
+; CHECK:       entry:
+; CHECK-NEXT:    [[B2:%.*]] = ptrtoint ptr [[B:%.*]] to i64
+; CHECK-NEXT:    [[A1:%.*]] = ptrtoint ptr [[A:%.*]] to i64
+; CHECK:       vector.memcheck:
+; CHECK-NEXT:    [[TMP1:%.*]] = sub i64 [[A1]], [[B2]]
+; CHECK-NEXT:    [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 16
+; CHECK-NEXT:    br i1 [[DIFF_CHECK]], label %scalar.ph, label %vector.ph
+;
+entry:
+  br label %outer.header
+
+outer.header:
+  %outer.iv = phi i64 [ %outer.iv.next, %outer.latch ], [ 0, %entry ]
+  %gep.a = getelementptr inbounds i32, ptr %a, i64 %outer.iv
+  br label %inner.body
+
+inner.body:
+  %red = phi i32 [ 0, %outer.header ], [ %red.next, %inner.body ]
+  %inner.iv = phi i64 [ 0, %outer.header ], [ %inner.iv.next, %inner.body ]
+  %gep.b = getelementptr inbounds i32, ptr %b, i64 %inner.iv
+  %l = load i32, ptr %gep.b, align 4
+  %red.next = sub i32 %red, %l
+  store i32 %red.next, ptr %gep.a, align 4
+  %inner.iv.next = add nuw nsw i64 %inner.iv, 1
+  %inner.cond = icmp eq i64 %inner.iv.next, %n
+  br i1 %inner.cond, label %outer.latch, label %inner.body
+
+outer.latch:
+  %outer.iv.next = add nuw nsw i64 %outer.iv, 1
+  %outer.cond = icmp eq i64 %outer.iv.next, %n
+  br i1 %outer.cond, label %exit, label %outer.header
+
+exit:
+  ret void
+}