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