From patchwork Thu Sep 1 05:47:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 57229 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DC007382DA60 for ; Thu, 1 Sep 2022 05:51:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DC007382DA60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662011467; bh=PwkqREyDrO7g3R2nABuG/+BkEWkY/lr/YkfQlU3VxgI=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=xUm6yKSLcBn6ppSlKhNDkzeGHJqJR0qvbpImaWw3apu80UEruQl7HcWhOW3Mcualr 7I38Bhz6bpZfLToJhbTFcj8/WPFnuIionajU+D9l/w1H5bKlr8uSvvZMeK/65lUjdi jUQApMqAlhjmld3tClB1YdAo0n1yLpboLIuQJ0eg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nh502-vm7.bullet.mail.kks.yahoo.co.jp (nh502-vm7.bullet.mail.kks.yahoo.co.jp [183.79.56.152]) by sourceware.org (Postfix) with SMTP id 4B746385354E for ; Thu, 1 Sep 2022 05:50:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4B746385354E Received: from [183.79.100.138] by nh502.bullet.mail.kks.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:32 -0000 Received: from [183.79.100.137] by t501.bullet.mail.kks.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:32 -0000 Received: from [127.0.0.1] by omp506.mail.kks.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:32 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 304843.13705.bm@omp506.mail.kks.yahoo.co.jp Received: (qmail 93976 invoked by alias); 1 Sep 2022 05:50:32 -0000 Received: from unknown (HELO ?192.168.2.3?) (175.177.45.181 with ) by smtp5007.mail.kks.ynwp.yahoo.co.jp with SMTP; 1 Sep 2022 05:50:32 -0000 X-YMail-JAS: 9YLsIacVM1mZWLhetfnF5MFKCihWQUSEn990WsIhL80XCajopVtikhRF.G8N9OJzW5y1iF50wt8EzfG3I6EoyIiZLwOixwdCk2qEiVfHzlXpNoSgpNnPnj__k6gmAP12azUQIr4MxQ-- X-Apparently-From: X-YMail-OSG: 8Cj2g7gVM1nVrcjs5l6HoHqMqIFChaNPVc7ywss7cEzoVAN Qjy3XZOKiZSXxDhsS7ksqmTSwvye_Vsy33BrqWJ5Ei7zv_4e8PUf7wC5syex rlRcjIuH6Zncd7r6uWur0wRvZ_h02KV6KMGpCWcDdcMk5Uh8ncbfmpMENQXA 0qMgQl2I.L1EZudCAEAK4sBC6Cqgak0IDSIGlGNYttbSLb51l.TV4e_z6J3Y COEOb.vz8wJsIU_E2RI59UfxL7Tn1ADpvTbpB_F0A0PmRclzarE95iYbp5ID KeTaNdt0u.3AnrnGyB3nUiKLFBGTWcuGuhQQ72UWRW_oVJwzMyMT.uJjZX4u Ox.CEanDgXOk5wevaY300R7d3MjcJwV7sGLEsoSJwjAK8G5D1.9846coFC6W EWpw6bhqQ4iF3tzlci0XWeaWiu0G9xpuHdCW9QORcdt6SiNuKFWfq_GlD31E Syk9DlxtBq4gMSC7tUwJY3FqfCb62q41ccnwd6yAQRB2U6TLARmDpV0eQCuz 7bt22nXhK9.wNmtSIzgjyO77pNt0VBJEdvLfGWrk_XY1Me38G534u9JuGDxZ tzjWjx1suTkcXSODYOZVwzoWwPt7ComRuNS6Ug4aW_OCuyrUJRLYbP2L76Eh bhxMX2QyQOD3sxNkJT6TCfj2eCl3AqUNYEdiDeu_sTaGPsQsr1iYk6kVId0_ BFSgGgeLiC5IwxMs5W27gHd6x0oYj6ej47_LOPCU78uFVsOoSd7kvnKfl1CW iEEESR0.eneSR5SzYC0hh00fwQjtZ68ZXx5NdCJKwHXoKOCGnYhUiDIi0pTx lF1HzKDcTRyVi1yZHnQljAOb0L6s2xu9uJcfk8EJIr7mCJ9xeGuVPDM2CHmc hqpr9bIW2vigMn6lhlW1zDUidqan8AfeZpWRWSBO_47XrTLjPK6FnGAikegb qcxJVE8CQcsee5xROTQ-- Message-ID: Date: Thu, 1 Sep 2022 14:47:11 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.2.1 To: GCC Patches Subject: [PATCH 1/2] xtensa: Eliminate unused stack frame allocation/freeing X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Takayuki 'January June' Suwa via Gcc-patches From: Takayuki 'January June' Suwa Reply-To: Takayuki 'January June' Suwa Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" In the example below, 'x' is once placed on the stack frame and then read into registers as the argument value of bar(): /* example */ struct foo { int a, b; }; extern struct foo bar(struct foo); struct foo test(void) { struct foo x = { 0, 1 }; return bar(x); } Thanks to the dead store elimination, the initialization of 'x' turns into merely loading the immediates to registers, but corresponding stack frame growth is not rolled back. As a result: ;; prereq: the CALL0 ABI ;; before test: addi sp, sp, -16 // unused stack frame allocation/freeing movi.n a2, 0 movi.n a3, 1 addi sp, sp, 16 // because no instructions that refer to j.l bar, a9 // the stack pointer between the two This patch eliminates such unused stack frame allocation/freeing: ;; after test: movi.n a2, 0 movi.n a3, 1 j.l bar, a9 gcc/ChangeLog: * config/xtensa/xtensa.cc (machine_function): New member to track the insns for stack pointer adjustment inside of the pro/epilogue. (xtensa_emit_adjust_stack_pointer): New function to share the common codes and to record the insns for stack pointer adjustment. (xtensa_expand_prologue): Change to use the function mentioned above when using the CALL0 ABI. (xtensa_expand_prologue): Ditto. And also change to cancel emitting the insns for the stack pointer adjustment if only used for its own. --- gcc/config/xtensa/xtensa.cc | 221 ++++++++++++++++++------------------ 1 file changed, 110 insertions(+), 111 deletions(-) diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index b673b6764da..cd509876fd2 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -102,6 +102,7 @@ struct GTY(()) machine_function int callee_save_size; bool frame_laid_out; bool epilogue_done; + hash_set *logues_a1_adjusts; }; /* Vector, indexed by hard register number, which contains 1 for a @@ -3048,7 +3049,7 @@ xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno) } static bool -xtensa_call_save_reg(int regno) +xtensa_call_save_reg (int regno) { if (TARGET_WINDOWED_ABI) return false; @@ -3084,7 +3085,7 @@ compute_frame_size (poly_int64 size) cfun->machine->callee_save_size = 0; for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) { - if (xtensa_call_save_reg(regno)) + if (xtensa_call_save_reg (regno)) cfun->machine->callee_save_size += UNITS_PER_WORD; } @@ -3143,6 +3144,49 @@ xtensa_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED) and the total number of words must be a multiple of 128 bits. */ #define MIN_FRAME_SIZE (8 * UNITS_PER_WORD) +static rtx_insn * +xtensa_emit_adjust_stack_pointer (HOST_WIDE_INT offset, bool need_note) +{ + rtx_insn *insn; + + if (xtensa_simm8 (offset) + || xtensa_simm8x256 (offset)) + insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (offset))); + else + { + rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); + rtx_insn* tmp_insn; + + if (offset < 0) + { + tmp_insn = emit_move_insn (tmp_reg, GEN_INT (-offset)); + insn = emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, + tmp_reg)); + } + else + { + tmp_insn = emit_move_insn (tmp_reg, GEN_INT (offset)); + insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + tmp_reg)); + } + cfun->machine->logues_a1_adjusts->add (tmp_insn); + } + + if (need_note) + { + rtx note_rtx = gen_rtx_SET (stack_pointer_rtx, + plus_constant (Pmode, stack_pointer_rtx, + offset)); + + RTX_FRAME_RELATED_P (insn) = 1; + add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); + } + + cfun->machine->logues_a1_adjusts->add (insn); + return insn; +} + void xtensa_expand_prologue (void) { @@ -3175,16 +3219,12 @@ xtensa_expand_prologue (void) HOST_WIDE_INT offset = 0; int callee_save_size = cfun->machine->callee_save_size; + cfun->machine->logues_a1_adjusts = new hash_set; + /* -128 is a limit of single addi instruction. */ if (IN_RANGE (total_size, 1, 128)) { - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, - GEN_INT (-total_size))); - RTX_FRAME_RELATED_P (insn) = 1; - note_rtx = gen_rtx_SET (stack_pointer_rtx, - plus_constant (Pmode, stack_pointer_rtx, - -total_size)); - add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); + insn = xtensa_emit_adjust_stack_pointer (-total_size, true); offset = total_size - UNITS_PER_WORD; } else if (callee_save_size) @@ -3194,75 +3234,34 @@ xtensa_expand_prologue (void) * move it to its final location. */ if (total_size > 1024) { - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, - GEN_INT (-callee_save_size))); - RTX_FRAME_RELATED_P (insn) = 1; - note_rtx = gen_rtx_SET (stack_pointer_rtx, - plus_constant (Pmode, stack_pointer_rtx, - -callee_save_size)); - add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); + insn = xtensa_emit_adjust_stack_pointer (-callee_save_size, + true); offset = callee_save_size - UNITS_PER_WORD; } else { - if (xtensa_simm8x256 (-total_size)) - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, - stack_pointer_rtx, - GEN_INT (-total_size))); - else - { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (total_size)); - insn = emit_insn (gen_subsi3 (stack_pointer_rtx, - stack_pointer_rtx, tmp_reg)); - } - RTX_FRAME_RELATED_P (insn) = 1; - note_rtx = gen_rtx_SET (stack_pointer_rtx, - plus_constant (Pmode, stack_pointer_rtx, - -total_size)); - add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); + insn = xtensa_emit_adjust_stack_pointer (-total_size, true); offset = total_size - UNITS_PER_WORD; } } for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) - { - if (xtensa_call_save_reg(regno)) - { - rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); - rtx mem = gen_frame_mem (SImode, x); - rtx reg = gen_rtx_REG (SImode, regno); - - offset -= UNITS_PER_WORD; - insn = emit_move_insn (mem, reg); - RTX_FRAME_RELATED_P (insn) = 1; - add_reg_note (insn, REG_FRAME_RELATED_EXPR, - gen_rtx_SET (mem, reg)); - } - } + if (xtensa_call_save_reg (regno)) + { + rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); + rtx mem = gen_frame_mem (SImode, x); + rtx reg = gen_rtx_REG (SImode, regno); + + offset -= UNITS_PER_WORD; + insn = emit_move_insn (mem, reg); + RTX_FRAME_RELATED_P (insn) = 1; + add_reg_note (insn, REG_FRAME_RELATED_EXPR, + gen_rtx_SET (mem, reg)); + } if (total_size > 1024 || (!callee_save_size && total_size > 128)) - { - if (xtensa_simm8x256 (callee_save_size - total_size)) - insn = emit_insn (gen_addsi3 (stack_pointer_rtx, - stack_pointer_rtx, - GEN_INT (callee_save_size - - total_size))); - else - { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (total_size - - callee_save_size)); - insn = emit_insn (gen_subsi3 (stack_pointer_rtx, - stack_pointer_rtx, tmp_reg)); - } - RTX_FRAME_RELATED_P (insn) = 1; - note_rtx = gen_rtx_SET (stack_pointer_rtx, - plus_constant (Pmode, stack_pointer_rtx, - callee_save_size - - total_size)); - add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx); - } + insn = xtensa_emit_adjust_stack_pointer (callee_save_size - total_size, + true); } if (frame_pointer_needed) @@ -3326,24 +3325,14 @@ xtensa_expand_epilogue (bool sibcall_p) { int regno; HOST_WIDE_INT offset; + df_ref ref; + bool stack_pointer_used = false; if (cfun->machine->current_frame_size > (frame_pointer_needed ? 127 : 1024)) { - if (xtensa_simm8x256 (cfun->machine->current_frame_size - - cfun->machine->callee_save_size)) - emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ? - hard_frame_pointer_rtx : stack_pointer_rtx, - GEN_INT (cfun->machine->current_frame_size - - cfun->machine->callee_save_size))); - else - { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, GEN_INT (cfun->machine->current_frame_size - - cfun->machine->callee_save_size)); - emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ? - hard_frame_pointer_rtx : stack_pointer_rtx, - tmp_reg)); - } + xtensa_emit_adjust_stack_pointer (cfun->machine->current_frame_size - + cfun->machine->callee_save_size, + false); offset = cfun->machine->callee_save_size - UNITS_PER_WORD; } else @@ -3359,19 +3348,18 @@ xtensa_expand_epilogue (bool sibcall_p) emit_insn (gen_blockage ()); for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) - { - if (xtensa_call_save_reg(regno)) - { - rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); - rtx reg; - - offset -= UNITS_PER_WORD; - emit_move_insn (reg = gen_rtx_REG (SImode, regno), - gen_frame_mem (SImode, x)); - if (regno == A0_REG && sibcall_p) - emit_use (reg); - } - } + if (xtensa_call_save_reg (regno)) + { + rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); + rtx reg; + + offset -= UNITS_PER_WORD; + emit_move_insn (reg = gen_rtx_REG (SImode, regno), + gen_frame_mem (SImode, x)); + if (regno == A0_REG && sibcall_p) + emit_use (reg); + stack_pointer_used = true; + } if (cfun->machine->current_frame_size > 0) { @@ -3384,31 +3372,42 @@ xtensa_expand_epilogue (bool sibcall_p) else offset = cfun->machine->callee_save_size; if (offset) - emit_insn (gen_addsi3 (stack_pointer_rtx, - stack_pointer_rtx, - GEN_INT (offset))); + xtensa_emit_adjust_stack_pointer (offset, false); } else - { - if (xtensa_simm8x256 (cfun->machine->current_frame_size)) - emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, - GEN_INT (cfun->machine->current_frame_size))); - else - { - rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); - emit_move_insn (tmp_reg, - GEN_INT (cfun->machine->current_frame_size)); - emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, - tmp_reg)); - } - } + xtensa_emit_adjust_stack_pointer (cfun->machine->current_frame_size, + false); } if (crtl->calls_eh_return) emit_insn (gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx, EH_RETURN_STACKADJ_RTX)); + + /* Check if the function body uses the stack pointer. */ + for (ref = DF_REG_USE_CHAIN (A1_REG); + ref; ref = DF_REF_NEXT_REG (ref)) + if (DF_REF_CLASS (ref) == DF_REF_REGULAR) + { + stack_pointer_used = true; + break; + } + + /* Undo the insns if the stack pointer is only used for its own + adjustment. */ + if (! (stack_pointer_used + || frame_pointer_needed + || crtl->calls_eh_return)) + for (const auto &insn : *cfun->machine->logues_a1_adjusts) + { + rtx note = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL); + + if (note) + remove_note (insn, note); + PATTERN (insn) = const0_rtx; + } } + cfun->machine->epilogue_done = true; if (!sibcall_p) emit_jump_insn (gen_return ()); From patchwork Thu Sep 1 05:49:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 57230 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 84AB6382DB38 for ; Thu, 1 Sep 2022 05:51:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 84AB6382DB38 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662011468; bh=6kyEfrDXUZ1A7Zlhzi4NEgmIasmuWjjpTnnGEkwARKo=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Ii1P2VkD/E70N4oe7Hla/N8RRjLpi/ND4EQFbVJiwWNADlmpt6AnN9bgWdBbMFS8n 15ssKYrA3ISLeaMiyYPVE+6V3iiEk6k/fvOtFcvSUUfq8qzngZ/WnDnzv7QXXI+Uzq ApKm/gjbIsuVjtMZPL5014VieTQvs8XaRaJw/fm4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nh602-vm9.bullet.mail.ssk.yahoo.co.jp (nh602-vm9.bullet.mail.ssk.yahoo.co.jp [182.22.90.34]) by sourceware.org (Postfix) with SMTP id 3D3B13854150 for ; Thu, 1 Sep 2022 05:50:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3D3B13854150 Received: from [182.22.66.105] by nh602.bullet.mail.ssk.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:34 -0000 Received: from [182.22.91.130] by t603.bullet.mail.ssk.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:33 -0000 Received: from [127.0.0.1] by omp603.mail.ssk.yahoo.co.jp with NNFMP; 01 Sep 2022 05:50:33 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 959472.74411.bm@omp603.mail.ssk.yahoo.co.jp Received: (qmail 71717 invoked by alias); 1 Sep 2022 05:50:33 -0000 Received: from unknown (HELO ?192.168.2.3?) (175.177.45.181 with ) by smtp5003.mail.kks.ynwp.yahoo.co.jp with SMTP; 1 Sep 2022 05:50:33 -0000 X-YMail-JAS: PjqgVAQVM1n1onOCzcg8qXxdaaUGrLHcQoUGCEQcbAehqItXqQMgUURuAnun_tNVtWj5113OHZ_Xg6LVq0RepCofGcqCCSd0L1gAlgYMLAMFqbqFuSkyPifeoNKXzMJJq0U8hO_Z_A-- X-Apparently-From: X-YMail-OSG: wKmG1q8VM1kt7jCtsbsnEXjdyQE9GwAYXX.IBCoes5AYn_t BSsZ1AB8UjztbCN5CUD03HD4pqUUhrGsEr4_csjBZEVirEqSVQxeOebR_rUb WxMHZNSLX3Gk1UyU5A__dGbFi.0sF10fbHKs7CGrBcfDMw6lqMwgixMtW95H mu0lmMHa6en81Us_lzI1eSfQr8ceTwlloDR0FEXOSrJJLW08s8xBlo2gw7DP jnNtBo4vXW9GjkE6W0sTblp0olPJYzvWkd7C6wqYG_vmDArrSnJShHMPbgMX G6SDGTVfXPGuA1nVyLKEl.Ps5AZ3QUOsi7a1Ix79SxWzpBD4SrEyg8.sdbMZ NlmVQ7KQlK_.tSr9mgXdye36HUL27Tnu6ym.B4sQnk7IUuxl9yF6Z4THeg6e rQ63d37sbDUao2AxlTI2U6oS0zj8bdBq1tIPfVjOkp2NEb3JOP2LVN9hkBRw P2gfJRU2Z_gkso1N2kupLeHcKS5NPMIP.y9VdFcx15x72C_Nq52GfH.JcMMF 9c4ri2sp10QNS5ArSDW3V7DPzQ0UDgkzznjSIzVH9gXGwF4yM9nBWIxMzjfm 7hU9NifIVK2RGVWHYVz62589p0zOg1j06twsk.8l7.lv4wXw1pb.mWsC6Vy7 97jG7ZIm1zU8Qv0hE8SQIg7MZSTWJjCCIV_l0hnF9gfP4SqIjR7sZEpZYnzh X6Ezk.BEUFrFhRTEhJvlLGLZ5byuGfUIs5y02U1kXKKpxmQ80D_97SaGhOQe 5MOwqo8E65LuqhpXho0QwQlnQQtezT7d1ANFCNa_dVTEWnbF8RNPfAbUgDz3 aE6rMektzHwuZT3VNFBF3UZKvfGDrk2XO8auckZi4NwOIx_rKYOvGJHdmuCy 7NhR7N967O7EE7xIDUTeTuPt2_QKbMbHoFFtIJirpg64jpJNjjT_OXMWyE1F OdpkWAYqZGsrC9na9yg-- Message-ID: <1a486e72-8b3a-752e-f1b8-4383a38c004b@yahoo.co.jp> Date: Thu, 1 Sep 2022 14:49:13 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.2.1 To: GCC Patches Subject: [PATCH 2/2] xtensa: Make complex hard register clobber elimination more robust and accurate X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Takayuki 'January June' Suwa via Gcc-patches From: Takayuki 'January June' Suwa Reply-To: Takayuki 'January June' Suwa Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This patch eliminates all clobbers for complex hard registers that will be overwritten entirely afterwards (supersedence of 3867d414bd7d9e5b6fb2a51b1fb3d9e9e1eae9). gcc/ChangeLog: * config/xtensa/xtensa.md: Rewrite the split pattern that performs the abovementioned process so that insns that overwrite clobbered register no longer need to be contiguous. (DSC): Remove as no longer needed. --- gcc/config/xtensa/xtensa.md | 67 +++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 3ed269249a4..f722ea56289 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -86,10 +86,6 @@ ;; This code iterator is for *shlrd and its variants. (define_code_iterator ior_op [ior plus]) -;; This mode iterator allows the DC and SC patterns to be defined from -;; the same template. -(define_mode_iterator DSC [DC SC]) - ;; Attributes. @@ -2843,27 +2839,54 @@ }) (define_split - [(clobber (match_operand:DSC 0 "register_operand"))] - "GP_REG_P (REGNO (operands[0]))" + [(clobber (match_operand 0 "register_operand"))] + "HARD_REGISTER_P (operands[0]) + && COMPLEX_MODE_P (GET_MODE (operands[0]))" [(const_int 0)] { - unsigned int regno = REGNO (operands[0]); - machine_mode inner_mode = GET_MODE_INNER (mode); + auto_sbitmap bmp (FIRST_PSEUDO_REGISTER); rtx_insn *insn; - rtx x; - if (! ((insn = next_nonnote_nondebug_insn (curr_insn)) - && NONJUMP_INSN_P (insn) - && GET_CODE (x = PATTERN (insn)) == SET - && REG_P (x = XEXP (x, 0)) - && GET_MODE (x) == inner_mode - && REGNO (x) == regno - && (insn = next_nonnote_nondebug_insn (insn)) - && NONJUMP_INSN_P (insn) - && GET_CODE (x = PATTERN (insn)) == SET - && REG_P (x = XEXP (x, 0)) - && GET_MODE (x) == inner_mode - && REGNO (x) == regno + REG_NREGS (operands[0]) / 2)) - FAIL; + rtx reg = gen_rtx_REG (SImode, 0); + bitmap_set_range (bmp, REGNO (operands[0]), REG_NREGS (operands[0])); + for (insn = next_nonnote_nondebug_insn_bb (curr_insn); + insn; insn = next_nonnote_nondebug_insn_bb (insn)) + { + sbitmap_iterator iter; + unsigned int regno; + if (NONJUMP_INSN_P (insn)) + { + EXECUTE_IF_SET_IN_BITMAP (bmp, 2, regno, iter) + { + set_regno_raw (reg, regno, REG_NREGS (reg)); + if (reg_overlap_mentioned_p (reg, PATTERN (insn))) + break; + } + if (GET_CODE (PATTERN (insn)) == SET) + { + rtx x = SET_DEST (PATTERN (insn)); + if (REG_P (x) && HARD_REGISTER_P (x)) + bitmap_clear_range (bmp, REGNO (x), REG_NREGS (x)); + else if (SUBREG_P (x) && HARD_REGISTER_P (SUBREG_REG (x))) + { + struct subreg_info info; + subreg_get_info (regno = REGNO (SUBREG_REG (x)), + GET_MODE (SUBREG_REG (x)), + SUBREG_BYTE (x), GET_MODE (x), &info); + if (!info.representable_p) + break; + bitmap_clear_range (bmp, regno + info.offset, info.nregs); + } + } + if (bitmap_empty_p (bmp)) + goto FALLTHRU; + } + else if (CALL_P (insn)) + EXECUTE_IF_SET_IN_BITMAP (bmp, 2, regno, iter) + if (call_used_or_fixed_reg_p (regno)) + break; + } + FAIL; +FALLTHRU:; }) (define_peephole2