OSDN Git Service

PR rtl/58542
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Oct 2013 20:09:13 +0000 (20:09 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Oct 2013 20:09:13 +0000 (20:09 +0000)
  * optabs.c (maybe_emit_atomic_exchange): Use create_input_operand
  instead of create_convert_operand_to.
  (maybe_emit_sync_lock_test_and_set): Likewise.
  (expand_atomic_compare_and_swap): Likewise.
  (maybe_emit_compare_and_swap_exchange_loop): Don't convert_modes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@204077 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/atomic-store-6.c [new file with mode: 0644]

index 6eb6185..7f9c8a4 100644 (file)
@@ -1,3 +1,12 @@
+2013-08-25  Richard Henderson  <rth@twiddle.net>
+
+       PR rtl/58542
+       * optabs.c (maybe_emit_atomic_exchange): Use create_input_operand
+       instead of create_convert_operand_to.
+       (maybe_emit_sync_lock_test_and_set): Likewise.
+       (expand_atomic_compare_and_swap): Likewise.
+       (maybe_emit_compare_and_swap_exchange_loop): Don't convert_modes.
+
 2013-10-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR rtl-optimization/58831
index 91b4661..aa6a59e 100644 (file)
@@ -7212,8 +7212,7 @@ maybe_emit_atomic_exchange (rtx target, rtx mem, rtx val, enum memmodel model)
 
       create_output_operand (&ops[0], target, mode);
       create_fixed_operand (&ops[1], mem);
-      /* VAL may have been promoted to a wider mode.  Shrink it if so.  */
-      create_convert_operand_to (&ops[2], val, mode, true);
+      create_input_operand (&ops[2], val, mode);
       create_integer_operand (&ops[3], model);
       if (maybe_expand_insn (icode, 4, ops))
        return ops[0].value;
@@ -7252,8 +7251,7 @@ maybe_emit_sync_lock_test_and_set (rtx target, rtx mem, rtx val,
       struct expand_operand ops[3];
       create_output_operand (&ops[0], target, mode);
       create_fixed_operand (&ops[1], mem);
-      /* VAL may have been promoted to a wider mode.  Shrink it if so.  */
-      create_convert_operand_to (&ops[2], val, mode, true);
+      create_input_operand (&ops[2], val, mode);
       if (maybe_expand_insn (icode, 3, ops))
        return ops[0].value;
     }
@@ -7295,8 +7293,6 @@ maybe_emit_compare_and_swap_exchange_loop (rtx target, rtx mem, rtx val)
     {
       if (!target || !register_operand (target, mode))
        target = gen_reg_rtx (mode);
-      if (GET_MODE (val) != VOIDmode && GET_MODE (val) != mode)
-       val = convert_modes (mode, GET_MODE (val), val, 1);
       if (expand_compare_and_swap_loop (mem, target, val, NULL_RTX))
        return target;
     }
@@ -7508,8 +7504,8 @@ expand_atomic_compare_and_swap (rtx *ptarget_bool, rtx *ptarget_oval,
       create_output_operand (&ops[0], target_bool, bool_mode);
       create_output_operand (&ops[1], target_oval, mode);
       create_fixed_operand (&ops[2], mem);
-      create_convert_operand_to (&ops[3], expected, mode, true);
-      create_convert_operand_to (&ops[4], desired, mode, true);
+      create_input_operand (&ops[3], expected, mode);
+      create_input_operand (&ops[4], desired, mode);
       create_integer_operand (&ops[5], is_weak);
       create_integer_operand (&ops[6], succ_model);
       create_integer_operand (&ops[7], fail_model);
@@ -7530,8 +7526,8 @@ expand_atomic_compare_and_swap (rtx *ptarget_bool, rtx *ptarget_oval,
 
       create_output_operand (&ops[0], target_oval, mode);
       create_fixed_operand (&ops[1], mem);
-      create_convert_operand_to (&ops[2], expected, mode, true);
-      create_convert_operand_to (&ops[3], desired, mode, true);
+      create_input_operand (&ops[2], expected, mode);
+      create_input_operand (&ops[3], desired, mode);
       if (!maybe_expand_insn (icode, 4, ops))
        return false;
 
index fe2cd37..85a9211 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-25  Richard Henderson  <rth@redhat.com>
+
+       PR rtl/58542
+       * gcc.dg/atomic-store-6.c: New.
+
 2013-10-25  Tom de Vries  <tom@codesourcery.com>
 
        PR c++/58282
diff --git a/gcc/testsuite/gcc.dg/atomic-store-6.c b/gcc/testsuite/gcc.dg/atomic-store-6.c
new file mode 100644 (file)
index 0000000..81499cd
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sync_int_128_runtime } */
+/* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
+
+__int128_t i;
+
+int main()
+{
+  __atomic_store_16(&i, -1, 0);
+  if (i != -1)
+    __builtin_abort();
+  return 0;
+}