[DAG] use SDNode flags 'nsz' to enable fadd/fsub with zero folds
authorSanjay Patel <spatel@rotateright.com>
Fri, 21 Oct 2016 14:36:58 +0000 (14:36 +0000)
committerSanjay Patel <spatel@rotateright.com>
Fri, 21 Oct 2016 14:36:58 +0000 (14:36 +0000)
commitcbaba93ce875ffa8ffe60cc5a39bc08ab7336113
tree73619117d269e49983f80c11ea1ea66ab6d51f28
parentc98d99a6003ccf41e72f751adbe31b0c4ec9562b
[DAG] use SDNode flags 'nsz' to enable fadd/fsub with zero folds

As discussed in D24815, let's start the process of killing off the broken fast-math global
state housed in TargetOptions and eliminate the need for function-level fast-math attributes.

Here we enable two similar folds that are possible when we don't care about signed-zero:
fadd nsz x, 0 --> x
fsub nsz 0, x --> -x

Note that although the test cases include a 'sin' function call, I'm side-stepping the
FMF-on-calls question (and lack of support in the DAG) for now. It's not needed for these
tests - isNegatibleForFree/GetNegatedExpression just look through a ISD::FSIN node.

Also, when we create an FNEG node and propagate the Flags of the FSUB to it, this doesn't
actually do anything today because Flags are silently dropped for any node that is not a
binary operator.

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

llvm-svn: 284824
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/X86/negative-sin.ll