[CFG] Overflow handling in estimate_probability
Zdenek Dvorak
rakdver@atrey.karlin.mff.cuni.cz
Tue Jun 18 06:25:00 GMT 2002
Hello.
This patch fixes possibility of division by zero in case of overflow in
estimate_probability.
I'm commiting it to cfg-branch.
Zdenek
Changelog:
* predict.c (estimate_probability): Avoid division by zero in case
of overflow.
Index: predict.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/predict.c,v
retrieving revision 1.44.2.36
diff -c -3 -p -r1.44.2.36 predict.c
*** predict.c 14 Jun 2002 19:13:50 -0000 1.44.2.36
--- predict.c 18 Jun 2002 13:01:56 -0000
*************** estimate_probability (loops_info)
*** 428,433 ****
--- 428,434 ----
int exits;
struct loop *loop = loops_info->parray[i];
struct loop_desc desc;
+ unsigned HOST_WIDE_INT niter;
flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES);
exits = loop->num_exits;
*************** estimate_probability (loops_info)
*** 435,444 ****
if (simple_loop_p (loops_info, loop, &desc)
&& desc.const_iter)
{
predict_edge (desc.in_edge, PRED_CFG_LOOP_ITERATIONS,
REG_BR_PROB_BASE
! - (REG_BR_PROB_BASE + (desc.niter + 1) /2)
! / (desc.niter + 1));
}
bbs = get_loop_body (loop);
--- 436,449 ----
if (simple_loop_p (loops_info, loop, &desc)
&& desc.const_iter)
{
+ niter = desc.niter + 1;
+ if (niter == 0) /* We might overflow here. */
+ niter = desc.niter;
+
predict_edge (desc.in_edge, PRED_CFG_LOOP_ITERATIONS,
REG_BR_PROB_BASE
! - (REG_BR_PROB_BASE + niter /2)
! / niter);
}
bbs = get_loop_body (loop);
More information about the Gcc-patches
mailing list