summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/LICM/hoist-round.ll61
1 files changed, 61 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LICM/hoist-round.ll b/llvm/test/Transforms/LICM/hoist-round.ll
new file mode 100644
index 00000000000..361b31e3e54
--- /dev/null
+++ b/llvm/test/Transforms/LICM/hoist-round.ll
@@ -0,0 +1,61 @@
+; RUN: opt -S -licm < %s | FileCheck %s
+
+target datalayout = "E-m:e-p:32:32-i8:8:8-i16:16:16-i64:32:32-f64:32:32-v64:32:32-v128:32:32-a0:0:32-n32"
+
+; This test verifies that ceil, floor, nearbyint, trunc, rint, round,
+; copysign, minnum, maxnum and fabs intrinsics are considered safe
+; to speculate.
+
+; CHECK-LABEL: @test
+; CHECK: call float @llvm.ceil.f32
+; CHECK: call float @llvm.floor.f32
+; CHECK: call float @llvm.nearbyint.f32
+; CHECK: call float @llvm.rint.f32
+; CHECK: call float @llvm.round.f32
+; CHECK: call float @llvm.trunc.f32
+; CHECK: call float @llvm.fabs.f32
+; CHECK: call float @llvm.copysign.f32
+; CHECK: call float @llvm.minnum.f32
+; CHECK: call float @llvm.maxnum.f32
+; CHECK: for.body:
+
+define void @test(float %arg1, float %arg2) {
+entry:
+ br label %for.head
+
+for.head:
+ %IND = phi i32 [ 0, %entry ], [ %IND.new, %for.body ]
+ %CMP = icmp slt i32 %IND, 10
+ br i1 %CMP, label %for.body, label %exit
+
+for.body:
+ %tmp.1 = call float @llvm.ceil.f32(float %arg1)
+ %tmp.2 = call float @llvm.floor.f32(float %tmp.1)
+ %tmp.3 = call float @llvm.nearbyint.f32(float %tmp.2)
+ %tmp.4 = call float @llvm.rint.f32(float %tmp.3)
+ %tmp.5 = call float @llvm.round.f32(float %tmp.4)
+ %tmp.6 = call float @llvm.trunc.f32(float %tmp.5)
+ %tmp.7 = call float @llvm.fabs.f32(float %tmp.6)
+ %tmp.8 = call float @llvm.copysign.f32(float %tmp.7, float %arg2)
+ %tmp.9 = call float @llvm.minnum.f32(float %tmp.8, float %arg2)
+ %tmp.10 = call float @llvm.maxnum.f32(float %tmp.9, float %arg2)
+ call void @consume(float %tmp.10)
+ %IND.new = add i32 %IND, 1
+ br label %for.head
+
+exit:
+ ret void
+}
+
+declare void @consume(float)
+
+declare float @llvm.ceil.f32(float)
+declare float @llvm.floor.f32(float)
+declare float @llvm.nearbyint.f32(float)
+declare float @llvm.rint.f32(float)
+declare float @llvm.round.f32(float)
+declare float @llvm.trunc.f32(float)
+declare float @llvm.fabs.f32(float)
+declare float @llvm.copysign.f32(float, float)
+declare float @llvm.minnum.f32(float, float)
+declare float @llvm.maxnum.f32(float, float)
OpenPOWER on IntegriCloud