]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2015-12-04 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Dec 2015 19:23:21 +0000 (19:23 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Dec 2015 19:23:21 +0000 (19:23 +0000)
PR rtl-optimization/68349
* lra-eliminations.c (move_plus_up): New function.
(lra_eliminate_regs_1): Use the function.

2015-12-04  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/68349
* gcc.target/i386/pr68349.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231300 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lra-eliminations.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr68349.c [new file with mode: 0644]

index 96e0c46f9e71ba529332c42c1a7d4d75563da2b5..81eb73fb893da300f2cd51e51a387f2b5825794c 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-04  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/68349
+       * lra-eliminations.c (move_plus_up): New function.
+       (lra_eliminate_regs_1): Use the function.
+
 2015-12-04  Nathan Sidwell  <nathan@acm.org>
 
        * config/nvptx/nvptx.c (nvptx_assemble_decl_begin): New,
index 38b1fbb2aab09e924580b08698a8e98f075b3541..c639d364fa195bfc40b67e5fb5eadddccad904cb 100644 (file)
@@ -279,6 +279,29 @@ get_elimination (rtx reg)
   return &self_elim_table;
 }
 
+/* Transform (subreg (plus reg const)) to (plus (subreg reg) const)
+   when it is possible.  Return X or the transformation result if the
+   transformation is done.  */
+static rtx
+move_plus_up (rtx x)
+{
+  rtx subreg_reg;
+  enum machine_mode x_mode, subreg_reg_mode;
+  
+  if (GET_CODE (x) != SUBREG || !subreg_lowpart_p (x))
+    return x;
+  subreg_reg = SUBREG_REG (x);
+  x_mode = GET_MODE (x);
+  subreg_reg_mode = GET_MODE (subreg_reg);
+  if (GET_CODE (x) == SUBREG && GET_CODE (subreg_reg) == PLUS
+      && GET_MODE_SIZE (x_mode) <= GET_MODE_SIZE (subreg_reg_mode)
+      && CONSTANT_P (XEXP (subreg_reg, 1)))
+    return gen_rtx_PLUS (x_mode, lowpart_subreg (x_mode, subreg_reg,
+                                                subreg_reg_mode),
+                        XEXP (subreg_reg, 1));
+  return x;
+}
+
 /* Scan X and replace any eliminable registers (such as fp) with a
    replacement (such as sp) if SUBST_P, plus an offset.  The offset is
    a change in the offset between the eliminable register and its
@@ -407,6 +430,8 @@ lra_eliminate_regs_1 (rtx_insn *insn, rtx x, machine_mode mem_mode,
                                         subst_p, update_p,
                                         update_sp_offset, full_p);
 
+       new0 = move_plus_up (new0);
+       new1 = move_plus_up (new1);
        if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
          return form_sum (new0, new1);
       }
index 40ae4fbf6a7f833bab131a786099d6a7ff25a7b9..d5f0ce057a43d8eb6711e0f8fedca3db2ba0fa04 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-04  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/68349
+       * gcc.target/i386/pr68349.c: New test.
+
 2015-12-04  Nathan Sidwell  <nathan@acm.org>
 
        * gcc.target/nvptx/ary-init.c: New.
        * gfortran.dg/graphite/pr68550-1.f90: New.
        * gfortran.dg/graphite/pr68550-2.f90: New.
 
->>>>>>> .r231221
 2015-12-02  Marek Polacek  <polacek@redhat.com>
 
        PR c/68513
diff --git a/gcc/testsuite/gcc.target/i386/pr68349.c b/gcc/testsuite/gcc.target/i386/pr68349.c
new file mode 100644 (file)
index 0000000..4eae053
--- /dev/null
@@ -0,0 +1,30 @@
+/* PR target/68483 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int a, b;
+unsigned long strlen();
+typedef struct sHyphenNode {
+  char sepcnts[0];
+  struct sHyphenNode *Daughters[];
+} * PHyphenNode;
+int GetIndex();
+PHyphenNode c;
+void DoHyphens_Field_1() {
+  char d[300], e[300];
+  int z, f, l = strlen();
+  for (; z;)
+    ;
+  for (; l; z++) {
+    f = z;
+    for (; f < l; f++) {
+      c = c->Daughters[GetIndex(d[f])];
+      a = 0;
+      for (; a <= f - z; a++)
+       if (e[z + a])
+         e[z] = c->sepcnts[a];
+    }
+  }
+  if (e[z])
+    b = 1;
+}