diff options
author | Richard Guenther <rguenther@suse.de> | 2006-07-07 16:30:36 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-07-07 16:30:36 +0000 |
commit | bfabddb6c0307307e963bf1388fcad0b8a00ba5c (patch) | |
tree | 6a1baa8ebb8584cddfcf0a2c3567372718ab3933 /gcc | |
parent | c6d0959c4b87ca27e45d827baf9b53071513a00b (diff) | |
download | gcc-bfabddb6c0307307e963bf1388fcad0b8a00ba5c.zip gcc-bfabddb6c0307307e963bf1388fcad0b8a00ba5c.tar.gz gcc-bfabddb6c0307307e963bf1388fcad0b8a00ba5c.tar.bz2 |
re PR middle-end/28268 (ICE with simple vector operations)
2006-07-07 Richard Guenther <rguenther@suse.de>
PR middle-end/28268
* tree.h (build_one_cst): Declare.
* tree.c (build_one_cst): New function.
* tree-ssa-math-opts.c (get_constant_one): Remove.
(insert_reciprocals): Use build_one_cst.
* fold-const.c (fold_plusminus_mult): Likewise.
* gcc.dg/torture/pr28268.c: New testcase.
From-SVN: r115263
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fold-const.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr28268.c | 8 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 31 | ||||
-rw-r--r-- | gcc/tree.c | 41 | ||||
-rw-r--r-- | gcc/tree.h | 1 |
7 files changed, 67 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a69352..df98b7b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2006-07-07 Richard Guenther <rguenther@suse.de> + + PR middle-end/28268 + * tree.h (build_one_cst): Declare. + * tree.c (build_one_cst): New function. + * tree-ssa-math-opts.c (get_constant_one): Remove. + (insert_reciprocals): Use build_one_cst. + * fold-const.c (fold_plusminus_mult): Likewise. + 2006-07-07 Roger Sayle <roger@eyesopen.com> * pointer-set.c (pointer_set_destroy): Correct whitespace. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 008310c..277bd32 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6727,7 +6727,7 @@ fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1) else { arg00 = arg0; - arg01 = fold_convert (type, integer_one_node); + arg01 = build_one_cst (type); } if (TREE_CODE (arg1) == MULT_EXPR) { @@ -6737,7 +6737,7 @@ fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1) else { arg10 = arg1; - arg11 = fold_convert (type, integer_one_node); + arg11 = build_one_cst (type); } same = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 63aa90d..6ce58b2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-07-07 Richard Guenther <rguenther@suse.de> + + PR middle-end/28268 + * gcc.dg/torture/pr28268.c: New testcase. + 2006-07-07 Steve Ellcey <sje@cup.hp.com> PR c++/27019 diff --git a/gcc/testsuite/gcc.dg/torture/pr28268.c b/gcc/testsuite/gcc.dg/torture/pr28268.c new file mode 100644 index 0000000..f143c08 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr28268.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +int __attribute__((vector_size(8))) a; + +void foo() +{ + a += a*a; +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 950b9aa..1ff0628 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -279,35 +279,6 @@ is_division_by (tree use_stmt, tree def) && TREE_OPERAND (TREE_OPERAND (use_stmt, 1), 1) == def; } -/* Return the LHS of a RDIV_EXPR that computes a reciprocal in type TYPE. */ -static tree -get_constant_one (tree type) -{ - tree scalar, cst; - int i; - - gcc_assert (FLOAT_TYPE_P (type)); - switch (TREE_CODE (type)) - { - case REAL_TYPE: - return build_real (type, dconst1); - - case VECTOR_TYPE: - scalar = build_real (TREE_TYPE (type), dconst1); - - /* Create 'vect_cst_ = {cst,cst,...,cst}' */ - cst = NULL_TREE; - for (i = TYPE_VECTOR_SUBPARTS (type); --i >= 0; ) - cst = tree_cons (NULL_TREE, scalar, cst); - - return build_vector (type, cst); - - default: - /* Complex operations have been split already. */ - gcc_unreachable (); - } -} - /* Walk the subset of the dominator tree rooted at OCC, setting the RECIP_DEF field to a definition of 1.0 / DEF that can be used in the given basic block. The field may be left NULL, of course, @@ -333,7 +304,7 @@ insert_reciprocals (block_stmt_iterator *def_bsi, struct occurrence *occ, type = TREE_TYPE (def); recip_def = make_rename_temp (type, "reciptmp"); new_stmt = build2 (MODIFY_EXPR, void_type_node, recip_def, - fold_build2 (RDIV_EXPR, type, get_constant_one (type), + fold_build2 (RDIV_EXPR, type, build_one_cst (type), def)); @@ -1161,6 +1161,47 @@ build_complex (tree type, tree real, tree imag) return t; } +/* Return a constant of arithmetic type TYPE which is the + multiplcative identity of the set TYPE. */ + +tree +build_one_cst (tree type) +{ + switch (TREE_CODE (type)) + { + case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: + case POINTER_TYPE: case REFERENCE_TYPE: + case OFFSET_TYPE: + return build_int_cst (type, 1); + + case REAL_TYPE: + return build_real (type, dconst1); + + case VECTOR_TYPE: + { + tree scalar, cst; + int i; + + scalar = build_one_cst (TREE_TYPE (type)); + + /* Create 'vect_cst_ = {cst,cst,...,cst}' */ + cst = NULL_TREE; + for (i = TYPE_VECTOR_SUBPARTS (type); --i >= 0; ) + cst = tree_cons (NULL_TREE, scalar, cst); + + return build_vector (type, cst); + } + + case COMPLEX_TYPE: + return build_complex (type, + build_one_cst (TREE_TYPE (type)), + fold_convert (TREE_TYPE (type), integer_zero_node)); + + default: + gcc_unreachable (); + } +} + /* Build a BINFO with LEN language slots. */ tree @@ -3534,6 +3534,7 @@ extern tree build_constructor_single (tree, tree, tree); extern tree build_constructor_from_list (tree, tree); extern tree build_real_from_int_cst (tree, tree); extern tree build_complex (tree, tree, tree); +extern tree build_one_cst (tree); extern tree build_string (int, const char *); extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL); #define build_tree_list(t,q) build_tree_list_stat(t,q MEM_STAT_INFO) |