diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2015-01-14 05:45:24 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2015-01-14 05:45:24 +0000 |
commit | 648eff1695d5b764542d51e76af4d4bfd41728ce (patch) | |
tree | 187064b3007325f6bab3c5d418af280951bc9223 /llvm/lib | |
parent | 7b068f6ba4d8d36fc55eef964af792f2665af513 (diff) | |
download | llvm-648eff1695d5b764542d51e76af4d4bfd41728ce.zip llvm-648eff1695d5b764542d51e76af4d4bfd41728ce.tar.gz llvm-648eff1695d5b764542d51e76af4d4bfd41728ce.tar.bz2 |
DAG Combiner: Fold SelectCC When Cond is UNDEF
In case folding a node end up with a NaN as operand for the select,
the folding of the condition of the selectcc node returns "UNDEF".
Differential Revision: http://reviews.llvm.org/D6889
llvm-svn: 225952
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 3a909b5..ee6223b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5100,13 +5100,16 @@ SDValue DAGCombiner::visitSELECT_CC(SDNode *N) { return N2; // cond always true -> true val else return N3; // cond always false -> false val - } - - // Fold to a simpler select_cc - if (SCC.getOpcode() == ISD::SETCC) + } else if (SCC->getOpcode() == ISD::UNDEF) { + // When the condition is UNDEF, just return the first operand. This is + // coherent the DAG creation, no setcc node is created in this case + return N2; + } else if (SCC.getOpcode() == ISD::SETCC) { + // Fold to a simpler select_cc return DAG.getNode(ISD::SELECT_CC, SDLoc(N), N2.getValueType(), SCC.getOperand(0), SCC.getOperand(1), N2, N3, SCC.getOperand(2)); + } } // If we can fold this based on the true/false value, do so. |