diff options
author | tkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-04 20:22:21 +0000 |
---|---|---|
committer | tkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-04 20:22:21 +0000 |
commit | f6e36c3d0986332cb0c68fe7049e05fcd25f63a0 (patch) | |
tree | 58f550f5722fb6ab76045f077f43698d59c89d4c | |
parent | 212e5c4fd6d50814fa16c907fed34b465cc3f876 (diff) | |
download | gcc-f6e36c3d0986332cb0c68fe7049e05fcd25f63a0.tar.gz |
2011-04-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/48412
* frontend-passes (cfe_expr_0): Reverse the order of going
through the loops.
2011-04-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/48412
* function_optimize_4.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171952 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/function_optimize_4.f90 | 20 |
4 files changed, 35 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f9513dbf650..bea09ffe3e4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2011-04-04 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/48412 + * frontend-passes (cfe_expr_0): Reverse the order of going + through the loops. + 2011-04-04 Tobias Burnus <burnus@net-b.de> Mikael Morin <mikael.morin@sfr.fr> diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 755bae0645d..c2f6bd5b026 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -295,16 +295,16 @@ cfe_expr_0 (gfc_expr **e, int *walk_subtrees, gfc_expr_walker (e, cfe_register_funcs, NULL); - /* Walk backwards through all the functions to make sure we - catch the leaf functions first. */ - for (i=expr_count-1; i>=1; i--) + /* Walk through all the functions. */ + + for (i=1; i<expr_count; i++) { /* Skip if the function has been replaced by a variable already. */ if ((*(expr_array[i]))->expr_type == EXPR_VARIABLE) continue; newvar = NULL; - for (j=i-1; j>=0; j--) + for (j=0; j<i; j++) { if (gfc_dep_compare_functions(*(expr_array[i]), *(expr_array[j]), true) == 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3204df3a820..afef468e17b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-04-04 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/48412 + * function_optimize_4.f90: New test. + 2011-04-04 Tobias Burnus <burnus@net-b.de> PR fortran/18918 diff --git a/gcc/testsuite/gfortran.dg/function_optimize_4.f90 b/gcc/testsuite/gfortran.dg/function_optimize_4.f90 new file mode 100644 index 00000000000..20fc46d3078 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/function_optimize_4.f90 @@ -0,0 +1,20 @@ +! { dg-do run } +! { dg-options "-O" } +! PR 48412 - function elimination got temporary varibles in the wrong order. +! Test case contributed by Joost VandeVondele. + +INTEGER FUNCTION S1(m,ma,lx) +INTEGER :: m,ma,lx + +IF (((m < 0).AND.(MODULO(ABS(ma-lx),2) == 1)).OR.& + ((m > 0).AND.(MODULO(ABS(ma-lx),2) == 0))) THEN + S1=1 +ELSE + S1=0 +ENDIF + +END FUNCTION + +INTEGER :: s1 +IF (S1(1,2,1).NE.0) CALL ABORT() +END |