re PR fortran/48412 (CP2K miscompiled due to some Fortran frontend pass)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 4 Apr 2011 20:22:21 +0000 (20:22 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 4 Apr 2011 20:22:21 +0000 (20:22 +0000)
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.

From-SVN: r171952

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/function_optimize_4.f90 [new file with mode: 0644]

index f9513dbf650f4997e922fafef5679cde8b66b169..bea09ffe3e4f3d110fa67d951c9ea9fd72421754 100644 (file)
@@ -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>
 
index 755bae0645de0ff5c4f8e6fd127a07c83709fc8d..c2f6bd5b0268e38206a7583bd3369eb409eff544 100644 (file)
@@ -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)
index 3204df3a820c257a63b01e176ced803bae7f3d90..afef468e17b16e5a09bd39c856291a4334ac74d8 100644 (file)
@@ -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 (file)
index 0000000..20fc46d
--- /dev/null
@@ -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