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

Nick Lewycky nlewycky at google.com
Mon Apr 4 17:16:01 PDT 2011


On 17 January 2011 16:09, Stuart Hastings <stuart at apple.com> wrote:

> Author: stuart
> Date: Mon Jan 17 18:09:27 2011
> New Revision: 123704
>
> URL: http://llvm.org/viewvc/llvm-project?rev=123704&view=rev
> Log:
> Remove checking that prevented overlapping CALLSEQ_START/CALLSEQ_END
> ranges, add legalizer support for nested calls.  Necessary for ARM
> byval support.  Radar 7662569.
>
> 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=123704&r1=123703&r2=123704&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Jan 17 18:09:27
> 2011
> @@ -66,11 +66,6 @@
>   /// against each other, including inserted libcalls.
>   SDValue LastCALLSEQ_END;
>
> -  /// IsLegalizingCall - This member is used *only* for purposes of
> providing
> -  /// helpful assertions that a libcall isn't created while another call
> is
> -  /// being legalized (which could lead to non-serialized call sequences).
> -  bool IsLegalizingCall;
> -
>   enum LegalizeAction {
>     Legal,      // The target natively supports this operation.
>     Promote,    // This operation should be executed in a larger type.
> @@ -225,7 +220,6 @@
>
>  void SelectionDAGLegalize::LegalizeDAG() {
>   LastCALLSEQ_END = DAG.getEntryNode();
> -  IsLegalizingCall = false;
>
>   // The legalize process is inherently a bottom-up recursive process
> (users
>   // legalize their uses before themselves).  Given infinite stack space,
> we
> @@ -1024,6 +1018,7 @@
>     }
>     break;
>   case ISD::CALLSEQ_START: {
> +    static int depth = 0;
>

Hi Stuart, this breaks using llvm from multiple threads. Please don't use
non-constant statics.

Nick


>     SDNode *CallEnd = FindCallEndFromCallStart(Node);
>
>     // Recursively Legalize all of the inputs of the call end that do not
> lead
> @@ -1041,7 +1036,7 @@
>
>     // Merge in the last call to ensure that this call starts after the
> last
>     // call ended.
> -    if (LastCALLSEQ_END.getOpcode() != ISD::EntryToken) {
> +    if (LastCALLSEQ_END.getOpcode() != ISD::EntryToken && depth == 0) {
>       Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
>                          Tmp1, LastCALLSEQ_END);
>       Tmp1 = LegalizeOp(Tmp1);
> @@ -1064,14 +1059,18 @@
>     // sequence have been legalized, legalize the call itself.  During this
>     // process, no libcalls can/will be inserted, guaranteeing that no
> calls
>     // can overlap.
> -    assert(!IsLegalizingCall && "Inconsistent sequentialization of
> calls!");
> +
> +    SDValue Saved_LastCALLSEQ_END = LastCALLSEQ_END ;
>     // Note that we are selecting this call!
>     LastCALLSEQ_END = SDValue(CallEnd, 0);
> -    IsLegalizingCall = true;
>
> +    depth++;
>     // Legalize the call, starting from the CALLSEQ_END.
>     LegalizeOp(LastCALLSEQ_END);
> -    assert(!IsLegalizingCall && "CALLSEQ_END should have cleared this!");
> +    depth--;
> +    assert(depth >= 0 && "Un-matched CALLSEQ_START?");
> +    if (depth > 0)
> +      LastCALLSEQ_END = Saved_LastCALLSEQ_END;
>     return Result;
>   }
>   case ISD::CALLSEQ_END:
> @@ -1110,10 +1109,7 @@
>                          Result.getResNo());
>       }
>     }
> -    assert(IsLegalizingCall && "Call sequence imbalance between
> start/end?");
>     // This finishes up call legalization.
> -    IsLegalizingCall = false;
> -
>     // If the CALLSEQ_END node has a flag, remember that we legalized it.
>     AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0));
>     if (Node->getNumValues() == 2)
> @@ -1949,7 +1945,6 @@
>  // and leave the Hi part unset.
>  SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode
> *Node,
>                                             bool isSigned) {
> -  assert(!IsLegalizingCall && "Cannot overlap legalization of calls!");
>   // The input chain to this libcall is the entry node of the function.
>   // Legalizing the call will automatically add the previous call to the
>   // dependence.
> @@ -1997,7 +1992,6 @@
>  SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC,
>                                          SDNode *Node,
>                                          bool isSigned) {
> -  assert(!IsLegalizingCall && "Cannot overlap legalization of calls!");
>   SDValue InChain = Node->getOperand(0);
>
>   TargetLowering::ArgListTy Args;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20110404/8df3dcc5/attachment.html>


More information about the llvm-commits mailing list