[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