[Bug middle-end/52436] BIT_FIELD_REF <MEM_REF <>> should be canonicalized for non-bitfield accesses

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Tue Apr 2 14:22:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52436

--- Comment #5 from rguenther at suse dot de <rguenther at suse dot de> 2013-04-02 14:21:56 UTC ---
On Tue, 2 Apr 2013, glisse at gcc dot gnu.org wrote:

> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52436
> 
> --- Comment #4 from Marc Glisse <glisse at gcc dot gnu.org> 2013-04-02 14:08:57 UTC ---
> (In reply to comment #3)
> > I'd re-organize it like
> 
> Ok, I'll try something like that.
> 
> > it avoids building a tree just to feed it into get_addr_base_and_unit_offset
> 
> The idea was that there would be almost no cases where this was done and no
> simplification occurred. If a transformation is indeed done, building one tree
> is not that expensive, especially if it avoids code duplication.

AFAIK it really doesn't.

> > It also avoids it if the access is not of byte-granularity which
> > get_addr_base_and_unit_offset does not even consider (it assumes it is fed
> > the argument of an ADDR_EXPR which obviously is byte-aligned).
> > 
> > The tree-flow-inline.h bits look ok.
> 
> In get_addr_base_and_unit_offset_1 I already check if the offset is a multiple
> of BITS_PER_UNIT, I should probably check that the size is a multiple as well,
> no?

No, get_addr_base_and_unit_offset_1 only is supposed to return the
addressable offset into an object - it doesn't care about access sizes.

> > I'm not sure what you need the forwprop / tree-ssa-propagate changes for.
> 
> I need something to call fold on a bit_field_ref of a mem_ref. For PR55266, the
> vector lowering pass produces a mem_ref and a bit_field_ref in two distinct
> gimple statements, and nothing tries to combine them.

But you can't really do what you do there.  You are possibly
transforming

  vecreg_2 = MEM[...];
....
  MEM[...] = xxxx; // clobber the memory location 
....
  scalreg_3 = BIT_FIELD_REF <vecreg_2, ...>;

into

  vecreg_2 = MEM[...]; // possibly unused
...
  MEM[...] = xxxx; // clobber the memory location
...
  scalreg_3 = MEM[...];

which is not correct, obviously.  "combining" with memory
accesses isn't trivial, certainly not a task I would consider
for forwprop.  I can't think of a suitable existing pass
that would combine this, but value-numbering should eventually
value-number both cases the same at least.

Richard.



More information about the Gcc-bugs mailing list