brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · 13c1840 Raw
93 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s2 3// The aim of this test is to verfiy that information of4// alignment of loaded objects is passed to outlined5// functions.6 7module attributes {llvm.data_layout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9", llvm.target_triple = "amdgcn-amd-amdhsa", omp.is_gpu = true, omp.is_target_device = true} {8  omp.private {type = private} @_QFEk_private_i32 : i329  llvm.func @_QQmain()  {10    %0 = llvm.mlir.constant(1 : i32) : i3211    %7 = llvm.alloca %0 x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr<5>12    %8 = llvm.addrspacecast %7 : !llvm.ptr<5> to !llvm.ptr13    %12 = llvm.mlir.constant(1 : i64) : i6414    %13 = llvm.alloca %12 x i32 {bindc_name = "k"} : (i64) -> !llvm.ptr<5>15    %14 = llvm.addrspacecast %13 : !llvm.ptr<5> to !llvm.ptr16    %15 = llvm.mlir.constant(1 : i64) : i6417    %16 = llvm.alloca %15 x i32 {bindc_name = "b"} : (i64) -> !llvm.ptr<5>18    %17 = llvm.addrspacecast %16 : !llvm.ptr<5> to !llvm.ptr19    %19 = llvm.mlir.constant(1 : index) : i6420    %20 = llvm.mlir.constant(0 : index) : i6421    %22 = llvm.mlir.addressof @_QFEa : !llvm.ptr22    %25 = llvm.mlir.addressof @_QFECnz : !llvm.ptr23    %60 = llvm.getelementptr %8[0, 7, %20, 0] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>24    %61 = llvm.load %60 : !llvm.ptr -> i6425    %62 = llvm.getelementptr %8[0, 7, %20, 1] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>26    %63 = llvm.load %62 : !llvm.ptr -> i6427    %64 = llvm.getelementptr %8[0, 7, %20, 2] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>28    %65 = llvm.load %64 : !llvm.ptr -> i6429    %66 = llvm.sub %63, %19 : i6430    %67 = omp.map.bounds lower_bound(%20 : i64) upper_bound(%66 : i64) extent(%63 : i64) stride(%65 : i64) start_idx(%61 : i64) {stride_in_bytes = true}31    %68 = llvm.getelementptr %22[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>32    %69 = omp.map.info var_ptr(%22 : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) var_ptr_ptr(%68 : !llvm.ptr) bounds(%67) -> !llvm.ptr {name = ""}33    %70 = omp.map.info var_ptr(%22 : !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>) map_clauses(to) capture(ByRef) members(%69 : [0] : !llvm.ptr) -> !llvm.ptr {name = "a"}34    %71 = omp.map.info var_ptr(%17 : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = "b"}35    %72 = omp.map.info var_ptr(%14 : !llvm.ptr, i32) map_clauses(implicit, exit_release_or_enter_alloc) capture(ByCopy) -> !llvm.ptr {name = "k"}36    %73 = omp.map.info var_ptr(%25 : !llvm.ptr, i32) map_clauses(implicit, exit_release_or_enter_alloc) capture(ByCopy) -> !llvm.ptr {name = "nz"}37    omp.target map_entries(%70 -> %arg0, %71 -> %arg1, %72 -> %arg2, %73 -> %arg3, %69 -> %arg4 : !llvm.ptr, !llvm.ptr, !llvm.ptr, !llvm.ptr, !llvm.ptr) {38      %106 = llvm.mlir.constant(0 : index) : i6439      %107 = llvm.mlir.constant(13 : i32) : i3240      %108 = llvm.mlir.constant(1000 : i32) : i3241      %109 = llvm.mlir.constant(1 : i32) : i3242      omp.teams {43        omp.parallel private(@_QFEk_private_i32 %arg2 -> %arg5 : !llvm.ptr) {44          %110 = llvm.mlir.constant(1 : i32) : i3245          %111 = llvm.alloca %110 x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr<5>46          %112 = llvm.addrspacecast %111 : !llvm.ptr<5> to !llvm.ptr47          omp.distribute {48            omp.wsloop {49              omp.loop_nest (%arg6) : i32 = (%109) to (%108) inclusive step (%109) {50                llvm.store %arg6, %arg5  : i32, !llvm.ptr51                %115 = llvm.mlir.constant(48 : i32) : i3252                "llvm.intr.memcpy"(%112, %arg0, %115) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()53                omp.yield54              }55            } {omp.composite}56          } {omp.composite}57          omp.terminator58        } {omp.composite}59        omp.terminator60      }61      omp.terminator62    }63    llvm.return64  }65  llvm.mlir.global internal @_QFEa() {addr_space = 0 : i32} : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {66    %6 = llvm.mlir.undef : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>67    llvm.return %6 : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>68  }69  llvm.mlir.global internal constant @_QFECnz() {addr_space = 0 : i32} : i32 {70    %0 = llvm.mlir.constant(1000 : i32) : i3271    llvm.return %0 : i3272  }73}74 75// CHECK:   call void @__kmpc_distribute_for_static_loop_4u(76// CHECK-SAME:  ptr addrspacecast (ptr addrspace(1) @[[GLOB:[0-9]+]] to ptr),77// CHECK-SAME:  ptr @[[LOOP_BODY_FUNC:.*]], ptr %[[LOOP_BODY_FUNC_ARG:.*]],78// CHEKC-SAME   i32 1000, i32 %1, i32 0, i32 0)79 80 81// CHECK:   define internal void @[[LOOP_BODY_FUNC]](i32 %[[CNT:.*]], ptr %[[LOOP_BODY_ARG_PTR:.*]]) #[[ATTRS:[0-9]+]] {82// CHECK:       %[[GEP_PTR_0:.*]] = getelementptr { ptr, ptr, ptr }, ptr %[[LOOP_BODY_ARG_PTR]], i32 0, i32 083// CHECK:       %[[INT_PTR:.*]] = load ptr, ptr %[[GEP_PTR_0]], align 8, !align ![[ALIGN_INT:[0-9]+]]84// CHECK:       %[[GEP_PTR_1:.*]] = getelementptr { ptr, ptr, ptr }, ptr %[[LOOP_BODY_ARG_PTR]], i32 0, i32 185// CHECK:       %[[STRUCT_PTR_0:.*]] = load ptr, ptr %[[GEP_PTR_1]], align 8, !align ![[ALIGN_STRUCT:[0-9]+]]86// CHECK:       %[[GEP_PTR_2:.*]] = getelementptr { ptr, ptr, ptr }, ptr %[[LOOP_BODY_ARG_PTR]], i32 0, i32 287// CHECK:       %[[STRUCT_PTR_1:.*]] = load ptr, ptr %[[GEP_PTR_2]], align 8, !align ![[ALIGN_STRUCT:[0-9]+]]88// CHECK:       store i32 %[[DATA_INT:.*]], ptr %[[INT_PTR]], align 489// CHECK:       call void @llvm.memcpy.p0.p0.i32(ptr %[[STRUCT_PTR_0]], ptr %[[STRUCT_PTR_1]], i32 48, i1 false)90 91// CHECK:       ![[ALIGN_STRUCT]] = !{i64 8}92// CHECK:       ![[ALIGN_INT]] = !{i64 4}93