diff mbox

[fortran] Further dependency improvements

Message ID 1282986416.3506.19.camel@linux-fd1f.site
State New
Headers show

Commit Message

Thomas Koenig Aug. 28, 2010, 9:06 a.m. UTC
Hi Daniel,

> I think that we introduced CLASS_PURE / CLASS_IMPURE for intrinsics 
> lately -- and would suggest to use that information instead of 
> duplicating the list here.  Although I do not completely remember 
> whether that is already set correctly or not.

Excellent point (I had completely missed this).  Upated patch is
attached.

Currently regtesting.  OK for trunk if this passes?

	Thomas

2010-08-28  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/45159
	* dependency.c (gfc_deb_compare_expr):  Compare equal for equal
	arglists for pure user functions, or for those intrinsic
	functions which are also pure.

2010-08-28  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/45159
	* gfortran.dg/dependency_34.f90:  New test.
diff mbox

Patch

Index: dependency.c
===================================================================
--- dependency.c	(Revision 163584)
+++ dependency.c	(Arbeitskopie)
@@ -353,39 +353,32 @@  gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2)
       return -2;
 
     case EXPR_FUNCTION:
-      /* We can only compare calls to the same intrinsic function.  */
-      if (e1->value.function.isym == 0 || e2->value.function.isym == 0
-	  || e1->value.function.isym != e2->value.function.isym)
-	return -2;
 
-      args1 = e1->value.function.actual;
-      args2 = e2->value.function.actual;
-
-      /* We should list the "constant" intrinsic functions.  Those
-	 without side-effects that provide equal results given equal
-	 argument lists.  */
-      switch (e1->value.function.isym->id)
+      /* PURE functions can be compared for argument equality.  */
+      if ((e1->value.function.esym && e2->value.function.esym
+	   && e1->value.function.esym == e2->value.function.esym
+	   && e1->value.function.esym->result->attr.pure)
+	  || (e1->value.function.isym && e2->value.function.isym
+	      && e1->value.function.isym == e2->value.function.isym
+	      && e1->value.function.isym->pure))
 	{
+	  args1 = e1->value.function.actual;
+	  args2 = e2->value.function.actual;
 
-	case GFC_ISYM_REAL:
-	case GFC_ISYM_LOGICAL:
-	case GFC_ISYM_DBLE:
-	  break;
-
-	default:
-	  return -2;
+	  /* Compare the argument lists for equality.  */
+	  while (args1 && args2)
+	    {
+	      if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0)
+		return -2;
+	      args1 = args1->next;
+	      args2 = args2->next;
+	    }
+	  return (args1 || args2) ? -2 : 0;
 	}
+      else
+	return -2;
+      break;
 
-      /* Compare the argument lists for equality.  */
-      while (args1 && args2)
-	{
-	  if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0)
-	    return -2;
-	  args1 = args1->next;
-	  args2 = args2->next;
-	}
-      return (args1 || args2) ? -2 : 0;
-      
     default:
       return -2;
     }