aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2006-11-13 03:16:11 -0500
committerJason Merrill <jason@gcc.gnu.org>2006-11-13 03:16:11 -0500
commit84816907e4bda26eb7a21a5d3d52eb876fcd91dd (patch)
tree37477647bbdc97991564bdf0325c20fe633a4896 /gcc
parent329b3cc384733e2f4df34f31b32600787398c798 (diff)
downloadgcc-84816907e4bda26eb7a21a5d3d52eb876fcd91dd.zip
gcc-84816907e4bda26eb7a21a5d3d52eb876fcd91dd.tar.gz
gcc-84816907e4bda26eb7a21a5d3d52eb876fcd91dd.tar.bz2
re PR middle-end/28915 (ICE: tree check: expected class 'constant', have 'declaration' (var_decl) in build_vector, at tree.c:973)
PR middle-end/28915 * gimplify.c (gimplify_init_constructor): Don't reduce TREE_CONSTANT vector ctors. * tree-cfg.c (verify_expr): Don't look into TREE_CONSTANT vector ctors. * expmed.c (make_tree): Handle CONST, SYMBOL_REF. * tree.c (build_vector): Handle non-_CST elements. Co-Authored-By: Andrew Pinski <pinskia@physics.uc.edu> From-SVN: r118747
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/expmed.c9
-rw-r--r--gcc/gimplify.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/vectorize1.c18
-rw-r--r--gcc/tree-cfg.c5
-rw-r--r--gcc/tree.c4
6 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6865d82..1cab5ef 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2006-11-12 Jason Merrill <jason@redhat.com>
+ Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR middle-end/28915
+ * gimplify.c (gimplify_init_constructor): Don't reduce TREE_CONSTANT
+ vector ctors.
+ * tree-cfg.c (verify_expr): Don't look into TREE_CONSTANT
+ vector ctors.
+ * expmed.c (make_tree): Handle CONST, SYMBOL_REF.
+ * tree.c (build_vector): Handle non-_CST elements.
+
2006-11-12 Kaz Kojima <kkojima@gcc.gnu.org>
* genemit.c (gen_insn): Call gen_exp with a non-null used
diff --git a/gcc/expmed.c b/gcc/expmed.c
index b044780..6a0d353 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -5044,6 +5044,15 @@ make_tree (tree type, rtx x)
GET_CODE (x) == ZERO_EXTEND);
return fold_convert (type, make_tree (t, XEXP (x, 0)));
+ case CONST:
+ return make_tree (type, XEXP (x, 0));
+
+ case SYMBOL_REF:
+ t = SYMBOL_REF_DECL (x);
+ if (t)
+ return fold_convert (type, build_fold_addr_expr (t));
+ /* else fall through. */
+
default:
t = build_decl (VAR_DECL, NULL_TREE, type);
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 4e5d609..13c5f48 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -3161,6 +3161,11 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
break;
}
+
+ /* Don't reduce a TREE_CONSTANT vector ctor even if we can't
+ make a VECTOR_CST. It won't do anything for us, and it'll
+ prevent us from representing it as a single constant. */
+ break;
}
/* Vector types use CONSTRUCTOR all the way through gimple
diff --git a/gcc/testsuite/gcc.target/i386/vectorize1.c b/gcc/testsuite/gcc.target/i386/vectorize1.c
new file mode 100644
index 0000000..28994bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/vectorize1.c
@@ -0,0 +1,18 @@
+/* PR middle-end/28915 */
+/* { dg-options "-msse -O2 -ftree-vectorize -fdump-tree-vect" } */
+
+extern char lanip[3][40];
+typedef struct
+{
+ char *t[4];
+}tx_typ;
+
+int set_names (void)
+{
+ static tx_typ tt1;
+ int ln;
+ for (ln = 0; ln < 4; ln++)
+ tt1.t[ln] = lanip[1];
+}
+
+/* { dg-final { scan-tree-dump "vect_cst" "vect" } } */
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 7c397aaa8..fc30f22 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -3420,6 +3420,11 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
CHECK_OP (1, "invalid operand to binary operator");
break;
+ case CONSTRUCTOR:
+ if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
+ *walk_subtrees = 0;
+ break;
+
default:
break;
}
diff --git a/gcc/tree.c b/gcc/tree.c
index 92b25e3..6e3d13b 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -973,6 +973,10 @@ build_vector (tree type, tree vals)
{
tree value = TREE_VALUE (link);
+ /* Don't crash if we get an address constant. */
+ if (!CONSTANT_CLASS_P (value))
+ continue;
+
over1 |= TREE_OVERFLOW (value);
over2 |= TREE_CONSTANT_OVERFLOW (value);
}