[Bug tree-optimization/53265] Warn when undefined behavior implies smaller iteration count

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Mar 12 14:15:00 GMT 2013


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

--- Comment #20 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-03-12 14:13:56 UTC ---
Ok, based on reading what exactly record_estimate does, I've tried:
--- tree-ssa-loop-niter.c.xx    2013-03-12 13:47:08.000000000 +0100
+++ tree-ssa-loop-niter.c    2013-03-12 15:01:50.498107788 +0100
@@ -2655,7 +2655,10 @@ record_nonwrapping_iv (struct loop *loop
       && warn_aggressive_loop_optimizations
       && (cfun->curr_properties & PROP_loops) != 0
       && !loop->warned_aggressive_loop_optimizations
-      && max.ucmp (tree_to_double_int (loop->nb_iterations)) < 0)
+      && (upper || realistic)
+      && (max + double_int_one).ucmp (tree_to_double_int
(loop->nb_iterations))
+     < 0
+      && dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt)))
     {
       location_t loop_locus = UNKNOWN_LOCATION;
       edge e = single_exit (loop);

incremental patch (for !upper && !realistic it gives up early, for
!dominated_by_p
it records the bounds, but doesn't call record_niter_bound, and
record_nonwrapping_iv calls unconditionally record_estimate with is_exit=false,
for which it adds double_int_one to the bounds.

With this #c16 and #c17 compile without warnings, unfortunately the testcase in
the patch regresses two tests, fn4 and fn7 (the latter is from the SPEC2k6
issue).

max + double_int_one above is unsafe btw, we'd need something that
record_estimate does to check for overflows.



More information about the Gcc-bugs mailing list