From: Hans-Peter Nilsson Date: Sun, 5 Jul 2020 23:51:42 +0000 (+0200) Subject: cris: Correct gcc_assert for atomic_fetch_op pattern X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1e98f060280b48328e9e7f5912d63d52c3ed6814;p=gcc.git 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. --- diff --git a/gcc/config/cris/sync.md b/gcc/config/cris/sync.md index 30b5ea075af..70640dbd55b 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