diff options
Diffstat (limited to 'flang/lib/Optimizer/CodeGen/CodeGen.cpp')
| -rw-r--r-- | flang/lib/Optimizer/CodeGen/CodeGen.cpp | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 9f21c6b0cf09..5f35825783c5 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -218,7 +218,7 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> { chrTy.getContext(), chrTy.getFKind()); llvmObjectType = convertType(rawCharTy); assert(end == 1); - size = integerCast(loc, rewriter, ity, lenParams[0]); + size = integerCast(loc, rewriter, ity, lenParams[0], /*fold=*/true); } else if (auto recTy = mlir::dyn_cast<fir::RecordType>(scalarType)) { mlir::LLVM::LLVMFuncOp memSizeFn = getDependentTypeMemSizeFn(recTy, alloc, rewriter); @@ -236,17 +236,29 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> { } } if (auto scaleSize = genAllocationScaleSize(alloc, ity, rewriter)) - size = rewriter.create<mlir::LLVM::MulOp>(loc, ity, size, scaleSize); + size = + rewriter.createOrFold<mlir::LLVM::MulOp>(loc, ity, size, scaleSize); if (alloc.hasShapeOperands()) { unsigned end = operands.size(); for (; i < end; ++i) - size = rewriter.create<mlir::LLVM::MulOp>( - loc, ity, size, integerCast(loc, rewriter, ity, operands[i])); + size = rewriter.createOrFold<mlir::LLVM::MulOp>( + loc, ity, size, + integerCast(loc, rewriter, ity, operands[i], /*fold=*/true)); } unsigned allocaAs = getAllocaAddressSpace(rewriter); unsigned programAs = getProgramAddressSpace(rewriter); + if (mlir::isa<mlir::LLVM::ConstantOp>(size.getDefiningOp())) { + // Set the Block in which the llvm alloca should be inserted. + mlir::Operation *parentOp = rewriter.getInsertionBlock()->getParentOp(); + mlir::Region *parentRegion = rewriter.getInsertionBlock()->getParent(); + mlir::Block *insertBlock = + getBlockForAllocaInsert(parentOp, parentRegion); + size.getDefiningOp()->moveBefore(&insertBlock->front()); + rewriter.setInsertionPointAfter(size.getDefiningOp()); + } + // NOTE: we used to pass alloc->getAttrs() in the builder for non opaque // pointers! Only propagate pinned and bindc_name to help debugging, but // this should have no functional purpose (and passing the operand segment @@ -3131,23 +3143,32 @@ struct StoreOpConversion : public fir::FIROpConversion<fir::StoreOp> { mlir::ConversionPatternRewriter &rewriter) const override { mlir::Location loc = store.getLoc(); mlir::Type storeTy = store.getValue().getType(); - mlir::LLVM::StoreOp newStoreOp; + mlir::Value llvmValue = adaptor.getValue(); + mlir::Value llvmMemref = adaptor.getMemref(); + mlir::LLVM::AliasAnalysisOpInterface newOp; if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(storeTy)) { - // fir.box value is actually in memory, load it first before storing it. mlir::Type llvmBoxTy = lowerTy().convertBoxTypeAsStruct(boxTy); - auto val = rewriter.create<mlir::LLVM::LoadOp>(loc, llvmBoxTy, - adaptor.getOperands()[0]); - attachTBAATag(val, boxTy, boxTy, nullptr); - newStoreOp = rewriter.create<mlir::LLVM::StoreOp>( - loc, val, adaptor.getOperands()[1]); + // fir.box value is actually in memory, load it first before storing it, + // or do a memcopy for assumed-rank descriptors. + if (boxTy.isAssumedRank()) { + TypePair boxTypePair{boxTy, llvmBoxTy}; + mlir::Value boxSize = + computeBoxSize(loc, boxTypePair, llvmValue, rewriter); + newOp = rewriter.create<mlir::LLVM::MemcpyOp>( + loc, llvmMemref, llvmValue, boxSize, /*isVolatile=*/false); + } else { + auto val = + rewriter.create<mlir::LLVM::LoadOp>(loc, llvmBoxTy, llvmValue); + attachTBAATag(val, boxTy, boxTy, nullptr); + newOp = rewriter.create<mlir::LLVM::StoreOp>(loc, val, llvmMemref); + } } else { - newStoreOp = rewriter.create<mlir::LLVM::StoreOp>( - loc, adaptor.getOperands()[0], adaptor.getOperands()[1]); + newOp = rewriter.create<mlir::LLVM::StoreOp>(loc, llvmValue, llvmMemref); } if (std::optional<mlir::ArrayAttr> optionalTag = store.getTbaa()) - newStoreOp.setTBAATags(*optionalTag); + newOp.setTBAATags(*optionalTag); else - attachTBAATag(newStoreOp, storeTy, storeTy, nullptr); + attachTBAATag(newOp, storeTy, storeTy, nullptr); rewriter.eraseOp(store); return mlir::success(); } |
