[llvm-branch-commits] [flang] [MLIR][OpenMP] Add Lowering support for OpenMP Declare Mapper directive (PR #117046)
Akash Banerjee via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Nov 28 13:30:24 PST 2024
TIFitis wrote:
As @agozillon requested, here's a sample of how Clang lowers declare mapper.
**C Code:**
```
typedef struct {
int *ptr;
int buf_size;
} T;
#pragma omp declare mapper(deep_copy : T abc) map(abc, abc.ptr[ : abc.buf_size])
int main() {
T xyz;
#pragma omp target data map(mapper(deep_copy), tofrom : xyz)
{
}
return 0;
}
```
**LLVM IR:**
```
@.offload_sizes = private unnamed_addr constant [1 x i64] [i64 16]
@.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 3]
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
entry:
%retval = alloca i32, align 4
%xyz = alloca %struct.T, align 8
%.offload_baseptrs = alloca [1 x ptr], align 8
%.offload_ptrs = alloca [1 x ptr], align 8
%.offload_mappers = alloca [1 x ptr], align 8
store i32 0, ptr %retval, align 4
%0 = getelementptr inbounds [1 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
store ptr %xyz, ptr %0, align 8
%1 = getelementptr inbounds [1 x ptr], ptr %.offload_ptrs, i32 0, i32 0
store ptr %xyz, ptr %1, align 8
%2 = getelementptr inbounds [1 x ptr], ptr %.offload_mappers, i64 0, i64 0
store ptr @.omp_mapper._ZTS1T.deep_copy, ptr %2, align 8
%3 = getelementptr inbounds [1 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
%4 = getelementptr inbounds [1 x ptr], ptr %.offload_ptrs, i32 0, i32 0
call void @__tgt_target_data_begin_mapper(ptr @1, i64 -1, i32 1, ptr %3, ptr %4, ptr @.offload_sizes, ptr @.offload_maptypes, ptr null, ptr %.offload_mappers)
%5 = getelementptr inbounds [1 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
%6 = getelementptr inbounds [1 x ptr], ptr %.offload_ptrs, i32 0, i32 0
call void @__tgt_target_data_end_mapper(ptr @1, i64 -1, i32 1, ptr %5, ptr %6, ptr @.offload_sizes, ptr @.offload_maptypes, ptr null, ptr %.offload_mappers)
ret i32 0
}
; Function Attrs: noinline nounwind uwtable
define internal void @.omp_mapper._ZTS1T.deep_copy(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3, i64 noundef %4, ptr noundef %5) #1 {
entry:
%.addr = alloca ptr, align 8
%.addr1 = alloca ptr, align 8
%.addr2 = alloca ptr, align 8
%.addr3 = alloca i64, align 8
%.addr4 = alloca i64, align 8
%.addr5 = alloca ptr, align 8
store ptr %0, ptr %.addr, align 8
store ptr %1, ptr %.addr1, align 8
store ptr %2, ptr %.addr2, align 8
store i64 %3, ptr %.addr3, align 8
store i64 %4, ptr %.addr4, align 8
store ptr %5, ptr %.addr5, align 8
%6 = load i64, ptr %.addr3, align 8
%7 = load ptr, ptr %.addr, align 8
%8 = load ptr, ptr %.addr1, align 8
%9 = load ptr, ptr %.addr2, align 8
%10 = udiv exact i64 %6, 16
%11 = getelementptr %struct.T, ptr %9, i64 %10
%12 = load i64, ptr %.addr4, align 8
%13 = load ptr, ptr %.addr5, align 8
%omp.arrayinit.isarray = icmp sgt i64 %10, 1
%14 = and i64 %12, 8
%15 = icmp ne ptr %8, %9
%16 = and i64 %12, 16
%17 = icmp ne i64 %16, 0
%18 = and i1 %15, %17
%19 = or i1 %omp.arrayinit.isarray, %18
%.omp.array..init..delete = icmp eq i64 %14, 0
%20 = and i1 %19, %.omp.array..init..delete
br i1 %20, label %.omp.array..init, label %omp.arraymap.head
.omp.array..init: ; preds = %entry
%21 = mul nuw i64 %10, 16
%22 = and i64 %12, -4
%23 = or i64 %22, 512
call void @__tgt_push_mapper_component(ptr %7, ptr %8, ptr %9, i64 %21, i64 %23, ptr %13)
br label %omp.arraymap.head
omp.arraymap.head: ; preds = %.omp.array..init, %entry
%omp.arraymap.isempty = icmp eq ptr %9, %11
br i1 %omp.arraymap.isempty, label %omp.done, label %omp.arraymap.body
omp.arraymap.body: ; preds = %omp.type.end19, %omp.arraymap.head
%omp.arraymap.ptrcurrent = phi ptr [ %9, %omp.arraymap.head ], [ %omp.arraymap.next, %omp.type.end19 ]
%ptr = getelementptr inbounds nuw %struct.T, ptr %omp.arraymap.ptrcurrent, i32 0, i32 0
%ptr6 = getelementptr inbounds nuw %struct.T, ptr %omp.arraymap.ptrcurrent, i32 0, i32 0
%24 = load ptr, ptr %ptr6, align 8
%arrayidx = getelementptr inbounds nuw i32, ptr %24, i64 0
%buf_size = getelementptr inbounds nuw %struct.T, ptr %omp.arraymap.ptrcurrent, i32 0, i32 1
%25 = load i32, ptr %buf_size, align 8
%conv = sext i32 %25 to i64
%26 = mul nuw i64 %conv, 4
%27 = getelementptr %struct.T, ptr %omp.arraymap.ptrcurrent, i32 1
%28 = ptrtoint ptr %27 to i64
%29 = ptrtoint ptr %omp.arraymap.ptrcurrent to i64
%30 = sub i64 %28, %29
%31 = sdiv exact i64 %30, ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
%32 = call i64 @__tgt_mapper_num_components(ptr %7)
%33 = shl i64 %32, 48
%34 = add nuw i64 0, %33
%35 = and i64 %12, 3
%36 = icmp eq i64 %35, 0
br i1 %36, label %omp.type.alloc, label %omp.type.alloc.else
omp.type.alloc: ; preds = %omp.arraymap.body
%37 = and i64 %34, -4
br label %omp.type.end
omp.type.alloc.else: ; preds = %omp.arraymap.body
%38 = icmp eq i64 %35, 1
br i1 %38, label %omp.type.to, label %omp.type.to.else
omp.type.to: ; preds = %omp.type.alloc.else
%39 = and i64 %34, -3
br label %omp.type.end
omp.type.to.else: ; preds = %omp.type.alloc.else
%40 = icmp eq i64 %35, 2
br i1 %40, label %omp.type.from, label %omp.type.end
omp.type.from: ; preds = %omp.type.to.else
%41 = and i64 %34, -2
br label %omp.type.end
omp.type.end: ; preds = %omp.type.from, %omp.type.to.else, %omp.type.to, %omp.type.alloc
%omp.maptype = phi i64 [ %37, %omp.type.alloc ], [ %39, %omp.type.to ], [ %41, %omp.type.from ], [ %34, %omp.type.to.else ]
call void @__tgt_push_mapper_component(ptr %7, ptr %omp.arraymap.ptrcurrent, ptr %omp.arraymap.ptrcurrent, i64 %31, i64 %omp.maptype, ptr null)
%42 = add nuw i64 281474976710659, %33
%43 = and i64 %12, 3
%44 = icmp eq i64 %43, 0
br i1 %44, label %omp.type.alloc7, label %omp.type.alloc.else8
omp.type.alloc7: ; preds = %omp.type.end
%45 = and i64 %42, -4
br label %omp.type.end12
omp.type.alloc.else8: ; preds = %omp.type.end
%46 = icmp eq i64 %43, 1
br i1 %46, label %omp.type.to9, label %omp.type.to.else10
omp.type.to9: ; preds = %omp.type.alloc.else8
%47 = and i64 %42, -3
br label %omp.type.end12
omp.type.to.else10: ; preds = %omp.type.alloc.else8
%48 = icmp eq i64 %43, 2
br i1 %48, label %omp.type.from11, label %omp.type.end12
omp.type.from11: ; preds = %omp.type.to.else10
%49 = and i64 %42, -2
br label %omp.type.end12
omp.type.end12: ; preds = %omp.type.from11, %omp.type.to.else10, %omp.type.to9, %omp.type.alloc7
%omp.maptype13 = phi i64 [ %45, %omp.type.alloc7 ], [ %47, %omp.type.to9 ], [ %49, %omp.type.from11 ], [ %42, %omp.type.to.else10 ]
call void @__tgt_push_mapper_component(ptr %7, ptr %omp.arraymap.ptrcurrent, ptr %omp.arraymap.ptrcurrent, i64 16, i64 %omp.maptype13, ptr null)
%50 = add nuw i64 281474976710675, %33
%51 = and i64 %12, 3
%52 = icmp eq i64 %51, 0
br i1 %52, label %omp.type.alloc14, label %omp.type.alloc.else15
omp.type.alloc14: ; preds = %omp.type.end12
%53 = and i64 %50, -4
br label %omp.type.end19
omp.type.alloc.else15: ; preds = %omp.type.end12
%54 = icmp eq i64 %51, 1
br i1 %54, label %omp.type.to16, label %omp.type.to.else17
omp.type.to16: ; preds = %omp.type.alloc.else15
%55 = and i64 %50, -3
br label %omp.type.end19
omp.type.to.else17: ; preds = %omp.type.alloc.else15
%56 = icmp eq i64 %51, 2
br i1 %56, label %omp.type.from18, label %omp.type.end19
omp.type.from18: ; preds = %omp.type.to.else17
%57 = and i64 %50, -2
br label %omp.type.end19
omp.type.end19: ; preds = %omp.type.from18, %omp.type.to.else17, %omp.type.to16, %omp.type.alloc14
%omp.maptype20 = phi i64 [ %53, %omp.type.alloc14 ], [ %55, %omp.type.to16 ], [ %57, %omp.type.from18 ], [ %50, %omp.type.to.else17 ]
call void @__tgt_push_mapper_component(ptr %7, ptr %ptr, ptr %arrayidx, i64 %26, i64 %omp.maptype20, ptr null)
%omp.arraymap.next = getelementptr %struct.T, ptr %omp.arraymap.ptrcurrent, i32 1
%omp.arraymap.isdone = icmp eq ptr %omp.arraymap.next, %11
br i1 %omp.arraymap.isdone, label %omp.arraymap.exit, label %omp.arraymap.body
omp.arraymap.exit: ; preds = %omp.type.end19
%omp.arrayinit.isarray21 = icmp sgt i64 %10, 1
%58 = and i64 %12, 8
%.omp.array..del..delete = icmp ne i64 %58, 0
%59 = and i1 %omp.arrayinit.isarray21, %.omp.array..del..delete
br i1 %59, label %.omp.array..del, label %omp.done
.omp.array..del: ; preds = %omp.arraymap.exit
%60 = mul nuw i64 %10, 16
%61 = and i64 %12, -4
%62 = or i64 %61, 512
call void @__tgt_push_mapper_component(ptr %7, ptr %8, ptr %9, i64 %60, i64 %62, ptr %13)
br label %omp.done
omp.done: ; preds = %.omp.array..del, %omp.arraymap.exit, %omp.arraymap.head
ret void
}
```
https://github.com/llvm/llvm-project/pull/117046
More information about the llvm-branch-commits
mailing list