diff options
| -rw-r--r-- | llvm/test/Transforms/LICM/assume.ll | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LICM/assume.ll b/llvm/test/Transforms/LICM/assume.ll index 098f9480bb1..ee48f767ff6 100644 --- a/llvm/test/Transforms/LICM/assume.ll +++ b/llvm/test/Transforms/LICM/assume.ll @@ -51,4 +51,49 @@ loop: br label %loop } +; Can't hoist because the call may throw and the assume +; may never execute. +define void @f_2(i1 %cond, i32* %ptr) { +; CHECK-LABEL: @f_2( +; CHECK-LABEL: entry: +; CHECK-LABEL: loop: +; CHECK: call void @llvm.assume(i1 %cond) +; CHECK: %val = load i32, i32* %ptr + +entry: + br label %loop + +loop: + %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ] + call void @maythrow() + call void @llvm.assume(i1 %cond) + %val = load i32, i32* %ptr + %x.inc = add i32 %x, %val + br label %loop +} + +; Note: resulting loop could be peeled and then hoisted, but +; by default assume is captured in phi cycle. +define void @f_3(i1 %cond, i32* %ptr) { +; CHECK-LABEL: @f_3( +; CHECK-LABEL: entry: +; CHECK: %val = load i32, i32* %ptr +; CHECK-LABEL: loop: +; CHECK: call void @llvm.assume(i1 %x.cmp) + +entry: + br label %loop + +loop: + %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ] + %x.cmp = phi i1 [%cond, %entry], [%cond.next, %loop] + call void @llvm.assume(i1 %x.cmp) + %val = load i32, i32* %ptr + %cond.next = icmp eq i32 %val, 5 + %x.inc = add i32 %x, %val + br label %loop +} + + +declare void @maythrow() declare void @llvm.assume(i1) |

