gen_atomic_compare_and_swapqi may generate:
(set (reg:SI 327) (sign_extend:SI (reg:SI 326)))

Sign extend compare if its mode is not word_mode.
Change sign extend compare condtition to avoid this problem.

gcc/ChangeLog:

        * config/loongarch/sync.md: Change sign extend condition.
---
 gcc/config/loongarch/sync.md | 42 ++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/gcc/config/loongarch/sync.md b/gcc/config/loongarch/sync.md
index a024c708414..59959bbbadc 100644
--- a/gcc/config/loongarch/sync.md
+++ b/gcc/config/loongarch/sync.md
@@ -620,7 +620,7 @@ (define_expand "atomic_compare_and_swap<mode>"
       emit_insn (gen_rtx_SET (compare, difference));
     }
 
-  if (word_mode != <MODE>mode)
+  if (word_mode != GET_MODE (compare))
     {
       rtx reg = gen_reg_rtx (word_mode);
       emit_insn (gen_rtx_SET (reg, gen_rtx_SIGN_EXTEND (word_mode, compare)));
@@ -764,26 +764,26 @@ (define_expand "atomic_compare_and_swap<mode>"
                                    operands[3], operands[4], mod_f);
     }
 
-      rtx compare = operands[1];
-      if (operands[3] != const0_rtx)
-       {
-         machine_mode mode = GET_MODE (operands[3]);
-         rtx op1 = convert_modes (SImode, mode, operands[1], true);
-         rtx op3 = convert_modes (SImode, mode, operands[3], true);
-         rtx difference = gen_rtx_MINUS (SImode, op1, op3);
-         compare = gen_reg_rtx (SImode);
-         emit_insn (gen_rtx_SET (compare, difference));
-       }
-
-      if (word_mode != <MODE>mode)
-       {
-         rtx reg = gen_reg_rtx (word_mode);
-         emit_insn (gen_rtx_SET (reg, gen_rtx_SIGN_EXTEND (word_mode, 
compare)));
-         compare = reg;
-       }
-
-      emit_insn (gen_rtx_SET (operands[0],
-                             gen_rtx_EQ (SImode, compare, const0_rtx)));
+  rtx compare = operands[1];
+  if (operands[3] != const0_rtx)
+    {
+      machine_mode mode = GET_MODE (operands[3]);
+      rtx op1 = convert_modes (SImode, mode, operands[1], true);
+      rtx op3 = convert_modes (SImode, mode, operands[3], true);
+      rtx difference = gen_rtx_MINUS (SImode, op1, op3);
+      compare = gen_reg_rtx (SImode);
+      emit_insn (gen_rtx_SET (compare, difference));
+    }
+
+  if (word_mode != GET_MODE (compare))
+    {
+      rtx reg = gen_reg_rtx (word_mode);
+      emit_insn (gen_rtx_SET (reg, gen_rtx_SIGN_EXTEND (word_mode, compare)));
+      compare = reg;
+    }
+
+  emit_insn (gen_rtx_SET (operands[0],
+                         gen_rtx_EQ (SImode, compare, const0_rtx)));
   DONE;
 })
 
-- 
2.34.1

Reply via email to