[Bug tree-optimization/56817] [4.8/4.9 Regression] ICE in hide_evolution_in_other_loops_than_loop

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Apr 3 08:21:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56817

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2013-04-03
                 CC|                            |hubicka at gcc dot gnu.org
         AssignedTo|unassigned at gcc dot       |rguenth at gcc dot gnu.org
                   |gnu.org                     |
   Target Milestone|---                         |4.8.1
     Ever Confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> 2013-04-03 08:21:29 UTC ---
Usually a sign of bogus wrto loop argument.

194       /* Induction variables are constants.  */
195       if (!simple_iv (loop, loop_containing_stmt (stmt), op, &iv, false))
196         return false;

op is defined in loop 4 which means it will get an evolution evolving in
loop 4, but stmt is in loop 6.  Both are nested inside loop (loop 1),
but they are not nested inside each other.

Which means you cannot compute a sensible evolution for op in loop 6
(which in the end means that simple_iv should return false, but that it
should not call analyze_scalar_evolution_in_loop for this loop/op combination).

Note that the caller above (tree_estimate_loop_size) is probably interested
in the evolution of 'op' in loop 'loop', not in the loop of the stmt
that uses op.  No?  Thus,

Index: tree-ssa-loop-ivcanon.c
===================================================================
--- tree-ssa-loop-ivcanon.c     (revision 197356)
+++ tree-ssa-loop-ivcanon.c     (working copy)
@@ -192,7 +192,7 @@ constant_after_peeling (tree op, gimple
     }

   /* Induction variables are constants.  */
-  if (!simple_iv (loop, loop_containing_stmt (stmt), op, &iv, false))
+  if (!simple_iv (loop, loop, op, &iv, false))
     return false;
   if (!is_gimple_min_invariant (iv.base))
     return false;

looks what we are interested in.



More information about the Gcc-bugs mailing list