diff options
author | Chris Lattner <sabre@nondot.org> | 2007-04-11 06:50:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-04-11 06:50:51 +0000 |
commit | a083ffcad71f1c2ee51974c6d1cbe661abcea4e3 (patch) | |
tree | 2bace2a4164c11d3d376d9c167b4db313dfc6a38 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | c5f85d37381d0a2db3f33e9a474fbd76939015c5 (diff) | |
download | bcm5719-llvm-a083ffcad71f1c2ee51974c6d1cbe661abcea4e3.tar.gz bcm5719-llvm-a083ffcad71f1c2ee51974c6d1cbe661abcea4e3.zip |
Fix this harder.
llvm-svn: 35888
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2c9d41cc577..e373ef43651 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -266,7 +266,8 @@ namespace { SDOperand SimplifyBinOpWithSameOpcodeHands(SDNode *N); SDOperand SimplifySelect(SDOperand N0, SDOperand N1, SDOperand N2); SDOperand SimplifySelectCC(SDOperand N0, SDOperand N1, SDOperand N2, - SDOperand N3, ISD::CondCode CC); + SDOperand N3, ISD::CondCode CC, + bool NotExtCompare = false); SDOperand SimplifySetCC(MVT::ValueType VT, SDOperand N0, SDOperand N1, ISD::CondCode Cond, bool foldBooleans = true); SDOperand ConstantFoldVBIT_CONVERTofVBUILD_VECTOR(SDNode *, MVT::ValueType); @@ -2133,10 +2134,10 @@ SDOperand DAGCombiner::visitSIGN_EXTEND(SDNode *N) { // sext(setcc x,y,cc) -> select_cc x, y, -1, 0, cc if (N0.getOpcode() == ISD::SETCC) { SDOperand SCC = - SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), - DAG.getConstant(~0ULL, VT), DAG.getConstant(0, VT), - cast<CondCodeSDNode>(N0.getOperand(2))->get()); - if (SCC.Val && SCC.Val != N) return SCC; + SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), + DAG.getConstant(~0ULL, VT), DAG.getConstant(0, VT), + cast<CondCodeSDNode>(N0.getOperand(2))->get(), true); + if (SCC.Val) return SCC; } return SDOperand(); @@ -2225,8 +2226,8 @@ SDOperand DAGCombiner::visitZERO_EXTEND(SDNode *N) { SDOperand SCC = SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), DAG.getConstant(1, VT), DAG.getConstant(0, VT), - cast<CondCodeSDNode>(N0.getOperand(2))->get()); - if (SCC.Val && SCC.Val != N) return SCC; + cast<CondCodeSDNode>(N0.getOperand(2))->get(), true); + if (SCC.Val) return SCC; } return SDOperand(); @@ -2317,10 +2318,10 @@ SDOperand DAGCombiner::visitANY_EXTEND(SDNode *N) { // aext(setcc x,y,cc) -> select_cc x, y, 1, 0, cc if (N0.getOpcode() == ISD::SETCC) { SDOperand SCC = - SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), - DAG.getConstant(1, VT), DAG.getConstant(0, VT), - cast<CondCodeSDNode>(N0.getOperand(2))->get()); - if (SCC.Val && SCC.Val != N && SCC.getOpcode() != ISD::ZERO_EXTEND) + SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), + DAG.getConstant(1, VT), DAG.getConstant(0, VT), + cast<CondCodeSDNode>(N0.getOperand(2))->get()); + if (SCC.Val) return SCC; } @@ -4047,7 +4048,7 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDOperand LHS, SDOperand DAGCombiner::SimplifySelectCC(SDOperand N0, SDOperand N1, SDOperand N2, SDOperand N3, - ISD::CondCode CC) { + ISD::CondCode CC, bool NotExtCompare) { MVT::ValueType VT = N2.getValueType(); ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val); @@ -4123,6 +4124,12 @@ SDOperand DAGCombiner::SimplifySelectCC(SDOperand N0, SDOperand N1, // fold select C, 16, 0 -> shl C, 4 if (N2C && N3C && N3C->isNullValue() && isPowerOf2_64(N2C->getValue()) && TLI.getSetCCResultContents() == TargetLowering::ZeroOrOneSetCCResult) { + + // If the caller doesn't want us to simplify this into a zext of a compare, + // don't do it. + if (NotExtCompare && N2C->getValue() == 1) + return SDOperand(); + // Get a SetCC of the condition // FIXME: Should probably make sure that setcc is legal if we ever have a // target where it isn't. |