|
| 1 | +! This test checks lowering of OpenMP DO Directive (Worksharing) |
| 2 | +! with linear clause |
| 3 | + |
| 4 | +! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - 2>&1 | FileCheck %s |
| 5 | + |
| 6 | +!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFsimple_linearEx"} |
| 7 | +!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFsimple_linearEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 8 | +!CHECK: %[[const:.*]] = arith.constant 1 : i32 |
| 9 | +subroutine simple_linear |
| 10 | + implicit none |
| 11 | + integer :: x, y, i |
| 12 | + !CHECK: omp.simd linear(%[[X]]#0 = %[[const]] : !fir.ref<i32>) {{.*}} |
| 13 | + !$omp simd linear(x) |
| 14 | + !CHECK: %[[LOAD:.*]] = fir.load %[[X]]#0 : !fir.ref<i32> |
| 15 | + !CHECK: %[[const:.*]] = arith.constant 2 : i32 |
| 16 | + !CHECK: %[[RESULT:.*]] = arith.addi %[[LOAD]], %[[const]] : i32 |
| 17 | + do i = 1, 10 |
| 18 | + y = x + 2 |
| 19 | + end do |
| 20 | +end subroutine |
| 21 | + |
| 22 | + |
| 23 | +!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_stepEx"} |
| 24 | +!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_stepEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 25 | +subroutine linear_step |
| 26 | + implicit none |
| 27 | + integer :: x, y, i |
| 28 | + !CHECK: %[[const:.*]] = arith.constant 4 : i32 |
| 29 | + !CHECK: omp.simd linear(%[[X]]#0 = %[[const]] : !fir.ref<i32>) {{.*}} |
| 30 | + !$omp simd linear(x:4) |
| 31 | + !CHECK: %[[LOAD:.*]] = fir.load %[[X]]#0 : !fir.ref<i32> |
| 32 | + !CHECK: %[[const:.*]] = arith.constant 2 : i32 |
| 33 | + !CHECK: %[[RESULT:.*]] = arith.addi %[[LOAD]], %[[const]] : i32 |
| 34 | + do i = 1, 10 |
| 35 | + y = x + 2 |
| 36 | + end do |
| 37 | +end subroutine |
| 38 | + |
| 39 | +!CHECK: %[[A_alloca:.*]] = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFlinear_exprEa"} |
| 40 | +!CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_alloca]] {uniq_name = "_QFlinear_exprEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 41 | +!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_exprEx"} |
| 42 | +!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_exprEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 43 | +subroutine linear_expr |
| 44 | + implicit none |
| 45 | + integer :: x, y, i, a |
| 46 | + !CHECK: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref<i32> |
| 47 | + !CHECK: %[[const:.*]] = arith.constant 4 : i32 |
| 48 | + !CHECK: %[[LINEAR_EXPR:.*]] = arith.addi %[[LOAD_A]], %[[const]] : i32 |
| 49 | + !CHECK: omp.simd linear(%[[X]]#0 = %[[LINEAR_EXPR]] : !fir.ref<i32>) {{.*}} |
| 50 | + !$omp simd linear(x:a+4) |
| 51 | + do i = 1, 10 |
| 52 | + y = x + 2 |
| 53 | + end do |
| 54 | +end subroutine |
0 commit comments