On 06/10/15 18:27, Renlin Li wrote:
> Hi all,
> 
> Previously, the compiler will generate the following pattern, which will 
> cause an ICE during postreload pass. Meanwhile, the instruction itself 
> produces UNKNOWN result when the source and destination register are the same 
> according to ARM instruction manual. The same rule applies to vtrn and vzip 
> patterns.
> 
> (insn 50 71 106 3 (parallel [
>             (set (reg:V2SI 48 d16 [172])
>                 (unspec:V2SI [
>                         (reg:V2SI 48 d16 [172])
>                         (reg:V2SI 48 d16 [172])
>                     ] UNSPEC_VUZP1))
>             (set (reg:V2SI 48 d16 [172])
>                 (unspec:V2SI [
>                         (reg:V2SI 48 d16 [172])
>                         (reg:V2SI 48 d16 [172])
>                     ] UNSPEC_VUZP2))
>         ]) /src/gcc/gcc/testsuite/gcc.dg/vect/pr37474.c:21 1991 
> {*neon_vuzpv2si_insn}
>      (nil))
> 
> The ICE is triggered when compiling gcc.dg/vect/pr37474.c using 
> arm-none-linux-gnueabihf toolchain.
> 
> Adding "&" modifier to operands[0] and operands[2] will explicitly prevent 
> those two register operands getting the same register.

> I made the same changes to neon_vtrn<mode>_insn and neon_vzip<mode>_insn 
> pattern as well.
> 
> arm-none-linux-gnueabihf regression tests Okay. Okay to commit?


OK  - please watch out for any fallout in the coming days.

After letting this bake for a few days please backport to all release branches 
as this is a latent issue in the target that is purely dependent on the pattern.

regards
Ramana


> 
> Regards,
> Renlin Li
> 
> gcc/ChangeLog:
> 
> 2015-10-06  Renlin Li  <renlin...@arm.com>
> 
>     * config/arm/neon.md (neon_vuzp<mode>_insn): Add & modifier for
>         operands[0] and operands[2].
>         (neon_vtrn<mode>_insn): Likewise.
>         (neon_vzip<mode>_insn): Likewise.
> 

Reply via email to