[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