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, PR 40413] Fix bad offset use in load_assign_lhs_subreplacements


Hi,

this patch fixes  PR 40413.  The problem is that  we pass an incorrect
offset to build_ref_for_offset which  then cannot find the right thing
in the RHS expression.

I also took this opportunity to fix a typo in a comment.

Bootstrapped and tested on x86_64-linux.

OK for trunk?

Thanks,

Martin


2009-06-15  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/40413
	* tree-sra.c (load_assign_lhs_subreplacements): Pass offset to
	build_ref_for_offset.
	(propagate_subacesses_accross_link): Fix a typo in a comment.

	* testsuite/gfortran.fortran-torture/compile/pr40413.f90: New file.

Index: mine/gcc/tree-sra.c
===================================================================
--- mine.orig/gcc/tree-sra.c
+++ mine/gcc/tree-sra.c
@@ -1544,7 +1544,7 @@ propagate_subacesses_accross_link (struc
 	  continue;
 	}
 
-      /* If a (part of) a union field in on the RHS of an assignment, it can
+      /* If a (part of) a union field is on the RHS of an assignment, it can
 	 have sub-accesses which do not make sense on the LHS (PR 40351).
 	 Check that this is not the case.  */
       if (!build_ref_for_offset (NULL, TREE_TYPE (lacc->base), norm_offset,
@@ -1949,8 +1949,7 @@ load_assign_lhs_subreplacements (struct
 	      rhs = unshare_expr (top_racc->base);
 	      repl_found = build_ref_for_offset (&rhs,
 						 TREE_TYPE (top_racc->base),
-						 lacc->offset - left_offset,
-						 lacc->type, false);
+						 offset, lacc->type, false);
 	      gcc_assert (repl_found);
 	    }
 
Index: mine/gcc/testsuite/gfortran.fortran-torture/compile/pr40413.f90
===================================================================
--- /dev/null
+++ mine/gcc/testsuite/gfortran.fortran-torture/compile/pr40413.f90
@@ -0,0 +1,46 @@
+module state_matrices
+
+  implicit none
+  private
+
+  public :: state_matrix_copy
+  public :: state_matrix_t
+  public :: matrix_element_t
+
+  type :: matrix_element_t
+     private
+     integer, dimension(:), allocatable :: f
+  end type matrix_element_t
+
+  type :: state_matrix_t
+     private
+     type(matrix_element_t), dimension(:), allocatable :: me
+  end type state_matrix_t
+
+  type :: polarization_t
+     logical :: polarized = .false.
+     integer :: spin_type = 0
+     integer :: multiplicity = 0
+     type(state_matrix_t) :: state
+  end type polarization_t
+
+contains
+
+  function polarization_copy (pol_in) result (pol)
+    type(polarization_t) :: pol
+    type(polarization_t), intent(in) :: pol_in
+    !!! type(state_matrix_t) :: state_dummy
+    pol%polarized = pol_in%polarized
+    pol%spin_type = pol_in%spin_type
+    pol%multiplicity = pol_in%multiplicity
+    !!! state_dummy = state_matrix_copy (pol_in%state)
+    !!! pol%state = state_dummy
+    pol%state = state_matrix_copy (pol_in%state)
+  end function polarization_copy
+
+  function state_matrix_copy (state_in) result (state)
+    type(state_matrix_t) :: state
+    type(state_matrix_t), intent(in), target :: state_in
+  end function state_matrix_copy
+
+end module state_matrices


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