Skip to content

Commit aea7403

Browse files
[MLIR][LLVMIR] Add elementtype attribute (#129918)
These are very common when using intrinsics (e.g. ARM NEON). For more context: ClangIR has currently been blocked on such intrinsics emission because of this lacking capability.
1 parent d1abbb4 commit aea7403

File tree

5 files changed

+14
-1
lines changed

5 files changed

+14
-1
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def LLVM_Dialect : Dialect {
4444
static StringRef getNoUndefAttrName() { return "llvm.noundef"; }
4545
static StringRef getDereferenceableAttrName() { return "llvm.dereferenceable"; }
4646
static StringRef getDereferenceableOrNullAttrName() { return "llvm.dereferenceable_or_null"; }
47+
static StringRef getElementTypeAttrName() { return "llvm.elementtype"; }
4748
static StringRef getInAllocaAttrName() { return "llvm.inalloca"; }
4849
static StringRef getInRegAttrName() { return "llvm.inreg"; }
4950
static StringRef getNestAttrName() { return "llvm.nest"; }

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3942,6 +3942,7 @@ LogicalResult LLVMDialect::verifyParameterAttribute(Operation *op,
39423942
if (name == LLVMDialect::getStructRetAttrName() ||
39433943
name == LLVMDialect::getByValAttrName() ||
39443944
name == LLVMDialect::getByRefAttrName() ||
3945+
name == LLVMDialect::getElementTypeAttrName() ||
39453946
name == LLVMDialect::getInAllocaAttrName() ||
39463947
name == LLVMDialect::getPreallocatedAttrName()) {
39473948
if (failed(checkTypeAttrType()))

mlir/lib/Target/LLVMIR/AttrKindDetail.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ getAttrKindToNameMapping() {
3535
LLVMDialect::getDereferenceableAttrName()},
3636
{llvm::Attribute::AttrKind::DereferenceableOrNull,
3737
LLVMDialect::getDereferenceableOrNullAttrName()},
38+
{llvm::Attribute::AttrKind::ElementType,
39+
LLVMDialect::getElementTypeAttrName()},
3840
{llvm::Attribute::AttrKind::InAlloca, LLVMDialect::getInAllocaAttrName()},
3941
{llvm::Attribute::AttrKind::InReg, LLVMDialect::getInRegAttrName()},
4042
{llvm::Attribute::AttrKind::Nest, LLVMDialect::getNestAttrName()},

mlir/test/Dialect/LLVMIR/call-intrin.mlir

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,12 @@ llvm.func @intrinsic_call_arg_attrs(%arg0: i32) -> i32 {
114114
%0 = llvm.call_intrinsic "llvm.riscv.sha256sig0"(%arg0) : (i32 {llvm.signext}) -> (i32)
115115
llvm.return %0 : i32
116116
}
117+
118+
// -----
119+
120+
// CHECK-LABEL: intrinsic_element_type
121+
llvm.func @intrinsic_element_type(%arg0: !llvm.ptr) {
122+
// CHECK: call i64 @llvm.aarch64.ldxr.p0(ptr elementtype(i8) %{{.*}})
123+
%0 = llvm.call_intrinsic "llvm.aarch64.ldxr.p0"(%arg0) : (!llvm.ptr {llvm.elementtype = i8}) -> i64
124+
llvm.return
125+
}

mlir/test/Target/LLVMIR/Import/intrinsic-unregistered.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ define dso_local void @t0(ptr %a) {
99

1010
; CHECK-LABEL: llvm.func @llvm.aarch64.ldxr.p0(!llvm.ptr)
1111
; CHECK-LABEL: llvm.func @t0
12-
; CHECK: llvm.call_intrinsic "llvm.aarch64.ldxr.p0"({{.*}}) : (!llvm.ptr) -> i64
12+
; CHECK: llvm.call_intrinsic "llvm.aarch64.ldxr.p0"({{.*}}) : (!llvm.ptr {llvm.elementtype = i8}) -> i64
1313
; CHECK: llvm.return
1414
; CHECK: }
1515

0 commit comments

Comments
 (0)