On 9/23/22 05:42, Tamar Christina wrote:
Hi All,

This adds a match.pd rule that can fold right shifts and bit_field_refs of
integers into just a bit_field_ref by adjusting the offset and the size of the
extract and adds an extend to the previous size.

Concretely turns:

#include <arm_neon.h>

unsigned int foor (uint32x4_t x)
{
     return x[1] >> 16;
}

which used to generate:

   _1 = BIT_FIELD_REF <x_2(D), 32, 32>;
   _3 = _1 >> 16;

into

   _4 = BIT_FIELD_REF <x_1(D), 16, 48>;
   _2 = (unsigned int) _4;

I currently limit the rewrite to only doing it if the resulting extract is in
a mode the target supports. i.e. it won't rewrite it to extract say 13-bits
because I worry that for targets that won't have a bitfield extract instruction
this may be a de-optimization.

Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu
and no issues.

Testcase are added in patch 2/2.

Ok for master?

Thanks,
Tamar

gcc/ChangeLog:

        * match.pd: Add bitfield and shift folding.

Were you planning to handle left shifts as well?  It looks like it since you've got iterations for the shift opcode and corresponding adjustment to the field, but they currently only handle rshift/plus.


Jeff


Reply via email to