+2020-01-17 Wilco Dijkstra <wdijkstr@arm.com>
+
+ 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.
+
2020-01-17 Richard Sandiford <richard.sandiford@arm.com>
PR target/93133
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, x, model_rtx;
machine_mode mode;
bool is_weak;
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));
(clobber (match_scratch:SI 7 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_compare_and_swap (operands);
(clobber (match_scratch:SI 7 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_compare_and_swap (operands);
(clobber (match_scratch:SI 7 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_compare_and_swap (operands);
(clobber (match_scratch:SI 4 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (SET, operands[0], NULL, operands[1],
(clobber (match_scratch:SI 4 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (<CODE>, NULL, operands[3], operands[0],
(clobber (match_scratch:SI 4 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (NOT, NULL, operands[3], operands[0],
(clobber (match_scratch:SI 5 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (<CODE>, operands[0], operands[4], operands[1],
(clobber (match_scratch:SI 5 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (NOT, operands[0], operands[4], operands[1],
(clobber (match_scratch:SI 4 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (<CODE>, NULL, operands[0], operands[1],
(clobber (match_scratch:SI 4 "=&r"))]
""
"#"
- "&& reload_completed"
+ "&& epilogue_completed"
[(const_int 0)]
{
aarch64_split_atomic_op (NOT, NULL, operands[0], operands[1],