forked from OSchip/llvm-project
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. llvm-svn: 26284
This commit is contained in:
parent
70af620709
commit
abac61603f
|
@ -665,6 +665,9 @@ SDOperand DAGCombiner::visitADD(SDNode *N) {
|
|||
// 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 @@ SDOperand DAGCombiner::SimplifySelectCC(SDOperand N0, SDOperand N1,
|
|||
// 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,
|
||||
|
|
|
@ -1047,22 +1047,26 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
|
|||
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 ||
|
||||
|
|
Loading…
Reference in New Issue