From 861c7bcd62bcbbf6e14311e18ba7293cc581e1ff Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Feb 2016 22:13:43 +0100 Subject: [PATCH] re PR rtl-optimization/69691 (wrong code at -O2 on x86_64-linux-gnu) PR rtl-optimization/69691 * lra-eliminations.c (move_plus_up): Don't add the addend twice. * gcc.c-torture/execute/pr69691.c: New test. From-SVN: r233187 --- gcc/ChangeLog | 5 + gcc/lra-eliminations.c | 3 +- gcc/testsuite/ChangeLog | 3 + gcc/testsuite/gcc.c-torture/execute/pr69691.c | 127 ++++++++++++++++++ 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr69691.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e166ae60d1..5ad69839f88 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-02-05 Jakub Jelinek + + PR rtl-optimization/69691 + * lra-eliminations.c (move_plus_up): Don't add the addend twice. + 2016-02-05 Pat Haugen * config/rs6000/crypto.md (crypto_vpermxor_): Correct insn type. diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c index 1494263c06f..9ae5cfea5ab 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 7876edab435..abd31565379 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-02-05 Jakub Jelinek + 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 00000000000..16b5556f264 --- /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; +} -- 2.30.2