! This test checks lowering of OpenMP SIMD Directive ! with linear clause ! RUN: %flang_fc1 -fopenmp -emit-hlfir -fopenmp-version=60 %s -o - 2>&1 | FileCheck %s ! RUN: %flang_fc1 -fopenmp -emit-hlfir -fopenmp-version=45 %s -o - 2>&1 | FileCheck %s --check-prefix=IMPLICIT !CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFsimple_linearEx"} !CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFsimple_linearEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[const:.*]] = arith.constant 1 : i32 !IMPLICIT: %[[I_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_linearEi"} !IMPLICIT: %[[I:.*]]:2 = hlfir.declare %[[I_ALLOCA]] {{.*}} !IMPLICIT: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFsimple_linearEx"} !IMPLICIT: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFsimple_linearEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[const:.*]] = arith.constant 1 : i32 subroutine simple_linear implicit none integer :: x, y, i !CHECK: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[const]] : i32)) {{.*}} !IMPLICIT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[const]] : i32, %[[I]]#0 : !fir.ref = %{{.*}} : i32) {{.*}} !$omp simd linear(x) do i = 1, 10 end do !CHECK: } {linear_var_types = [i32]} !IMPLICIT: } {linear_var_types = [i32, i32]} end subroutine !CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_stepEx"} !CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_stepEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[I_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFlinear_stepEi"} !IMPLICIT: %[[I:.*]]:2 = hlfir.declare %[[I_ALLOCA]] {{.*}} !IMPLICIT: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_stepEx"} !IMPLICIT: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_stepEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[const:.*]] = arith.constant 4 : i32 subroutine linear_step implicit none integer :: x, y, i !CHECK: %[[const:.*]] = arith.constant 4 : i32 !CHECK: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[const]] : i32)) {{.*}} !IMPLICIT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[const]] : i32, %[[I]]#0 : !fir.ref = %{{.*}} : i32) {{.*}} !$omp simd linear(x:4) do i = 1, 10 end do !CHECK: } {linear_var_types = [i32]} !IMPLICIT: } {linear_var_types = [i32, i32]} end subroutine !CHECK: %[[A_alloca:.*]] = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFlinear_exprEa"} !CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_alloca]] {uniq_name = "_QFlinear_exprEa"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_exprEx"} !CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_exprEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[A_alloca:.*]] = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFlinear_exprEa"} !IMPLICIT: %[[A:.*]]:2 = hlfir.declare %[[A_alloca]] {uniq_name = "_QFlinear_exprEa"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[I_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFlinear_exprEi"} !IMPLICIT: %[[I:.*]]:2 = hlfir.declare %[[I_ALLOCA]] {uniq_name = "_QFlinear_exprEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_exprEx"} !IMPLICIT: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_exprEx"} : (!fir.ref) -> (!fir.ref, !fir.ref) subroutine linear_expr implicit none integer :: x, y, i, a !CHECK: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref !CHECK: %[[const:.*]] = arith.constant 4 : i32 !CHECK: %[[LINEAR_EXPR:.*]] = arith.addi %[[LOAD_A]], %[[const]] : i32 !IMPLICIT: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref !IMPLICIT: %[[const:.*]] = arith.constant 4 : i32 !IMPLICIT: %[[LINEAR_EXPR:.*]] = arith.addi %[[LOAD_A]], %[[const]] : i32 !CHECK: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[LINEAR_EXPR]] : i32)) {{.*}} !IMPLICIT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[LINEAR_EXPR]] : i32, %[[I]]#0 : !fir.ref = {{.*}} : i32) {{.*}} !$omp simd linear(x:a+4) do i = 1, 10 end do !CHECK: } {linear_var_types = [i32]} !IMPLICIT: } {linear_var_types = [i32, i32]} end subroutine subroutine non_i32_type !CHECK: %[[I_DECLARE:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFnon_i32_typeEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[J_DECLARE:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFnon_i32_typeEj"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: %[[CONST:.*]] = arith.constant 1 : i64 !IMPLICIT: %[[I_DECLARE:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFnon_i32_typeEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[J_DECLARE:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFnon_i32_typeEj"} : (!fir.ref) -> (!fir.ref, !fir.ref) !IMPLICIT: %[[CONST:.*]] = arith.constant 1 : i64 !IMPLICIT: {{.*}} = arith.constant 1 : i32 !IMPLICIT: {{.*}} = arith.constant 10 : i32 !IMPLICIT: %[[STEP_VAR_CONST:.*]] = arith.constant 1 : i32 integer(kind=8)::j=0 !CHECK: omp.simd linear(val(%[[J_DECLARE]]#0 : !fir.ref = %[[CONST]] : i64)) {{.*}} !IMPLICIT: omp.simd linear(%[[J_DECLARE]]#0 : !fir.ref = %[[CONST]] : i64, %[[I_DECLARE]]#0 : !fir.ref = %[[STEP_VAR_CONST]] : i32) !$omp simd linear(j:1_8) do i = 1,10 end do !$omp end simd !CHECK: } {linear_var_types = [i64]} !IMPLICIT: } {linear_var_types = [i64, i32]} end subroutine