summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-04 20:22:21 +0000
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-04 20:22:21 +0000
commitf6e36c3d0986332cb0c68fe7049e05fcd25f63a0 (patch)
tree58f550f5722fb6ab76045f077f43698d59c89d4c
parent212e5c4fd6d50814fa16c907fed34b465cc3f876 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/function_optimize_4.f9020
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