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 30b5ea075af4de4e21fa8583508d085cd52b36b5..70640dbd55be08e8fd71228936cae02efd3a7961 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