This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch, fortran, committed] Walk expressions in subroutine calls


Hello world,

I have committed the attached patch (rev. 168320) as obvious after
regression-testing, after discovering that expressions in subroutine
calls were not walked in frontend-passes.c.

I also took the liberty of doing some whitespace fixes at the same time.

	Thomas

2010-12-29  Thomas Koenig  <tkoenig@gcc.gnu.org>

	* frontend-passes.c (gfc_code_walker): Handle expressions
	in EXEC_CALL, EXEC_ASSIGN_CALL and EXEC_CALL_PPC.
	Separate cases in switch statements by blank lines.

2010-12-29  Thomas Koenig  <tkoenig@gcc.gnu.org>

	* gfortran.dg/character_comparison_7.f90:  New test.

Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 168201)
+++ frontend-passes.c	(Arbeitskopie)
@@ -524,9 +524,12 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
       int result = codefn (c, &walk_subtrees, data);
       if (result)
 	return result;
+
       if (walk_subtrees)
 	{
 	  gfc_code *b;
+	  gfc_actual_arglist *a;
+
 	  switch ((*c)->op)
 	    {
 	    case EXEC_DO:
@@ -535,6 +538,19 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	      WALK_SUBEXPR ((*c)->ext.iterator->end);
 	      WALK_SUBEXPR ((*c)->ext.iterator->step);
 	      break;
+
+	    case EXEC_CALL:
+	    case EXEC_ASSIGN_CALL:
+	      for (a = (*c)->ext.actual; a; a = a->next)
+		WALK_SUBEXPR (a->expr);
+	      break;
+
+	    case EXEC_CALL_PPC:
+	      WALK_SUBEXPR ((*c)->expr1);
+	      for (a = (*c)->ext.actual; a; a = a->next)
+		WALK_SUBEXPR (a->expr);
+	      break;
+
 	    case EXEC_SELECT:
 	      WALK_SUBEXPR ((*c)->expr1);
 	      for (b = (*c)->block; b; b = b->block)
@@ -548,6 +564,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 		  WALK_SUBCODE (b->next);
 		}
 	      continue;
+
 	    case EXEC_ALLOCATE:
 	    case EXEC_DEALLOCATE:
 	      {
@@ -556,6 +573,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 		  WALK_SUBEXPR (a->expr);
 		break;
 	      }
+
 	    case EXEC_FORALL:
 	      {
 		gfc_forall_iterator *fa;
@@ -568,6 +586,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 		  }
 		break;
 	      }
+
 	    case EXEC_OPEN:
 	      WALK_SUBEXPR ((*c)->ext.open->unit);
 	      WALK_SUBEXPR ((*c)->ext.open->file);
@@ -591,12 +610,14 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	      WALK_SUBEXPR ((*c)->ext.open->id);
 	      WALK_SUBEXPR ((*c)->ext.open->newunit);
 	      break;
+
 	    case EXEC_CLOSE:
 	      WALK_SUBEXPR ((*c)->ext.close->unit);
 	      WALK_SUBEXPR ((*c)->ext.close->status);
 	      WALK_SUBEXPR ((*c)->ext.close->iostat);
 	      WALK_SUBEXPR ((*c)->ext.close->iomsg);
 	      break;
+
 	    case EXEC_BACKSPACE:
 	    case EXEC_ENDFILE:
 	    case EXEC_REWIND:
@@ -605,6 +626,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	      WALK_SUBEXPR ((*c)->ext.filepos->iostat);
 	      WALK_SUBEXPR ((*c)->ext.filepos->iomsg);
 	      break;
+
 	    case EXEC_INQUIRE:
 	      WALK_SUBEXPR ((*c)->ext.inquire->unit);
 	      WALK_SUBEXPR ((*c)->ext.inquire->file);
@@ -643,12 +665,14 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	      WALK_SUBEXPR ((*c)->ext.inquire->size);
 	      WALK_SUBEXPR ((*c)->ext.inquire->round);
 	      break;
+
 	    case EXEC_WAIT:
 	      WALK_SUBEXPR ((*c)->ext.wait->unit);
 	      WALK_SUBEXPR ((*c)->ext.wait->iostat);
 	      WALK_SUBEXPR ((*c)->ext.wait->iomsg);
 	      WALK_SUBEXPR ((*c)->ext.wait->id);
 	      break;
+
 	    case EXEC_READ:
 	    case EXEC_WRITE:
 	      WALK_SUBEXPR ((*c)->ext.dt->io_unit);
@@ -669,6 +693,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	      WALK_SUBEXPR ((*c)->ext.dt->sign);
 	      WALK_SUBEXPR ((*c)->ext.dt->extra_comma);
 	      break;
+
 	    case EXEC_OMP_DO:
 	    case EXEC_OMP_PARALLEL:
 	    case EXEC_OMP_PARALLEL_DO:
@@ -689,6 +714,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	    default:
 	      break;
 	    }
+
 	  WALK_SUBEXPR ((*c)->expr1);
 	  WALK_SUBEXPR ((*c)->expr2);
 	  WALK_SUBEXPR ((*c)->expr3);
! { dg-do run }
! { dg-options "-O -fdump-tree-original" }
! Test that expressions in subroutine calls are also optimized
program main
  implicit none
  character(len=4) :: c
  c = 'abcd'
  call yes(c == c)
  call no(c /= c)
end program main

subroutine yes(a)
  implicit none
  logical, intent(in) :: a
  if (.not. a) call abort
end subroutine yes

subroutine no(a)
  implicit none
  logical, intent(in) :: a
  if (a) call abort
end subroutine no

! { dg-final { scan-tree-dump-times "gfortran_compare_string" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]