summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-19 09:06:54 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-19 09:06:54 +0000
commit02067dc53cf72664671a7c7b23ba05218861e2a2 (patch)
treeb82321d60c8540d93282490a2395f56bf8a0f30e /gcc/tree-ssa-pre.c
parent862bb3cd49b5de32ded383717d9ee73387684bbe (diff)
downloadgcc-02067dc53cf72664671a7c7b23ba05218861e2a2.tar.gz
2008-08-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/35972 PR tree-optimization/23094 * tree-ssa-sccvn.h (vn_reference_lookup_pieces): Add maywalk parameter. * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Properly handle MISALIGNED_INDIRECT_REF. (get_ref_from_reference_ops): New helper. (vn_reference_lookup_pieces): Walk the use-def chain using the alias-oracle if requested. * tree-ssa-pre.c (phi_translate_1): Do reference lookup with walking the use-def chain. (compute_avail): But not here. (create_component_ref_by_pieces_1): Properly handle MISALIGNED_INDIRECT_REF. (do_regular_insertion): Handle fully redundant expressions after PHI-translation also for SSA_NAME values, not only constants. Correctly use edoubleprime for that. * gcc.dg/tree-ssa/ssa-pre-19.c: New testcase. * gcc.dg/autopar/reduc-1.c: Move constant initialized arrays to global memory. * gcc.dg/autopar/reduc-1char.c: Likewise. * gcc.dg/autopar/reduc-1short.c: Likewise. * gcc.dg/autopar/reduc-2.c: Likewise. * gcc.dg/autopar/reduc-2char.c: Likewise. * gcc.dg/autopar/reduc-2short.c: Likewise. * gcc.dg/autopar/reduc-3.c: Likewise. * gcc.dg/tree-ssa/ifc-20040816-1.c: Likewise. * gcc.dg/vect/costmodel/i386/costmodel-vect-reduc-1char.c: Likewise. * gcc.dg/vect/costmodel/x86_64/costmodel-vect-reduc-1char.c: Likewise. * gcc.dg/vect/fast-math-vect-reduc-5.c: Likewise. * gcc.dg/vect/fast-math-vect-reduc-7.c: Likewise. * gcc.dg/vect/no-trapping-math-2.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-111.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c: Likewise. * gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c: Likewise. * gcc.dg/vect/no-vfa-vect-37.c: Likewise. * gcc.dg/vect/no-vfa-vect-depend-1.c: Likewise. * gcc.dg/vect/pr18400.c: Likewise. * gcc.dg/vect/slp-12b.c: Likewise. * gcc.dg/vect/slp-14.c: Likewise. * gcc.dg/vect/slp-7.c: Likewise. * gcc.dg/vect/slp-15.c: Likewise. * gcc.dg/vect/slp-16.c: Likewise. * gcc.dg/vect/slp-17.c: Likewise. * gcc.dg/vect/slp-24.c: Likewise. * gcc.dg/vect/slp-28.c: Likewise. * gcc.dg/vect/slp-3.c: Likewise. * gcc.dg/vect/slp-34.c: Likewise. * gcc.dg/vect/slp-6.c: Likewise. * gcc.dg/vect/slp-8.c: Likewise. * gcc.dg/vect/vect-107.c: Likewise. * gcc.dg/vect/vect-108.c: Likewise. * gcc.dg/vect/vect-11.c: Likewise. * gcc.dg/vect/vect-112.c: Likewise. * gcc.dg/vect/vect-115.c: Likewise. * gcc.dg/vect/vect-11a.c: Likewise. * gcc.dg/vect/vect-34.c: Likewise. * gcc.dg/vect/vect-9.c: Likewise. * gcc.dg/vect/vect-97.c: Likewise. * gcc.dg/vect/vect-align-1.c: Likewise. * gcc.dg/vect/vect-float-extend-1.c: Likewise. * gcc.dg/vect/vect-floatint-conversion-1.c: Likewise. * gcc.dg/vect/vect-ifcvt-16.c: Likewise. * gcc.dg/vect/vect-ifcvt-17.c: Likewise. * gcc.dg/vect/vect-ifcvt-2.c: Likewise. * gcc.dg/vect/vect-ifcvt-3.c: Likewise. * gcc.dg/vect/vect-ifcvt-4.c: Likewise. * gcc.dg/vect/vect-ifcvt-5.c: Likewise. * gcc.dg/vect/vect-ifcvt-6.c: Likewise. * gcc.dg/vect/vect-ifcvt-7.c: Likewise. * gcc.dg/vect/vect-intfloat-conversion-1.c: Likewise. * gcc.dg/vect/vect-intfloat-conversion-2.c: Likewise. * gcc.dg/vect/vect-intfloat-conversion-3.c: Likewise. * gcc.dg/vect/vect-intfloat-conversion-4a.c: Likewise. * gcc.dg/vect/vect-intfloat-conversion-4b.c: Likewise. * gcc.dg/vect/vect-multitypes-2.c: Likewise. * gcc.dg/vect/vect-multitypes-5.c: Likewise. * gcc.dg/vect/vect-reduc-1.c: Likewise. * gcc.dg/vect/vect-reduc-1char.c: Likewise. * gcc.dg/vect/vect-reduc-1short.c: Likewise. * gcc.dg/vect/vect-reduc-2.c: Likewise. * gcc.dg/vect/vect-reduc-3.c: Likewise. * gcc.dg/vect/vect-shift-1.c: Likewise. * gcc.dg/vect/vect-strided-float.c: Likewise. * gcc.dg/vect/vect-strided-store-u32-i2.c: Likewise. * gcc.dg/vect/wrapv-vect-reduc-2char.c: Likewise. * gcc.dg/vect/wrapv-vect-reduc-2short.c: Likewise. * gcc.dg/tree-ssa/gen-vect-11.c: Likewise. * gcc.dg/tree-ssa/gen-vect-11a.c: Likewise. * gcc.dg/tree-ssa/gen-vect-2.c: Likewise. * gcc.dg/vect/costmodel/ppc/costmodel-vect-76c.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139226 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 9e8ff56495e..cc5678258a1 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1566,7 +1566,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
{
tree result = vn_reference_lookup_pieces (newvuses,
newoperands,
- &newref);
+ &newref, true);
unsigned int new_val_id;
if (newref)
@@ -2499,8 +2499,12 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
genop1 = fold_convert (build_pointer_type (currop->type),
genop1);
- folded = fold_build1 (currop->opcode, currop->type,
- genop1);
+ if (currop->opcode == MISALIGNED_INDIRECT_REF)
+ folded = fold_build2 (currop->opcode, currop->type,
+ genop1, currop->op1);
+ else
+ folded = fold_build1 (currop->opcode, currop->type,
+ genop1);
return folded;
}
break;
@@ -3139,6 +3143,7 @@ do_regular_insertion (basic_block block, basic_block dom)
basic_block bprime;
pre_expr eprime = NULL;
edge_iterator ei;
+ pre_expr edoubleprime;
val = get_expr_value_id (expr);
if (bitmap_set_contains_value (PHI_GEN (block), val))
@@ -3154,7 +3159,6 @@ do_regular_insertion (basic_block block, basic_block dom)
FOR_EACH_EDGE (pred, ei, block->preds)
{
unsigned int vprime;
- pre_expr edoubleprime;
/* This can happen in the very weird case
that our fake infinite loop edges have caused a
@@ -3216,7 +3220,8 @@ do_regular_insertion (basic_block block, basic_block dom)
an invariant, then the PHI has the same value on all
edges. Note this. */
else if (!cant_insert && all_same && eprime
- && eprime->kind == CONSTANT
+ && (edoubleprime->kind == CONSTANT
+ || edoubleprime->kind == NAME)
&& !value_id_constant_p (val))
{
unsigned int j;
@@ -3224,7 +3229,7 @@ do_regular_insertion (basic_block block, basic_block dom)
bitmap_set_t exprset = VEC_index (bitmap_set_t,
value_expressions, val);
- unsigned int new_val = get_expr_value_id (eprime);
+ unsigned int new_val = get_expr_value_id (edoubleprime);
FOR_EACH_EXPR_ID_IN_SET (exprset, j, bi)
{
pre_expr expr = expression_for_id (j);
@@ -3234,9 +3239,14 @@ do_regular_insertion (basic_block block, basic_block dom)
vn_ssa_aux_t info = VN_INFO (PRE_EXPR_NAME (expr));
/* Just reset the value id and valnum so it is
the same as the constant we have discovered. */
- info->valnum = PRE_EXPR_CONSTANT (eprime);
+ if (edoubleprime->kind == CONSTANT)
+ {
+ info->valnum = PRE_EXPR_CONSTANT (edoubleprime);
+ pre_stats.constified++;
+ }
+ else
+ info->valnum = PRE_EXPR_NAME (edoubleprime);
info->value_id = new_val;
- pre_stats.constified++;
}
}
}
@@ -3594,7 +3604,7 @@ compute_avail (void)
copy_reference_ops_from_call (stmt, &ops);
vn_reference_lookup_pieces (shared_vuses_from_stmt (stmt),
- ops, &ref);
+ ops, &ref, false);
VEC_free (vn_reference_op_s, heap, ops);
if (!ref)
continue;