diff options
| author | Philip Reames <listmail@philipreames.com> | 2018-08-09 04:21:02 +0000 |
|---|---|---|
| committer | Philip Reames <listmail@philipreames.com> | 2018-08-09 04:21:02 +0000 |
| commit | 954eab1087ea48b6276ceb4d6d44425c715c3834 (patch) | |
| tree | fb4e9a6f4ba0b80d10bbedd2e4b85eb1d98f63d2 | |
| parent | 3f270336e1c4e69ead7d7f78e3d2f9c1d859f40d (diff) | |
| download | bcm5719-llvm-954eab1087ea48b6276ceb4d6d44425c715c3834.tar.gz bcm5719-llvm-954eab1087ea48b6276ceb4d6d44425c715c3834.zip | |
[LICM] Add tests for future hoisting of fence instructions [NFC]
The main interesting case is a fence in an otherwise dead loop or one containing only arithmetic. This can happen as a result of DSE or other transforms from seemingly reasonable initial IR.
llvm-svn: 339310
| -rw-r--r-- | llvm/test/Transforms/LICM/fence.ll | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LICM/fence.ll b/llvm/test/Transforms/LICM/fence.ll new file mode 100644 index 00000000000..1240f1e1e08 --- /dev/null +++ b/llvm/test/Transforms/LICM/fence.ll @@ -0,0 +1,118 @@ +; RUN: opt -licm -basicaa < %s -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 + +define void @test1(i64 %n) { +; CHECK-LABEL: @test1 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence release + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @test2(i64 %n) { +; CHECK-LABEL: @test2 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence acquire + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @test3(i64 %n) { +; CHECK-LABEL: @test3 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence acq_rel + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @test4(i64 %n) { +; CHECK-LABEL: @test4 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence seq_cst + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @testneg1(i64 %n, i64* %p) { +; CHECK-LABEL: @testneg1 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + store i64 %iv, i64* %p + fence release + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @testneg2(i64* %p) { +; CHECK-LABEL: @testneg2 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence acquire + %n = load i64, i64* %p + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + +define void @testfp1(i64 %n, i64* %p) { +; CHECK-LABEL: @testfp1 +; CHECK-LABEL: loop: +; CHECK: fence +entry: + br label %loop +loop: + %iv = phi i64 [0, %entry], [%iv.next, %loop] + fence release + fence release + %iv.next = add i64 %iv, 1 + %test = icmp slt i64 %iv, %n + br i1 %test, label %loop, label %exit +exit: + ret void +} + |

