diff options
author | Adam Nemet <anemet@apple.com> | 2017-03-28 23:46:08 +0000 |
---|---|---|
committer | Adam Nemet <anemet@apple.com> | 2017-03-28 23:46:08 +0000 |
commit | 6820f391eba0beb7d0da48c3a3a746ac19bba4d9 (patch) | |
tree | af26dec76b1cba46b61087ab1d00b20675feaa27 | |
parent | 192d8520dea72472d70096c7b1e1e2a5875ccf82 (diff) | |
download | bcm5719-llvm-6820f391eba0beb7d0da48c3a3a746ac19bba4d9.tar.gz bcm5719-llvm-6820f391eba0beb7d0da48c3a3a746ac19bba4d9.zip |
[SDAG] Add AllowContract to SNodeFlags
Properly propagate the FMF from the LLVM IR to this flag.
This is toward moving fp-contraction=fast from an LLVM TargetOption to a
FastMathFlag in order to fix PR25721.
Differential Revision: https://reviews.llvm.org/D31165
llvm-svn: 298961
-rw-r--r-- | llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index 9295702e389..06148070c81 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -350,13 +350,15 @@ private: bool NoSignedZeros : 1; bool AllowReciprocal : 1; bool VectorReduction : 1; + bool AllowContract : 1; public: /// Default constructor turns off all optimization flags. SDNodeFlags() : NoUnsignedWrap(false), NoSignedWrap(false), Exact(false), UnsafeAlgebra(false), NoNaNs(false), NoInfs(false), - NoSignedZeros(false), AllowReciprocal(false), VectorReduction(false) {} + NoSignedZeros(false), AllowReciprocal(false), VectorReduction(false), + AllowContract(false) {} // These are mutators for each flag. void setNoUnsignedWrap(bool b) { NoUnsignedWrap = b; } @@ -368,6 +370,7 @@ public: void setNoSignedZeros(bool b) { NoSignedZeros = b; } void setAllowReciprocal(bool b) { AllowReciprocal = b; } void setVectorReduction(bool b) { VectorReduction = b; } + void setAllowContract(bool b) { AllowContract = b; } // These are accessors for each flag. bool hasNoUnsignedWrap() const { return NoUnsignedWrap; } @@ -379,6 +382,7 @@ public: bool hasNoSignedZeros() const { return NoSignedZeros; } bool hasAllowReciprocal() const { return AllowReciprocal; } bool hasVectorReduction() const { return VectorReduction; } + bool hasAllowContract() const { return AllowContract; } /// Clear any flags in this flag set that aren't also set in Flags. void intersectWith(const SDNodeFlags *Flags) { @@ -390,6 +394,7 @@ public: NoInfs &= Flags->NoInfs; NoSignedZeros &= Flags->NoSignedZeros; AllowReciprocal &= Flags->AllowReciprocal; + AllowContract &= Flags->AllowContract; } }; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 9a4d44842ea..8501f327d53 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2588,6 +2588,7 @@ void SelectionDAGBuilder::visitBinary(const User &I, unsigned OpCode) { Flags.setVectorReduction(vec_redux); if (EnableFMFInDAG) { Flags.setAllowReciprocal(FMF.allowReciprocal()); + Flags.setAllowContract(FMF.allowContract()); Flags.setNoInfs(FMF.noInfs()); Flags.setNoNaNs(FMF.noNaNs()); Flags.setNoSignedZeros(FMF.noSignedZeros()); |