diff options
author | Martin Jambor <mjambor@suse.cz> | 2011-02-09 12:48:09 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2011-02-09 12:48:09 +0100 |
commit | 4fd7321445500c8283d94b38e2e728b4fa4517a7 (patch) | |
tree | 6eb9fcbf5f662ad5fe9a681d1dc716caf7795eee /gcc | |
parent | 1bbb474148a83811771b36b76a62e3f59aae5ba2 (diff) | |
download | gcc-4fd7321445500c8283d94b38e2e728b4fa4517a7.zip gcc-4fd7321445500c8283d94b38e2e728b4fa4517a7.tar.gz gcc-4fd7321445500c8283d94b38e2e728b4fa4517a7.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr25923.f90 | 4 | ||||
-rw-r--r-- | gcc/tree-sra.c | 64 |
4 files changed, 62 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d83740f..7dc0847 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> PR target/47548 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7da97ab..3483b50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> PR fortran/47583 diff --git a/gcc/testsuite/gfortran.dg/pr25923.f90 b/gcc/testsuite/gfortran.dg/pr25923.f90 index 9140d35..e0df5b0 100644 --- a/gcc/testsuite/gfortran.dg/pr25923.f90 +++ b/gcc/testsuite/gfortran.dg/pr25923.f90 @@ -10,7 +10,7 @@ implicit none 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) :: res logical, external:: some_func @@ -19,7 +19,7 @@ contains else res = arg 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 diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 82d7601..27cb303 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -195,6 +195,14 @@ struct access statement? This flag is propagated down the access tree. */ 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 analyze_access_subtree create scalar replacements for this group if possible. */ @@ -368,16 +376,18 @@ dump_access (FILE *f, struct access *access, bool grp) fprintf (f, ", type = "); print_generic_expr (f, access->type, 0); if (grp) - fprintf (f, ", grp_write = %d, total_scalarization = %d, " - "grp_read = %d, grp_hint = %d, grp_assignment_read = %d," - "grp_assignment_write = %d, grp_covered = %d, " + fprintf (f, ", total_scalarization = %d, grp_read = %d, grp_write = %d, " + "grp_assignment_read = %d, grp_assignment_write = %d, " + "grp_scalar_read = %d, grp_scalar_write = %d, " + "grp_hint = %d, grp_covered = %d, " "grp_unscalarizable_region = %d, grp_unscalarized_data = %d, " "grp_partial_lhs = %d, grp_to_be_replaced = %d, " "grp_maybe_modified = %d, " "grp_not_necessarilly_dereferenced = %d\n", - access->grp_write, access->total_scalarization, - access->grp_read, access->grp_hint, access->grp_assignment_read, - access->grp_assignment_write, access->grp_covered, + access->total_scalarization, access->grp_read, access->grp_write, + access->grp_assignment_read, access->grp_assignment_write, + access->grp_scalar_read, access->grp_scalar_write, + access->grp_hint, access->grp_covered, access->grp_unscalarizable_region, access->grp_unscalarized_data, access->grp_partial_lhs, access->grp_to_be_replaced, 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); bool grp_write = 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_write = access->grp_assignment_write; - bool multiple_reads = false; + bool multiple_scalar_reads = false; bool total_scalarization = access->total_scalarization; bool grp_partial_lhs = access->grp_partial_lhs; 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) break; if (ac2->write) - grp_write = true; + { + grp_write = true; + grp_scalar_write = (grp_scalar_write + || is_gimple_reg_type (ac2->type)); + } else { - if (grp_read) - multiple_reads = true; - else - grp_read = true; + grp_read = true; + if (is_gimple_reg_type (ac2->type)) + { + if (grp_scalar_read) + multiple_scalar_reads = true; + else + grp_scalar_read = true; + } } grp_assignment_read |= ac2->grp_assignment_read; grp_assignment_write |= ac2->grp_assignment_write; @@ -1648,9 +1670,11 @@ sort_and_splice_var_accesses (tree var) access->group_representative = access; access->grp_write = grp_write; 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_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_unscalarizable_region = unscalarizable_region; 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 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 ----------------------------------------------------------------------------- @@ -1888,8 +1912,6 @@ analyze_access_subtree (struct access *root, bool allow_replacements, HOST_WIDE_INT covered_to = root->offset; bool scalar = is_gimple_reg_type (root->type); bool hole = false, sth_created = false; - bool direct_read = root->grp_read; - bool direct_write = root->grp_write; if (root->grp_assignment_read) 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 && (root->grp_hint - || ((direct_write || root->grp_assignment_write) - && (direct_read || root->grp_assignment_read)))) + || ((root->grp_scalar_read || root->grp_assignment_read) + && (root->grp_scalar_write || root->grp_assignment_write)))) { if (dump_file && (dump_flags & TDF_DETAILS)) { |