* [patch, Fortran] Some more trim optimizatins
@ 2011-03-26 9:55 Thomas Koenig
2011-03-27 13:44 ` Tobias Burnus
0 siblings, 1 reply; 3+ messages in thread
From: Thomas Koenig @ 2011-03-26 9:55 UTC (permalink / raw)
To: fortran, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 628 bytes --]
Hello world,
the following patch extends the trim optimization to variables like
trim(a%x).
Going for trim(a(1)) led to a very strange regression, so I took that
out (for now).
Regression-tested. OK for trunk?
Thomas
2011-03-26 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/47065
* frontend-passes (optimize_trim): Also follow references, except
when they are substring references or array references.
2011-03-26 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/47065
* gfortran.dg/trim_optimize_5.f90: New test.
* gfortran.dg/trim_optimize_6.f90: New test.
[-- Attachment #2: trim_optimize_5.f90 --]
[-- Type: text/plain, Size: 615 bytes --]
! { dg-do run }
! { dg-options "-O -fdump-tree-original" }
! PR 47065 - replace trim with substring expressions even with references.
program main
use foo
implicit none
type t
character(len=2) :: x
end type t
type(t) :: a
character(len=3) :: b
character(len=10) :: line
a%x = 'a'
write(unit=line,fmt='(A,A)') trim(a%x),"X"
if (line /= 'aX ') call abort
b = 'ab'
write (unit=line,fmt='(A,A)') trim(b),"Y"
if (line /= 'abY ') call abort
end program main
! { dg-final { scan-tree-dump-times "string_len_trim" 2 "original" } }
! { dg-final { cleanup-tree-dump "original" } }
[-- Attachment #3: trim_optimize_6.f90 --]
[-- Type: text/plain, Size: 545 bytes --]
! { dg-do run }
! PR 47065 - make sure that impure functions are not evaluated twice when
! replacing calls to trim with expression(1:len_trim)
module foo
implicit none
contains
function f()
integer :: f
integer :: s=0
s = s + 1
f = s
end function f
end module foo
program main
use foo
implicit none
character(len=10) :: line
character(len=4) :: b(2)
b(1) = 'a'
b(2) = 'bc'
write(unit=line,fmt='(A,A)') trim(b(f())), "X"
if (line /= "aX ") call abort
if (f() .ne. 2) call abort
end program main
[-- Attachment #4: p6.diff --]
[-- Type: text/x-patch, Size: 3077 bytes --]
Index: frontend-passes.c
===================================================================
--- frontend-passes.c (Revision 171207)
+++ frontend-passes.c (Arbeitskopie)
@@ -664,6 +664,7 @@
gfc_ref *ref;
gfc_expr *fcn;
gfc_actual_arglist *actual_arglist, *next;
+ gfc_ref **rr = NULL;
/* Don't do this optimization within an argument list, because
otherwise aliasing issues may occur. */
@@ -681,46 +682,54 @@
if (a->expr_type != EXPR_VARIABLE)
return false;
+ /* Follow all references to find the correct place to put the newly
+ created reference. FIXME: Also handle substring references and
+ array references. Array references cause strange regressions at
+ the moment. */
+
if (a->ref)
{
- /* FIXME - also handle substring references, by modifying the
- reference itself. Make sure not to evaluate functions in
- the references twice. */
- return false;
+ for (rr = &(a->ref); *rr; rr = &((*rr)->next))
+ {
+ if ((*rr)->type == REF_SUBSTRING || (*rr)->type == REF_ARRAY)
+ return false;
+ }
}
- else
- {
- strip_function_call (e);
- /* Create the reference. */
+ strip_function_call (e);
- ref = gfc_get_ref ();
- ref->type = REF_SUBSTRING;
+ if (e->ref == NULL)
+ rr = &(e->ref);
- /* Set the start of the reference. */
+ /* Create the reference. */
- ref->u.ss.start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
+ ref = gfc_get_ref ();
+ ref->type = REF_SUBSTRING;
- /* Build the function call to len_trim(x, gfc_defaul_integer_kind). */
+ /* Set the start of the reference. */
- fcn = gfc_get_expr ();
- fcn->expr_type = EXPR_FUNCTION;
- fcn->value.function.isym =
- gfc_intrinsic_function_by_id (GFC_ISYM_LEN_TRIM);
- actual_arglist = gfc_get_actual_arglist ();
- actual_arglist->expr = gfc_copy_expr (e);
- next = gfc_get_actual_arglist ();
- next->expr = gfc_get_int_expr (gfc_default_integer_kind, NULL,
- gfc_default_integer_kind);
- actual_arglist->next = next;
- fcn->value.function.actual = actual_arglist;
+ ref->u.ss.start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
- /* Set the end of the reference to the call to len_trim. */
+ /* Build the function call to len_trim(x, gfc_defaul_integer_kind). */
- ref->u.ss.end = fcn;
- e->ref = ref;
- return true;
- }
+ fcn = gfc_get_expr ();
+ fcn->expr_type = EXPR_FUNCTION;
+ fcn->value.function.isym =
+ gfc_intrinsic_function_by_id (GFC_ISYM_LEN_TRIM);
+ actual_arglist = gfc_get_actual_arglist ();
+ actual_arglist->expr = gfc_copy_expr (e);
+ next = gfc_get_actual_arglist ();
+ next->expr = gfc_get_int_expr (gfc_default_integer_kind, NULL,
+ gfc_default_integer_kind);
+ actual_arglist->next = next;
+ fcn->value.function.actual = actual_arglist;
+
+ /* Set the end of the reference to the call to len_trim. */
+
+ ref->u.ss.end = fcn;
+ gcc_assert (*rr == NULL);
+ *rr = ref;
+ return true;
}
#define WALK_SUBEXPR(NODE) \
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch, Fortran] Some more trim optimizatins
2011-03-26 9:55 [patch, Fortran] Some more trim optimizatins Thomas Koenig
@ 2011-03-27 13:44 ` Tobias Burnus
2011-03-27 17:52 ` Thomas Koenig
0 siblings, 1 reply; 3+ messages in thread
From: Tobias Burnus @ 2011-03-27 13:44 UTC (permalink / raw)
To: Thomas Koenig; +Cc: fortran, gcc-patches
Thomas Koenig wrote:
> the following patch extends the trim optimization to variables like
> trim(a%x).
>
> Regression-tested. OK for trunk?
OK.
Tobias
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch, Fortran] Some more trim optimizatins
2011-03-27 13:44 ` Tobias Burnus
@ 2011-03-27 17:52 ` Thomas Koenig
0 siblings, 0 replies; 3+ messages in thread
From: Thomas Koenig @ 2011-03-27 17:52 UTC (permalink / raw)
To: Tobias Burnus; +Cc: fortran, gcc-patches
Hi Tobias,
> Thomas Koenig wrote:
>> the following patch extends the trim optimization to variables like
>> trim(a%x).
>>
>> Regression-tested. OK for trunk?
>
> OK.
Sending fortran/ChangeLog
Sending fortran/frontend-passes.c
Sending testsuite/ChangeLog
Adding testsuite/gfortran.dg/trim_optimize_5.f90
Adding testsuite/gfortran.dg/trim_optimize_6.f90
Transmitting file data .....
Committed revision 171575.
Thanks for the review!
Thomas
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-03-27 17:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-26 9:55 [patch, Fortran] Some more trim optimizatins Thomas Koenig
2011-03-27 13:44 ` Tobias Burnus
2011-03-27 17:52 ` Thomas Koenig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).