public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] cfgrtl: Don't try to redirect asm goto to EXIT [PR108263]
@ 2023-01-03 10:28 Jakub Jelinek
  2023-01-03 11:01 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2023-01-03 10:28 UTC (permalink / raw)
  To: Richard Biener, Jeff Law; +Cc: gcc-patches

Hi!

The following testcase distilled from Linux kernel on ppc64le ICEs,
because fixup_reorder_chain sees a bb with a single fallthru edge
falling into a bb with simple return and decides to redirect
that fallthru edge to EXIT.  That is possible if the bb ending
in the fallthru edge doesn't end with a jump or ends with a normal
unconditional jump, but not when the bb ends with asm goto which can despite
a single fallthru have multiple labels to the fallthrough basic block.

The following patch makes sure we never try to redirect such cases to EXIT.

Bootstrapped/regtested on x86_64-linux, i686-linux and s390x-linux, ok for
trunk?

2023-01-03  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/108263
	* cfgrtl.cc (fixup_reorder_chain): Avoid trying to redirect
	asm goto to EXIT.

	* gcc.dg/pr108263.c: New test.

--- gcc/cfgrtl.cc.jj	2023-01-02 09:32:32.000000000 +0100
+++ gcc/cfgrtl.cc	2023-01-02 14:13:40.658338194 +0100
@@ -3910,6 +3910,7 @@ fixup_reorder_chain (void)
       rtx ret_label = NULL_RTX;
       basic_block nb;
       edge_iterator ei;
+      bool asm_goto = false;
 
       if (EDGE_COUNT (bb->succs) == 0)
 	continue;
@@ -4016,7 +4017,9 @@ fixup_reorder_chain (void)
 		  || e_fall->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
 		continue;
 
-	      /* Otherwise we'll have to use the fallthru fixup below.  */
+	      /* Otherwise we'll have to use the fallthru fixup below.
+		 But avoid redirecting asm goto to EXIT.  */
+	      asm_goto = true;
 	    }
 	  else
 	    {
@@ -4048,7 +4051,8 @@ fixup_reorder_chain (void)
 	 return rather than a jump to the return block.  */
       rtx_insn *ret, *use;
       basic_block dest;
-      if (bb_is_just_return (e_fall->dest, &ret, &use)
+      if (!asm_goto
+	  && bb_is_just_return (e_fall->dest, &ret, &use)
 	  && ((PATTERN (ret) == simple_return_rtx && targetm.have_simple_return ())
 	      || (PATTERN (ret) == ret_rtx && targetm.have_return ())))
 	{
--- gcc/testsuite/gcc.dg/pr108263.c.jj	2023-01-02 14:09:49.381614027 +0100
+++ gcc/testsuite/gcc.dg/pr108263.c	2023-01-02 14:07:16.899772608 +0100
@@ -0,0 +1,25 @@
+/* PR rtl-optimization/108263 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int v, *p;
+
+void
+foo (void)
+{
+  int i;
+  for (i = 0; ; i++)
+    {
+      if (v)
+	{
+	  __label__ l1;
+	  asm goto ("" : : : : l1);
+	l1:
+	  return;
+	}
+      if (p[i])
+	break;
+    }
+  asm goto ("" : : "r" (i) : : l2);
+l2:;
+}

	Jakub


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] cfgrtl: Don't try to redirect asm goto to EXIT [PR108263]
  2023-01-03 10:28 [PATCH] cfgrtl: Don't try to redirect asm goto to EXIT [PR108263] Jakub Jelinek
@ 2023-01-03 11:01 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2023-01-03 11:01 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Jeff Law, gcc-patches



> Am 03.01.2023 um 11:29 schrieb Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org>:
> 
> Hi!
> 
> The following testcase distilled from Linux kernel on ppc64le ICEs,
> because fixup_reorder_chain sees a bb with a single fallthru edge
> falling into a bb with simple return and decides to redirect
> that fallthru edge to EXIT.  That is possible if the bb ending
> in the fallthru edge doesn't end with a jump or ends with a normal
> unconditional jump, but not when the bb ends with asm goto which can despite
> a single fallthru have multiple labels to the fallthrough basic block.
> 
> The following patch makes sure we never try to redirect such cases to EXIT.
> 
> Bootstrapped/regtested on x86_64-linux, i686-linux and s390x-linux, ok for
> trunk?

Ok

Richard 

> 2023-01-03  Jakub Jelinek  <jakub@redhat.com>
> 
>    PR rtl-optimization/108263
>    * cfgrtl.cc (fixup_reorder_chain): Avoid trying to redirect
>    asm goto to EXIT.
> 
>    * gcc.dg/pr108263.c: New test.
> 
> --- gcc/cfgrtl.cc.jj    2023-01-02 09:32:32.000000000 +0100
> +++ gcc/cfgrtl.cc    2023-01-02 14:13:40.658338194 +0100
> @@ -3910,6 +3910,7 @@ fixup_reorder_chain (void)
>       rtx ret_label = NULL_RTX;
>       basic_block nb;
>       edge_iterator ei;
> +      bool asm_goto = false;
> 
>       if (EDGE_COUNT (bb->succs) == 0)
>    continue;
> @@ -4016,7 +4017,9 @@ fixup_reorder_chain (void)
>          || e_fall->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
>        continue;
> 
> -          /* Otherwise we'll have to use the fallthru fixup below.  */
> +          /* Otherwise we'll have to use the fallthru fixup below.
> +         But avoid redirecting asm goto to EXIT.  */
> +          asm_goto = true;
>        }
>      else
>        {
> @@ -4048,7 +4051,8 @@ fixup_reorder_chain (void)
>     return rather than a jump to the return block.  */
>       rtx_insn *ret, *use;
>       basic_block dest;
> -      if (bb_is_just_return (e_fall->dest, &ret, &use)
> +      if (!asm_goto
> +      && bb_is_just_return (e_fall->dest, &ret, &use)
>      && ((PATTERN (ret) == simple_return_rtx && targetm.have_simple_return ())
>          || (PATTERN (ret) == ret_rtx && targetm.have_return ())))
>    {
> --- gcc/testsuite/gcc.dg/pr108263.c.jj    2023-01-02 14:09:49.381614027 +0100
> +++ gcc/testsuite/gcc.dg/pr108263.c    2023-01-02 14:07:16.899772608 +0100
> @@ -0,0 +1,25 @@
> +/* PR rtl-optimization/108263 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +int v, *p;
> +
> +void
> +foo (void)
> +{
> +  int i;
> +  for (i = 0; ; i++)
> +    {
> +      if (v)
> +    {
> +      __label__ l1;
> +      asm goto ("" : : : : l1);
> +    l1:
> +      return;
> +    }
> +      if (p[i])
> +    break;
> +    }
> +  asm goto ("" : : "r" (i) : : l2);
> +l2:;
> +}
> 
>    Jakub
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-01-03 11:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-03 10:28 [PATCH] cfgrtl: Don't try to redirect asm goto to EXIT [PR108263] Jakub Jelinek
2023-01-03 11:01 ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).