[llvm-commits] [llvm] r72514 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Bill Wendling isanbard at gmail.com
Thu May 28 11:19:55 PDT 2009


Eli,

I had to revert this and r72516 (which depended upon this patch)
because it was breaking the llvm-gcc bootstrap:

Assertion failed: (!Tmp2.getNode() && "Can't legalize BR_CC with legal
condition!"), function ExpandNode, file
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmCore.roots/llvmCore~obj/src/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp,
line 2923.
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmgcc42.roots/llvmgcc42~obj/src/gcc/libgcc2.c:1727:
internal compiler error: Abort trap
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://developer.apple.com/bugreporter> for instructions.

Please investigate.

-bw

On Wed, May 27, 2009 at 9:39 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
> Author: efriedma
> Date: Wed May 27 23:39:57 2009
> New Revision: 72514
>
> URL: http://llvm.org/viewvc/llvm-project?rev=72514&view=rev
> Log:
> Remove special cases for more opcodes.
>
> This is basically the end of this series of patches for LegalizeDAG; the
> remaining special cases can't be removed without more infrastructure
> work.  There's a FIXME for each relevant opcode near the beginning of
> SelectionDAGLegalize::LegalizeOp.
>
>
> Modified:
>    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=72514&r1=72513&r2=72514&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed May 27 23:39:57 2009
> @@ -1038,39 +1038,6 @@
>     if (Node->getNumValues() == 2)
>       AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1));
>     return Result.getValue(Op.getResNo());
> -  case ISD::BR_CC:
> -    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
> -    // Ensure that libcalls are emitted before a branch.
> -    Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END);
> -    Tmp1 = LegalizeOp(Tmp1);
> -    Tmp2 = Node->getOperand(2);              // LHS
> -    Tmp3 = Node->getOperand(3);              // RHS
> -    Tmp4 = Node->getOperand(1);              // CC
> -
> -    LegalizeSetCC(TLI.getSetCCResultType(Tmp2.getValueType()),
> -                  Tmp2, Tmp3, Tmp4, dl);
> -    LastCALLSEQ_END = DAG.getEntryNode();
> -
> -    // If we didn't get both a LHS and RHS back from LegalizeSetCC,
> -    // the LHS is a legal SETCC itself.  In this case, we need to compare
> -    // the result against zero to select between true and false values.
> -    if (Tmp3.getNode() == 0) {
> -      Tmp3 = DAG.getConstant(0, Tmp2.getValueType());
> -      Tmp4 = DAG.getCondCode(ISD::SETNE);
> -    }
> -
> -    Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp4, Tmp2, Tmp3,
> -                                    Node->getOperand(4));
> -
> -    switch (TLI.getOperationAction(ISD::BR_CC, Tmp3.getValueType())) {
> -    default: assert(0 && "Unexpected action for BR_CC!");
> -    case TargetLowering::Legal: break;
> -    case TargetLowering::Custom:
> -      Tmp4 = TLI.LowerOperation(Result, DAG);
> -      if (Tmp4.getNode()) Result = Tmp4;
> -      break;
> -    }
> -    break;
>   case ISD::LOAD: {
>     LoadSDNode *LD = cast<LoadSDNode>(Node);
>     Tmp1 = LegalizeOp(LD->getChain());   // Legalize the chain.
> @@ -1512,38 +1479,7 @@
>     }
>     break;
>   }
> -  case ISD::SELECT_CC: {
> -    Tmp1 = Node->getOperand(0);               // LHS
> -    Tmp2 = Node->getOperand(1);               // RHS
> -    Tmp3 = LegalizeOp(Node->getOperand(2));   // True
> -    Tmp4 = LegalizeOp(Node->getOperand(3));   // False
> -    SDValue CC = Node->getOperand(4);
> -
> -    LegalizeSetCC(TLI.getSetCCResultType(Tmp1.getValueType()),
> -                  Tmp1, Tmp2, CC, dl);
> -
> -    // If we didn't get both a LHS and RHS back from LegalizeSetCC,
> -    // the LHS is a legal SETCC itself.  In this case, we need to compare
> -    // the result against zero to select between true and false values.
> -    if (Tmp2.getNode() == 0) {
> -      Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
> -      CC = DAG.getCondCode(ISD::SETNE);
> -    }
> -    Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, Tmp4, CC);
> -
> -    // Everything is legal, see if we should expand this op or something.
> -    switch (TLI.getOperationAction(ISD::SELECT_CC, Tmp3.getValueType())) {
> -    default: assert(0 && "This action is not supported yet!");
> -    case TargetLowering::Legal: break;
> -    case TargetLowering::Custom:
> -      Tmp1 = TLI.LowerOperation(Result, DAG);
> -      if (Tmp1.getNode()) Result = Tmp1;
> -      break;
> -    }
> -    break;
> -  }
>   }
> -
>   assert(Result.getValueType() == Op.getValueType() &&
>          "Bad legalization!");
>
> @@ -2355,7 +2291,7 @@
>  void SelectionDAGLegalize::ExpandNode(SDNode *Node,
>                                       SmallVectorImpl<SDValue> &Results) {
>   DebugLoc dl = Node->getDebugLoc();
> -  SDValue Tmp1, Tmp2, Tmp3;
> +  SDValue Tmp1, Tmp2, Tmp3, Tmp4;
>   switch (Node->getOpcode()) {
>   case ISD::CTPOP:
>   case ISD::CTLZ:
> @@ -2977,6 +2913,47 @@
>     Results.push_back(Tmp1);
>     break;
>   }
> +  case ISD::SELECT_CC: {
> +    Tmp1 = Node->getOperand(0);   // LHS
> +    Tmp2 = Node->getOperand(1);   // RHS
> +    Tmp3 = Node->getOperand(2);   // True
> +    Tmp4 = Node->getOperand(3);   // False
> +    SDValue CC = Node->getOperand(4);
> +
> +    LegalizeSetCC(TLI.getSetCCResultType(Tmp1.getValueType()),
> +                  Tmp1, Tmp2, CC, dl);
> +
> +    assert(!Tmp2.getNode() && "Can't legalize SELECT_CC with legal condition!");
> +    Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
> +    CC = DAG.getCondCode(ISD::SETNE);
> +    Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1, Tmp2,
> +                       Tmp3, Tmp4, CC);
> +    Results.push_back(Tmp1);
> +    break;
> +  }
> +  case ISD::BR_CC: {
> +    Tmp1 = Node->getOperand(0);              // Chain
> +    Tmp2 = Node->getOperand(2);              // LHS
> +    Tmp3 = Node->getOperand(3);              // RHS
> +    Tmp4 = Node->getOperand(1);              // CC
> +
> +    LegalizeSetCC(TLI.getSetCCResultType(Tmp2.getValueType()),
> +                  Tmp2, Tmp3, Tmp4, dl);
> +    LastCALLSEQ_END = DAG.getEntryNode();
> +
> +    // If we didn't get both a LHS and RHS back from LegalizeSetCC,
> +    // the LHS is a legal SETCC itself.  In this case, we need to compare
> +    // the result against zero to select between true and false values.
> +    if (Tmp3.getNode() == 0) {
> +      Tmp3 = DAG.getConstant(0, Tmp2.getValueType());
> +      Tmp4 = DAG.getCondCode(ISD::SETNE);
> +    }
> +
> +    Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4, Tmp2,
> +                       Tmp3, Node->getOperand(4));
> +    Results.push_back(Tmp1);
> +    break;
> +  }
>   case ISD::GLOBAL_OFFSET_TABLE:
>   case ISD::GlobalAddress:
>   case ISD::GlobalTLSAddress:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list