This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Speedup int_bit_from_pos
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Mike Stump <mikestump at comcast dot net>
- Cc: Jan Hubicka <hubicka at ucw dot cz>, Richard Biener <rguenther at suse dot de>, Jeff Law <law at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 22 Sep 2014 20:53:03 +0200
- Subject: Re: Speedup int_bit_from_pos
- Authentication-results: sourceware.org; auth=none
- References: <20140920040451 dot GC21760 at kam dot mff dot cuni dot cz> <541D948B dot 1030602 at redhat dot com> <20140920160752 dot GA18043 at kam dot mff dot cuni dot cz> <9767d203-5e46-4835-86b2-f983d20fcba8 at email dot android dot com> <20140921141944 dot GA4519 at kam dot mff dot cuni dot cz> <alpine dot LSU dot 2 dot 11 dot 1409220951530 dot 20733 at zhemvz dot fhfr dot qr> <20140922155110 dot GA30885 at kam dot mff dot cuni dot cz> <CF77FAC2-E85A-4204-8DF8-CCB78336EB7B at comcast dot net> <20140922182217 dot GA5371 at kam dot mff dot cuni dot cz> <1A97F69C-2945-4911-84D4-5F648ED36DCC at comcast dot net>
> On Sep 22, 2014, at 11:22 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> >> Not quite:
> >>
> >> offset_int woffset
> >> = (wi::to_offset (xoffset)
> >> + wi::lrshift (wi::to_offset (DECL_FIELD_BIT_OFFSET (field)),
> >> LOG2_BITS_PER_UNIT));
> >>
> >> offset_int is the type that can hold all bit positions, byte positions, byte sizes and bit sizes.
> >
> > Yep, I worked that out in meantime. Now I get:
> > ../../gcc/tree.h: In function ïlong int int_bit_position(const_tree)ï:
> > ../../gcc/tree.h:3890:24: error: ïto_offsetï is not a member of ïwiï
> > return (wi::lrshift (wi::to_offset (DECL_FIELD_OFFSET (field)), BITS_PER_UNIT_LOG)
>
> That is defined later in tree.h? If you want to use it in tree.h, you will have to have it after to_offset is defined. Alternatively, you can move it up, but, you will need to understand the dependancies some (or try some builds).
Aha, missed that bit. I am testing this variant.
Honza
Index: tree.h
===================================================================
--- tree.h (revision 215421)
+++ tree.h (working copy)
@@ -3877,10 +3877,9 @@ extern tree size_in_bytes (const_tree);
extern HOST_WIDE_INT int_size_in_bytes (const_tree);
extern HOST_WIDE_INT max_int_size_in_bytes (const_tree);
extern tree bit_position (const_tree);
-extern HOST_WIDE_INT int_bit_position (const_tree);
extern tree byte_position (const_tree);
extern HOST_WIDE_INT int_byte_position (const_tree);
#define sizetype sizetype_tab[(int) stk_sizetype]
#define bitsizetype sizetype_tab[(int) stk_bitsizetype]
#define ssizetype sizetype_tab[(int) stk_ssizetype]
@@ -4797,4 +4797,14 @@ extern tree get_inner_reference (tree, H
EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */
extern tree array_ref_low_bound (tree);
+/* Like bit_position, but return as an integer. It must be representable in
+ that way (since it could be a signed value, we don't have the
+ option of returning -1 like int_size_in_byte can. */
+
+static inline HOST_WIDE_INT
+int_bit_position (const_tree field)
+{
+ return (wi::lrshift (wi::to_offset (DECL_FIELD_OFFSET (field)), BITS_PER_UNIT_LOG)
+ + wi::to_offset (DECL_FIELD_BIT_OFFSET (field))).to_shwi ();
+}
#endif /* GCC_TREE_H */