On 24/10/2022 14:29, Richard Biener wrote:
On Mon, 24 Oct 2022, Andre Vieira (lists) wrote:

Changing if-convert would merely change this testcase but we could still
trigger using a different structure type, changing the size of Int24 to 32
bits rather than 24:
package Loop_Optimization23_Pkg is
   type Nibble is mod 2**4;
   type Int24  is mod 2**32;  -- Changed this from 24->32
   type StructA is record
     a : Nibble;
     b : Int24;
   end record;
   pragma Pack(StructA);
   type StructB is record
     a : Nibble;
     b : StructA;
   end record;
   pragma Pack(StructB);
   type ArrayOfStructB is array(0..100) of StructB;
   procedure Foo (X : in out ArrayOfStructB);
end Loop_Optimization23_Pkg;

This would yield a DR_REF (dr): (*x_7(D))[_1].b.b  where the last 'b' isn't a
DECL_BIT_FIELD anymore, but the first one still is and still has the
non-multiple of BITS_PER_UNIT offset. Thus passing the
vect_find_stmt_data_reference check and triggering the
vect_check_gather_scatter failure. So unless we go and make sure we always set
the DECL_BIT_FIELD on all subsequent accesses of a DECL_BIT_FIELD 'struct'
(which is odd enough on its own) then we are better off catching the issue in
vect_check_gather_scatter ?
But it's not only an issue with scatter-gather, other load/store handling
assumes it can create a pointer to the start of the access and thus
requires BITS_PER_UNIT alignment for each of them.  So we need to fail
at data-ref analysis somehow.

Richard.

Sorry for the delay on this, had some other things come in between. After our IRC discussion I believe we agreed that it would be neater to check this in vect_check_gather_scatter as I did in the original patch in https://gcc.gnu.org/pipermail/gcc-patches/2022-October/604139.html The main reasons being that to check earlier we'd need to walk the DR_REF to look for any FIELD_DECL that has DECL_BIT_FIELD set and we decided against that.

Can you confirm the original patch is OK for trunk?

Kind regards,
Andre

Reply via email to