10#include "mlir/Dialect/Func/IR/FuncOps.h"
11#include "mlir/IR/PatternMatch.h"
12#include "mlir/Support/LogicalResult.h"
13#include "mlir/Transforms/DialectConversion.h"
14#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
18#include "llvm/Support/TimeProfiler.h"
24#define GEN_PASS_DEF_HOISTALLOCAS
25#include "clang/CIR/Dialect/Passes.h.inc"
30struct HoistAllocasPass :
public impl::HoistAllocasBase<HoistAllocasPass> {
32 HoistAllocasPass() =
default;
33 void runOnOperation()
override;
36static void process(mlir::ModuleOp mod, cir::FuncOp func) {
37 if (func.getRegion().empty())
41 mlir::Block &entryBlock = func.getRegion().front();
42 mlir::Operation *insertPoint = &*entryBlock.begin();
46 func.getBody().walk<mlir::WalkOrder::PostOrder>([&](cir::AllocaOp alloca) {
47 if (alloca->getBlock() == &entryBlock)
50 if (alloca.getDynAllocSize())
62 if (alloca.getConstant())
63 alloca.setConstant(
false);
65 alloca->moveBefore(insertPoint);
69void HoistAllocasPass::runOnOperation() {
70 llvm::TimeTraceScope scope(
"Hoist Allocas");
71 llvm::SmallVector<Operation *, 16> ops;
73 Operation *op = getOperation();
74 auto mod = mlir::dyn_cast<mlir::ModuleOp>(op);
76 mod = op->getParentOfType<mlir::ModuleOp>();
80 getOperation()->walk<mlir::WalkOrder::PreOrder>([&](cir::FuncOp op) {
82 return mlir::WalkResult::skip();
89 return std::make_unique<HoistAllocasPass>();
std::unique_ptr< Pass > createHoistAllocasPass()
static bool optInfoAttr()