From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vs1-xe2e.google.com (mail-vs1-xe2e.google.com [IPv6:2607:f8b0:4864:20::e2e]) by sourceware.org (Postfix) with ESMTPS id E19F33851C3E for ; Fri, 4 Jun 2021 02:51:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E19F33851C3E Received: by mail-vs1-xe2e.google.com with SMTP id x8so4118496vso.5 for ; Thu, 03 Jun 2021 19:51:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=mX/VsbXwUfTdwYiZ3G0zs8DalmSTYturtbfvl4zo/BI=; b=HYFRnyKU3k7uLF7VSGfUUUajFb4tmjE9Y6SZ+dKRGMgaJBCtyBB6FdlxuN6FkIMgB8 oPYXea87uuLjlMCwZCTeMlCrPpKe6LFY8YmeFMza5rctkoY1bXOlDw6yM2iWX2g8ye3O 951rZmJhltDwBzDHSpv2Rgc/vFHFvL45LAN+L4j2fZ3FSx5mGUiXDRwSs8n/kd1mOCQz lV7Es18asTAbNo4yogwxZ6PQ3Djl1x3TBIytYdqWN+BmFI8RHipFXPe9AJpNQCPmBl9b g0ulH5DD25jrdPjcA02x/fjjLff+RzD2biDCMVpcO1g7a7NJsN51EHe4fhz4nQZjjNUI BO5A== X-Gm-Message-State: AOAM533XpUdVWWGB3N3TFWyNXHszXvucA8zIPb3oNZT8bFYoc7sG0o5B 8DFwkOR5lSjZ5jXkyUO2zO1EfgT1riRDTV3NIP4= X-Google-Smtp-Source: ABdhPJzVK3z6IdRdjOdjLTBJ14Y7j2FzbYzyNpU90HHjJzKbL9R4ASkErd6OUz8sSKIq7c8D8ZoStqF/udiF/eHjaIw= X-Received: by 2002:a05:6102:5cf:: with SMTP id v15mr1080314vsf.57.1622775106414; Thu, 03 Jun 2021 19:51:46 -0700 (PDT) MIME-Version: 1.0 References: <20210603065408.47912-1-hongtao.liu@intel.com> In-Reply-To: <20210603065408.47912-1-hongtao.liu@intel.com> From: Hongtao Liu Date: Fri, 4 Jun 2021 10:55:20 +0800 Message-ID: Subject: Re: [PATCH 1/2] CALL_INSN may not be a real function call. To: liuhongt Cc: GCC Patches , Jakub Jelinek , Richard Sandiford , Uros Bizjak Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jun 2021 02:51:48 -0000 Ping, This is a splitted middle-end patch as a follow up of https://gcc.gnu.org/pipermail/gcc-patches/2021-June/571544.html On Thu, Jun 3, 2021 at 2:54 PM liuhongt via Gcc-patches wrote: > > Use "used" flag for CALL_INSN to indicate it's a fake call. If it's a > fake call, it won't have its own function stack. > > gcc/ChangeLog > > PR target/82735 > * df-scan.c (df_get_call_refs): When call_insn is a fake call, > it won't use stack pointer reg. > * final.c (leaf_function_p): When call_insn is a fake call, it > won't affect caller as a leaf function. > * reg-stack.c (callee_clobbers_any_stack_reg): New. > (subst_stack_regs): When call_insn doesn't clobber any stack > reg, don't clear the arguments. > * rtl.c (shallow_copy_rtx): Don't clear flag used when orig is > a insn. > * shrink-wrap.c (requires_stack_frame_p): No need for stack > frame for a fake call. > * rtl.h (FAKE_CALL_P): New macro. > --- > gcc/df-scan.c | 3 ++- > gcc/final.c | 3 ++- > gcc/reg-stack.c | 18 +++++++++++++++++- > gcc/rtl.c | 6 ++++-- > gcc/rtl.h | 5 +++++ > gcc/shrink-wrap.c | 2 +- > 6 files changed, 31 insertions(+), 6 deletions(-) > > diff --git a/gcc/df-scan.c b/gcc/df-scan.c > index 6691c3e8357..1268536b3f0 100644 > --- a/gcc/df-scan.c > +++ b/gcc/df-scan.c > @@ -3090,7 +3090,8 @@ df_get_call_refs (class df_collection_rec *collection_rec, > > for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) > { > - if (i == STACK_POINTER_REGNUM) > + if (i == STACK_POINTER_REGNUM > + && !FAKE_CALL_P (insn_info->insn)) > /* The stack ptr is used (honorarily) by a CALL insn. */ > df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i], > NULL, bb, insn_info, DF_REF_REG_USE, > diff --git a/gcc/final.c b/gcc/final.c > index e0a70fcd830..817f7722cb2 100644 > --- a/gcc/final.c > +++ b/gcc/final.c > @@ -4109,7 +4109,8 @@ leaf_function_p (void) > for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) > { > if (CALL_P (insn) > - && ! SIBLING_CALL_P (insn)) > + && ! SIBLING_CALL_P (insn) > + && ! FAKE_CALL_P (insn)) > return 0; > if (NONJUMP_INSN_P (insn) > && GET_CODE (PATTERN (insn)) == SEQUENCE > diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c > index 25210f0c17f..1d9ea035cf4 100644 > --- a/gcc/reg-stack.c > +++ b/gcc/reg-stack.c > @@ -174,6 +174,7 @@ > #include "reload.h" > #include "tree-pass.h" > #include "rtl-iter.h" > +#include "function-abi.h" > > #ifdef STACK_REGS > > @@ -2368,6 +2369,18 @@ subst_asm_stack_regs (rtx_insn *insn, stack_ptr regstack) > } > } > } > + > +/* Return true if a function call is allowed to alter some or all bits > + of any stack reg. */ > +static bool > +callee_clobbers_any_stack_reg (const function_abi & callee_abi) > +{ > + for (unsigned regno = FIRST_STACK_REG; regno <= LAST_STACK_REG; regno++) > + if (callee_abi.clobbers_at_least_part_of_reg_p (regno)) > + return true; > + return false; > +} > + > > /* Substitute stack hard reg numbers for stack virtual registers in > INSN. Non-stack register numbers are not changed. REGSTACK is the > @@ -2382,7 +2395,10 @@ subst_stack_regs (rtx_insn *insn, stack_ptr regstack) > bool control_flow_insn_deleted = false; > int i; > > - if (CALL_P (insn)) > + /* If the target of the call doesn't clobber any stack registers, > + Don't clear the arguments. */ > + if (CALL_P (insn) > + && callee_clobbers_any_stack_reg (insn_callee_abi (insn))) > { > int top = regstack->top; > > diff --git a/gcc/rtl.c b/gcc/rtl.c > index b0ba1ff684c..aaee882f5ca 100644 > --- a/gcc/rtl.c > +++ b/gcc/rtl.c > @@ -395,8 +395,10 @@ shallow_copy_rtx (const_rtx orig MEM_STAT_DECL) > case SCRATCH: > break; > default: > - /* For all other RTXes clear the used flag on the copy. */ > - RTX_FLAG (copy, used) = 0; > + /* For all other RTXes clear the used flag on the copy. > + CALL_INSN use "used" flag to indicate it's a fake call. */ > + if (!INSN_P (orig)) > + RTX_FLAG (copy, used) = 0; > break; > } > return copy; > diff --git a/gcc/rtl.h b/gcc/rtl.h > index 35178b5bfac..5ed0d6dd6fa 100644 > --- a/gcc/rtl.h > +++ b/gcc/rtl.h > @@ -839,6 +839,11 @@ struct GTY(()) rtvec_def { > /* Predicate yielding nonzero iff X is a call insn. */ > #define CALL_P(X) (GET_CODE (X) == CALL_INSN) > > +/* 1 if RTX is a call_insn for a fake call. > + CALL_INSN use "used" flag to indicate it's a fake call. */ > +#define FAKE_CALL_P(RTX) \ > + (RTL_FLAG_CHECK1 ("FAKE_CALL_P", (RTX), CALL_INSN)->used) > + > /* Predicate yielding nonzero iff X is an insn that cannot jump. */ > #define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN) > > diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c > index ba7b5cd56fd..5e60f34f749 100644 > --- a/gcc/shrink-wrap.c > +++ b/gcc/shrink-wrap.c > @@ -57,7 +57,7 @@ requires_stack_frame_p (rtx_insn *insn, HARD_REG_SET prologue_used, > HARD_REG_SET hardregs; > unsigned regno; > > - if (CALL_P (insn)) > + if (CALL_P (insn) && !FAKE_CALL_P (insn)) > return !SIBLING_CALL_P (insn); > > /* We need a frame to get the unique CFA expected by the unwinder. */ > -- > 2.18.1 > -- BR, Hongtao