Hi Kugan, On 08/01/16 12:07, Kugan wrote:
neon_vld1<mode> pattern does not accept eliminable registers and due to this, testcase in PR ICE. The problem is in arm_expand_neon_args, in the NEON_ARG_MEMORY case, where it call force_reg. Since an eliminable reg is already a reg, it just returns that value, and we get the wrong result. It needs to call copy_to_mode_reg instead, like arm_expand_binop_builtin does. Attached patch does this. Regression tested on arm-none-linux-gnu with no new regression. Is this OK for trunk?
I see this also fails on GCC 5. Could you test this on that branch too please.
Thanks, Kugan gcc/ChangeLog: 2016-01-08 Kugan Vivekanandarajah <kug...@linaro.org> Jim Wilson <jim.wil...@linaro.org> PR target/69194 * config/arm/arm-builtins.c (arm_expand_neon_args): Call copy_to_mode_reg instead of force_reg. gcc/testsuite/ChangeLog: 2016-01-08 Kugan Vivekanandarajah <kug...@linaro.org> PR target/69194 * gcc.target/arm/pr69194.C: New test.
I notice in the testcase we have: + void vld1q_f32(const float *__a) { __builtin_neon_vld1v4sf(__a); } We don't support using the neon builtins directly. Could you try replacing it with the appropriate intrinsic from arm_neon.h? I think this would be vld1q_f32. Thanks, Kyrill