cris: Correct gcc_assert for atomic_fetch_op pattern
authorHans-Peter Nilsson <hp@axis.com>
Sun, 5 Jul 2020 23:51:42 +0000 (01:51 +0200)
committerHans-Peter Nilsson <hp@axis.com>
Mon, 6 Jul 2020 00:35:54 +0000 (02:35 +0200)
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.

gcc/config/cris/sync.md

index 30b5ea0..70640db 100644 (file)
   "<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