Patchwork PR tree-optimization/55569 (profile updating ICE)

login
register
mail settings
Submitter Jan Hubicka
Date Jan. 9, 2013, 3:06 p.m.
Message ID <20130109150632.GC17341@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/210719/
State New
Headers show

Comments

Jan Hubicka - Jan. 9, 2013, 3:06 p.m.
Hi,
this patch fixes problem with negative probabilities that result in overflow on
ITERATION_BOUND parameter that is taken from niter code returning wider values
than int.  I went for gcov_type instead of HOST_WIDE_INT because it makes sense
to derive the bounds from profile, too.

Will commit it as obvious once bootstrap/regtest on x86_64 complette.

Honza

	PR tree-optimization/55569
	* cfgloopmanip.c (scale_loop_profile): Make ITERATION_BOUND gcov_type.
	* cfgloop.h (scale_loop_profile): Likewise.
	* gcc.c-torture/compile/pr55569.c: New testcase.

Patch

Index: cfgloopmanip.c
===================================================================
--- cfgloopmanip.c	(revision 195047)
+++ cfgloopmanip.c	(working copy)
@@ -481,7 +481,7 @@  scale_loop_frequencies (struct loop *loo
    to iterate too many times.  */
 
 void
-scale_loop_profile (struct loop *loop, int scale, int iteration_bound)
+scale_loop_profile (struct loop *loop, int scale, gcov_type iteration_bound)
 {
   gcov_type iterations = expected_loop_iterations_unbounded (loop);
   edge e;
Index: cfgloop.h
===================================================================
--- cfgloop.h	(revision 195047)
+++ cfgloop.h	(working copy)
@@ -711,7 +711,7 @@  extern void unroll_and_peel_loops (int);
 extern void doloop_optimize_loops (void);
 extern void move_loop_invariants (void);
 extern bool finite_loop_p (struct loop *);
-extern void scale_loop_profile (struct loop *loop, int scale, int iteration_bound);
+extern void scale_loop_profile (struct loop *loop, int scale, gcov_type iteration_bound);
 extern vec<basic_block> get_loop_hot_path (const struct loop *loop);
 
 /* Returns the outermost loop of the loop nest that contains LOOP.*/
Index: testsuite/gcc.c-torture/compile/pr55569.c
===================================================================
--- testsuite/gcc.c-torture/compile/pr55569.c	(revision 0)
+++ testsuite/gcc.c-torture/compile/pr55569.c	(revision 0)
@@ -0,0 +1,11 @@ 
+/* { dg-options "-O1 -ftree-vectorize" } */
+int *bar (void);
+
+void
+foo (void)
+{
+  long x;
+  int *y = bar ();
+    for (x = -1 / sizeof (int); x; --x, ++y)
+       *y = 0;
+}