/// more than once.
std::map<SDOperand, std::pair<SDOperand, SDOperand> > ExpandedNodes;
+ void AddLegalizedOperand(SDOperand From, SDOperand To) {
+ bool isNew = LegalizedNodes.insert(std::make_pair(From, To)).second;
+ assert(isNew && "Got into the map somehow?");
+ }
+
/// setValueTypeAction - Set the action for a particular value type. This
/// assumes an action has not already been set for this value type.
void setValueTypeAction(MVT::ValueType VT, LegalizeAction A) {
if (Tmp1 != Node->getOperand(0) ||
Tmp2 != Node->getOperand(1))
Result = DAG.getLoad(Node->getValueType(0), Tmp1, Tmp2);
- break;
+ else
+ Result = SDOperand(Node, 0);
+
+ // Since loads produce two values, make sure to remember that we legalized
+ // both of them.
+ AddLegalizedOperand(SDOperand(Node, 0), Result);
+ AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
+ return Result.getValue(Op.ResNo);
case ISD::EXTRACT_ELEMENT:
// Get both the low and high parts.
switch (getTypeAction(Node->getOperand(1).getValueType())) {
case Legal:
Tmp2 = LegalizeOp(Node->getOperand(1));
- if (Tmp2 != Node->getOperand(1))
+ if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Tmp2);
break;
case Expand: {
break;
}
- if (!Op.Val->hasOneUse()) {
- bool isNew = LegalizedNodes.insert(std::make_pair(Op, Result)).second;
- assert(isNew && "Got into the map somehow?");
- }
+ if (!Op.Val->hasOneUse())
+ AddLegalizedOperand(Op, Result);
return Result;
}
Hi = DAG.getLoad(NVT, Lo.getValue(1), Ptr);
// Remember that we legalized the chain.
- bool isNew = LegalizedNodes.insert(std::make_pair(Op.getValue(1),
- Hi.getValue(1))).second;
- assert(isNew && "This node was already legalized!");
+ AddLegalizedOperand(Op.getValue(1), Hi.getValue(1));
if (!TLI.isLittleEndian())
std::swap(Lo, Hi);
break;