aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2020-07-06 01:51:42 +0200
committerHans-Peter Nilsson <hp@axis.com>2020-07-06 02:35:54 +0200
commit1e98f060280b48328e9e7f5912d63d52c3ed6814 (patch)
tree4a734bd4b45c41c4b7f5558a1fcc52d9b581dcd7
parentdf66f280ec449ee1c8aaf353956b8b3d54e1d901 (diff)
downloadgcc-1e98f060280b48328e9e7f5912d63d52c3ed6814.zip
gcc-1e98f060280b48328e9e7f5912d63d52c3ed6814.tar.gz
gcc-1e98f060280b48328e9e7f5912d63d52c3ed6814.tar.bz2
cris: Correct gcc_assert for atomic_fetch_op pattern
Yet another misnumbering of operands: the asserted non-overlap would be the only benign operands overlap. "Suddenly" exposed by g++.dg/cpp0x/pr81325.C when testing unrelated changes affecting register allocation. To wit, operands 2 and 1 are the only ones that are safe for overlap, it's only that it doesn't seem to make much sense to write the address of the atomic data as the atomic data. gcc: * config/cris/sync.md ("cris_atomic_fetch_<atomic_op_name><mode>_1"): Correct gcc_assert of overlapping operands.
-rw-r--r--gcc/config/cris/sync.md6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/config/cris/sync.md b/gcc/config/cris/sync.md
index 30b5ea0..70640db 100644
--- a/gcc/config/cris/sync.md
+++ b/gcc/config/cris/sync.md
@@ -128,7 +128,11 @@
"<MODE>mode == QImode || !TARGET_ATOMICS_MAY_CALL_LIBFUNCS"
{
/* Can't be too sure; better ICE if this happens. */
- gcc_assert (!reg_overlap_mentioned_p (operands[2], operands[1]));
+ gcc_assert (!reg_overlap_mentioned_p (operands[0], operands[1])
+ && !reg_overlap_mentioned_p (operands[0], operands[2])
+ && !reg_overlap_mentioned_p (operands[0], operands[3])
+ && !reg_overlap_mentioned_p (operands[1], operands[3])
+ && !reg_overlap_mentioned_p (operands[2], operands[3]));
if (cris_cpu_version == 10)
return