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);
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);
if (auto unnamedAddr = function.getUnnamedAddr())
llvmFunc->setUnnamedAddr(convertUnnamedAddrToLLVM(*unnamedAddr));
+
+ if (auto alignment = function.getAlignment())
+ llvmFunc->setAlignment(llvm::MaybeAlign(*alignment));
}
return success();
// 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
; 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
// -----
+// 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]+}}