Skip to content

Commit 3c599c1

Browse files
committed
[flang] In AllocMemOp lowering, convert types for calling malloc on 32-bit
1 parent 9a54c77 commit 3c599c1

File tree

7 files changed

+74
-9
lines changed

7 files changed

+74
-9
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,8 @@ struct EmboxCharOpConversion : public fir::FIROpConversion<fir::EmboxCharOp> {
982982
template <typename ModuleOp>
983983
static mlir::SymbolRefAttr
984984
getMallocInModule(ModuleOp mod, fir::AllocMemOp op,
985-
mlir::ConversionPatternRewriter &rewriter) {
985+
mlir::ConversionPatternRewriter &rewriter,
986+
mlir::Type indexType) {
986987
static constexpr char mallocName[] = "malloc";
987988
if (auto mallocFunc =
988989
mod.template lookupSymbol<mlir::LLVM::LLVMFuncOp>(mallocName))
@@ -992,7 +993,6 @@ getMallocInModule(ModuleOp mod, fir::AllocMemOp op,
992993
return mlir::SymbolRefAttr::get(userMalloc);
993994

994995
mlir::OpBuilder moduleBuilder(mod.getBodyRegion());
995-
auto indexType = mlir::IntegerType::get(op.getContext(), 64);
996996
auto mallocDecl = moduleBuilder.create<mlir::LLVM::LLVMFuncOp>(
997997
op.getLoc(), mallocName,
998998
mlir::LLVM::LLVMFunctionType::get(getLlvmPtrType(op.getContext()),
@@ -1002,12 +1002,13 @@ getMallocInModule(ModuleOp mod, fir::AllocMemOp op,
10021002
}
10031003

10041004
/// Return the LLVMFuncOp corresponding to the standard malloc call.
1005-
static mlir::SymbolRefAttr
1006-
getMalloc(fir::AllocMemOp op, mlir::ConversionPatternRewriter &rewriter) {
1005+
static mlir::SymbolRefAttr getMalloc(fir::AllocMemOp op,
1006+
mlir::ConversionPatternRewriter &rewriter,
1007+
mlir::Type indexType) {
10071008
if (auto mod = op->getParentOfType<mlir::gpu::GPUModuleOp>())
1008-
return getMallocInModule(mod, op, rewriter);
1009+
return getMallocInModule(mod, op, rewriter, indexType);
10091010
auto mod = op->getParentOfType<mlir::ModuleOp>();
1010-
return getMallocInModule(mod, op, rewriter);
1011+
return getMallocInModule(mod, op, rewriter, indexType);
10111012
}
10121013

10131014
/// Helper function for generating the LLVM IR that computes the distance
@@ -1067,7 +1068,12 @@ struct AllocMemOpConversion : public fir::FIROpConversion<fir::AllocMemOp> {
10671068
for (mlir::Value opnd : adaptor.getOperands())
10681069
size = rewriter.create<mlir::LLVM::MulOp>(
10691070
loc, ity, size, integerCast(loc, rewriter, ity, opnd));
1070-
heap->setAttr("callee", getMalloc(heap, rewriter));
1071+
auto mallocTyWidth = lowerTy().getIndexTypeBitwidth();
1072+
auto mallocTy =
1073+
mlir::IntegerType::get(rewriter.getContext(), mallocTyWidth);
1074+
if (mallocTyWidth != ity.getIntOrFloatBitWidth())
1075+
size = integerCast(loc, rewriter, mallocTy, size);
1076+
heap->setAttr("callee", getMalloc(heap, rewriter, mallocTy));
10711077
rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>(
10721078
heap, ::getLlvmPtrType(heap.getContext()), size,
10731079
addLLVMOpBundleAttrs(rewriter, heap->getAttrs(), 1));

flang/lib/Optimizer/CodeGen/TypeConverter.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,27 @@
2828

2929
namespace fir {
3030

31+
static mlir::LowerToLLVMOptions MakeLowerOptions(mlir::ModuleOp module) {
32+
llvm::StringRef dataLayoutString;
33+
auto dataLayoutAttr = module->template getAttrOfType<mlir::StringAttr>(
34+
mlir::LLVM::LLVMDialect::getDataLayoutAttrName());
35+
if (dataLayoutAttr)
36+
dataLayoutString = dataLayoutAttr.getValue();
37+
38+
auto options = mlir::LowerToLLVMOptions(module.getContext());
39+
auto llvmDL = llvm::DataLayout(dataLayoutString);
40+
if (llvmDL.getPointerSizeInBits(0) == 32) {
41+
// FIXME: Should translateDataLayout in the MLIR layer be doing this?
42+
options.overrideIndexBitwidth(32);
43+
}
44+
options.dataLayout = llvmDL;
45+
return options;
46+
}
47+
3148
LLVMTypeConverter::LLVMTypeConverter(mlir::ModuleOp module, bool applyTBAA,
3249
bool forceUnifiedTBAATree,
3350
const mlir::DataLayout &dl)
34-
: mlir::LLVMTypeConverter(module.getContext()),
51+
: mlir::LLVMTypeConverter(module.getContext(), MakeLowerOptions(module)),
3552
kindMapping(getKindMapping(module)),
3653
specifics(CodeGenSpecifics::get(
3754
module.getContext(), getTargetTriple(module), getKindMapping(module),

flang/test/Fir/alloc-32.fir

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: %flang_fc1 -triple i686 -emit-llvm %s -o - | FileCheck %s
2+
3+
// This is a check for calling malloc using i32 when on a 32-bit target (only).
4+
// It doesn't contain the comprehensive tests that alloc.fir has, and
5+
// that file should be used to exercise most code paths.
6+
7+
module attributes {
8+
fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.target_triple = "i686"
9+
} {
10+
11+
// CHECK-LABEL: define ptr @allocmem_scalar_nonchar(
12+
// CHECK: call ptr @malloc(i32 4)
13+
func.func @allocmem_scalar_nonchar() -> !fir.heap<i32> {
14+
%1 = fir.allocmem i32
15+
return %1 : !fir.heap<i32>
16+
}
17+
18+
// CHECK-LABEL: define ptr @allocmem_scalar_dynchar(
19+
// CHECK-SAME: i32 %[[len:.*]])
20+
// CHECK: %[[mul1:.*]] = sext i32 %[[len]] to i64
21+
// CHECK: %[[mul2:.*]] = mul i64 1, %[[mul1]]
22+
// CHECK: %[[trunc:.*]] = trunc i64 %[[mul2]] to i32
23+
// CHECK: call ptr @malloc(i32 %[[trunc]])
24+
func.func @allocmem_scalar_dynchar(%l : i32) -> !fir.heap<!fir.char<1,?>> {
25+
%1 = fir.allocmem !fir.char<1,?>(%l : i32)
26+
return %1 : !fir.heap<!fir.char<1,?>>
27+
}
28+
29+
}

flang/test/Fir/alloc.fir

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s
33

44
// UNSUPPORTED: system-windows
5+
// UNSUPPORTED: target-x86
6+
// UNSUPPORTED: target=sparc-{{.*}}
7+
// UNSUPPORTED: target=sparcel-{{.*}}
58

69
// CHECK-LABEL: define ptr @alloca_scalar_nonchar()
710
// CHECK: alloca i32, i64 1

flang/test/Integration/OpenMP/private-global.f90

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
!RUN: %flang_fc1 -emit-llvm -fopenmp %s -o - | FileCheck %s
2+
!UNSUPPORTED: target-x86
3+
!UNSUPPORTED: target=sparc-{{.*}}
4+
!UNSUPPORTED: target=sparcel-{{.*}}
25

36
! Regression test for https://github.com/llvm/llvm-project/issues/106297
47

@@ -36,7 +39,7 @@ program bug
3639
! CHECK: %[[FIFTY_BOX_VAL:.*]] = insertvalue { ptr, i64, i32, i8, i8, i8, i8 } { ptr undef, i64 4, i32 20240719, i8 0, i8 9, i8 0, i8 0 }, ptr %[[FIFTY]], 0
3740
! CHECK: store { ptr, i64, i32, i8, i8, i8, i8 } %[[FIFTY_BOX_VAL]], ptr %[[BOXED_FIFTY]], align 8
3841
! CHECK: call void @llvm.memcpy.p0.p0.i32(ptr %[[TABLE_BOX_ADDR2]], ptr %[[INTERMEDIATE]], i32 48, i1 false)
39-
! CHECK: call void @_FortranAAssign(ptr %[[TABLE_BOX_ADDR2]], ptr %[[BOXED_FIFTY]], ptr @{{.*}}, i32 9)
42+
! CHECK: call void @_FortranAAssign(ptr %[[TABLE_BOX_ADDR2]], ptr %[[BOXED_FIFTY]], ptr @{{.*}}, i32 12)
4043
! CHECK: call void @llvm.memcpy.p0.p0.i32(ptr %[[TABLE_BOX_ADDR]], ptr %[[PRIV_BOX_ALLOC]], i32 48, i1 false)
4144
! CHECK: %[[PRIV_TABLE:.*]] = call ptr @malloc(i64 40)
4245
! ...

flang/test/Lower/OpenMP/parallel-reduction-mixed.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
! RUN: %flang_fc1 -emit-llvm -fopenmp -o - %s 2>&1 \
55
! RUN: | FileCheck %s
66

7+
! UNSUPPORTED: target-x86
8+
! UNSUPPORTED: target=sparc-{{.*}}
9+
! UNSUPPORTED: target=sparcel-{{.*}}
10+
711
subroutine proc
812
implicit none
913
real(8),allocatable :: F(:)

flang/test/Lower/forall/character-1.f90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
! RUN: %flang -emit-llvm -flang-deprecated-no-hlfir -S -mmlir -disable-external-name-interop %s -o - | FileCheck %s
33
! Test from Fortran source through to LLVM IR.
44
! UNSUPPORTED: system-windows
5+
! UNSUPPORTED: target-x86
6+
! UNSUPPORTED: target=sparc-{{.*}}
7+
! UNSUPPORTED: target=sparcel-{{.*}}
58

69
! Assumed size array of assumed length character.
710
program test

0 commit comments

Comments
 (0)