aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-08-03 20:49:40 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-08-03 20:49:40 +0200
commitcb3d2e3327e9901d85095799343fad46e0588594 (patch)
treea33d6ea08c18a40a9e4602308e044392bf3b2a16 /gcc
parent35bdbc6962988219faf2c7bf2a0dabd3d8657adb (diff)
downloadgcc-cb3d2e3327e9901d85095799343fad46e0588594.zip
gcc-cb3d2e3327e9901d85095799343fad46e0588594.tar.gz
gcc-cb3d2e3327e9901d85095799343fad46e0588594.tar.bz2
re PR tree-optimization/49948 (ICE with -ftree-parallelize-loops: "address taken, but ADDRESSABLE bit not set")
PR tree-optimization/49948 * gimple.c (walk_stmt_load_store_addr_ops): Walk CONSTRUCTOR elements. * gcc.dg/pr49948.c: New test. From-SVN: r177291
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimple.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr49948.c22
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 63aef19..2b70738 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/49948
+ * gimple.c (walk_stmt_load_store_addr_ops): Walk CONSTRUCTOR elements.
+
2011-08-03 Anatoly Sokolov <aesok@post.ru>
* config/m32c/m32c.c (class_sizes): Remove.
diff --git a/gcc/gimple.c b/gcc/gimple.c
index af23c6a..561e41e 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -5259,6 +5259,20 @@ walk_stmt_load_store_addr_ops (gimple stmt, void *data,
&& TREE_CODE (OBJ_TYPE_REF_OBJECT (rhs)) == ADDR_EXPR)
ret |= visit_addr (stmt, TREE_OPERAND (OBJ_TYPE_REF_OBJECT (rhs),
0), data);
+ else if (TREE_CODE (rhs) == CONSTRUCTOR)
+ {
+ unsigned int ix;
+ tree val;
+
+ FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), ix, val)
+ if (TREE_CODE (val) == ADDR_EXPR)
+ ret |= visit_addr (stmt, TREE_OPERAND (val, 0), data);
+ else if (TREE_CODE (val) == OBJ_TYPE_REF
+ && TREE_CODE (OBJ_TYPE_REF_OBJECT (val)) == ADDR_EXPR)
+ ret |= visit_addr (stmt,
+ TREE_OPERAND (OBJ_TYPE_REF_OBJECT (val),
+ 0), data);
+ }
lhs = gimple_assign_lhs (stmt);
if (TREE_CODE (lhs) == TARGET_MEM_REF
&& TREE_CODE (TMR_BASE (lhs)) == ADDR_EXPR)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7578370..92b1b8d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/49948
+ * gcc.dg/pr49948.c: New test.
+
2011-08-03 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/47383
diff --git a/gcc/testsuite/gcc.dg/pr49948.c b/gcc/testsuite/gcc.dg/pr49948.c
new file mode 100644
index 0000000..f742393
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr49948.c
@@ -0,0 +1,22 @@
+/* PR tree-optimization/49948 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-parallelize-loops=2" } */
+
+extern int a, *b;
+int
+foo (void)
+{
+ int c, d = 8, *e[8], i;
+ if (a <= 7)
+ {
+ for (i = 0; i < 8; ++i)
+ e[i] = &c;
+ while (--d)
+ {
+ a = 0;
+ b = e[0];
+ }
+ return 0;
+ }
+ return b == &d;
+}