Hi,

In function arm_expand_compare_and_swap, oldval is converted to SImode
when its "mode" is QImode/HImode. After "FALLTHRU" to "case SImode",
we should use "SImode", other than "mode" (which is QImode/HImode).
And INSN atomic_compare_and_swap<mode>_1 expects the operand in
SImode.

No make check regression.

Is it OK for 4.7 and trunk?

Thanks!
-Zhenqiang

ChangeLog:
2012-10-19  Zhenqiang Chen <zhenqiang.c...@linaro.org>

        PR target/54892
        * config/arm/arm.c (arm_expand_compare_and_swap): Use SImode to make
        sure the mode is correct when falling through from above cases.

testsuite/ChangeLog:
2012-10-19  Zhenqiang Chen <zhenqiang.c...@linaro.org>

        PR target/54892
        * gcc.target/arm/pr54892.c: New.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index fc3a508..265e1cb 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -25437,8 +25437,8 @@ arm_expand_compare_and_swap (rtx operands[])
     case SImode:
       /* Force the value into a register if needed.  We waited until after
         the zero-extension above to do this properly.  */
-      if (!arm_add_operand (oldval, mode))
-       oldval = force_reg (mode, oldval);
+      if (!arm_add_operand (oldval, SImode))
+       oldval = force_reg (SImode, oldval);
       break;

     case DImode:
/* { dg-do compile } */

int set_role(unsigned char role_id, short m_role)
{
  return __sync_bool_compare_and_swap(&m_role, -1, role_id);
}

Reply via email to