reg_equal_test.c: New test.
authorKugan Vivekanandarajah <kuganv@linaro.org>
Fri, 24 Jul 2015 01:43:22 +0000 (01:43 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Fri, 24 Jul 2015 01:43:22 +0000 (01:43 +0000)
gcc/testsuite/ChangeLog:

2015-07-23  Kugan Vivekanandarajah  <kuganv@linaro.org>

* gcc.target/arm/reg_equal_test.c: New test.

gcc/ChangeLog:

2015-07-23  Kugan Vivekanandarajah  <kuganv@linaro.org>

* config/arm/arm.c (arm_emit_movpair): Add REG_EQUAL notes to
instruction.

From-SVN: r226135

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/reg_equal_test.c [new file with mode: 0644]

index 1d6fd3c7dffd65575e8a1712b9a2e53a302833c0..211f82ba6f73807422b442933ca471e1bf246a43 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-23  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       * config/arm/arm.c (arm_emit_movpair): Add REG_EQUAL notes to
+       instruction.
+
 2015-07-23  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * cse.c (cse_insn): Fix missing check for STRICT_LOW_PART and minor
index e1bc727c6a0b1d0e3628f5dafb63ec9cc401baf7..eeab8a8b5ae318e29845ec0f13f394e48a9464bb 100644 (file)
@@ -17871,19 +17871,27 @@ output_mov_long_double_arm_from_arm (rtx *operands)
 void
 arm_emit_movpair (rtx dest, rtx src)
  {
+  rtx insn;
+
   /* If the src is an immediate, simplify it.  */
   if (CONST_INT_P (src))
     {
       HOST_WIDE_INT val = INTVAL (src);
       emit_set_insn (dest, GEN_INT (val & 0x0000ffff));
       if ((val >> 16) & 0x0000ffff)
-        emit_set_insn (gen_rtx_ZERO_EXTRACT (SImode, dest, GEN_INT (16),
-                                             GEN_INT (16)),
-                       GEN_INT ((val >> 16) & 0x0000ffff));
+       {
+         emit_set_insn (gen_rtx_ZERO_EXTRACT (SImode, dest, GEN_INT (16),
+                                              GEN_INT (16)),
+                        GEN_INT ((val >> 16) & 0x0000ffff));
+         insn = get_last_insn ();
+         set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
+       }
       return;
     }
    emit_set_insn (dest, gen_rtx_HIGH (SImode, src));
    emit_set_insn (dest, gen_rtx_LO_SUM (SImode, dest, src));
+   insn = get_last_insn ();
+   set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
  }
 
 /* Output a move between double words.  It must be REG<-MEM
index d8742d3dd773341fde807d8d814fca9b0918481d..81d09f6fffc25dd6176fadd08cd3b56dac8340c2 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-23  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       * gcc.target/arm/reg_equal_test.c: New test.
+
 2015-07-23  Jeff Law  <law@redhat.com>
 
        PR lto/66752
diff --git a/gcc/testsuite/gcc.target/arm/reg_equal_test.c b/gcc/testsuite/gcc.target/arm/reg_equal_test.c
new file mode 100644 (file)
index 0000000..58fa9dd
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-rtl-expand" } */
+
+extern void abort (void);
+unsigned int a = 1;
+
+int
+main (void)
+{
+  unsigned int b, c, d;
+
+  if (sizeof (int) != 4 || (int) 0xc7d24b5e > 0)
+    return 0;
+
+  c = 0xc7d24b5e;
+  d = a | -2;
+  b = (d == 0) ? c : (c % d);
+  if (b != c)
+    abort ();
+
+  return 0;
+}
+
+/* { dg-final { scan-rtl-dump "expr_list:REG_EQUAL \\(const_int -942519458" "expand" } } */