aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cfgexpand.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr43670.c29
4 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4eae83a..7e08006 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2010-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43670
+ * cfgexpand.c (expand_debug_expr): If for non-NULL offset
+ op0 is not a MEM, just return NULL instead of assertion
+ failure.
+ (discover_nonconstant_array_refs): Don't walk debug stmts.
+
2010-04-08 Doug Kwan <dougkwan@google.com>
* configure.ac: Recognize gold and do not use its version number
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index eeb5c73..bff4897 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2502,7 +2502,8 @@ expand_debug_expr (tree exp)
{
enum machine_mode addrmode, offmode;
- gcc_assert (MEM_P (op0));
+ if (!MEM_P (op0))
+ return NULL;
op0 = XEXP (op0, 0);
addrmode = GET_MODE (op0);
@@ -3623,7 +3624,8 @@ discover_nonconstant_array_refs (void)
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
- walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL);
+ if (!is_gimple_debug (stmt))
+ walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 30ee707..39fb6f0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43670
+ * gcc.dg/pr43670.c: New test.
+
2010-04-08 Maxim Kuvyrkov <maxim@codesourcery.com>
PR middle-end/40815
diff --git a/gcc/testsuite/gcc.dg/pr43670.c b/gcc/testsuite/gcc.dg/pr43670.c
new file mode 100644
index 0000000..f152b4d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr43670.c
@@ -0,0 +1,29 @@
+/* PR debug/43670 */
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vrp -fcompare-debug" } */
+
+extern void abort (void);
+
+typedef struct { double T1; } S;
+
+void
+foo (void)
+{
+ int i, j;
+ double s;
+
+ S y[2][2];
+ S *x[2] = { y[0], y[1] };
+ S **p = x;
+
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ p[j][i].T1 = 1;
+
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ s = p[j][i].T1;
+
+ if (s != 1)
+ abort ();
+}