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
This commit is contained in:
parent
cc4bb878f1
commit
8ae5e6f215
@ -1,3 +1,18 @@
|
|||||||
|
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user