From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2063) id DD89C3857C41; Tue, 2 Aug 2022 03:56:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD89C3857C41 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Kewen Lin To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-10186] rs6000: Preserve REG_EH_REGION when replacing load/store [PR106091] X-Act-Checkin: gcc X-Git-Author: Kewen Lin X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 8fdd79a0be51d3f5492e14c825c6f4543ffabeca X-Git-Newrev: cd014105121275d1b226cb494277663d9181ab01 Message-Id: <20220802035627.DD89C3857C41@sourceware.org> Date: Tue, 2 Aug 2022 03:56:27 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Aug 2022 03:56:28 -0000 https://gcc.gnu.org/g:cd014105121275d1b226cb494277663d9181ab01 commit r11-10186-gcd014105121275d1b226cb494277663d9181ab01 Author: Kewen Lin Date: Mon Jul 25 21:29:14 2022 -0500 rs6000: Preserve REG_EH_REGION when replacing load/store [PR106091] As test case in PR106091 shows, rs6000 specific pass swaps doesn't preserve the reg_note REG_EH_REGION when replacing some load insn at the end of basic block, it causes the flow info verification to fail unexpectedly. Since memory reference rtx may trap, this patch is to ensure we copy REG_EH_REGION reg_note while replacing swapped aligned load or store. PR target/106091 gcc/ChangeLog: * config/rs6000/rs6000-p8swap.c (replace_swapped_aligned_store): Copy REG_EH_REGION when replacing one store insn having it. (replace_swapped_aligned_load): Likewise. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr106091.c: New test. (cherry picked from commit f4286601933406142b46693660f7f4b682cb50a5) Diff: --- gcc/config/rs6000/rs6000-p8swap.c | 20 ++++++++++++++++++-- gcc/testsuite/gcc.target/powerpc/pr106091.c | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gcc/config/rs6000/rs6000-p8swap.c b/gcc/config/rs6000/rs6000-p8swap.c index 903002a4576..4741d14d99f 100644 --- a/gcc/config/rs6000/rs6000-p8swap.c +++ b/gcc/config/rs6000/rs6000-p8swap.c @@ -1668,7 +1668,15 @@ replace_swapped_aligned_store (swap_web_entry *insn_entry, gcc_assert ((GET_CODE (new_body) == SET) && MEM_P (SET_DEST (new_body))); - set_block_for_insn (new_insn, BLOCK_FOR_INSN (store_insn)); + basic_block bb = BLOCK_FOR_INSN (store_insn); + set_block_for_insn (new_insn, bb); + /* Handle REG_EH_REGION note. */ + if (cfun->can_throw_non_call_exceptions && BB_END (bb) == store_insn) + { + rtx note = find_reg_note (store_insn, REG_EH_REGION, NULL_RTX); + if (note) + add_reg_note (new_insn, REG_EH_REGION, XEXP (note, 0)); + } df_insn_rescan (new_insn); df_insn_delete (store_insn); @@ -1761,7 +1769,15 @@ replace_swapped_aligned_load (swap_web_entry *insn_entry, rtx swap_insn) gcc_assert ((GET_CODE (new_body) == SET) && MEM_P (SET_SRC (new_body))); - set_block_for_insn (new_insn, BLOCK_FOR_INSN (def_insn)); + basic_block bb = BLOCK_FOR_INSN (def_insn); + set_block_for_insn (new_insn, bb); + /* Handle REG_EH_REGION note. */ + if (cfun->can_throw_non_call_exceptions && BB_END (bb) == def_insn) + { + rtx note = find_reg_note (def_insn, REG_EH_REGION, NULL_RTX); + if (note) + add_reg_note (new_insn, REG_EH_REGION, XEXP (note, 0)); + } df_insn_rescan (new_insn); df_insn_delete (def_insn); diff --git a/gcc/testsuite/gcc.target/powerpc/pr106091.c b/gcc/testsuite/gcc.target/powerpc/pr106091.c new file mode 100644 index 00000000000..61ce8cf4733 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr106091.c @@ -0,0 +1,15 @@ +/* { dg-options "-O -fnon-call-exceptions -fno-tree-dce -fno-tree-forwprop -w" } */ + +/* Verify there is no ICE. */ + +typedef short __attribute__ ((__vector_size__ (64))) V; +V v, w; + +inline V foo (V a, V b); + +V +foo (V a, V b) +{ + b &= v < b; + return (V){foo (b, w)[3], (V){}[3]}; +}