diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-08-03 22:02:30 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-08-03 22:02:30 +0000 |
commit | 15b71db372221e4cb5b5e490397cd4ea4199505f (patch) | |
tree | 3819a385329077d8671c0fd7dcb745b43945967e | |
parent | 051de0eb4fb3abfce4863ea88afeffd2bc35cbed (diff) | |
download | gcc-15b71db372221e4cb5b5e490397cd4ea4199505f.zip gcc-15b71db372221e4cb5b5e490397cd4ea4199505f.tar.gz gcc-15b71db372221e4cb5b5e490397cd4ea4199505f.tar.bz2 |
re PR fortran/45159 (Unnecessary temporaries)
2010-08-03 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/45159
* dependency.c (gfc_deb_compare_expr): Remove any integer
conversion functions to larger types from both arguments.
Remove handling these functions futher down.
2010-08-03 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/45159
* gfortran.dg/dependency_30.f90: New test.
From-SVN: r162848
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/dependency.c | 52 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/dependency_30.f90 | 9 |
4 files changed, 59 insertions, 14 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 23c0a1e..a426d83 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-08-03 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/45159 + * dependency.c (gfc_deb_compare_expr): Remove any integer + conversion functions to larger types from both arguments. + Remove handling these functions futher down. + 2010-08-03 Janus Weil <janus@gcc.gnu.org> PR fortran/44584 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 1eae1eb..90b2d67 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -180,7 +180,45 @@ gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2) gfc_actual_arglist *args1; gfc_actual_arglist *args2; int i; + gfc_expr *n1, *n2; + n1 = NULL; + n2 = NULL; + + /* Remove any integer conversion functions to larger types. */ + if (e1->expr_type == EXPR_FUNCTION && e1->value.function.isym + && e1->value.function.isym->id == GFC_ISYM_CONVERSION + && e1->ts.type == BT_INTEGER) + { + args1 = e1->value.function.actual; + if (args1->expr->ts.type == BT_INTEGER + && e1->ts.kind > args1->expr->ts.kind) + n1 = args1->expr; + } + + if (e2->expr_type == EXPR_FUNCTION && e2->value.function.isym + && e2->value.function.isym->id == GFC_ISYM_CONVERSION + && e2->ts.type == BT_INTEGER) + { + args2 = e2->value.function.actual; + if (args2->expr->ts.type == BT_INTEGER + && e2->ts.kind > args2->expr->ts.kind) + n2 = args2->expr; + } + + if (n1 != NULL) + { + if (n2 != NULL) + return gfc_dep_compare_expr (n1, n2); + else + return gfc_dep_compare_expr (n1, e2); + } + else + { + if (n2 != NULL) + return gfc_dep_compare_expr (e1, n2); + } + if (e1->expr_type == EXPR_OP && (e1->value.op.op == INTRINSIC_UPLUS || e1->value.op.op == INTRINSIC_PARENTHESES)) @@ -328,20 +366,6 @@ gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2) argument lists. */ switch (e1->value.function.isym->id) { - case GFC_ISYM_CONVERSION: - /* Handle integer extensions specially, as __convert_i4_i8 - is not only "constant" but also "unary" and "increasing". */ - if (args1 && !args1->next - && args2 && !args2->next - && e1->ts.type == BT_INTEGER - && args1->expr->ts.type == BT_INTEGER - && e1->ts.kind > args1->expr->ts.kind - && e2->ts.type == e1->ts.type - && e2->ts.kind == e1->ts.kind - && args2->expr->ts.type == args1->expr->ts.type - && args2->expr->ts.kind == args2->expr->ts.kind) - return gfc_dep_compare_expr (args1->expr, args2->expr); - break; case GFC_ISYM_REAL: case GFC_ISYM_LOGICAL: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8fbbb52..960b7fe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-03 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/45159 + * gfortran.dg/dependency_30.f90: New test. + 2010-08-03 Jan Hubicka <jh@suse.cz> * gcc.c-torture/compile/pr45085.c: New testcase. diff --git a/gcc/testsuite/gfortran.dg/dependency_30.f90 b/gcc/testsuite/gfortran.dg/dependency_30.f90 new file mode 100644 index 0000000..575dbebc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_30.f90 @@ -0,0 +1,9 @@ +! { do-do compile } +! { dg-options "-Warray-temporaries" } +! PR 45159 - make sure no temporary is created for this. +subroutine foo(a,b,i,j,k,n) + implicit none + integer, intent(in) :: i, j, k, n + real, dimension(n) :: a,b + a(k:i-1) = a(i:j) +end subroutine foo |