|
1 |
| -; RUN: opt -S < %s -p loop-vectorize,'print<loops>' -disable-output -enable-early-exit-vectorization 2>&1 | FileCheck %s |
| 1 | +; RUN: opt -S < %s -passes='loop-vectorize,verify<loops>,print<loops>' -disable-output -enable-early-exit-vectorization 2>&1 | FileCheck %s |
2 | 2 |
|
3 | 3 | declare void @init_mem(ptr, i64);
|
4 | 4 |
|
@@ -89,3 +89,32 @@ loop.outer.latch:
|
89 | 89 | %count.outer.next = add i64 %count.outer, %t
|
90 | 90 | br label %loop.outer
|
91 | 91 | }
|
| 92 | + |
| 93 | +define i32 @early_exit_branch_to_outer_header() { |
| 94 | +; CHECK-LABEL: Loop info for function 'early_exit_branch_to_outer_header': |
| 95 | +; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%loop.header,%loop.latch<exiting>,%outer.header.loopexit<latch>,%scalar.ph,%vector.ph,%vector.body,%middle.split,%middle.block<exiting>,%vector.early.exit |
| 96 | +; CHECK-NEXT: Loop at depth 2 containing: %loop.header<header><exiting>,%loop.latch<latch><exiting> |
| 97 | +; CHECK-NEXT: Loop at depth 2 containing: %vector.body<header><latch><exiting> |
| 98 | +entry: |
| 99 | + %src = alloca [1024 x i8] |
| 100 | + call void @init_mem(ptr %src, i64 1024) |
| 101 | + br label %outer.header |
| 102 | + |
| 103 | +outer.header: |
| 104 | + br label %loop.header |
| 105 | + |
| 106 | +loop.header: |
| 107 | + %iv = phi i64 [ 0, %outer.header ], [ %iv.next, %loop.latch ] |
| 108 | + %gep.src = getelementptr i8, ptr %src, i64 %iv |
| 109 | + %l = load i8, ptr %gep.src, align 1 |
| 110 | + %c = icmp eq i8 %l, 0 |
| 111 | + br i1 %c, label %outer.header, label %loop.latch |
| 112 | + |
| 113 | +loop.latch: |
| 114 | + %iv.next = add i64 %iv, 1 |
| 115 | + %ec = icmp eq i64 %iv.next, 1024 |
| 116 | + br i1 %ec, label %exit, label %loop.header |
| 117 | + |
| 118 | +exit: |
| 119 | + ret i32 1 |
| 120 | +} |
0 commit comments