From 84816907e4bda26eb7a21a5d3d52eb876fcd91dd Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 13 Nov 2006 03:16:11 -0500 Subject: [PATCH] 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 From-SVN: r118747 --- gcc/ChangeLog | 11 +++++++++++ gcc/expmed.c | 9 +++++++++ gcc/gimplify.c | 5 +++++ gcc/testsuite/gcc.target/i386/vectorize1.c | 18 ++++++++++++++++++ gcc/tree-cfg.c | 5 +++++ gcc/tree.c | 4 ++++ 6 files changed, 52 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/vectorize1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6865d8220de3..1cab5ef1cba7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2006-11-12 Jason Merrill + Andrew Pinski + + 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 * genemit.c (gen_insn): Call gen_exp with a non-null used diff --git a/gcc/expmed.c b/gcc/expmed.c index b044780d71c9..6a0d3532ca7d 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 4e5d609bc595..13c5f48d1124 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 000000000000..28994bd72d9e --- /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 7c397aaa8e69..fc30f2285d50 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 92b25e352641..6e3d13b8792b 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); } -- 2.43.5