aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lra-eliminations.c3
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr69691.c127
4 files changed, 137 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1e166ae..5ad6983 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/69691
+ * lra-eliminations.c (move_plus_up): Don't add the addend twice.
+
2016-02-05 Pat Haugen <pthaugen@us.ibm.com>
* config/rs6000/crypto.md (crypto_vpermxor_<mode>): Correct insn type.
diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c
index 1494263..9ae5cfe 100644
--- a/gcc/lra-eliminations.c
+++ b/gcc/lra-eliminations.c
@@ -303,7 +303,8 @@ move_plus_up (rtx x)
subreg_lowpart_offset (x_mode,
subreg_reg_mode));
if (cst && CONSTANT_P (cst))
- return gen_rtx_PLUS (x_mode, lowpart_subreg (x_mode, subreg_reg,
+ return gen_rtx_PLUS (x_mode, lowpart_subreg (x_mode,
+ XEXP (subreg_reg, 0),
subreg_reg_mode), cst);
}
return x;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7876eda..abd3156 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-02-05 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/69691
+ * gcc.c-torture/execute/pr69691.c: New test.
+
PR c++/69628
* g++.dg/parse/pr69628.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr69691.c b/gcc/testsuite/gcc.c-torture/execute/pr69691.c
new file mode 100644
index 0000000..16b5556
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr69691.c
@@ -0,0 +1,127 @@
+/* PR rtl-optimization/69691 */
+
+char u[] = { 46, 97, 99, 104, 52, 0 };
+char *v[] = { u, 0 };
+struct S { char a[10]; struct S *b[31]; };
+struct S r[7], *r2 = r;
+static struct S *w = 0;
+
+__attribute__((noinline, noclone)) int
+fn (int x)
+{
+ if (__builtin_strchr (u, x) || x == 96)
+ return x;
+ __builtin_abort ();
+}
+
+__attribute__((noinline, noclone)) int
+foo (char x)
+{
+ if (x == 0)
+ __builtin_abort ();
+ if (fn (x) >= 96 && fn (x) <= 122)
+ return (fn (x) - 96);
+ else if (x == 46)
+ return 0;
+ else
+ {
+ __builtin_printf ("foo %d\n", x);
+ return -1;
+ }
+}
+
+__attribute__((noinline, noclone)) void
+bar (char **x)
+{
+ char **b, c, *d, e[500], *f, g[10];
+ int z, l, h, i;
+ struct S *s;
+
+ w = r2++;
+ for (b = x; *b; b++)
+ {
+ __builtin_strcpy (e, *b);
+ f = e;
+ do
+ {
+ d = __builtin_strchr (f, 32);
+ if (d)
+ *d = 0;
+ l = __builtin_strlen (f);
+ h = 0;
+ s = w;
+ __builtin_memset (g, 0, sizeof (g));
+ for (z = 0; z < l; z++)
+ {
+ c = f[z];
+ if (c >= 48 && c <= 57)
+ g[h] = c - 48;
+ else
+ {
+ i = foo (c);
+ if (!s->b[i])
+ {
+ s->b[i] = r2++;
+ if (r2 == &r[7])
+ __builtin_abort ();
+ }
+ s = s->b[i];
+ h++;
+ }
+ }
+ __builtin_memcpy (s->a, g, 10);
+ if (d)
+ f = d + 1;
+ }
+ while (d);
+ }
+}
+
+__attribute__((noinline, noclone)) void
+baz (char *x)
+{
+ char a[300], b[300];
+ int z, y, t, l;
+ struct S *s;
+
+ l = __builtin_strlen (x);
+ *a = 96;
+ for (z = 0; z < l; z++)
+ {
+ a[z + 1] = fn ((unsigned int) x[z]);
+ if (foo (a[z + 1]) <= 0)
+ return;
+ }
+ a[l + 1] = 96;
+ l += 2;
+ __builtin_memset (b, 0, l + 2);
+
+ if (!w)
+ return;
+
+ for (z = 0; z < l; z++)
+ {
+ s = w;
+ for (y = z; y < l; y++)
+ {
+ s = s->b[foo (a[y])];
+ if (!s)
+ break;
+ for (t = 0; t <= y - z + 2; t++)
+ if (s->a[t] > b[z + t])
+ b[z + t] = s->a[t];
+ }
+ }
+ for (z = 3; z < l - 2; z++)
+ if ((b[z] & 1) == 1)
+ asm ("");
+}
+
+int
+main ()
+{
+ bar (v);
+ char c[] = { 97, 97, 97, 97, 97, 0 };
+ baz (c);
+ return 0;
+}