diff options
Diffstat (limited to 'llvm/test/Transforms/LoopVectorize')
-rw-r--r-- | llvm/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/llvm/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll b/llvm/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll index 456271ea1aa..f944d1f97da 100644 --- a/llvm/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll +++ b/llvm/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll @@ -29,11 +29,13 @@ target triple = "x86_64-unknown-linux-gnu" ; Verify that store is vectorized as stride-1 memory access. -; CHECK: vector.body: -; CHECK: store <4 x i32> +; CHECK-LABEL: @test_01( +; CHECK-NOT: vector.body: +; This test was originally vectorized, but now SCEV is smart enough to prove +; that its trip count is 1, so it gets ignored by vectorizer. ; Function Attrs: uwtable -define void @test() { +define void @test_01() { br label %.outer ; <label>:1: ; preds = %2 @@ -66,3 +68,41 @@ define void @test() { br i1 undef, label %2, label %._crit_edge.loopexit } +; After trip count is increased, the test gets vectorized. +; CHECK-LABEL: @test_02( +; CHECK: vector.body: +; CHECK: store <4 x i32> + +; Function Attrs: uwtable +define void @test_02() { + br label %.outer + +; <label>:1: ; preds = %2 + ret void + +; <label>:2: ; preds = %._crit_edge.loopexit + %3 = add nsw i32 %.ph, -2 + br i1 undef, label %1, label %.outer + +.outer: ; preds = %2, %0 + %.ph = phi i32 [ %3, %2 ], [ 336, %0 ] + %.ph2 = phi i32 [ 62, %2 ], [ 110, %0 ] + %4 = and i32 %.ph, 30 + %5 = add i32 %.ph2, 1 + br label %6 + +; <label>:6: ; preds = %6, %.outer + %7 = phi i32 [ %5, %.outer ], [ %13, %6 ] + %8 = phi i32 [ %.ph2, %.outer ], [ %7, %6 ] + %9 = add i32 %8, 2 + %10 = zext i32 %9 to i64 + %11 = getelementptr inbounds i32, i32 addrspace(1)* undef, i64 %10 + %12 = ashr i32 undef, %4 + store i32 %12, i32 addrspace(1)* %11, align 4 + %13 = add i32 %7, 1 + %14 = icmp sgt i32 %13, 610 + br i1 %14, label %._crit_edge.loopexit, label %6 + +._crit_edge.loopexit: ; preds = %._crit_edge.loopexit, %6 + br i1 undef, label %2, label %._crit_edge.loopexit +} |