diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-01-07 22:28:47 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-01-07 22:28:47 +0000 | 
| commit | ea4ca94cae5cab524daf0e012d75cc9777878aaf (patch) | |
| tree | 1e11b291c0cc5fccbfb2cbc379d663196ab34c83 /llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | |
| parent | 68a12140c0c7ba22442c609985a78d61cb65ef08 (diff) | |
| download | bcm5719-llvm-ea4ca94cae5cab524daf0e012d75cc9777878aaf.tar.gz bcm5719-llvm-ea4ca94cae5cab524daf0e012d75cc9777878aaf.zip | |
Fix a bug in load expansion legalization and ret legalization.  This fixes
CodeGen/Generic/select.ll:castconst.
llvm-svn: 19357
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 26 | 
1 files changed, 17 insertions, 9 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 52389ec8ad2..95bc3ab4322 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -72,6 +72,11 @@ class SelectionDAGLegalize {    /// 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) { @@ -323,7 +328,14 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {      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. @@ -368,7 +380,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {        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: { @@ -550,10 +562,8 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {      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;  } @@ -632,9 +642,7 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){      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; | 

