1! { dg-do compile } 2! { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-pre" } 3module test 4 5 type shell1quartet_type 6 7 integer(kind=kind(1)) :: ab_l_sum 8 integer(kind=kind(1)), dimension(:), pointer :: ab_form_3dints_x_indices => NULL() 9 integer(kind=kind(1)), dimension(:), pointer :: ab_form_3dints_yz_rms_indices => NULL() 10 11 end type 12 13contains 14subroutine make_esss(self,esss) 15 type(shell1quartet_type) :: self 16 intent(in) :: self 17 real(kind=kind(1.0d0)), dimension(:), intent(out) :: esss 18 real(kind=kind(1.0d0)), dimension(:), pointer :: Izz 19 real(kind=kind(1.0d0)), dimension(:,:), pointer :: Ix,Iy,Iz,Iyz 20 integer(kind=kind(1)), dimension(:), pointer :: e_x,ii_ivec 21 integer(kind=kind(1)) :: dim, dim1, nroots, ii,z,y 22 23 dim = self%ab_l_sum+1 24 dim1 = self%ab_l_sum+2 25 nroots = (dim1) / 2 26 call create_(Ix,nroots,dim) 27 call create_(Iy,nroots,dim) 28 call create_(Iz,nroots,dim) 29 call create_(Iyz,nroots,dim*dim1/2) 30 31 e_x => self%ab_form_3dints_x_indices 32 ii_ivec => self%ab_form_3dints_yz_rms_indices 33 34 call foo(Ix) 35 call foo(Iy) 36 call foo(Iz) 37 38 esss = ZERO 39 ii = 0 40 do z=1,dim 41 Izz => Iz(:,z) 42 do y=1,dim1-z 43 ii = ii + 1 44 Iyz(:,ii) = Izz * Iy(:,y) 45 end do 46 end do 47 esss = esss + sum(Ix(:,e_x) * Iyz(:,ii_ivec),1) 48 49end subroutine 50 51end 52 53! There should be three loads from iyz.data, not four. 54 55! { dg-final { scan-tree-dump-times "= iyz.data" 3 "pre" } } 56! { dg-final { cleanup-tree-dump "pre" } } 57