140 lines
4.4 KiB
Diff
140 lines
4.4 KiB
Diff
|
Backported to gcc7 from:
|
||
|
|
||
|
From: Wilco Dijkstra <wdijkstr@arm.com>
|
||
|
Date: Fri, 17 Jan 2020 13:17:21 +0000 (+0000)
|
||
|
Subject: [AArch64] Fix shrinkwrapping interactions with atomics (PR92692)
|
||
|
X-Git-Url: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;a=commitdiff_plain;h=e5e07b68187b9aa334519746c45b8cffc5eb7e5c
|
||
|
|
||
|
[AArch64] Fix shrinkwrapping interactions with atomics (PR92692)
|
||
|
|
||
|
The separate shrinkwrapping pass may insert stores in the middle
|
||
|
of atomics loops which can cause issues on some implementations.
|
||
|
Avoid this by delaying splitting atomics patterns until after
|
||
|
prolog/epilog generation.
|
||
|
|
||
|
gcc/
|
||
|
PR target/92692
|
||
|
* config/aarch64/aarch64.c (aarch64_split_compare_and_swap)
|
||
|
Add assert to ensure prolog has been emitted.
|
||
|
(aarch64_split_atomic_op): Likewise.
|
||
|
* config/aarch64/atomics.md (aarch64_compare_and_swap<mode>)
|
||
|
Use epilogue_completed rather than reload_completed.
|
||
|
(aarch64_atomic_exchange<mode>): Likewise.
|
||
|
(aarch64_atomic_<atomic_optab><mode>): Likewise.
|
||
|
(atomic_nand<mode>): Likewise.
|
||
|
(aarch64_atomic_fetch_<atomic_optab><mode>): Likewise.
|
||
|
(atomic_fetch_nand<mode>): Likewise.
|
||
|
(aarch64_atomic_<atomic_optab>_fetch<mode>): Likewise.
|
||
|
(atomic_nand_fetch<mode>): Likewise.
|
||
|
---
|
||
|
|
||
|
Index: gcc-7.5.0+r278197/gcc/config/aarch64/aarch64.c
|
||
|
===================================================================
|
||
|
--- gcc-7.5.0+r278197.orig/gcc/config/aarch64/aarch64.c 2020-01-22 18:16:46.000000000 +0100
|
||
|
+++ gcc-7.5.0+r278197/gcc/config/aarch64/aarch64.c 2020-01-22 18:17:46.000000000 +0100
|
||
|
@@ -12005,6 +12005,9 @@ aarch64_gen_atomic_cas (rtx rval, rtx me
|
||
|
void
|
||
|
aarch64_split_compare_and_swap (rtx operands[])
|
||
|
{
|
||
|
+ /* Split after prolog/epilog to avoid interactions with shrinkwrapping. */
|
||
|
+ gcc_assert (epilogue_completed);
|
||
|
+
|
||
|
rtx rval, mem, oldval, newval, scratch;
|
||
|
machine_mode mode;
|
||
|
bool is_weak;
|
||
|
@@ -12320,6 +12323,9 @@ void
|
||
|
aarch64_split_atomic_op (enum rtx_code code, rtx old_out, rtx new_out, rtx mem,
|
||
|
rtx value, rtx model_rtx, rtx cond)
|
||
|
{
|
||
|
+ /* Split after prolog/epilog to avoid interactions with shrinkwrapping. */
|
||
|
+ gcc_assert (epilogue_completed);
|
||
|
+
|
||
|
machine_mode mode = GET_MODE (mem);
|
||
|
machine_mode wmode = (mode == DImode ? DImode : SImode);
|
||
|
const enum memmodel model = memmodel_from_int (INTVAL (model_rtx));
|
||
|
Index: gcc-7.5.0+r278197/gcc/config/aarch64/atomics.md
|
||
|
===================================================================
|
||
|
--- gcc-7.5.0+r278197.orig/gcc/config/aarch64/atomics.md 2020-01-22 18:16:46.000000000 +0100
|
||
|
+++ gcc-7.5.0+r278197/gcc/config/aarch64/atomics.md 2020-01-22 18:20:20.000000000 +0100
|
||
|
@@ -53,7 +53,7 @@
|
||
|
(clobber (match_scratch:SI 7 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_compare_and_swap (operands);
|
||
|
@@ -77,7 +77,7 @@
|
||
|
(clobber (match_scratch:SI 7 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_compare_and_swap (operands);
|
||
|
@@ -169,7 +169,7 @@
|
||
|
(clobber (match_scratch:SI 4 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (SET, operands[0], NULL, operands[1],
|
||
|
@@ -230,7 +230,7 @@
|
||
|
(clobber (match_scratch:SI 4 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (<CODE>, NULL, operands[3], operands[0],
|
||
|
@@ -271,7 +271,7 @@
|
||
|
(clobber (match_scratch:SI 4 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (NOT, NULL, operands[3], operands[0],
|
||
|
@@ -317,7 +317,7 @@
|
||
|
(clobber (match_scratch:SI 5 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (<CODE>, operands[0], operands[4], operands[1],
|
||
|
@@ -361,7 +361,7 @@
|
||
|
(clobber (match_scratch:SI 5 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (NOT, operands[0], operands[4], operands[1],
|
||
|
@@ -408,7 +408,7 @@
|
||
|
(clobber (match_scratch:SI 4 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (<CODE>, NULL, operands[0], operands[1],
|
||
|
@@ -455,7 +455,7 @@
|
||
|
(clobber (match_scratch:SI 4 "=&r"))]
|
||
|
""
|
||
|
"#"
|
||
|
- "&& reload_completed"
|
||
|
+ "&& epilogue_completed"
|
||
|
[(const_int 0)]
|
||
|
{
|
||
|
aarch64_split_atomic_op (NOT, NULL, operands[0], operands[1],
|