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;
>           }
> 


Reply via email to