Issue 159744
Summary [mlir][openacc] Wrong offload size when translating to LLVM IR
Labels mlir
Assignees
Reporter aywala
    https://github.com/llvm/llvm-project/blob/main/mlir/test/Target/LLVMIR/openacc-llvm.mlir

```
llvm.func @testenterdataop(%arg0: !llvm.ptr, %arg1 : !llvm.ptr) {
  %0 = acc.create varPtr(%arg0 : !llvm.ptr) varType(f32) -> !llvm.ptr
  %1 = acc.copyin varPtr(%arg1 : !llvm.ptr) varType(f32) -> !llvm.ptr
  acc.enter_data dataOperands(%0, %1 : !llvm.ptr, !llvm.ptr)
  llvm.return
}
```
The varType is f32 in mlir, but the offload size is sizeof(ptr) in llvm IR.

```
// CHECK: %[[OFFLOAD_SIZES_GEP:.*]] = getelementptr inbounds [2 x i64], ptr %[[OFFLOAD_SIZES]], i32 0, i32 0
// CHECK: store i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64), ptr %[[OFFLOAD_SIZES_GEP]]
``` 
https://github.com/llvm/llvm-project/blob/main/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp
```
if (isa<LLVM::LLVMPointerType>(data.getType())) {
      dataPtrBase = dataValue;
      dataPtr = dataValue;
      dataSize = accBuilder->getSizeInBytes(dataValue);
    } else {
```
OMPIRBuilder.cpp
```
Value *OpenMPIRBuilder::getSizeInBytes(Value *BasePtr) {
  LLVMContext &Ctx = Builder.getContext();
  Value *Null =
 Constant::getNullValue(PointerType::getUnqual(BasePtr->getContext()));
 Value *SizeGep =
      Builder.CreateGEP(BasePtr->getType(), Null, Builder.getInt32(1));
  Value *SizePtrToInt = Builder.CreatePtrToInt(SizeGep, Type::getInt64Ty(Ctx));
  return SizePtrToInt;
}
```
The code in `processOperands` can not compute offload size correctly, it always be sizeof(ptr).
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to