This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][optabs.c] Fix PR 61713: ICE when expanding single-threaded version of atomic_test_and_set


Hi all,

This fixes the PR mentioned in the subject. When expanding atomic_test_and_set we try the corresponding sync optabs and if none exist, like for pre-SMP ARM architectures (-march=armv6 and earlier) the code in optabs.c reverts to a single-threaded implementation that just does a load and store.

However, if the result of the operation is to be ignored the code in builtins.c follows the convention that the target RTX is set to const0_rtx to signify that the result is ignored and the expand functions in optabs.c are supposed to check for that and act appropriately.

The code in the single-threaded codepath in expand_atomic_test_and_set in optabs.c didn't perform this check and instead tried to emit a move to a const0_rtx which ICEs further down the line.

This patch fixes that by checking if the result is ignored, and if it is omits the load. I wouldn't dare to remove the load in normal atomic handling code due to all the memory ordering subtleties, but this code path occurs only when we have a trivially single-threaded bare-metal target and the compiler assumes no races anyway and no dodgy context switches and tries to implement this with a ldrb+strb, so I think removing the ldrb is valid.

Bootstrapped on arm, aarch64 and x86 and tested as well.

Ok for trunk?
This appears on 4.9 as well, I'll test it on that branch as well

2014-07-16  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

    PR target/61713
    * gcc/optabs.c (expand_atomic_test_and_set): Do not try to emit
    move to subtarget in serial version if result is ignored.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]