Patchwork Speedup copy_reference_ops_from_ref

login
register
mail settings
Submitter Richard Guenther
Date Dec. 8, 2010, 2:28 p.m.
Message ID <alpine.LNX.2.00.1012081527120.23074@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/74722/
State New
Headers show

Comments

Richard Guenther - Dec. 8, 2010, 2:28 p.m.
This halves the time spent in copy_reference_ops_from_ref for infcodes.c.
The trick is to use a shift when dividing/multiplying by BITS_PER_UNIT
as done elsewhere.

I'll apply this after bootstrapping and testing on 
x86_64-unknown-linux-gnu.

Thanks,
Richard.

2010-12-08  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Use a shift
	instead of a division to divide by BITS_PER_UNIT.
Joseph S. Myers - Dec. 8, 2010, 3:13 p.m.
On Wed, 8 Dec 2010, Richard Guenther wrote:

> +					   BITS_PER_UNIT == 8
> +					   ? 3 : exact_log2 (BITS_PER_UNIT),

I know we use this idiom elsewhere, but if we (i.e. 3.4-or-later host 
compiler) aren't folding exact_log2 (BITS_PER_UNIT) to a constant (given 
constant BITS_PER_UNIT) there's something wrong with either our constant 
folding for built-in functions or our inlining heuristics.
Richard Guenther - Dec. 8, 2010, 3:18 p.m.
On Wed, 8 Dec 2010, Joseph S. Myers wrote:

> On Wed, 8 Dec 2010, Richard Guenther wrote:
> 
> > +					   BITS_PER_UNIT == 8
> > +					   ? 3 : exact_log2 (BITS_PER_UNIT),
> 
> I know we use this idiom elsewhere, but if we (i.e. 3.4-or-later host 
> compiler) aren't folding exact_log2 (BITS_PER_UNIT) to a constant (given 
> constant BITS_PER_UNIT) there's something wrong with either our constant 
> folding for built-in functions or our inlining heuristics.

I think we indeed should fold it to a constant.  An even better
cleanup would be to introduce double_int_units_to_bits, 
double_int_bits_to_units.

Richard.

Patch

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 167583)
+++ gcc/tree-ssa-sccvn.c	(working copy)
@@ -644,10 +644,11 @@  copy_reference_ops_from_ref (tree ref, V
 		  {
 		    double_int off
 		      = double_int_add (tree_to_double_int (this_offset),
-					double_int_sdiv
+					double_int_rshift
 					  (tree_to_double_int (bit_offset),
-					   uhwi_to_double_int (BITS_PER_UNIT),
-					   TRUNC_DIV_EXPR));
+					   BITS_PER_UNIT == 8
+					   ? 3 : exact_log2 (BITS_PER_UNIT),
+					   HOST_BITS_PER_DOUBLE_INT, true));
 		    if (double_int_fits_in_shwi_p (off))
 		      temp.off = off.low;
 		  }