42 llvm::PointerUnion<mlir::Operation *, mlir::Block *> location;
43 bool saveRestoreStack;
47 T *tryGetPtr()
const {
49 if (T *ptr = llvm::dyn_cast_if_present<T *>(location))
56 InsertionPoint(T *ptr,
bool saveRestoreStack =
false)
57 : location(ptr), saveRestoreStack{saveRestoreStack} {}
58 InsertionPoint(std::nullptr_t null)
59 : location(null), saveRestoreStack{
false} {}
63 return tryGetPtr<mlir::Operation>();
67 mlir::Block *
tryGetBlock()
const {
return tryGetPtr<mlir::Block>(); }
76 bool operator==(
const InsertionPoint &rhs)
const {
77 return (location == rhs.location) &&
78 (saveRestoreStack == rhs.saveRestoreStack);
81 bool operator!=(
const InsertionPoint &rhs)
const {
return !(*
this == rhs); }
86class StackArraysAnalysisWrapper {
88 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(StackArraysAnalysisWrapper)
91 using AllocMemMap = llvm::DenseMap<mlir::Operation *, InsertionPoint>;
93 StackArraysAnalysisWrapper(mlir::Operation *op) {}
100 const AllocMemMap *getCandidateOps(mlir::Operation *func);
103 llvm::DenseMap<mlir::Operation *, AllocMemMap> funcMaps;
105 llvm::LogicalResult analyseFunction(mlir::Operation *func);
109class AllocMemConversion :
public mlir::OpRewritePattern<fir::AllocMemOp> {
111 explicit AllocMemConversion(
112 mlir::MLIRContext *ctx,
113 const StackArraysAnalysisWrapper::AllocMemMap &candidateOps,
114 std::optional<mlir::DataLayout> &dl,
115 std::optional<fir::KindMapping> &kindMap)
116 : OpRewritePattern(ctx), candidateOps{candidateOps}, dl{dl},
120 matchAndRewrite(fir::AllocMemOp allocmem,
121 mlir::PatternRewriter &rewriter)
const override;
131 const StackArraysAnalysisWrapper::AllocMemMap &candidateOps;
133 const std::optional<mlir::DataLayout> &dl;
134 const std::optional<fir::KindMapping> &kindMap;
139 fir::AllocMemOp &oldAlloc,
143 std::optional<fir::AllocaOp>
144 insertAlloca(fir::AllocMemOp &oldAlloc,
145 mlir::PatternRewriter &rewriter)
const;
148 void insertStackSaveRestore(fir::AllocMemOp oldAlloc,
149 mlir::PatternRewriter &rewriter)
const;
152 void insertLifetimeMarkers(fir::AllocMemOp oldAlloc, fir::AllocaOp newAlloc,
153 mlir::PatternRewriter &rewriter)
const;