[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp SelectionDAG.cpp
Nate Begeman
natebegeman at mac.com
Fri Feb 17 18:41:10 PST 2006
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 ||
More information about the llvm-commits
mailing list