Commit 4cc13d9d by Martin Jambor Committed by Martin Jambor

re PR tree-optimization/46349 (incorrect scalarization)

2010-11-15  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/46349
	* tree-sra.c (contains_bitfld_comp_ref_p): New function.
	(contains_vce_or_bfcref_p): Likewise.
	(sra_modify_assign): Use them.

	* testsuite/gnat.dg/opt9.adb: New file.
	* testsuite/gnat.dg/opt9_pkg.ads: Likewise

From-SVN: r166759
parent 9965e3cd
2010-11-15 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/46349
* tree-sra.c (contains_bitfld_comp_ref_p): New function.
(contains_vce_or_bfcref_p): Likewise.
(sra_modify_assign): Use them.
2010-11-15 Richard Guenther <rguenther@suse.de> 2010-11-15 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46467 PR tree-optimization/46467
2010-11-15 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/46349
* gnat.dg/opt9.adb: New file.
* gnat.dg/opt9_pkg.ads: Likewise
2010-11-15 Richard Guenther <rguenther@suse.de> 2010-11-15 Richard Guenther <rguenther@suse.de>
PR lto/44989 PR lto/44989
......
-- { dg-do compile }
-- { dg-options "-gnatws -O" }
with Opt9_Pkg; use Opt9_Pkg;
procedure Opt9 is
type Array_T is array (1 .. N) of Integer;
type Clock_T is record
N_Ticks : Integer := 0;
end record;
type Rec is record
Values : Array_T;
Valid : Boolean;
Tstamp : Clock_T;
end record;
pragma Pack (Rec);
Data : Rec;
begin
null;
end;
package Opt9_Pkg is
N : integer := 15;
end Opt9_Pkg;
...@@ -2626,6 +2626,41 @@ get_repl_default_def_ssa_name (struct access *racc) ...@@ -2626,6 +2626,41 @@ get_repl_default_def_ssa_name (struct access *racc)
return repl; return repl;
} }
/* Return true if REF has a COMPONENT_REF with a bit-field field declaration
somewhere in it. */
static inline bool
contains_bitfld_comp_ref_p (const_tree ref)
{
while (handled_component_p (ref))
{
if (TREE_CODE (ref) == COMPONENT_REF
&& DECL_BIT_FIELD (TREE_OPERAND (ref, 1)))
return true;
ref = TREE_OPERAND (ref, 0);
}
return false;
}
/* Return true if REF has an VIEW_CONVERT_EXPR or a COMPONENT_REF with a
bit-field field declaration somewhere in it. */
static inline bool
contains_vce_or_bfcref_p (const_tree ref)
{
while (handled_component_p (ref))
{
if (TREE_CODE (ref) == VIEW_CONVERT_EXPR
|| (TREE_CODE (ref) == COMPONENT_REF
&& DECL_BIT_FIELD (TREE_OPERAND (ref, 1))))
return true;
ref = TREE_OPERAND (ref, 0);
}
return false;
}
/* Examine both sides of the assignment statement pointed to by STMT, replace /* Examine both sides of the assignment statement pointed to by STMT, replace
them with a scalare replacement if there is one and generate copying of them with a scalare replacement if there is one and generate copying of
replacements if scalarized aggregates have been used in the assignment. GSI replacements if scalarized aggregates have been used in the assignment. GSI
...@@ -2694,6 +2729,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) ...@@ -2694,6 +2729,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
??? This should move to fold_stmt which we simply should ??? This should move to fold_stmt which we simply should
call after building a VIEW_CONVERT_EXPR here. */ call after building a VIEW_CONVERT_EXPR here. */
if (AGGREGATE_TYPE_P (TREE_TYPE (lhs)) if (AGGREGATE_TYPE_P (TREE_TYPE (lhs))
&& !contains_bitfld_comp_ref_p (lhs)
&& !access_has_children_p (lacc)) && !access_has_children_p (lacc))
{ {
lhs = build_ref_for_offset (loc, lhs, 0, TREE_TYPE (rhs), lhs = build_ref_for_offset (loc, lhs, 0, TREE_TYPE (rhs),
...@@ -2701,7 +2737,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) ...@@ -2701,7 +2737,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
gimple_assign_set_lhs (*stmt, lhs); gimple_assign_set_lhs (*stmt, lhs);
} }
else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs)) else if (AGGREGATE_TYPE_P (TREE_TYPE (rhs))
&& !contains_view_convert_expr_p (rhs) && !contains_vce_or_bfcref_p (rhs)
&& !access_has_children_p (racc)) && !access_has_children_p (racc))
rhs = build_ref_for_offset (loc, rhs, 0, TREE_TYPE (lhs), rhs = build_ref_for_offset (loc, rhs, 0, TREE_TYPE (lhs),
gsi, false); gsi, false);
...@@ -2751,8 +2787,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) ...@@ -2751,8 +2787,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
This is what the first branch does. */ This is what the first branch does. */
if (gimple_has_volatile_ops (*stmt) if (gimple_has_volatile_ops (*stmt)
|| contains_view_convert_expr_p (rhs) || contains_vce_or_bfcref_p (rhs)
|| contains_view_convert_expr_p (lhs)) || contains_vce_or_bfcref_p (lhs))
{ {
if (access_has_children_p (racc)) if (access_has_children_p (racc))
generate_subtree_copies (racc->first_child, racc->base, 0, 0, 0, generate_subtree_copies (racc->first_child, racc->base, 0, 0, 0,
......
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