This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PR90724 - ICE with __sync_bool_compare_and_swap with -march=armv8.2-a
- From: Prathamesh Kulkarni <prathamesh dot kulkarni at linaro dot org>
- To: gcc Patches <gcc-patches at gcc dot gnu dot org>, James Greenhalgh <james dot greenhalgh at arm dot com>
- Cc: Richard Sandiford <richard dot sandiford at arm dot com>
- Date: Wed, 17 Jul 2019 12:47:49 +0530
- Subject: Re: PR90724 - ICE with __sync_bool_compare_and_swap with -march=armv8.2-a
- References: <CAAgBjMnMqXAnbtnTT4Q_0GDFw9X3mRfbActR1bMkU73Cg_x6Yg@mail.gmail.com>
On Wed, 10 Jul 2019 at 16:54, Prathamesh Kulkarni
<prathamesh.kulkarni@linaro.org> wrote:
>
> Hi,
> For following test-case,
> static long long AL[24];
>
> int
> check_ok (void)
> {
> return (__sync_bool_compare_and_swap (AL+1, 0x200000003ll, 0x1234567890ll));
> }
>
> Compiling with -O2 -march=armv8.2-a results in:
> pr90724.c: In function ‘check_ok’:
> pr90724.c:7:1: error: unrecognizable insn:
> 7 | }
> | ^
> (insn 11 10 12 2 (set (reg:CC 66 cc)
> (compare:CC (reg:DI 95)
> (const_int 8589934595 [0x200000003]))) "pr90724.c":6:11 -1
> (nil))
>
> IIUC, the issue is that 0x200000003 falls outside the range of
> allowable immediate in cmp ? If it's replaced by a small constant then it works.
>
> The ICE results with -march=armv8.2-a because, we enter if
> (TARGET_LSE) { ... } condition
> in aarch64_expand_compare_and_swap, while with -march=armv8.a it goes into else,
> which forces oldval into register if the predicate fails to match.
>
> The attached patch checks if y (oldval) satisfies aarch64_plus_operand
> predicate and if not, forces it to be in register, which resolves ICE.
> Does it look OK ?
>
> Bootstrap+testing in progress on aarch64-linux-gnu.
ping https://gcc.gnu.org/ml/gcc-patches/2019-07/msg00793.html
Thanks,
Prathamesh
>
> PS: The issue has nothing to do with SVE, which I incorrectly
> mentioned in bug report.
>
> Thanks,
> Prathamesh