Commit 8ae5e6f2 by Andrew Pinski Committed by Andrew Pinski

re PR tree-optimization/25528 (missed LIM on the tree level (complex types))

2006-01-06  Andrew Pinski  <pinskia@physics.uc.edu>

        PR tree-opt/25528
        * tree-ssa-alias.c (find_used_portions): Handle REALPART_EXPR
        and IMAGPART_EXPR.
        * tree-flow-inline.h (var_can_have_subvars): Handle complex types
        on non gimple variables.  Also add checks at the top for decls and
        mtags.
        * tree-ssa-structalias.c (push_fields_onto_fieldstack): Handle
        complex types.
        * tree-ssa-operands.c (parse_ssa_operands): Handle REALPART_EXPR
        and IMAGPART_EXPR for creating MUST_DEFs.
        (get_expr_operands): Handle SSA_NAME, STRUCT_FIELD_TAG, TYPE_MEMORY_TAG,
        and NAME_MEMORY_TAG separately from the DECLs.

From-SVN: r109419
parent cc4bb878
2006-01-06 Andrew Pinski <pinskia@physics.uc.edu>
PR tree-opt/25528
* tree-ssa-alias.c (find_used_portions): Handle REALPART_EXPR
and IMAGPART_EXPR.
* tree-flow-inline.h (var_can_have_subvars): Handle complex types
on non gimple variables. Also add checks at the top for decls and
mtags.
* tree-ssa-structalias.c (push_fields_onto_fieldstack): Handle
complex types.
* tree-ssa-operands.c (parse_ssa_operands): Handle REALPART_EXPR
and IMAGPART_EXPR for creating MUST_DEFs.
(get_expr_operands): Handle SSA_NAME, STRUCT_FIELD_TAG, TYPE_MEMORY_TAG,
and NAME_MEMORY_TAG separately from the DECLs.
2006-01-06 Richard Guenther <rguenther@suse.de> 2006-01-06 Richard Guenther <rguenther@suse.de>
* tree-dfa.c (mark_new_vars_to_rename): Create stmt * tree-dfa.c (mark_new_vars_to_rename): Create stmt
......
...@@ -1490,13 +1490,28 @@ get_subvar_at (tree var, unsigned HOST_WIDE_INT offset) ...@@ -1490,13 +1490,28 @@ get_subvar_at (tree var, unsigned HOST_WIDE_INT offset)
/* Return true if V is a tree that we can have subvars for. /* Return true if V is a tree that we can have subvars for.
Normally, this is any aggregate type, however, due to implementation Normally, this is any aggregate type, however, due to implementation
limitations ATM, we exclude array types as well. */ limitations ATM, we exclude array types as well. Also complex
types which are not gimple registers can have subvars. */
static inline bool static inline bool
var_can_have_subvars (tree v) var_can_have_subvars (tree v)
{ {
return (AGGREGATE_TYPE_P (TREE_TYPE (v)) && /* Non decls or memory tags can never have subvars. */
TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE); if (!DECL_P (v) || MTAG_P (v))
return false;
/* Aggregates besides arrays can have subvars. */
if (AGGREGATE_TYPE_P (TREE_TYPE (v))
&& TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE)
return true;
/* Complex types variables which are not also a gimple register can
have subvars. */
if (TREE_CODE (TREE_TYPE (v)) == COMPLEX_TYPE
&& !DECL_COMPLEX_GIMPLE_REG_P (v))
return true;
return false;
} }
......
...@@ -2694,6 +2694,8 @@ find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) ...@@ -2694,6 +2694,8 @@ find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
{ {
switch (TREE_CODE (*tp)) switch (TREE_CODE (*tp))
{ {
case REALPART_EXPR:
case IMAGPART_EXPR:
case COMPONENT_REF: case COMPONENT_REF:
{ {
HOST_WIDE_INT bitsize; HOST_WIDE_INT bitsize;
......
...@@ -734,9 +734,7 @@ parse_ssa_operands (tree stmt) ...@@ -734,9 +734,7 @@ parse_ssa_operands (tree stmt)
if (TREE_CODE (lhs) != ARRAY_REF if (TREE_CODE (lhs) != ARRAY_REF
&& TREE_CODE (lhs) != ARRAY_RANGE_REF && TREE_CODE (lhs) != ARRAY_RANGE_REF
&& TREE_CODE (lhs) != BIT_FIELD_REF && TREE_CODE (lhs) != BIT_FIELD_REF)
&& TREE_CODE (lhs) != REALPART_EXPR
&& TREE_CODE (lhs) != IMAGPART_EXPR)
lhs_flags |= opf_kill_def; lhs_flags |= opf_kill_def;
get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), lhs_flags); get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), lhs_flags);
...@@ -1065,6 +1063,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) ...@@ -1065,6 +1063,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
case STRUCT_FIELD_TAG: case STRUCT_FIELD_TAG:
case TYPE_MEMORY_TAG: case TYPE_MEMORY_TAG:
case NAME_MEMORY_TAG: case NAME_MEMORY_TAG:
add_stmt_operand (expr_p, s_ann, flags);
return;
case VAR_DECL: case VAR_DECL:
case PARM_DECL: case PARM_DECL:
case RESULT_DECL: case RESULT_DECL:
......
...@@ -3568,6 +3568,24 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, ...@@ -3568,6 +3568,24 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
{ {
tree field; tree field;
int count = 0; int count = 0;
if (TREE_CODE (type) == COMPLEX_TYPE)
{
fieldoff_s *real_part, *img_part;
real_part = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
real_part->type = TREE_TYPE (type);
real_part->size = TYPE_SIZE (TREE_TYPE (type));
real_part->offset = offset;
real_part->decl = NULL_TREE;
img_part = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
img_part->type = TREE_TYPE (type);
img_part->size = TYPE_SIZE (TREE_TYPE (type));
img_part->offset = offset + TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (type)));
img_part->decl = NULL_TREE;
return 2;
}
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
if (TREE_CODE (field) == FIELD_DECL) if (TREE_CODE (field) == FIELD_DECL)
......
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