Sorry,i mistakenly deleted local mail for
https://gcc.gnu.org/pipermail/gcc-patches/2020-June/548174.html, so i
send an another email.

> What I mean is that op2 is a CONST_INT, which in theory can have any
> HOST_WIDE_INT values.
> By assigning that to unsigned int variable, you are effectively
> testing shift % 0x100000000ULL instead of the shift.
>
> So, it is fine to use unsigned int (or even unsigned char) var for the
> shift_constant (shouldn't that be shift_amount?), but the test if it is
> outside of range then should be performed on if (UINTVAL (op2) > 7).
> And perhaps just don't bother with the out of bounds shifts, so just
>   if (UINTVAL (op2) > 7)
>     return false;
> because that is just UB and no need to optimize invalid code.

Changed and updated patch.

gcc/ChangeLog:
        PR target/95524
        * config/i386/i386-expand.c
        (ix86_expand_vec_shift_qihi_constant): New function.
        * config/i386/i386-protos.h
        (ix86_expand_vec_shift_qihi_constant): Declare.
        * config/i386/sse.md (<shift_insn><mode>3): Optimize shift
        V*QImode by constant.

gcc/testsuite/ChangeLog:
        * gcc.target/i386/avx2-shiftqihi-constant-1.c: New test.
        * gcc.target/i386/avx2-shiftqihi-constant-2.c: Ditto.
        * gcc.target/i386/avx512bw-shiftqihi-constant-1.c: Ditto.
        * gcc.target/i386/avx512bw-shiftqihi-constant-2.c: Ditto.
        * gcc.target/i386/sse2-shiftqihi-constant-1.c: Ditto.
        * gcc.target/i386/sse2-shiftqihi-constant-2.c: Ditto.
-- 
BR,
Hongtao

Attachment: 0001-Optimize-V16QI-V32QI-V64QI-shift-by-constant_V2.patch
Description: Binary data

Reply via email to