mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 18:50:45 +08:00
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
This commit is contained in:
parent
c6d0959c4b
commit
bfabddb6c0
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
8
gcc/testsuite/gcc.dg/torture/pr28268.c
Normal file
8
gcc/testsuite/gcc.dg/torture/pr28268.c
Normal file
@ -0,0 +1,8 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
int __attribute__((vector_size(8))) a;
|
||||
|
||||
void foo()
|
||||
{
|
||||
a += a*a;
|
||||
}
|
@ -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));
|
||||
|
||||
|
||||
|
41
gcc/tree.c
41
gcc/tree.c
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user