[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