From patchwork Mon Oct 22 15:26:25 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Minor record_upper_bound tweek Date: Mon, 22 Oct 2012 05:26:25 -0000 From: Jan Hubicka X-Patchwork-Id: 193179 Message-Id: <20121022152625.GA18262@kam.mff.cuni.cz> To: gcc-patches@gcc.gnu.org, rguenther@suse.de Hi, with profile feedback we may misupdate the profile and start to believe that loops iterate more times than they do. This patch makes at least nb_iterations_estimate no greater than nb_iterations_upper_bound. This makes the unrolling/peeling/unswitching heuristics to behave more consistently. Bootstrapped/regtested x86_64-linux, OK? Honza * tree-sssa-loop-niter.c (record_niter_bound): Be sure that realistic estimate is not bigger than upper bound. Index: tree-ssa-loop-niter.c =================================================================== --- tree-ssa-loop-niter.c (revision 192632) +++ tree-ssa-loop-niter.c (working copy) @@ -2506,13 +2506,20 @@ record_niter_bound (struct loop *loop, d { loop->any_upper_bound = true; loop->nb_iterations_upper_bound = i_bound; + if (loop->any_estimate + && i_bound.ult (loop->nb_iterations_estimate)) + loop->nb_iterations_estimate = i_bound; } if (realistic && (!loop->any_estimate || i_bound.ult (loop->nb_iterations_estimate))) { loop->any_estimate = true; - loop->nb_iterations_estimate = i_bound; + if (loop->nb_iterations_upper_bound.ult (i_bound) + && loop->any_upper_bound) + loop->nb_iterations_estimate = loop->nb_iterations_upper_bound; + else + loop->nb_iterations_estimate = i_bound; } /* If an upper bound is smaller than the realistic estimate of the