@@ -982,7 +982,8 @@ struct EmboxCharOpConversion : public fir::FIROpConversion<fir::EmboxCharOp> {
982982template <typename ModuleOp>
983983static mlir::SymbolRefAttr
984984getMallocInModule (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 ));
@@ -2116,7 +2122,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
21162122 unsigned dim = iter.index ();
21172123 mlir::Value lb = one;
21182124 if (!lbounds.empty ()) {
2119- lb = lbounds[dim];
2125+ lb = integerCast (loc, rewriter, lowerTy (). indexType (), lbounds[dim]) ;
21202126 auto extentIsEmpty = rewriter.create <mlir::LLVM::ICmpOp>(
21212127 loc, mlir::LLVM::ICmpPredicate::eq, extent, zero);
21222128 lb = rewriter.create <mlir::LLVM::SelectOp>(loc, extentIsEmpty, one, lb);
0 commit comments