diff options
author | Wilco Dijkstra <wdijkstr@arm.com> | 2020-01-17 13:17:21 +0000 |
---|---|---|
committer | Wilco Dijkstra <wdijkstr@arm.com> | 2020-01-17 13:17:21 +0000 |
commit | e5e07b68187b9aa334519746c45b8cffc5eb7e5c (patch) | |
tree | 6f5915fd6e2d44a27bcec52891749cf1d9c08128 /gcc/config/aarch64/atomics.md | |
parent | f788c2d66a6ee1ded65dafccbc5e485d42af4808 (diff) | |
download | gcc-e5e07b68187b9aa334519746c45b8cffc5eb7e5c.zip gcc-e5e07b68187b9aa334519746c45b8cffc5eb7e5c.tar.gz gcc-e5e07b68187b9aa334519746c45b8cffc5eb7e5c.tar.bz2 |
[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.
Diffstat (limited to 'gcc/config/aarch64/atomics.md')
-rw-r--r-- | gcc/config/aarch64/atomics.md | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/gcc/config/aarch64/atomics.md b/gcc/config/aarch64/atomics.md index c2bcabd..9969477 100644 --- a/gcc/config/aarch64/atomics.md +++ b/gcc/config/aarch64/atomics.md @@ -56,7 +56,7 @@ (clobber (match_scratch:SI 7 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_compare_and_swap (operands); @@ -80,7 +80,7 @@ (clobber (match_scratch:SI 7 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_compare_and_swap (operands); @@ -104,7 +104,7 @@ (clobber (match_scratch:SI 7 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_compare_and_swap (operands); @@ -223,7 +223,7 @@ (clobber (match_scratch:SI 4 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_atomic_op (SET, operands[0], NULL, operands[1], @@ -344,7 +344,7 @@ (clobber (match_scratch:SI 4 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_atomic_op (<CODE>, NULL, operands[3], operands[0], @@ -400,7 +400,7 @@ (clobber (match_scratch:SI 4 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_atomic_op (NOT, NULL, operands[3], operands[0], @@ -504,7 +504,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], @@ -551,7 +551,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], @@ -604,7 +604,7 @@ (clobber (match_scratch:SI 4 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_atomic_op (<CODE>, NULL, operands[0], operands[1], @@ -628,7 +628,7 @@ (clobber (match_scratch:SI 4 "=&r"))] "" "#" - "&& reload_completed" + "&& epilogue_completed" [(const_int 0)] { aarch64_split_atomic_op (NOT, NULL, operands[0], operands[1], |