Cause:
The loop contains a statement that cannot be mapped to SIMD instructions by the vectorizer. In the example below, the loop contains an assignment to a derived data type which is not directly vectorizable.
Example:
module my_mod integer, parameter :: N=1000 type :: my_type integer :: c1 real(8) :: c2 end type my_type type(my_type), dimension(N) :: my_inst end module my_mod subroutine initialize(init_data) use my_mod implicit none integer :: i type(my_type), intent(in) :: init_data do i=1,N my_inst(i) = init_data enddo end subroutine initialize
> ifort -c -vec-report2 d_15011_1.f90
Resolution Status:
If the derived type contained only scalars of the same length, e.g. integer(4) and real(4), the loop would be potentially vectorizable. In the present example, the loop may be vectorized if an assignment operator is defined for the derived type. The assignment operation can then be inlined:
module my_mod integer, parameter :: N=1000 type :: my_type integer :: c1 real(8) :: c2 end type my_type type(my_type), dimension(N) :: my_inst interface assignment(=) module procedure assign_my_type end interface contains subroutine assign_my_type(t2,t1) type(my_type), intent(in ) :: t1 type(my_type), intent(inout) :: t2 t2%c1 = t1%c1 t2%c2 = t1%c2 end subroutine assign_my_type end module my_mod subroutine initialize(init_data) use my_mod implicit none integer :: i type(my_type), intent(in) :: init_data do i=1,N my_inst(i) = init_data enddo end subroutine initialize
> ifort -c -vec-report2 d_15011_2.f90 d
A defined assignment operator would also allow the loop to be vectorized if the derived type contained an array component. In this case, the assignment of the array component itself may be converted to a call to memcpy.