|
| 1 | +// For testing: |
| 2 | +// 1. parsing/printing (roundtripping): `fir-opt do_loop_with_local_and_local_init.mlir -o roundtrip.mlir` |
| 3 | +// 2. Lowering locality specs during CFG: `fir-opt --cfg-conversion do_loop_with_local_and_local_init.mlir -o after_cfg_lowering.mlir` |
| 4 | + |
| 5 | +// TODO I will add both of the above steps as proper tests when the PoC is complete. |
| 6 | +module attributes {dlti.dl_spec = #dlti.dl_spec<i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, !llvm.ptr<270> = dense<32> : vector<4xi64>, f64 = dense<64> : vector<2xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, "dlti.endianness" = "little", "dlti.stack_alignment" = 128 : i64>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 21.0.0 (/home/kaergawy/git/aomp20.0/llvm-project/flang c8cf5a644886bb8dd3ad19be6e3b916ffcbd222c)", llvm.target_triple = "x86_64-unknown-linux-gnu"} { |
| 7 | + |
| 8 | + omp.private {type = private} @local_privatizer : i32 |
| 9 | + |
| 10 | + omp.private {type = firstprivate} @local_init_privatizer : i32 copy { |
| 11 | + ^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<i32>): |
| 12 | + %0 = fir.load %arg0 : !fir.ref<i32> |
| 13 | + fir.store %0 to %arg1 : !fir.ref<i32> |
| 14 | + omp.yield(%arg1 : !fir.ref<i32>) |
| 15 | + } |
| 16 | + |
| 17 | + func.func @_QPomploop() { |
| 18 | + %0 = fir.alloca i32 {bindc_name = "i"} |
| 19 | + %1:2 = hlfir.declare %0 {uniq_name = "_QFomploopEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 20 | + %2 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploopEi"} |
| 21 | + %3:2 = hlfir.declare %2 {uniq_name = "_QFomploopEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 22 | + %4 = fir.alloca i32 {bindc_name = "local_init_var", uniq_name = "_QFomploopElocal_init_var"} |
| 23 | + %5:2 = hlfir.declare %4 {uniq_name = "_QFomploopElocal_init_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 24 | + %6 = fir.alloca i32 {bindc_name = "local_var", uniq_name = "_QFomploopElocal_var"} |
| 25 | + %7:2 = hlfir.declare %6 {uniq_name = "_QFomploopElocal_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 26 | + %c1_i32 = arith.constant 1 : i32 |
| 27 | + %8 = fir.convert %c1_i32 : (i32) -> index |
| 28 | + %c10_i32 = arith.constant 10 : i32 |
| 29 | + %9 = fir.convert %c10_i32 : (i32) -> index |
| 30 | + %c1 = arith.constant 1 : index |
| 31 | + fir.do_loop %arg0 = %8 to %9 step %c1 unordered private(@local_privatizer %7#0 -> %arg1, @local_init_privatizer %5#0 -> %arg2 : !fir.ref<i32>, !fir.ref<i32>) { |
| 32 | + %10 = fir.convert %arg0 : (index) -> i32 |
| 33 | + fir.store %10 to %1#1 : !fir.ref<i32> |
| 34 | + %12:2 = hlfir.declare %arg1 {uniq_name = "_QFomploopElocal_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 35 | + %14:2 = hlfir.declare %arg2 {uniq_name = "_QFomploopElocal_init_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 36 | + %16 = fir.load %1#0 : !fir.ref<i32> |
| 37 | + %c5_i32 = arith.constant 5 : i32 |
| 38 | + %17 = arith.cmpi slt, %16, %c5_i32 : i32 |
| 39 | + fir.if %17 { |
| 40 | + %c42_i32 = arith.constant 42 : i32 |
| 41 | + hlfir.assign %c42_i32 to %12#0 : i32, !fir.ref<i32> |
| 42 | + } else { |
| 43 | + %c84_i32 = arith.constant 84 : i32 |
| 44 | + hlfir.assign %c84_i32 to %14#0 : i32, !fir.ref<i32> |
| 45 | + } |
| 46 | + } |
| 47 | + return |
| 48 | + } |
| 49 | +} |
0 commit comments