From: Thomas Koenig Date: Tue, 3 Aug 2010 22:02:30 +0000 (+0000) Subject: re PR fortran/45159 (Unnecessary temporaries) X-Git-Tag: releases/gcc-4.6.0~5273 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15b71db372221e4cb5b5e490397cd4ea4199505f;p=thirdparty%2Fgcc.git re PR fortran/45159 (Unnecessary temporaries) 2010-08-03 Thomas Koenig 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 PR fortran/45159 * gfortran.dg/dependency_30.f90: New test. From-SVN: r162848 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 23c0a1ef1ff3..a426d83e84cf 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-08-03 Thomas Koenig + + 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 PR fortran/44584 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 1eae1ebaa810..90b2d679ec92 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 8fbbb522c224..960b7fe807d3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-03 Thomas Koenig + + PR fortran/45159 + * gfortran.dg/dependency_30.f90: New test. + 2010-08-03 Jan Hubicka * 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 000000000000..575dbebcb1ed --- /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