From 1e98f060280b48328e9e7f5912d63d52c3ed6814 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Mon, 6 Jul 2020 01:51:42 +0200 Subject: 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__1"): Correct gcc_assert of overlapping operands. --- gcc/config/cris/sync.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gcc') 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 == 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 -- cgit v1.1