summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-01-19 13:34:45 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-01-19 13:34:45 +0100
commit569efc34ebc4f0a01d435dc11c3146b5442132cd (patch)
tree75a7d1ce1a175bc96655f4cf67f8ea84e0f07f16 /gcc
parente49d321f033c35d907d9d3eb339efaa6a8ba1e52 (diff)
downloadgcc-569efc34ebc4f0a01d435dc11c3146b5442132cd.tar.gz
re PR rtl-optimization/68955 (wrong code at -O3 on x86-64-linux-gnu in 32-bit mode)
PR rtl-optimization/68955 PR rtl-optimization/64557 * dse.c (record_store, check_mem_read_rtx): Don't call get_addr here. Fix up formatting. * alias.c (get_addr): Handle VALUE +/- CONST_SCALAR_INT_P. * gcc.dg/torture/pr68955.c: New test. From-SVN: r232554
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/alias.c22
-rw-r--r--gcc/dse.c14
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr68955.c41
5 files changed, 76 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 717330d16fc..372b25dca8b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/68955
+ PR rtl-optimization/64557
+ * dse.c (record_store, check_mem_read_rtx): Don't call get_addr
+ here. Fix up formatting.
+ * alias.c (get_addr): Handle VALUE +/- CONST_SCALAR_INT_P.
+
2016-01-19 Jan Hubicka <hubicka@ucw.cz>
PR lto/69133
diff --git a/gcc/alias.c b/gcc/alias.c
index 352ae091194..d3273e8e852 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2193,8 +2193,8 @@ refs_newer_value_p (const_rtx expr, rtx v)
}
/* Convert the address X into something we can use. This is done by returning
- it unchanged unless it is a value; in the latter case we call cselib to get
- a more useful rtx. */
+ it unchanged unless it is a VALUE or VALUE +/- constant; for VALUE
+ we call cselib to get a more useful rtx. */
rtx
get_addr (rtx x)
@@ -2203,7 +2203,23 @@ get_addr (rtx x)
struct elt_loc_list *l;
if (GET_CODE (x) != VALUE)
- return x;
+ {
+ if ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS)
+ && GET_CODE (XEXP (x, 0)) == VALUE
+ && CONST_SCALAR_INT_P (XEXP (x, 1)))
+ {
+ rtx op0 = get_addr (XEXP (x, 0));
+ if (op0 != XEXP (x, 0))
+ {
+ if (GET_CODE (x) == PLUS
+ && GET_CODE (XEXP (x, 1)) == CONST_INT)
+ return plus_constant (GET_MODE (x), op0, INTVAL (XEXP (x, 1)));
+ return simplify_gen_binary (GET_CODE (x), GET_MODE (x),
+ op0, XEXP (x, 1));
+ }
+ }
+ return x;
+ }
v = CSELIB_VAL_PTR (x);
if (v)
{
diff --git a/gcc/dse.c b/gcc/dse.c
index 7dc0b8a2a9c..99f23cab413 100644
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -1515,14 +1515,9 @@ record_store (rtx body, bb_info_t bb_info)
mem_addr = base->val_rtx;
else
{
- group_info *group
- = rtx_group_vec[group_id];
+ group_info *group = rtx_group_vec[group_id];
mem_addr = group->canon_base_addr;
}
- /* get_addr can only handle VALUE but cannot handle expr like:
- VALUE + OFFSET, so call get_addr to get original addr for
- mem_addr before plus_constant. */
- mem_addr = get_addr (mem_addr);
if (offset)
mem_addr = plus_constant (get_address_mode (mem), mem_addr, offset);
}
@@ -2128,14 +2123,9 @@ check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
mem_addr = base->val_rtx;
else
{
- group_info *group
- = rtx_group_vec[group_id];
+ group_info *group = rtx_group_vec[group_id];
mem_addr = group->canon_base_addr;
}
- /* get_addr can only handle VALUE but cannot handle expr like:
- VALUE + OFFSET, so call get_addr to get original addr for
- mem_addr before plus_constant. */
- mem_addr = get_addr (mem_addr);
if (offset)
mem_addr = plus_constant (get_address_mode (mem), mem_addr, offset);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d80aaa6e91e..b9365f0207e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/68955
+ PR rtl-optimization/64557
+ * gcc.dg/torture/pr68955.c: New test.
+
2016-01-19 Jan Hubicka <hubicka@ucw.cz>
PR lto/69136
diff --git a/gcc/testsuite/gcc.dg/torture/pr68955.c b/gcc/testsuite/gcc.dg/torture/pr68955.c
new file mode 100644
index 00000000000..e9da003f475
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr68955.c
@@ -0,0 +1,41 @@
+/* PR rtl-optimization/68955 */
+/* { dg-do run } */
+/* { dg-output "ONE1ONE" } */
+
+int a, b, c, d, g, m;
+int i[7][7][5] = { { { 5 } }, { { 5 } },
+ { { 5 }, { 5 }, { 5 }, { 5 }, { 5 }, { -1 } } };
+static int j = 11;
+short e, f, h, k, l;
+
+static void
+foo ()
+{
+ for (; e < 5; e++)
+ for (h = 3; h; h--)
+ {
+ for (g = 1; g < 6; g++)
+ {
+ m = c == 0 ? b : b / c;
+ i[e][1][e] = i[1][1][1] | (m & l) && f;
+ }
+ for (k = 0; k < 6; k++)
+ {
+ for (d = 0; d < 6; d++)
+ i[1][e][h] = i[h][k][e] >= l;
+ i[e + 2][h + 3][e] = 6 & l;
+ i[2][1][2] = a;
+ for (; j < 5;)
+ for (;;)
+ ;
+ }
+ }
+}
+
+int
+main ()
+{
+ foo ();
+ __builtin_printf ("ONE%dONE\n", i[1][0][2]);
+ return 0;
+}