diff --git a/llvm/test/Transforms/LoopVectorize/X86/interleave-count.ll b/llvm/test/Transforms/LoopVectorize/X86/interleave-count.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/X86/interleave-count.ll @@ -0,0 +1,40 @@ +; REQUIRES: asserts +; +; RUN: opt -S -passes=loop-vectorize -debug-only=loop-vectorize \ +; RUN: -mtriple=x86_64-pc_linux -mcpu=cascadelake \ +; RUN: -force-target-max-vector-interleave=16 -force-target-num-vector-regs=16 \ +; RUN: %s 2>&1 | FileCheck %s + +; Check that the interleave count is limited by 8 even if there is no +; register use except one induction variable. +define void @test(ptr %dst, i64 %size) { +; CHECK-LABEL: LV: Checking a loop in 'test' +; CHECK: LV: IC is 8 +; +; CHECK-LABEL: define void @test +; +; Number of @llvm.masked.scatter() calls is 8. +; CHECK: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NEXT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; CHECK-NOT: call void @llvm.masked.scatter.v4f64.v4p0(<4 x double> +; +entry: + %p.end = getelementptr inbounds double, ptr %dst, i64 %size + br label %loop + +loop: + %p = phi ptr [%dst, %entry], [%p.next, %loop] + store double -1.000000e+00, ptr %p, align 8 + %p.next = getelementptr inbounds double, ptr %p, i64 8 + %done = icmp eq ptr %p.next, %p.end + br i1 %done, label %exit, label %loop + +exit: + ret void +}