Commit e3949961 by Paolo Bonzini Committed by Paolo Bonzini

re PR tree-optimization/26821 (ice in varasm.c with certain flags)

2006-04-18  Paolo Bonzini  <bonzini@gnu.org>

        PR tree-optimization/26821
        * tree-ssa-math-opts.c (get_constant_one): New.
        (insert_reciprocals): Use it.

From-SVN: r113025
parent 231816e7
2006-04-18 Paolo Bonzini <bonzini@gnu.org>
PR tree-optimization/26821
* tree-ssa-math-opts.c (get_constant_one): New.
(insert_reciprocals): Use it.
2006-04-17 Geoffrey Keating <geoffk@apple.com> 2006-04-17 Geoffrey Keating <geoffk@apple.com>
* dwarf2out.c (free_AT): Delete. * dwarf2out.c (free_AT): Delete.
......
/* { dg-do compile } */
/* { dg-require-effective-target vect_float } */
void f(float *__restrict__ qa, float *__restrict__ qb,
float *__restrict__ qc, float *__restrict__ rtrms)
{
int i;
static float qam[600];
static float qbm[600];
static float qcm[600];
for(i=0;i<600;i++)
{
float a = rtrms[i];
qam[i] = qa[i]/a;
qbm[i] = qb[i]/a;
qcm[i] = qc[i]/a;
}
}
...@@ -279,6 +279,35 @@ is_division_by (tree use_stmt, tree def) ...@@ -279,6 +279,35 @@ is_division_by (tree use_stmt, tree def)
&& TREE_OPERAND (TREE_OPERAND (use_stmt, 1), 1) == 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 /* 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 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, the given basic block. The field may be left NULL, of course,
...@@ -304,8 +333,8 @@ insert_reciprocals (block_stmt_iterator *def_bsi, struct occurrence *occ, ...@@ -304,8 +333,8 @@ insert_reciprocals (block_stmt_iterator *def_bsi, struct occurrence *occ,
type = TREE_TYPE (def); type = TREE_TYPE (def);
recip_def = make_rename_temp (type, "reciptmp"); recip_def = make_rename_temp (type, "reciptmp");
new_stmt = build2 (MODIFY_EXPR, void_type_node, recip_def, new_stmt = build2 (MODIFY_EXPR, void_type_node, recip_def,
fold_build2 (RDIV_EXPR, type, fold_build2 (RDIV_EXPR, type, get_constant_one (type),
build_real (type, dconst1), def)); def));
if (occ->bb_has_division) if (occ->bb_has_division)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment