[Mlir-commits] [mlir] ac2a606 - [mlir][llvm] Add inalloca attribute to alloca op.
Tobias Gysi
llvmlistbot at llvm.org
Wed Mar 8 23:22:28 PST 2023
Author: Théo Degioanni
Date: 2023-03-09T08:20:54+01:00
New Revision: ac2a60613ffe7207ee3589252278770dc19b82a1
URL: https://github.com/llvm/llvm-project/commit/ac2a60613ffe7207ee3589252278770dc19b82a1
DIFF: https://github.com/llvm/llvm-project/commit/ac2a60613ffe7207ee3589252278770dc19b82a1.diff
LOG: [mlir][llvm] Add inalloca attribute to alloca op.
This revision adds the inalloca attribute to the alloca operation in the LLVMIR dialect.
It also adds tests for import and export.
Reviewed By: gysit
Differential Revision: https://reviews.llvm.org/D145483
Added:
Modified:
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
mlir/test/Dialect/LLVMIR/roundtrip.mlir
mlir/test/Target/LLVMIR/Import/instructions.ll
mlir/test/Target/LLVMIR/llvmir.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 8660d63929429..607e9cd5cc613 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -173,7 +173,8 @@ def LLVM_FNegOp : LLVM_UnaryFloatArithmeticOp<
def LLVM_AllocaOp : LLVM_Op<"alloca">, LLVM_MemOpPatterns {
let arguments = (ins AnyInteger:$arraySize,
OptionalAttr<I64Attr>:$alignment,
- OptionalAttr<TypeAttr>:$elem_type);
+ OptionalAttr<TypeAttr>:$elem_type,
+ UnitAttr:$inalloca);
let results = (outs Res<LLVM_AnyPointer, "",
[MemAlloc<AutomaticAllocationScopeResource>]>:$res);
string llvmInstName = "Alloca";
@@ -184,16 +185,18 @@ def LLVM_AllocaOp : LLVM_Op<"alloca">, LLVM_MemOpPatterns {
: op.getType().cast<LLVMPointerType>().getElementType());
auto *inst = builder.CreateAlloca(elementType, addrSpace, $arraySize);
}] # setAlignmentCode # [{
+ inst->setUsedWithInAlloca($inalloca);
$res = inst;
}];
- // FIXME: Import attributes.
string mlirBuilder = [{
auto *allocaInst = cast<llvm::AllocaInst>(inst);
Type allocatedType =
moduleImport.convertType(allocaInst->getAllocatedType());
unsigned alignment = allocaInst->getAlign().value();
$res = $_builder.create<LLVM::AllocaOp>(
- $_location, $_resultType, allocatedType, $arraySize, alignment);
+ $_location, $_resultType, $arraySize,
+ alignment == 0 ? IntegerAttr() : $_builder.getI64IntegerAttr(alignment),
+ TypeAttr::get(allocatedType), allocaInst->isUsedWithInAlloca());
}];
let builders = [
OpBuilder<(ins "Type":$resultType, "Value":$arraySize,
@@ -203,9 +206,9 @@ def LLVM_AllocaOp : LLVM_Op<"alloca">, LLVM_MemOpPatterns {
"pass the allocated type explicitly if opaque pointers are used");
if (alignment == 0)
return build($_builder, $_state, resultType, arraySize, IntegerAttr(),
- TypeAttr());
+ TypeAttr(), false);
build($_builder, $_state, resultType, arraySize,
- $_builder.getI64IntegerAttr(alignment), TypeAttr());
+ $_builder.getI64IntegerAttr(alignment), TypeAttr(), false);
}]>,
OpBuilder<(ins "Type":$resultType, "Type":$elementType, "Value":$arraySize,
CArg<"unsigned", "0">:$alignment),
@@ -216,7 +219,7 @@ def LLVM_AllocaOp : LLVM_Op<"alloca">, LLVM_MemOpPatterns {
build($_builder, $_state, resultType, arraySize,
alignment == 0 ? IntegerAttr()
: $_builder.getI64IntegerAttr(alignment),
- elemTypeAttr);
+ elemTypeAttr, false);
}]>
];
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index c776fdd7ed5c6..e1100a700c30a 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -185,21 +185,31 @@ void AllocaOp::print(OpAsmPrinter &p) {
auto funcTy =
FunctionType::get(getContext(), {getArraySize().getType()}, {getType()});
+ if (getInalloca())
+ p << " inalloca";
+
p << ' ' << getArraySize() << " x " << elemTy;
if (getAlignment() && *getAlignment() != 0)
- p.printOptionalAttrDict((*this)->getAttrs(), {kElemTypeAttrName});
- else
p.printOptionalAttrDict((*this)->getAttrs(),
- {"alignment", kElemTypeAttrName});
+ {kElemTypeAttrName, getInallocaAttrName()});
+ else
+ p.printOptionalAttrDict(
+ (*this)->getAttrs(),
+ {getAlignmentAttrName(), kElemTypeAttrName, getInallocaAttrName()});
p << " : " << funcTy;
}
-// <operation> ::= `llvm.alloca` ssa-use `x` type attribute-dict?
-// `:` type `,` type
+// <operation> ::= `llvm.alloca` `inalloca`? ssa-use `x` type
+// attribute-dict? `:` type `,` type
ParseResult AllocaOp::parse(OpAsmParser &parser, OperationState &result) {
OpAsmParser::UnresolvedOperand arraySize;
Type type, elemType;
SMLoc trailingTypeLoc;
+
+ if (succeeded(parser.parseOptionalKeyword("inalloca")))
+ result.addAttribute(getInallocaAttrName(result.name),
+ UnitAttr::get(parser.getContext()));
+
if (parser.parseOperand(arraySize) || parser.parseKeyword("x") ||
parser.parseType(elemType) ||
parser.parseOptionalAttrDict(result.attributes) || parser.parseColon() ||
diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
index f7b340fd66ac8..943dc874169fe 100644
--- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir
+++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
@@ -325,8 +325,8 @@ func.func @mixed_vect(%arg0: vector<8xf32>, %arg1: vector<4xf32>, %arg2: vector<
func.func @alloca(%size : i64) {
// CHECK: llvm.alloca %{{.*}} x i32 : (i64) -> !llvm.ptr<i32>
llvm.alloca %size x i32 {alignment = 0} : (i64) -> (!llvm.ptr<i32>)
- // CHECK: llvm.alloca %{{.*}} x i32 {alignment = 8 : i64} : (i64) -> !llvm.ptr<i32>
- llvm.alloca %size x i32 {alignment = 8} : (i64) -> (!llvm.ptr<i32>)
+ // CHECK: llvm.alloca inalloca %{{.*}} x i32 {alignment = 8 : i64} : (i64) -> !llvm.ptr<i32>
+ llvm.alloca inalloca %size x i32 {alignment = 8} : (i64) -> (!llvm.ptr<i32>)
llvm.return
}
diff --git a/mlir/test/Target/LLVMIR/Import/instructions.ll b/mlir/test/Target/LLVMIR/Import/instructions.ll
index 47076a7abb018..cbdb0ebe295ef 100644
--- a/mlir/test/Target/LLVMIR/Import/instructions.ll
+++ b/mlir/test/Target/LLVMIR/Import/instructions.ll
@@ -341,9 +341,11 @@ define ptr @alloca(i64 %size) {
; CHECK: llvm.alloca %[[C1]] x f64 {alignment = 8 : i64} : (i32) -> !llvm.ptr
; CHECK: llvm.alloca %[[SIZE]] x i32 {alignment = 8 : i64} : (i64) -> !llvm.ptr
; CHECK: llvm.alloca %[[SIZE]] x i32 {alignment = 4 : i64} : (i64) -> !llvm.ptr<3>
+ ; CHECK: llvm.alloca inalloca %[[SIZE]] x i32 {alignment = 4 : i64} : (i64) -> !llvm.ptr
%1 = alloca double
%2 = alloca i32, i64 %size, align 8
%3 = alloca i32, i64 %size, addrspace(3)
+ %4 = alloca inalloca i32, i64 %size
ret ptr %1
}
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 01ca6d2bf2ab9..82d05dbf0015a 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -1353,6 +1353,8 @@ llvm.func @alloca(%size : i64) {
llvm.alloca %size x i32 {alignment = 8} : (i64) -> (!llvm.ptr<i32>)
// CHECK-NEXT: alloca {{.*}} addrspace(3)
llvm.alloca %size x i32 {alignment = 0} : (i64) -> (!llvm.ptr<i32, 3>)
+ // CHECK-NEXT: alloca inalloca {{.*}} align 4
+ llvm.alloca inalloca %size x i32 : (i64) -> !llvm.ptr
llvm.return
}
More information about the Mlir-commits
mailing list