summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2019-05-06 20:34:05 +0000
committerSanjay Patel <spatel@rotateright.com>2019-05-06 20:34:05 +0000
commita6019d51649973c88dc5953d98a46a964768deb2 (patch)
tree65f0732d13f403fa07850245519b622dbd7fc0c7 /llvm/test/Transforms
parent2d2277f5e7ce8b2836e4a5a393a2c4da26c2e439 (diff)
downloadbcm5719-llvm-a6019d51649973c88dc5953d98a46a964768deb2.tar.gz
bcm5719-llvm-a6019d51649973c88dc5953d98a46a964768deb2.zip
[InstCombine] sink FP negation of operands through select
We don't always get this: Cond ? -X : -Y --> -(Cond ? X : Y) ...even with the legacy IR form of fneg in the case with extra uses, and we miss matching with the newer 'fneg' instruction because we are expecting binops through the rest of the path. Differential Revision: https://reviews.llvm.org/D61604 llvm-svn: 360075
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/fneg.ll17
1 files changed, 8 insertions, 9 deletions
diff --git a/llvm/test/Transforms/InstCombine/fneg.ll b/llvm/test/Transforms/InstCombine/fneg.ll
index 4a5f033629d..9c4e72f5f06 100644
--- a/llvm/test/Transforms/InstCombine/fneg.ll
+++ b/llvm/test/Transforms/InstCombine/fneg.ll
@@ -161,9 +161,8 @@ define <4 x double> @fdiv_op0_constant_fneg_vec(<4 x double> %x) {
define <2 x double> @fneg_fneg_sel(<2 x double> %x, <2 x double> %y, i1 %cond) {
; CHECK-LABEL: @fneg_fneg_sel(
-; CHECK-NEXT: [[N1:%.*]] = fneg <2 x double> [[X:%.*]]
-; CHECK-NEXT: [[N2:%.*]] = fneg <2 x double> [[Y:%.*]]
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], <2 x double> [[N1]], <2 x double> [[N2]]
+; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[COND:%.*]], <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]
+; CHECK-NEXT: [[SEL:%.*]] = fneg <2 x double> [[SEL_V]]
; CHECK-NEXT: ret <2 x double> [[SEL]]
;
%n1 = fneg <2 x double> %x
@@ -178,8 +177,8 @@ define float @fneg_fneg_sel_extra_use1(float %x, float %y, i1 %cond) {
; CHECK-LABEL: @fneg_fneg_sel_extra_use1(
; CHECK-NEXT: [[N1:%.*]] = fneg float [[X:%.*]]
; CHECK-NEXT: call void @use(float [[N1]])
-; CHECK-NEXT: [[N2:%.*]] = fneg float [[Y:%.*]]
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], float [[N1]], float [[N2]]
+; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[COND:%.*]], float [[X]], float [[Y:%.*]]
+; CHECK-NEXT: [[SEL:%.*]] = fneg float [[SEL_V]]
; CHECK-NEXT: ret float [[SEL]]
;
%n1 = fneg float %x
@@ -191,10 +190,10 @@ define float @fneg_fneg_sel_extra_use1(float %x, float %y, i1 %cond) {
define float @fneg_fneg_sel_extra_use2(float %x, float %y, i1 %cond) {
; CHECK-LABEL: @fneg_fneg_sel_extra_use2(
-; CHECK-NEXT: [[N1:%.*]] = fneg float [[X:%.*]]
; CHECK-NEXT: [[N2:%.*]] = fneg float [[Y:%.*]]
; CHECK-NEXT: call void @use(float [[N2]])
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], float [[N1]], float [[N2]]
+; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[COND:%.*]], float [[X:%.*]], float [[Y]]
+; CHECK-NEXT: [[SEL:%.*]] = fneg float [[SEL_V]]
; CHECK-NEXT: ret float [[SEL]]
;
%n1 = fneg float %x
@@ -210,8 +209,8 @@ define float @fsub_fsub_sel_extra_use1(float %x, float %y, i1 %cond) {
; CHECK-LABEL: @fsub_fsub_sel_extra_use1(
; CHECK-NEXT: [[N1:%.*]] = fsub float -0.000000e+00, [[X:%.*]]
; CHECK-NEXT: call void @use(float [[N1]])
-; CHECK-NEXT: [[N2:%.*]] = fsub float -0.000000e+00, [[Y:%.*]]
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], float [[N1]], float [[N2]]
+; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[COND:%.*]], float [[X]], float [[Y:%.*]]
+; CHECK-NEXT: [[SEL:%.*]] = fsub float -0.000000e+00, [[SEL_V]]
; CHECK-NEXT: ret float [[SEL]]
;
%n1 = fsub float -0.0, %x
OpenPOWER on IntegriCloud