re PR middle-end/45505 (gfortran.dg/pr25923.f90)
2011-02-09 Martin Jambor <mjambor@suse.cz> PR middle-end/45505 * tree-sra.c (struct access): New flags grp_scalar_read and grp_scalar_write. Changed description of assignment read and write flags. (dump_access): Dump new flags, reorder all of them. (sort_and_splice_var_accesses): Set the new flag accordingly, use them to detect multiple scalar reads. (analyze_access_subtree): Use the new scalar read write flags instead of the old flags. Adjusted comments. * testsuite/gfortran.dg/pr25923.f90: Remove xfails. From-SVN: r169964
This commit is contained in:
parent
1bbb474148
commit
4fd7321445
|
@ -1,3 +1,15 @@
|
||||||
|
2011-02-09 Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
|
PR middle-end/45505
|
||||||
|
* tree-sra.c (struct access): New flags grp_scalar_read and
|
||||||
|
grp_scalar_write. Changed description of assignment read and write
|
||||||
|
flags.
|
||||||
|
(dump_access): Dump new flags, reorder all of them.
|
||||||
|
(sort_and_splice_var_accesses): Set the new flag accordingly, use them
|
||||||
|
to detect multiple scalar reads.
|
||||||
|
(analyze_access_subtree): Use the new scalar read write flags instead
|
||||||
|
of the old flags. Adjusted comments.
|
||||||
|
|
||||||
2011-02-08 DJ Delorie <dj@redhat.com>
|
2011-02-08 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
PR target/47548
|
PR target/47548
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-02-09 Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
|
PR middle-end/45505
|
||||||
|
* gfortran.dg/pr25923.f90: Remove xfails.
|
||||||
|
|
||||||
2011-02-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
2011-02-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/47583
|
PR fortran/47583
|
||||||
|
|
|
@ -10,7 +10,7 @@ implicit none
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
function baz(arg) result(res) ! { dg-bogus "res.yr' may be" "PR45505" { xfail ilp32 } }
|
function baz(arg) result(res) ! { dg-bogus "res.yr' may be" }
|
||||||
type(bar), intent(in) :: arg
|
type(bar), intent(in) :: arg
|
||||||
type(bar) :: res
|
type(bar) :: res
|
||||||
logical, external:: some_func
|
logical, external:: some_func
|
||||||
|
@ -19,7 +19,7 @@ contains
|
||||||
else
|
else
|
||||||
res = arg
|
res = arg
|
||||||
end if
|
end if
|
||||||
end function baz ! { dg-warning "res.yr' may be" "PR45505" { xfail ilp32 } }
|
end function baz ! { dg-warning "res.yr' may be" }
|
||||||
|
|
||||||
end module foo
|
end module foo
|
||||||
|
|
||||||
|
|
|
@ -195,6 +195,14 @@ struct access
|
||||||
statement? This flag is propagated down the access tree. */
|
statement? This flag is propagated down the access tree. */
|
||||||
unsigned grp_assignment_write : 1;
|
unsigned grp_assignment_write : 1;
|
||||||
|
|
||||||
|
/* Does this group contain a read access through a scalar type? This flag is
|
||||||
|
not propagated in the access tree in any direction. */
|
||||||
|
unsigned grp_scalar_read : 1;
|
||||||
|
|
||||||
|
/* Does this group contain a write access through a scalar type? This flag
|
||||||
|
is not propagated in the access tree in any direction. */
|
||||||
|
unsigned grp_scalar_write : 1;
|
||||||
|
|
||||||
/* Other passes of the analysis use this bit to make function
|
/* Other passes of the analysis use this bit to make function
|
||||||
analyze_access_subtree create scalar replacements for this group if
|
analyze_access_subtree create scalar replacements for this group if
|
||||||
possible. */
|
possible. */
|
||||||
|
@ -368,16 +376,18 @@ dump_access (FILE *f, struct access *access, bool grp)
|
||||||
fprintf (f, ", type = ");
|
fprintf (f, ", type = ");
|
||||||
print_generic_expr (f, access->type, 0);
|
print_generic_expr (f, access->type, 0);
|
||||||
if (grp)
|
if (grp)
|
||||||
fprintf (f, ", grp_write = %d, total_scalarization = %d, "
|
fprintf (f, ", total_scalarization = %d, grp_read = %d, grp_write = %d, "
|
||||||
"grp_read = %d, grp_hint = %d, grp_assignment_read = %d,"
|
"grp_assignment_read = %d, grp_assignment_write = %d, "
|
||||||
"grp_assignment_write = %d, grp_covered = %d, "
|
"grp_scalar_read = %d, grp_scalar_write = %d, "
|
||||||
|
"grp_hint = %d, grp_covered = %d, "
|
||||||
"grp_unscalarizable_region = %d, grp_unscalarized_data = %d, "
|
"grp_unscalarizable_region = %d, grp_unscalarized_data = %d, "
|
||||||
"grp_partial_lhs = %d, grp_to_be_replaced = %d, "
|
"grp_partial_lhs = %d, grp_to_be_replaced = %d, "
|
||||||
"grp_maybe_modified = %d, "
|
"grp_maybe_modified = %d, "
|
||||||
"grp_not_necessarilly_dereferenced = %d\n",
|
"grp_not_necessarilly_dereferenced = %d\n",
|
||||||
access->grp_write, access->total_scalarization,
|
access->total_scalarization, access->grp_read, access->grp_write,
|
||||||
access->grp_read, access->grp_hint, access->grp_assignment_read,
|
access->grp_assignment_read, access->grp_assignment_write,
|
||||||
access->grp_assignment_write, access->grp_covered,
|
access->grp_scalar_read, access->grp_scalar_write,
|
||||||
|
access->grp_hint, access->grp_covered,
|
||||||
access->grp_unscalarizable_region, access->grp_unscalarized_data,
|
access->grp_unscalarizable_region, access->grp_unscalarized_data,
|
||||||
access->grp_partial_lhs, access->grp_to_be_replaced,
|
access->grp_partial_lhs, access->grp_to_be_replaced,
|
||||||
access->grp_maybe_modified,
|
access->grp_maybe_modified,
|
||||||
|
@ -1593,9 +1603,13 @@ sort_and_splice_var_accesses (tree var)
|
||||||
struct access *access = VEC_index (access_p, access_vec, i);
|
struct access *access = VEC_index (access_p, access_vec, i);
|
||||||
bool grp_write = access->write;
|
bool grp_write = access->write;
|
||||||
bool grp_read = !access->write;
|
bool grp_read = !access->write;
|
||||||
|
bool grp_scalar_write = access->write
|
||||||
|
&& is_gimple_reg_type (access->type);
|
||||||
|
bool grp_scalar_read = !access->write
|
||||||
|
&& is_gimple_reg_type (access->type);
|
||||||
bool grp_assignment_read = access->grp_assignment_read;
|
bool grp_assignment_read = access->grp_assignment_read;
|
||||||
bool grp_assignment_write = access->grp_assignment_write;
|
bool grp_assignment_write = access->grp_assignment_write;
|
||||||
bool multiple_reads = false;
|
bool multiple_scalar_reads = false;
|
||||||
bool total_scalarization = access->total_scalarization;
|
bool total_scalarization = access->total_scalarization;
|
||||||
bool grp_partial_lhs = access->grp_partial_lhs;
|
bool grp_partial_lhs = access->grp_partial_lhs;
|
||||||
bool first_scalar = is_gimple_reg_type (access->type);
|
bool first_scalar = is_gimple_reg_type (access->type);
|
||||||
|
@ -1620,13 +1634,21 @@ sort_and_splice_var_accesses (tree var)
|
||||||
if (ac2->offset != access->offset || ac2->size != access->size)
|
if (ac2->offset != access->offset || ac2->size != access->size)
|
||||||
break;
|
break;
|
||||||
if (ac2->write)
|
if (ac2->write)
|
||||||
grp_write = true;
|
{
|
||||||
|
grp_write = true;
|
||||||
|
grp_scalar_write = (grp_scalar_write
|
||||||
|
|| is_gimple_reg_type (ac2->type));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (grp_read)
|
grp_read = true;
|
||||||
multiple_reads = true;
|
if (is_gimple_reg_type (ac2->type))
|
||||||
else
|
{
|
||||||
grp_read = true;
|
if (grp_scalar_read)
|
||||||
|
multiple_scalar_reads = true;
|
||||||
|
else
|
||||||
|
grp_scalar_read = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
grp_assignment_read |= ac2->grp_assignment_read;
|
grp_assignment_read |= ac2->grp_assignment_read;
|
||||||
grp_assignment_write |= ac2->grp_assignment_write;
|
grp_assignment_write |= ac2->grp_assignment_write;
|
||||||
|
@ -1648,9 +1670,11 @@ sort_and_splice_var_accesses (tree var)
|
||||||
access->group_representative = access;
|
access->group_representative = access;
|
||||||
access->grp_write = grp_write;
|
access->grp_write = grp_write;
|
||||||
access->grp_read = grp_read;
|
access->grp_read = grp_read;
|
||||||
|
access->grp_scalar_read = grp_scalar_read;
|
||||||
|
access->grp_scalar_write = grp_scalar_write;
|
||||||
access->grp_assignment_read = grp_assignment_read;
|
access->grp_assignment_read = grp_assignment_read;
|
||||||
access->grp_assignment_write = grp_assignment_write;
|
access->grp_assignment_write = grp_assignment_write;
|
||||||
access->grp_hint = multiple_reads || total_scalarization;
|
access->grp_hint = multiple_scalar_reads || total_scalarization;
|
||||||
access->grp_partial_lhs = grp_partial_lhs;
|
access->grp_partial_lhs = grp_partial_lhs;
|
||||||
access->grp_unscalarizable_region = unscalarizable_region;
|
access->grp_unscalarizable_region = unscalarizable_region;
|
||||||
if (access->first_link)
|
if (access->first_link)
|
||||||
|
@ -1851,13 +1875,13 @@ enum mark_rw_status { SRA_MRRW_NOTHING, SRA_MRRW_DIRECT, SRA_MRRW_ASSIGN};
|
||||||
there is more than one direct read access) or according to the following
|
there is more than one direct read access) or according to the following
|
||||||
table:
|
table:
|
||||||
|
|
||||||
Access written to individually (once or more times)
|
Access written to through a scalar type (once or more times)
|
||||||
|
|
|
|
||||||
| Parent written to in an assignment statement
|
| Written to in an assignment statement
|
||||||
| |
|
| |
|
||||||
| | Access read individually _once_
|
| | Access read as scalar _once_
|
||||||
| | |
|
| | |
|
||||||
| | | Parent read in an assignment statement
|
| | | Read in an assignment statement
|
||||||
| | | |
|
| | | |
|
||||||
| | | | Scalarize Comment
|
| | | | Scalarize Comment
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
@ -1888,8 +1912,6 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
|
||||||
HOST_WIDE_INT covered_to = root->offset;
|
HOST_WIDE_INT covered_to = root->offset;
|
||||||
bool scalar = is_gimple_reg_type (root->type);
|
bool scalar = is_gimple_reg_type (root->type);
|
||||||
bool hole = false, sth_created = false;
|
bool hole = false, sth_created = false;
|
||||||
bool direct_read = root->grp_read;
|
|
||||||
bool direct_write = root->grp_write;
|
|
||||||
|
|
||||||
if (root->grp_assignment_read)
|
if (root->grp_assignment_read)
|
||||||
mark_read = SRA_MRRW_ASSIGN;
|
mark_read = SRA_MRRW_ASSIGN;
|
||||||
|
@ -1938,8 +1960,8 @@ analyze_access_subtree (struct access *root, bool allow_replacements,
|
||||||
|
|
||||||
if (allow_replacements && scalar && !root->first_child
|
if (allow_replacements && scalar && !root->first_child
|
||||||
&& (root->grp_hint
|
&& (root->grp_hint
|
||||||
|| ((direct_write || root->grp_assignment_write)
|
|| ((root->grp_scalar_read || root->grp_assignment_read)
|
||||||
&& (direct_read || root->grp_assignment_read))))
|
&& (root->grp_scalar_write || root->grp_assignment_write))))
|
||||||
{
|
{
|
||||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue