Patchwork Fix loop-iv.c ICE

login
register
mail settings
Submitter Jan Hubicka
Date Jan. 16, 2013, 4:13 p.m.
Message ID <20130116161346.GB3955@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/212793/
State New
Headers show

Comments

Jan Hubicka - Jan. 16, 2013, 4:13 p.m.
Hi,
this patch fixes ICE seen in PR51083 on PPC.  Here the flags ^= 0x80000000 expression
is translated as PLUS.  This makes us to consider flags to be IV and work out that the
loop do not really iterate.   It is a missed optimization that we do not work out this
on all targets and do not unloop the loop at tree level. I opened PR for this.
This patch fixes the ICE that we get confused on concluding that max number of iterations
is 0.

Bootstrapped/regtested x86_64-linux (where the code path do not really trigger obviously)
and tested that it is fixing the testcase on PPC.
OK?

Honza
	PR tree-optimizatoin/51083

	* gcc.c-torture/compile/pr51083.c: New testcase.

	* loop-iv.c (iv_number_of_iterations): Consider zero iteration case.
Richard Guenther - Jan. 17, 2013, 10:03 a.m.
On Wed, Jan 16, 2013 at 5:13 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> this patch fixes ICE seen in PR51083 on PPC.  Here the flags ^= 0x80000000 expression
> is translated as PLUS.  This makes us to consider flags to be IV and work out that the
> loop do not really iterate.   It is a missed optimization that we do not work out this
> on all targets and do not unloop the loop at tree level. I opened PR for this.
> This patch fixes the ICE that we get confused on concluding that max number of iterations
> is 0.
>
> Bootstrapped/regtested x86_64-linux (where the code path do not really trigger obviously)
> and tested that it is fixing the testcase on PPC.
> OK?

Ok.

Thanks,
Richard.

> Honza
>         PR tree-optimizatoin/51083
>
>         * gcc.c-torture/compile/pr51083.c: New testcase.
>
>         * loop-iv.c (iv_number_of_iterations): Consider zero iteration case.
>
> Index: testsuite/gcc.c-torture/compile/pr51083.c
> ===================================================================
> --- testsuite/gcc.c-torture/compile/pr51083.c   (revision 0)
> +++ testsuite/gcc.c-torture/compile/pr51083.c   (revision 0)
> @@ -0,0 +1,18 @@
> +extern int debug_threads;
> +extern void sigsuspend (void);
> +void my_waitpid (int flags, int wnohang)
> +{
> +  while (1)
> +    {
> +      if (flags & 0x80000000)
> +        {
> +          if (wnohang)
> +            break;
> +          if (debug_threads)
> +            __builtin_puts ("blocking\n");
> +          sigsuspend ();
> +        }
> +      flags ^= 0x80000000;
> +    }
> +}
> +
> Index: loop-iv.c
> ===================================================================
> --- loop-iv.c   (revision 195144)
> +++ loop-iv.c   (working copy)
> @@ -2819,7 +2819,8 @@ iv_number_of_iterations (struct loop *lo
>    else
>      {
>        max = determine_max_iter (loop, desc, old_niter);
> -      gcc_assert (max);
> +      if (!max)
> +       goto zero_iter_simplify;
>        if (!desc->infinite
>           && !desc->assumptions)
>         record_niter_bound (loop, double_int::from_uhwi (max),

Patch

Index: testsuite/gcc.c-torture/compile/pr51083.c
===================================================================
--- testsuite/gcc.c-torture/compile/pr51083.c	(revision 0)
+++ testsuite/gcc.c-torture/compile/pr51083.c	(revision 0)
@@ -0,0 +1,18 @@ 
+extern int debug_threads;
+extern void sigsuspend (void);
+void my_waitpid (int flags, int wnohang)
+{
+  while (1)
+    {
+      if (flags & 0x80000000)
+        {
+          if (wnohang)
+            break;
+          if (debug_threads)
+            __builtin_puts ("blocking\n");
+          sigsuspend ();
+        }
+      flags ^= 0x80000000;
+    }
+}
+
Index: loop-iv.c
===================================================================
--- loop-iv.c	(revision 195144)
+++ loop-iv.c	(working copy)
@@ -2819,7 +2819,8 @@  iv_number_of_iterations (struct loop *lo
   else
     {
       max = determine_max_iter (loop, desc, old_niter);
-      gcc_assert (max);
+      if (!max)
+	goto zero_iter_simplify;
       if (!desc->infinite
 	  && !desc->assumptions)
 	record_niter_bound (loop, double_int::from_uhwi (max),