Richard Sandiford <rdsandif...@googlemail.com> wrote: >This started out as an another attempt to find places where we had >things like: > > offset_int x = wi::to_offset (...); > x = ...x...; > >and change them to: > > offset_int x = ...wi::to_offset (...)...; > >with the get_ref_base_and_extent case being the main one. >But it turned out that some of them were also multiplying or >dividing by BITS_PER_UNIT, so it ended up also being a patch to >convert those to shifts.
Ok and yes please. Thanks, Richard. >I didn't want to cut-&-paste the 3 : log2 (BITS_PER_UNIT) conditional >yet more times, so I added a LOG2_BITS_PER_UNIT to defaults.h. I can >retrofit it to the existing code if that's OK at this stage. > >For insn-recog.ii this reduces the number of divmod_internal calls from >7884858 to 369746. > >Thanks, >Richard > > >Index: gcc/ChangeLog.wide-int >=================================================================== >--- gcc/ChangeLog.wide-int 2013-11-29 15:09:59.623293132 +0000 >+++ gcc/ChangeLog.wide-int 2013-11-29 15:11:48.611155898 +0000 >@@ -111,6 +111,7 @@ > (stabstr_U): Use wide-int interfaces. > (dbxout_type): Update to use cst_fits_shwi_p. > * defaults.h >+ (LOG2_BITS_PER_UNIT): Define. > (TARGET_SUPPORTS_WIDE_INT): Add default. > * dfp.c: Include wide-int.h. > (decimal_real_to_integer2): Use wide-int interfaces and rename to >Index: gcc/alias.c >=================================================================== >--- gcc/alias.c 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/alias.c 2013-11-29 15:11:48.606155857 +0000 >@@ -2355,8 +2355,8 @@ adjust_offset_for_component_ref (tree x, > > offset_int woffset > = (wi::to_offset (xoffset) >- + wi::udiv_trunc (wi::to_offset (DECL_FIELD_BIT_OFFSET (field)), >- BITS_PER_UNIT)); >+ + wi::lrshift (wi::to_offset (DECL_FIELD_BIT_OFFSET (field)), >+ LOG2_BITS_PER_UNIT)); > if (!wi::fits_uhwi_p (woffset)) > { > *known_p = false; >Index: gcc/defaults.h >=================================================================== >--- gcc/defaults.h 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/defaults.h 2013-11-29 15:11:48.606155857 +0000 >@@ -475,6 +475,14 @@ #define DWARF_TYPE_SIGNATURE_SIZE 8 > #define BITS_PER_UNIT 8 > #endif > >+#if BITS_PER_UNIT == 8 >+#define LOG2_BITS_PER_UNIT 3 >+#elif BITS_PER_UNIT == 16 >+#define LOG2_BITS_PER_UNIT 4 >+#else >+#error Unknown BITS_PER_UNIT >+#endif >+ > #ifndef BITS_PER_WORD > #define BITS_PER_WORD (BITS_PER_UNIT * UNITS_PER_WORD) > #endif >Index: gcc/dwarf2out.c >=================================================================== >--- gcc/dwarf2out.c 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/dwarf2out.c 2013-11-29 15:40:56.188806688 +0000 >@@ -14930,7 +14930,7 @@ field_byte_offset (const_tree decl) > object_offset_in_bits = bitpos_int; > > object_offset_in_bytes >- = wi::udiv_trunc (object_offset_in_bits, BITS_PER_UNIT); >+ = wi::lrshift (object_offset_in_bits, LOG2_BITS_PER_UNIT); > return object_offset_in_bytes.to_shwi (); > } > > >Index: gcc/gimple-fold.c >=================================================================== >--- gcc/gimple-fold.c 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/gimple-fold.c 2013-11-29 15:41:17.425983303 +0000 >@@ -2926,7 +2926,6 @@ fold_nonarray_ctor_reference (tree type, > tree field_offset = DECL_FIELD_BIT_OFFSET (cfield); > tree field_size = DECL_SIZE (cfield); > offset_int bitoffset; >- offset_int byte_offset_cst = wi::to_offset (byte_offset); > offset_int bitoffset_end, access_end; > > /* Variable sized objects in static constructors makes no sense, >@@ -2939,7 +2938,8 @@ fold_nonarray_ctor_reference (tree type, > > /* Compute bit offset of the field. */ > bitoffset = (wi::to_offset (field_offset) >- + byte_offset_cst * BITS_PER_UNIT); >+ + wi::lshift (wi::to_offset (byte_offset), >+ LOG2_BITS_PER_UNIT)); > /* Compute bit offset where the field ends. */ > if (field_size != NULL_TREE) > bitoffset_end = bitoffset + wi::to_offset (field_size); >Index: gcc/gimple-ssa-strength-reduction.c >=================================================================== >--- gcc/gimple-ssa-strength-reduction.c 2013-11-29 15:04:41.136142237 >+0000 >+++ gcc/gimple-ssa-strength-reduction.c 2013-11-29 15:40:56.188806688 >+0000 >@@ -897,7 +897,7 @@ restructure_reference (tree *pbase, tree > c2 = 0; > } > >- c4 = wi::udiv_floor (index, BITS_PER_UNIT); >+ c4 = wi::lrshift (index, LOG2_BITS_PER_UNIT); > c5 = backtrace_base_for_ref (&t2); > > *pbase = t1; >Index: gcc/tree-dfa.c >=================================================================== >--- gcc/tree-dfa.c 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/tree-dfa.c 2013-11-29 15:41:39.513166464 +0000 >@@ -437,10 +437,8 @@ get_ref_base_and_extent (tree exp, HOST_ > > if (this_offset && TREE_CODE (this_offset) == INTEGER_CST) > { >- offset_int woffset = wi::to_offset (this_offset); >- woffset = wi::lshift (woffset, >- (BITS_PER_UNIT == 8 >- ? 3 : exact_log2 (BITS_PER_UNIT))); >+ offset_int woffset = wi::lshift (wi::to_offset (this_offset), >+ LOG2_BITS_PER_UNIT); > woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field)); > bit_offset += woffset; > >@@ -505,9 +503,7 @@ get_ref_base_and_extent (tree exp, HOST_ > = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound), > TYPE_PRECISION (TREE_TYPE (index))); > woffset *= wi::to_offset (unit_size); >- woffset = wi::lshift (woffset, >- (BITS_PER_UNIT == 8 >- ? 3 : exact_log2 (BITS_PER_UNIT))); >+ woffset = wi::lshift (woffset, LOG2_BITS_PER_UNIT); > bit_offset += woffset; > > /* An array ref with a constant index up in the structure >Index: gcc/tree-ssa-alias.c >=================================================================== >--- gcc/tree-ssa-alias.c 2013-11-29 15:04:41.136142237 +0000 >+++ gcc/tree-ssa-alias.c 2013-11-29 15:11:48.605155849 +0000 >@@ -2127,18 +2127,19 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref > if (TREE_CODE (rbase) != MEM_REF) > return false; > // Compare pointers. >- offset += mem_ref_offset (base) * BITS_PER_UNIT; >- roffset += mem_ref_offset (rbase) * BITS_PER_UNIT; >+ offset += wi::lshift (mem_ref_offset (base), >+ LOG2_BITS_PER_UNIT); >+ roffset += wi::lshift (mem_ref_offset (rbase), >+ LOG2_BITS_PER_UNIT); > base = TREE_OPERAND (base, 0); > rbase = TREE_OPERAND (rbase, 0); > } >- if (base == rbase) >- { >- offset_int size = wi::to_offset (len) * BITS_PER_UNIT; >- if (wi::les_p (offset, roffset) >- && wi::les_p (roffset + ref->max_size, offset + size)) >- return true; >- } >+ if (base == rbase >+ && wi::les_p (offset, roffset) >+ && wi::les_p (roffset + ref->max_size, >+ offset + wi::lshift (wi::to_offset (len), >+ LOG2_BITS_PER_UNIT))) >+ return true; > break; > } >