[mlir][LLVM] Add alignment to LLVMFuncOp
authorChristian Ulmann <christian.ulmann@nextsilicon.com>
Tue, 4 Jul 2023 06:26:53 +0000 (06:26 +0000)
committerChristian Ulmann <christian.ulmann@nextsilicon.com>
Tue, 4 Jul 2023 06:33:36 +0000 (06:33 +0000)
Reviewed By: gysit

Differential Revision: https://reviews.llvm.org/D154410

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
mlir/lib/Target/LLVMIR/ModuleImport.cpp
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
mlir/test/Dialect/LLVMIR/func.mlir
mlir/test/Target/LLVMIR/Import/function-attributes.ll
mlir/test/Target/LLVMIR/llvmir.mlir

index 1b1b004..98f5b84 100644 (file)
@@ -1648,7 +1648,8 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [
     OptionalAttr<UnitAttr>:$arm_streaming,
     OptionalAttr<UnitAttr>:$arm_locally_streaming,
     OptionalAttr<StrAttr>:$section,
-    OptionalAttr<UnnamedAddr>:$unnamed_addr
+    OptionalAttr<UnnamedAddr>:$unnamed_addr,
+    OptionalAttr<I64Attr>:$alignment
   );
 
   let regions = (region AnyRegion:$body);
index efa1fc3..f23dad6 100644 (file)
@@ -1749,6 +1749,9 @@ LogicalResult ModuleImport::processFunction(llvm::Function *func) {
   if (func->hasComdat())
     funcOp.setComdatAttr(comdatMapping.lookup(func->getComdat()));
 
+  if (llvm::MaybeAlign maybeAlign = func->getAlign())
+    funcOp.setAlignment(maybeAlign->value());
+
   // Handle Function attributes.
   processFunctionAttributes(func, funcOp);
 
index 62b7ec4..5ba9a6e 100644 (file)
@@ -1044,6 +1044,9 @@ LogicalResult ModuleTranslation::convertFunctionSignatures() {
 
     if (auto unnamedAddr = function.getUnnamedAddr())
       llvmFunc->setUnnamedAddr(convertUnnamedAddrToLLVM(*unnamedAddr));
+
+    if (auto alignment = function.getAlignment())
+      llvmFunc->setAlignment(llvm::MaybeAlign(*alignment));
   }
 
   return success();
index 491234a..c0da9fc 100644 (file)
@@ -207,7 +207,13 @@ module {
 
   // CHECK-LABEL: local_unnamed_addr @local_unnamed_addr_func
   llvm.func local_unnamed_addr @local_unnamed_addr_func() {
-      llvm.return
+    llvm.return
+  }
+
+  // CHECK-LABEL: @align_func
+  // CHECK-SAME: attributes {alignment = 2 : i64}
+  llvm.func @align_func() attributes {alignment = 2 : i64} {
+    llvm.return
   }
 
   // CHECK: llvm.comdat @__llvm_comdat
index 034933f..bf9d746 100644 (file)
@@ -229,3 +229,17 @@ define void @local_unnamed_addr_func() local_unnamed_addr {
 
 ; CHECK-LABEL: unnamed_addr @unnamed_addr_func
 declare void @unnamed_addr_func() unnamed_addr
+
+// -----
+
+; CHECK-LABEL: @align_func
+; CHECK-SAME: attributes {alignment = 2 : i64}
+define void @align_func() align 2 {
+  ret void
+}
+
+// -----
+
+; CHECK-LABEL: @align_decl
+; CHECK-SAME: attributes {alignment = 64 : i64}
+declare void @align_decl() align 64
index bb2cf21..f37ed75 100644 (file)
@@ -1656,6 +1656,20 @@ llvm.func unnamed_addr @unnamed_addr_func()
 
 // -----
 
+// CHECK-LABEL: @align_func
+// CHECK-SAME: align 2
+llvm.func @align_func() attributes {alignment = 2 : i64} {
+    llvm.return
+}
+
+// -----
+
+// CHECK-LABEL: @align_decl
+// CHECK-SAME: align 64
+llvm.func @align_decl() attributes {alignment = 64 : i64}
+
+// -----
+
 // CHECK-LABEL: @callFreezeOp
 llvm.func @callFreezeOp(%x : i32) {
   // CHECK: freeze i32 %{{[0-9]+}}