diff options
Diffstat (limited to 'llvm/test/Transforms/LICM/preheader-safe.ll')
-rw-r--r-- | llvm/test/Transforms/LICM/preheader-safe.ll | 151 |
1 files changed, 0 insertions, 151 deletions
diff --git a/llvm/test/Transforms/LICM/preheader-safe.ll b/llvm/test/Transforms/LICM/preheader-safe.ll deleted file mode 100644 index 03a7258df11..00000000000 --- a/llvm/test/Transforms/LICM/preheader-safe.ll +++ /dev/null @@ -1,151 +0,0 @@ -; RUN: opt -S -licm < %s | FileCheck %s -; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop(licm)' -S %s | FileCheck %s - -declare void @use_nothrow(i64 %a) nounwind -declare void @use(i64 %a) -declare void @maythrow() - -define void @nothrow(i64 %x, i64 %y, i1* %cond) { -; CHECK-LABEL: nothrow -; CHECK-LABEL: entry -; CHECK: %div = udiv i64 %x, %y -; CHECK-LABEL: loop -; CHECK: call void @use_nothrow(i64 %div) -entry: - br label %loop - -loop: ; preds = %entry, %for.inc - %div = udiv i64 %x, %y - br label %loop2 - -loop2: - call void @use_nothrow(i64 %div) - br label %loop -} - -; The udiv is guarantee to execute if the loop is -define void @throw_header_after(i64 %x, i64 %y, i1* %cond) { -; CHECK-LABEL: throw_header_after -; CHECK: %div = udiv i64 %x, %y -; CHECK-LABEL: loop -; CHECK: call void @use(i64 %div) -entry: - br label %loop - -loop: ; preds = %entry, %for.inc - %div = udiv i64 %x, %y - call void @use(i64 %div) - br label %loop -} -define void @throw_header_after_rec(i64* %xp, i64* %yp, i1* %cond) { -; CHECK-LABEL: throw_header_after_rec -; CHECK: %x = load i64, i64* %xp -; CHECK: %y = load i64, i64* %yp -; CHECK: %div = udiv i64 %x, %y -; CHECK-LABEL: loop -; CHECK: call void @use(i64 %div) -entry: - br label %loop - -loop: ; preds = %entry, %for.inc - %x = load i64, i64* %xp - %y = load i64, i64* %yp - %div = udiv i64 %x, %y - call void @use(i64 %div) readonly - br label %loop -} - -; Similiar to the above, but the hoistable instruction (%y in this case) -; happens not to be the first instruction in the block. -define void @throw_header_after_nonfirst(i64* %xp, i64* %yp, i1* %cond) { -; CHECK-LABEL: throw_header_after_nonfirst -; CHECK: %y = load i64, i64* %yp -; CHECK-LABEL: loop -; CHECK: %x = load i64, i64* %gep -; CHECK: %div = udiv i64 %x, %y -; CHECK: call void @use(i64 %div) -entry: - br label %loop - -loop: ; preds = %entry, %for.inc - %iv = phi i64 [0, %entry], [%div, %loop] - %gep = getelementptr i64, i64* %xp, i64 %iv - %x = load i64, i64* %gep - %y = load i64, i64* %yp - %div = udiv i64 %x, %y - call void @use(i64 %div) readonly - br label %loop -} - -; Negative test -define void @throw_header_before(i64 %x, i64 %y, i1* %cond) { -; CHECK-LABEL: throw_header_before -; CHECK-LABEL: loop -; CHECK: %div = udiv i64 %x, %y -; CHECK: call void @use(i64 %div) -entry: - br label %loop - -loop: ; preds = %entry, %for.inc - call void @maythrow() - %div = udiv i64 %x, %y - call void @use(i64 %div) - br label %loop -} - -; The header is known no throw, but the loop is not. We can -; still lift out of the header. -define void @nothrow_header(i64 %x, i64 %y, i1 %cond) { -; CHECK-LABEL: nothrow_header -; CHECK-LABEL: entry -; CHECK: %div = udiv i64 %x, %y -; CHECK-LABEL: loop - ; CHECK: call void @use(i64 %div) -entry: - br label %loop -loop: ; preds = %entry, %for.inc - %div = udiv i64 %x, %y - br i1 %cond, label %loop-if, label %exit -loop-if: - call void @use(i64 %div) - br label %loop -exit: - ret void -} - -; Positive test - can hoist something that happens before thrower. -define void @nothrow_header_pos(i64 %x, i64 %y, i1 %cond) { -; CHECK-LABEL: nothrow_header_pos -; CHECK-LABEL: entry -; CHECK: %div = udiv i64 %x, %y -; CHECK-LABEL: loop -; CHECK: call void @use(i64 %div) -entry: - br label %loop -loop: ; preds = %entry, %for.inc - br label %loop-if -loop-if: - %div = udiv i64 %x, %y - call void @use(i64 %div) - br label %loop -} - - -; Negative test - can't move out of throwing block -define void @nothrow_header_neg(i64 %x, i64 %y, i1 %cond) { -; CHECK-LABEL: nothrow_header_neg -; CHECK-LABEL: entry -; CHECK-LABEL: loop -; CHECK: call void @maythrow() -; CHECK: %div = udiv i64 %x, %y -; CHECK: call void @use(i64 %div) -entry: - br label %loop -loop: ; preds = %entry, %for.inc - br label %loop-if -loop-if: - call void @maythrow() - %div = udiv i64 %x, %y - call void @use(i64 %div) - br label %loop -} |