diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -279,6 +279,7 @@ TypeAttr:$in_type, OptionalAttr:$uniq_name, OptionalAttr:$bindc_name, + UnitAttr:$pinned, Variadic:$typeparams, Variadic:$shape ); @@ -292,16 +293,29 @@ let builders = [ OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName, "llvm::StringRef":$bindcName, CArg<"mlir::ValueRange", "{}">:$typeparams, - CArg<"mlir::ValueRange", "{}">:$shape, - CArg<"llvm::ArrayRef", "{}">:$attributes)>, - OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName, - CArg<"mlir::ValueRange", "{}">:$typeparams, - CArg<"mlir::ValueRange", "{}">:$shape, - CArg<"llvm::ArrayRef", "{}">:$attributes)>, - OpBuilder<(ins "mlir::Type":$in_type, - CArg<"mlir::ValueRange", "{}">:$typeparams, - CArg<"mlir::ValueRange", "{}">:$shape, - CArg<"llvm::ArrayRef", "{}">:$attributes)>]; + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>, + OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName, + "llvm::StringRef":$bindcName, "bool":$pinned, + CArg<"mlir::ValueRange", "{}">:$typeparams, + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>, + OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName, + CArg<"mlir::ValueRange", "{}">:$typeparams, + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>, + OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName, + "bool":$pinned, CArg<"mlir::ValueRange", "{}">:$typeparams, + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>, + OpBuilder<(ins "mlir::Type":$inType, "bool":$pinned, + CArg<"mlir::ValueRange", "{}">:$typeparams, + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>, + OpBuilder<(ins "mlir::Type":$inType, + CArg<"mlir::ValueRange", "{}">:$typeparams, + CArg<"mlir::ValueRange", "{}">:$shape, + CArg<"llvm::ArrayRef", "{}">:$attributes)>]; let verifier = [{ return ::verify(*this); }]; diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -169,7 +169,18 @@ llvm::ArrayRef attributes) { auto nameAttr = builder.getStringAttr(uniqName); build(builder, result, wrapAllocaResultType(inType), inType, nameAttr, {}, - typeparams, shape); + /*pinned=*/false, typeparams, shape); + result.addAttributes(attributes); +} + +void fir::AllocaOp::build(mlir::OpBuilder &builder, + mlir::OperationState &result, mlir::Type inType, + llvm::StringRef uniqName, bool pinned, + mlir::ValueRange typeparams, mlir::ValueRange shape, + llvm::ArrayRef attributes) { + auto nameAttr = builder.getStringAttr(uniqName); + build(builder, result, wrapAllocaResultType(inType), inType, nameAttr, {}, + pinned, typeparams, shape); result.addAttributes(attributes); } @@ -183,7 +194,22 @@ auto bindcAttr = bindcName.empty() ? mlir::StringAttr{} : builder.getStringAttr(bindcName); build(builder, result, wrapAllocaResultType(inType), inType, nameAttr, - bindcAttr, typeparams, shape); + bindcAttr, /*pinned=*/false, typeparams, shape); + result.addAttributes(attributes); +} + +void fir::AllocaOp::build(mlir::OpBuilder &builder, + mlir::OperationState &result, mlir::Type inType, + llvm::StringRef uniqName, llvm::StringRef bindcName, + bool pinned, mlir::ValueRange typeparams, + mlir::ValueRange shape, + llvm::ArrayRef attributes) { + auto nameAttr = + uniqName.empty() ? mlir::StringAttr{} : builder.getStringAttr(uniqName); + auto bindcAttr = + bindcName.empty() ? mlir::StringAttr{} : builder.getStringAttr(bindcName); + build(builder, result, wrapAllocaResultType(inType), inType, nameAttr, + bindcAttr, pinned, typeparams, shape); result.addAttributes(attributes); } @@ -192,6 +218,16 @@ mlir::ValueRange typeparams, mlir::ValueRange shape, llvm::ArrayRef attributes) { build(builder, result, wrapAllocaResultType(inType), inType, {}, {}, + /*pinned=*/false, typeparams, shape); + result.addAttributes(attributes); +} + +void fir::AllocaOp::build(mlir::OpBuilder &builder, + mlir::OperationState &result, mlir::Type inType, + bool pinned, mlir::ValueRange typeparams, + mlir::ValueRange shape, + llvm::ArrayRef attributes) { + build(builder, result, wrapAllocaResultType(inType), inType, {}, {}, pinned, typeparams, shape); result.addAttributes(attributes); }