public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] loop-invariant: JUMP_INSNs aren't loop invariant [PR97954]
@ 2020-12-01  8:48 Jakub Jelinek
  2020-12-01 10:06 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2020-12-01  8:48 UTC (permalink / raw)
  To: Richard Biener, Jeff Law; +Cc: gcc-patches

Hi!

The following testcase ICEs because loop invariant motion moves asm goto
with a single output as invariant.
Normally, jumps aren't really moved, because if they are single set,
they have their SET_DEST (pc) and pc_rtx has VOIDmode on which one of the
functions find_invariant_insn calls bails out.  The code already punts on
insns that can throw or trap.  And for asm goto without outputs, it isn't
single set, or asm goto with two or more outputs it isn't single set either.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2020-12-01  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/97954
	* loop-invariant.c (find_invariant_insn): Punt on JUMP_P insns.

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

--- gcc/loop-invariant.c.jj	2020-01-12 11:54:36.000000000 +0100
+++ gcc/loop-invariant.c	2020-11-30 09:56:37.022696142 +0100
@@ -1099,6 +1099,10 @@ find_invariant_insn (rtx_insn *insn, boo
   if (HAVE_cc0 && sets_cc0_p (insn))
     return;
 
+  /* Jumps have control flow side-effects.  */
+  if (JUMP_P (insn))
+    return;
+
   set = single_set (insn);
   if (!set)
     return;
--- gcc/testsuite/gcc.dg/pr97954.c.jj	2020-11-30 10:31:54.870891248 +0100
+++ gcc/testsuite/gcc.dg/pr97954.c	2020-11-30 10:31:08.875407984 +0100
@@ -0,0 +1,12 @@
+/* PR rtl-optimization/97954 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+foo (void)
+{
+  int x;
+ lab:
+  asm goto ("": "=r" (x) : : : lab);
+  return x;
+}

	Jakub


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

* Re: [PATCH] loop-invariant: JUMP_INSNs aren't loop invariant [PR97954]
  2020-12-01  8:48 [PATCH] loop-invariant: JUMP_INSNs aren't loop invariant [PR97954] Jakub Jelinek
@ 2020-12-01 10:06 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2020-12-01 10:06 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Jeff Law, gcc-patches

On Tue, 1 Dec 2020, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase ICEs because loop invariant motion moves asm goto
> with a single output as invariant.
> Normally, jumps aren't really moved, because if they are single set,
> they have their SET_DEST (pc) and pc_rtx has VOIDmode on which one of the
> functions find_invariant_insn calls bails out.  The code already punts on
> insns that can throw or trap.  And for asm goto without outputs, it isn't
> single set, or asm goto with two or more outputs it isn't single set either.
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?

OK.

Thanks,
Richard.

> 2020-12-01  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR rtl-optimization/97954
> 	* loop-invariant.c (find_invariant_insn): Punt on JUMP_P insns.
> 
> 	* gcc.dg/pr97954.c: New test.
> 
> --- gcc/loop-invariant.c.jj	2020-01-12 11:54:36.000000000 +0100
> +++ gcc/loop-invariant.c	2020-11-30 09:56:37.022696142 +0100
> @@ -1099,6 +1099,10 @@ find_invariant_insn (rtx_insn *insn, boo
>    if (HAVE_cc0 && sets_cc0_p (insn))
>      return;
>  
> +  /* Jumps have control flow side-effects.  */
> +  if (JUMP_P (insn))
> +    return;
> +
>    set = single_set (insn);
>    if (!set)
>      return;
> --- gcc/testsuite/gcc.dg/pr97954.c.jj	2020-11-30 10:31:54.870891248 +0100
> +++ gcc/testsuite/gcc.dg/pr97954.c	2020-11-30 10:31:08.875407984 +0100
> @@ -0,0 +1,12 @@
> +/* PR rtl-optimization/97954 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +int
> +foo (void)
> +{
> +  int x;
> + lab:
> +  asm goto ("": "=r" (x) : : : lab);
> +  return x;
> +}
> 
> 	Jakub
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

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

end of thread, other threads:[~2020-12-01 10:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-01  8:48 [PATCH] loop-invariant: JUMP_INSNs aren't loop invariant [PR97954] Jakub Jelinek
2020-12-01 10:06 ` 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).