summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorSilviu Baranga <silviu.baranga@arm.com>2016-04-22 11:21:36 +0000
committerSilviu Baranga <silviu.baranga@arm.com>2016-04-22 11:21:36 +0000
commite985c76b905129cf083d0894694eaef3362a2555 (patch)
tree6832f09d3cffa479ea56ec3f8d8165feec4bc083 /llvm/test/Transforms
parent55609982503543eefc7347273e71290fe5d14ebf (diff)
downloadbcm5719-llvm-e985c76b905129cf083d0894694eaef3362a2555.tar.gz
bcm5719-llvm-e985c76b905129cf083d0894694eaef3362a2555.zip
[InstCombine] Preserve fast math flags when combining PHIs
Summary: When optimizing PHIs which have inputs floating point binary operators, we preserve all IR flags except the fast math flags. This change removes the logic which tracked some of the IR flags (no wrap, exact) and replaces it by doing an and on the IR flags of all inputs to the PHI - which will also handle the fast math flags. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D19370 llvm-svn: 267139
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll89
1 files changed, 89 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll b/llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll
new file mode 100644
index 00000000000..6e3ae8087cb
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll
@@ -0,0 +1,89 @@
+; RUN: opt < %s -instcombine -S -o - | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+
+; CHECK-LABEL: define float @func1(
+define float @func1(float %a, float %b, float %c, i1 %cond) {
+entry:
+ br i1 %cond, label %cond.true, label %cond.false
+
+cond.true:
+ %sub0 = fsub fast float %a, %b
+ br label %cond.end
+
+cond.false:
+ %sub1 = fsub fast float %a, %c
+ br label %cond.end
+
+; The fast-math flags should always be transfered if possible.
+; CHECK-LABEL: cond.end
+; CHECK [[PHI:%[^ ]*]] = phi float [ %b, %cond.true ], [ %c, %cond.false ]
+; CHECK fsub fast float %a, [[PHI]]
+cond.end:
+ %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
+ ret float %e
+}
+
+; CHECK-LABEL: define float @func2(
+define float @func2(float %a, float %b, float %c, i1 %cond) {
+entry:
+ br i1 %cond, label %cond.true, label %cond.false
+
+cond.true:
+ %sub0 = fsub fast float %a, %b
+ br label %cond.end
+
+cond.false:
+ %sub1 = fsub float %a, %c
+ br label %cond.end
+
+; The fast-math flags should always be transfered if possible.
+; CHECK-LABEL: cond.end
+; CHECK [[PHI:%[^ ]*]] = phi float [ %b, %cond.true ], [ %c, %cond.false ]
+; CHECK fsub float %a, [[PHI]]
+cond.end:
+ %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
+ ret float %e
+}
+
+; CHECK-LABEL: define float @func3(
+define float @func3(float %a, float %b, float %c, i1 %cond) {
+entry:
+ br i1 %cond, label %cond.true, label %cond.false
+
+cond.true:
+ %sub0 = fsub fast float %a, 2.0
+ br label %cond.end
+
+cond.false:
+ %sub1 = fsub fast float %b, 2.0
+ br label %cond.end
+
+; CHECK-LABEL: cond.end
+; CHECK [[PHI:%[^ ]*]] = phi float [ %a, %cond.true ], [ %b, %cond.false ]
+; CHECK fadd fast float %a, [[PHI]]
+cond.end:
+ %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
+ ret float %e
+}
+
+; CHECK-LABEL: define float @func4(
+define float @func4(float %a, float %b, float %c, i1 %cond) {
+entry:
+ br i1 %cond, label %cond.true, label %cond.false
+
+cond.true:
+ %sub0 = fsub fast float %a, 2.0
+ br label %cond.end
+
+cond.false:
+ %sub1 = fsub float %b, 2.0
+ br label %cond.end
+
+; CHECK-LABEL: cond.end
+; CHECK [[PHI:%[^ ]*]] = phi float [ %a, %cond.true ], [ %b, %cond.false ]
+; CHECK fadd float %a, [[PHI]]
+cond.end:
+ %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
+ ret float %e
+}
OpenPOWER on IntegriCloud