diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/vec_unsafe-fp-math.ll | 23 |
2 files changed, 25 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 5d95af69fab..a465cdb9725 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6754,8 +6754,8 @@ SDValue DAGCombiner::visitFADD(SDNode *N) { SDValue DAGCombiner::visitFSUB(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); - ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0); - ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); + ConstantFPSDNode *N0CFP = isConstOrConstSplatFP(N0); + ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1); EVT VT = N->getValueType(0); SDLoc dl(N); const TargetOptions &Options = DAG.getTarget().Options; diff --git a/llvm/test/CodeGen/X86/vec_unsafe-fp-math.ll b/llvm/test/CodeGen/X86/vec_unsafe-fp-math.ll new file mode 100644 index 00000000000..827d4184d11 --- /dev/null +++ b/llvm/test/CodeGen/X86/vec_unsafe-fp-math.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -enable-unsafe-fp-math -mtriple=x86_64-unknown-unknown -mcpu=corei7 | FileCheck %s + +; Make sure that vectors get the same benefits as scalars when using unsafe-fp-math. + +; Subtracting zero is free. +define <4 x float> @vec_fsub_zero(<4 x float> %x) { +; CHECK-LABEL: vec_fsub_zero: +; CHECK-NOT: subps +; CHECK-NOT: xorps +; CHECK: retq + %sub = fsub <4 x float> %x, zeroinitializer + ret <4 x float> %sub +} + +; Negating doesn't require subtraction. +define <4 x float> @vec_fneg(<4 x float> %x) { +; CHECK-LABEL: vec_fneg: +; CHECK: xorps {{.*}}LCP{{.*}}, %xmm0 +; CHECK-NOT: subps +; CHECK-NEXT: retq + %sub = fsub <4 x float> zeroinitializer, %x + ret <4 x float> %sub +} |