Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.107 -> 1.108 SelectionDAG.cpp updated: 1.258 -> 1.259 --- Log message: Add checks to make sure we don't create bogus extend nodes, and fix a bug where we were doing exactly that which was causing failures on x86 and alpha. --- Diffs of the changes: (+14 -4) DAGCombiner.cpp | 14 ++++++++++---- SelectionDAG.cpp | 4 ++++ 2 files changed, 14 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.107 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.108 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.107 Fri Feb 17 15:58:01 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Feb 17 20:40:58 2006 @@ -665,6 +665,9 @@ // fold (A+(B-A)) -> B if (N1.getOpcode() == ISD::SUB && N0 == N1.getOperand(1)) return N1.getOperand(0); + // + if (SimplifyDemandedBits(SDOperand(N, 0))) + return SDOperand(); return SDOperand(); } @@ -2297,13 +2300,16 @@ // 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. - SDOperand Temp, SCC = DAG.getSetCC(TLI.getSetCCResultTy(), N0, N1, CC); - WorkList.push_back(SCC.Val); + SDOperand Temp, SCC; // cast from setcc result type to select result type - if (AfterLegalize) + if (AfterLegalize) { + SCC = DAG.getSetCC(TLI.getSetCCResultTy(), N0, N1, CC); Temp = DAG.getZeroExtendInReg(SCC, N2.getValueType()); - else + } else { + SCC = DAG.getSetCC(MVT::i1, N0, N1, CC); Temp = DAG.getNode(ISD::ZERO_EXTEND, N2.getValueType(), SCC); + } + WorkList.push_back(SCC.Val); WorkList.push_back(Temp.Val); // shl setcc result by log2 n2c return DAG.getNode(ISD::SHL, N2.getValueType(), Temp, Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.258 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.259 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.258 Fri Feb 17 15:58:01 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Feb 17 20:40:58 2006 @@ -1047,22 +1047,26 @@ return Operand; // Factor of one node? No factor. case ISD::SIGN_EXTEND: if (Operand.getValueType() == VT) return Operand; // noop extension + assert(Operand.getValueType() < VT && "Invalid sext node, dst < src!"); if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) return getNode(OpOpcode, VT, Operand.Val->getOperand(0)); break; case ISD::ZERO_EXTEND: if (Operand.getValueType() == VT) return Operand; // noop extension + assert(Operand.getValueType() < VT && "Invalid zext node, dst < src!"); if (OpOpcode == ISD::ZERO_EXTEND) // (zext (zext x)) -> (zext x) return getNode(ISD::ZERO_EXTEND, VT, Operand.Val->getOperand(0)); break; case ISD::ANY_EXTEND: if (Operand.getValueType() == VT) return Operand; // noop extension + assert(Operand.getValueType() < VT && "Invalid anyext node, dst < src!"); if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND) // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x) return getNode(OpOpcode, VT, Operand.Val->getOperand(0)); break; case ISD::TRUNCATE: if (Operand.getValueType() == VT) return Operand; // noop truncate + assert(Operand.getValueType() > VT && "Invalid truncate node, src < dst!"); if (OpOpcode == ISD::TRUNCATE) return getNode(ISD::TRUNCATE, VT, Operand.Val->getOperand(0)); else if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND || _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits