[llvm] r334037 - guard fneg with fmf sub flags

Michael Berg via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 5 11:49:48 PDT 2018


Author: mcberg2017
Date: Tue Jun  5 11:49:47 2018
New Revision: 334037

URL: http://llvm.org/viewvc/llvm-project?rev=334037&view=rev
Log:
guard fneg with fmf sub flags

Summary: This change uses fmf subflags to guard optimizations as well as unsafe. These changes originated from D46483.

Reviewers: spatel, hfinkel

Reviewed By: spatel

Subscribers: nemanjai

Differential Revision: https://reviews.llvm.org/D47389

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
    llvm/trunk/test/CodeGen/PowerPC/fmf-propagation.ll

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=334037&r1=334036&r2=334037&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Jun  5 11:49:47 2018
@@ -4049,10 +4049,10 @@ SDValue SelectionDAG::getNode(unsigned O
     break;
   case ISD::FNEG:
     // -(X-Y) -> (Y-X) is unsafe because when X==Y, -0.0 != +0.0
-    if (getTarget().Options.UnsafeFPMath && OpOpcode == ISD::FSUB)
-      // FIXME: FNEG has no fast-math-flags to propagate; use the FSUB's flags?
+    if ((getTarget().Options.UnsafeFPMath || Flags.hasNoSignedZeros()) &&
+        OpOpcode == ISD::FSUB)
       return getNode(ISD::FSUB, DL, VT, Operand.getOperand(1),
-                     Operand.getOperand(0), Operand.getNode()->getFlags());
+                     Operand.getOperand(0), Flags);
     if (OpOpcode == ISD::FNEG)  // --X -> X
       return Operand.getOperand(0);
     break;

Modified: llvm/trunk/test/CodeGen/PowerPC/fmf-propagation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/fmf-propagation.ll?rev=334037&r1=334036&r2=334037&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/fmf-propagation.ll (original)
+++ llvm/trunk/test/CodeGen/PowerPC/fmf-propagation.ll Tue Jun  5 11:49:47 2018
@@ -460,28 +460,25 @@ define double @log2_approx(double %x) no
 ; -(X - Y) --> (Y - X)
 
 ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fneg_fsub_nozeros_1:'
-; FMFDEBUG:         fsub {{t[0-9]+}}, {{t[0-9]+}}
+; FMFDEBUG:         fsub nsz {{t[0-9]+}}, {{t[0-9]+}}
 ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fneg_fsub_nozeros_1:'
 
 ; GLOBALDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fneg_fsub_nozeros_1:'
-; GLOBALDEBUG:         fsub {{t[0-9]+}}, {{t[0-9]+}}
+; GLOBALDEBUG:         fsub nsz {{t[0-9]+}}, {{t[0-9]+}}
 ; GLOBALDEBUG:       Type-legalized selection DAG: %bb.0 'fneg_fsub_nozeros_1:'
 
 define float @fneg_fsub_nozeros_1(float %x, float %y, float %z) {
 ; FMF-LABEL: fneg_fsub_nozeros_1:
 ; FMF:       # %bb.0:
-; FMF-NEXT:    xssubsp 0, 1, 2
-; FMF-NEXT:    xxlxor 13, 13, 13
-; FMF-NEXT:    xssubsp 1, 13, 0
+; FMF-NEXT:    xssubsp 1, 2, 1
 ; FMF-NEXT:    blr
 ;
 ; GLOBAL-LABEL: fneg_fsub_nozeros_1:
 ; GLOBAL:       # %bb.0:
-; GLOBAL-NEXT:    xssubsp 0, 1, 2
-; GLOBAL-NEXT:    xxlxor 13, 13, 13
-; GLOBAL-NEXT:    xssubsp 1, 13, 0
+; GLOBAL-NEXT:    xssubsp 1, 2, 1
 ; GLOBAL-NEXT:    blr
   %neg = fsub float %x, %y
-  %add = fsub float 0.0, %neg
+  %add = fsub nsz float 0.0, %neg
   ret float %add
 }
+




More information about the llvm-commits mailing list