[Mlir-commits] [mlir] [MLIR][LLVM] Add pass to update ops with default visibility (PR #171727)
Asher Mancinelli
llvmlistbot at llvm.org
Thu Dec 11 08:32:09 PST 2025
https://github.com/ashermancinelli updated https://github.com/llvm/llvm-project/pull/171727
>From 8a9aaed29e1cc53aa799b4f592af2a7591a8166a Mon Sep 17 00:00:00 2001
From: Asher Mancinelli <ashermancinelli at gmail.com>
Date: Mon, 8 Dec 2025 17:10:15 -0800
Subject: [PATCH 1/3] [MLIR] Add LLVM default visibility pass
Similar to the -fvisibility=(hidden|protected) option in Clang, this
pass changes the visibility of global values and function definitions
with the default visibility to have the visibility specicified in the
option.
---
.../mlir/Dialect/LLVMIR/Transforms/Passes.td | 21 +++++-
.../Transforms/UseDefaultVisibilityPass.h | 26 +++++++
.../Dialect/LLVMIR/Transforms/CMakeLists.txt | 1 +
.../Transforms/UseDefaultVisibilityPass.cpp | 49 +++++++++++++
.../LLVMIR/use-default-visibility.mlir | 72 +++++++++++++++++++
5 files changed, 168 insertions(+), 1 deletion(-)
create mode 100644 mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
create mode 100644 mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
create mode 100644 mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
diff --git a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td
index 961909d5c8d27..eaffd2978047b 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/Transforms/Passes.td
@@ -9,6 +9,7 @@
#ifndef MLIR_DIALECT_LLVMIR_TRANSFORMS_PASSES
#define MLIR_DIALECT_LLVMIR_TRANSFORMS_PASSES
+include "mlir/Dialect/LLVMIR/LLVMOps.td"
include "mlir/Pass/PassBase.td"
def LLVMAddComdats : Pass<"llvm-add-comdats", "::mlir::ModuleOp"> {
@@ -45,6 +46,24 @@ def LLVMRequestCWrappersPass
}];
}
+def LLVMUseDefaultVisibilityPass
+ : Pass<"llvm-use-default-visibility", "::mlir::ModuleOp"> {
+ let summary =
+ "Update default visibility of all global values and function definitions";
+ let description = [{
+ Update the default visibility of all global values and function definitions
+ to `visibility`, as with -fvisibility=(hidden|protected).
+ }];
+ let options =
+ [Option<"useVisibility", "visibility", "::mlir::LLVM::Visibility",
+ /*default=*/"::mlir::LLVM::Visibility::Default",
+ "Visibility to use in place of default.", [{::llvm::cl::values(
+ clEnumValN(::mlir::LLVM::Visibility::Hidden, "hidden", "Hidden"),
+ clEnumValN(::mlir::LLVM::Visibility::Protected, "protected", "Protected")
+ )}]>,
+ ];
+}
+
def NVVMOptimizeForTargetPass : Pass<"llvm-optimize-for-nvvm-target"> {
let summary = "Optimize NVVM IR";
}
@@ -56,7 +75,7 @@ def DIScopeForLLVMFuncOpPass : Pass<"ensure-debug-info-scope-on-llvm-func", "::m
emitting line tables from MLIR FileLocCol locations.
This is not intended to be a proper replacement for frontends to emit
- complete debug informations, however it is a convenient way to get line
+ complete debug information, however it is a convenient way to get line
tables for debugging purposes. This allow to step trough in a debugger
line-by-line or get a backtrace with line numbers.
}];
diff --git a/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h b/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
new file mode 100644
index 0000000000000..4ba4561259b9a
--- /dev/null
+++ b/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
@@ -0,0 +1,26 @@
+//===- UseDefaultVisibilityPass.h - Update default visibility -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_DIALECT_LLVMIR_TRANSFORMS_USEDEFAULTVISIBILITYPASS_H
+#define MLIR_DIALECT_LLVMIR_TRANSFORMS_USEDEFAULTVISIBILITYPASS_H
+
+#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
+#include <memory>
+
+namespace mlir {
+class Pass;
+
+namespace LLVM {
+
+#define GEN_PASS_DECL_LLVMUSEDEFAULTVISIBILITYPASS
+#include "mlir/Dialect/LLVMIR/Transforms/Passes.h.inc"
+
+} // namespace LLVM
+} // namespace mlir
+
+#endif // MLIR_DIALECT_LLVMIR_TRANSFORMS_USEDEFAULTVISIBILITYPASS_H
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
index 37a45d478a1fb..6ffa2d9a8a9e8 100644
--- a/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
@@ -7,6 +7,7 @@ add_mlir_dialect_library(MLIRLLVMIRTransforms
LegalizeForExport.cpp
OptimizeForNVVM.cpp
RequestCWrappers.cpp
+ UseDefaultVisibilityPass.cpp
DEPENDS
MLIRLLVMPassIncGen
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
new file mode 100644
index 0000000000000..a9a54edbe7045
--- /dev/null
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
@@ -0,0 +1,49 @@
+//===- UseDefaultVisibilityPass.cpp - Update default visibility ---------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h"
+#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
+#include "mlir/Pass/Pass.h"
+#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
+
+namespace mlir {
+namespace LLVM {
+#define GEN_PASS_DEF_LLVMUSEDEFAULTVISIBILITYPASS
+#include "mlir/Dialect/LLVMIR/Transforms/Passes.h.inc"
+} // namespace LLVM
+} // namespace mlir
+
+using namespace mlir;
+
+template <typename OpT>
+static void updateVisibility(OpT op, LLVM::Visibility useDefaultVisibility) {
+ LLVM::Visibility vis = op.getVisibility_();
+ if (vis == LLVM::Visibility::Default) {
+ op.setVisibility_(useDefaultVisibility);
+ }
+}
+
+namespace {
+class UseDefaultVisibilityPass
+ : public LLVM::impl::LLVMUseDefaultVisibilityPassBase<
+ UseDefaultVisibilityPass> {
+ using Base::Base;
+
+public:
+ void runOnOperation() override {
+ LLVM::Visibility useDefaultVisibility = useVisibility.getValue();
+ getOperation()->walk([&](Operation *op) {
+ if (auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op)) {
+ updateVisibility(funcOp, useDefaultVisibility);
+ } else if (auto globalOp = dyn_cast<LLVM::GlobalOp>(op)) {
+ updateVisibility(globalOp, useDefaultVisibility);
+ }
+ });
+ }
+};
+} // namespace
diff --git a/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir b/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
new file mode 100644
index 0000000000000..1022d575669f3
--- /dev/null
+++ b/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
@@ -0,0 +1,72 @@
+// RUN: mlir-opt --llvm-use-default-visibility=visibility=hidden %s | FileCheck %s --check-prefix=HIDDEN
+// RUN: mlir-opt --llvm-use-default-visibility=visibility=protected %s | FileCheck %s --check-prefix=PROTECTED
+
+// Ensure the global function definitions and global values are changed to the specified visibility,
+// and only when they have default visibility.
+
+llvm.func @func1() {
+ llvm.return
+}
+
+llvm.mlir.global internal constant @global1(0 : i32) : i32
+
+llvm.func hidden @func2() {
+ llvm.return
+}
+
+llvm.mlir.global internal hidden constant @global2(1 : i32) : i32
+
+llvm.func protected @func3() {
+ llvm.return
+}
+
+llvm.mlir.global internal protected constant @global3(2 : i32) : i32
+
+llvm.comdat @llvm_comdat {
+ llvm.comdat_selector @any any
+}
+llvm.mlir.global internal constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) : i64
+
+llvm.func @decl()
+
+// HIDDEN-LABEL: llvm.func hidden @func1() {
+// HIDDEN: llvm.return
+// HIDDEN: }
+// HIDDEN: llvm.mlir.global internal hidden constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+
+// HIDDEN-LABEL: llvm.func hidden @func2() {
+// HIDDEN: llvm.return
+// HIDDEN: }
+// HIDDEN: llvm.mlir.global internal hidden constant @global2(1 : i32) {addr_space = 0 : i32} : i32
+
+// HIDDEN-LABEL: llvm.func protected @func3() {
+// HIDDEN: llvm.return
+// HIDDEN: }
+// HIDDEN: llvm.mlir.global internal protected constant @global3(2 : i32) {addr_space = 0 : i32} : i32
+
+// HIDDEN-LABEL: llvm.comdat @llvm_comdat {
+// HIDDEN: llvm.comdat_selector @any any
+// HIDDEN: }
+// HIDDEN: llvm.mlir.global internal hidden constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// HIDDEN: llvm.func hidden @decl()
+
+// PROTECTED-LABEL: llvm.func protected @func1() {
+// PROTECTED: llvm.return
+// PROTECTED: }
+// PROTECTED: llvm.mlir.global internal protected constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+
+// PROTECTED-LABEL: llvm.func hidden @func2() {
+// PROTECTED: llvm.return
+// PROTECTED: }
+// PROTECTED: llvm.mlir.global internal hidden constant @global2(1 : i32) {addr_space = 0 : i32} : i32
+
+// PROTECTED-LABEL: llvm.func protected @func3() {
+// PROTECTED: llvm.return
+// PROTECTED: }
+// PROTECTED: llvm.mlir.global internal protected constant @global3(2 : i32) {addr_space = 0 : i32} : i32
+
+// PROTECTED-LABEL: llvm.comdat @llvm_comdat {
+// PROTECTED: llvm.comdat_selector @any any
+// PROTECTED: }
+// PROTECTED: llvm.mlir.global internal protected constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// PROTECTED: llvm.func protected @decl()
>From 592f76a03a734dda136e5b0683b7db12901873e6 Mon Sep 17 00:00:00 2001
From: Asher Mancinelli <ashermancinelli at gmail.com>
Date: Wed, 10 Dec 2025 15:08:08 -0800
Subject: [PATCH 2/3] Fix formatting
---
.../LLVMIR/Transforms/UseDefaultVisibilityPass.h | 1 -
.../LLVMIR/Transforms/UseDefaultVisibilityPass.cpp | 10 ++++------
2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h b/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
index 4ba4561259b9a..e77ee8cb5de0b 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
+++ b/mlir/include/mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h
@@ -10,7 +10,6 @@
#define MLIR_DIALECT_LLVMIR_TRANSFORMS_USEDEFAULTVISIBILITYPASS_H
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
-#include <memory>
namespace mlir {
class Pass;
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
index a9a54edbe7045..351371efa456c 100644
--- a/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
@@ -1,4 +1,4 @@
-//===- UseDefaultVisibilityPass.cpp - Update default visibility ---------===//
+//===- UseDefaultVisibilityPass.cpp - Update default visibility -----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -23,9 +23,8 @@ using namespace mlir;
template <typename OpT>
static void updateVisibility(OpT op, LLVM::Visibility useDefaultVisibility) {
LLVM::Visibility vis = op.getVisibility_();
- if (vis == LLVM::Visibility::Default) {
+ if (vis == LLVM::Visibility::Default)
op.setVisibility_(useDefaultVisibility);
- }
}
namespace {
@@ -38,11 +37,10 @@ class UseDefaultVisibilityPass
void runOnOperation() override {
LLVM::Visibility useDefaultVisibility = useVisibility.getValue();
getOperation()->walk([&](Operation *op) {
- if (auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op)) {
+ if (auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op))
updateVisibility(funcOp, useDefaultVisibility);
- } else if (auto globalOp = dyn_cast<LLVM::GlobalOp>(op)) {
+ else if (auto globalOp = dyn_cast<LLVM::GlobalOp>(op))
updateVisibility(globalOp, useDefaultVisibility);
- }
});
}
};
>From a2f511d3b84a9e9ea15ebe71971949e8645be2f9 Mon Sep 17 00:00:00 2001
From: Asher Mancinelli <ashermancinelli at gmail.com>
Date: Thu, 11 Dec 2025 08:31:35 -0800
Subject: [PATCH 3/3] Update pass to look at all ops from MLIR dialect
---
.../Transforms/UseDefaultVisibilityPass.cpp | 29 ++--
.../LLVMIR/use-default-visibility.mlir | 139 ++++++++++++++++--
2 files changed, 141 insertions(+), 27 deletions(-)
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
index 351371efa456c..767fc0799026b 100644
--- a/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.cpp
@@ -7,9 +7,9 @@
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/LLVMIR/Transforms/UseDefaultVisibilityPass.h"
+#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Pass/Pass.h"
-#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
namespace mlir {
namespace LLVM {
@@ -20,11 +20,15 @@ namespace LLVM {
using namespace mlir;
-template <typename OpT>
-static void updateVisibility(OpT op, LLVM::Visibility useDefaultVisibility) {
- LLVM::Visibility vis = op.getVisibility_();
- if (vis == LLVM::Visibility::Default)
- op.setVisibility_(useDefaultVisibility);
+static void updateVisibility(Operation *op,
+ LLVM::VisibilityAttr newVisibilityAttr) {
+ if (auto visibilityAttr =
+ op->getAttrOfType<LLVM::VisibilityAttr>(LLVM::VisibilityAttr::name)) {
+ LLVM::Visibility visibility = visibilityAttr.getValue();
+ if (visibility == LLVM::Visibility::Default) {
+ op->setAttr(LLVM::VisibilityAttr::name, newVisibilityAttr);
+ }
+ }
}
namespace {
@@ -36,11 +40,14 @@ class UseDefaultVisibilityPass
public:
void runOnOperation() override {
LLVM::Visibility useDefaultVisibility = useVisibility.getValue();
- getOperation()->walk([&](Operation *op) {
- if (auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op))
- updateVisibility(funcOp, useDefaultVisibility);
- else if (auto globalOp = dyn_cast<LLVM::GlobalOp>(op))
- updateVisibility(globalOp, useDefaultVisibility);
+ Operation *op = getOperation();
+ MLIRContext *context = op->getContext();
+ Dialect *llvmDialect = context->getLoadedDialect<LLVM::LLVMDialect>();
+ auto newVisibilityAttr =
+ LLVM::VisibilityAttr::get(context, useDefaultVisibility);
+ op->walk([&](Operation *op) {
+ if (op->getDialect() == llvmDialect)
+ updateVisibility(op, newVisibilityAttr);
});
}
};
diff --git a/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir b/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
index 1022d575669f3..37c75e52debcd 100644
--- a/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
+++ b/mlir/test/Dialect/LLVMIR/use-default-visibility.mlir
@@ -4,69 +4,176 @@
// Ensure the global function definitions and global values are changed to the specified visibility,
// and only when they have default visibility.
+llvm.comdat @llvm_comdat {
+ llvm.comdat_selector @any any
+}
+
+llvm.func @func() {
+ llvm.return
+}
+
+llvm.func @ifunc_resolver() -> !llvm.ptr {
+ %0 = llvm.mlir.addressof @func : !llvm.ptr
+ llvm.return %0 : !llvm.ptr
+}
+
+// Default visibility
+
llvm.func @func1() {
llvm.return
}
llvm.mlir.global internal constant @global1(0 : i32) : i32
+llvm.mlir.alias external @func1_alias {addr_space = 0 : i32} : !llvm.ptr {
+ %0 = llvm.mlir.addressof @func1 : !llvm.ptr
+ llvm.return %0 : !llvm.ptr
+}
+
+llvm.func @decl1()
+
+llvm.mlir.global internal constant @comdat1(1 : i64) comdat(@llvm_comdat::@any) : i64
+
+llvm.mlir.ifunc external @ifunc1: !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
+// Hidden visibility
+
llvm.func hidden @func2() {
llvm.return
}
llvm.mlir.global internal hidden constant @global2(1 : i32) : i32
+llvm.mlir.alias external hidden @func2_alias {addr_space = 0 : i32} : !llvm.ptr {
+ %0 = llvm.mlir.addressof @func2 : !llvm.ptr
+ llvm.return %0 : !llvm.ptr
+}
+
+llvm.func hidden @decl2()
+
+llvm.mlir.global internal hidden constant @comdat2(1 : i64) comdat(@llvm_comdat::@any) : i64
+
+llvm.mlir.ifunc external hidden @ifunc2: !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
+// Protected visibility
+
llvm.func protected @func3() {
llvm.return
}
llvm.mlir.global internal protected constant @global3(2 : i32) : i32
-llvm.comdat @llvm_comdat {
- llvm.comdat_selector @any any
+llvm.mlir.alias external protected @func3_alias {addr_space = 0 : i32} : !llvm.ptr {
+ %0 = llvm.mlir.addressof @func3 : !llvm.ptr
+ llvm.return %0 : !llvm.ptr
}
-llvm.mlir.global internal constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) : i64
-llvm.func @decl()
+llvm.func protected @decl3()
+
+llvm.mlir.global internal protected constant @comdat3(1 : i64) comdat(@llvm_comdat::@any) : i64
+
+llvm.mlir.ifunc external protected @ifunc3: !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
+// HIDDEN-LABEL: llvm.comdat @llvm_comdat {
+// HIDDEN: llvm.comdat_selector @any any
+// HIDDEN: }
+
+// HIDDEN-LABEL: llvm.func @func() {
+// HIDDEN: llvm.return
+// HIDDEN: }
+
+// HIDDEN-LABEL: llvm.func @ifunc_resolver() -> !llvm.ptr {
+// HIDDEN: %[[MLIR_0:.*]] = llvm.mlir.addressof @func : !llvm.ptr
+// HIDDEN: llvm.return %[[MLIR_0]] : !llvm.ptr
+// HIDDEN: }
-// HIDDEN-LABEL: llvm.func hidden @func1() {
+// HIDDEN-LABEL: llvm.func @func1() {
// HIDDEN: llvm.return
// HIDDEN: }
-// HIDDEN: llvm.mlir.global internal hidden constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+// HIDDEN: llvm.mlir.global internal constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+
+// HIDDEN-LABEL: llvm.mlir.alias external @func1_alias {addr_space = 0 : i32} : !llvm.ptr {
+// HIDDEN: %[[MLIR_0:.*]] = llvm.mlir.addressof @func1 : !llvm.ptr
+// HIDDEN: llvm.return %[[MLIR_0]] : !llvm.ptr
+// HIDDEN: }
+// HIDDEN: llvm.func @decl1()
+// HIDDEN: llvm.mlir.global internal constant @comdat1(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// HIDDEN: llvm.mlir.ifunc external @ifunc1 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
// HIDDEN-LABEL: llvm.func hidden @func2() {
// HIDDEN: llvm.return
// HIDDEN: }
// HIDDEN: llvm.mlir.global internal hidden constant @global2(1 : i32) {addr_space = 0 : i32} : i32
+// HIDDEN-LABEL: llvm.mlir.alias external hidden @func2_alias {addr_space = 0 : i32} : !llvm.ptr {
+// HIDDEN: %[[MLIR_0:.*]] = llvm.mlir.addressof @func2 : !llvm.ptr
+// HIDDEN: llvm.return %[[MLIR_0]] : !llvm.ptr
+// HIDDEN: }
+// HIDDEN: llvm.func hidden @decl2()
+// HIDDEN: llvm.mlir.global internal hidden constant @comdat2(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// HIDDEN: llvm.mlir.ifunc external hidden @ifunc2 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
// HIDDEN-LABEL: llvm.func protected @func3() {
// HIDDEN: llvm.return
// HIDDEN: }
// HIDDEN: llvm.mlir.global internal protected constant @global3(2 : i32) {addr_space = 0 : i32} : i32
-// HIDDEN-LABEL: llvm.comdat @llvm_comdat {
-// HIDDEN: llvm.comdat_selector @any any
+// HIDDEN-LABEL: llvm.mlir.alias external protected @func3_alias {addr_space = 0 : i32} : !llvm.ptr {
+// HIDDEN: %[[MLIR_0:.*]] = llvm.mlir.addressof @func3 : !llvm.ptr
+// HIDDEN: llvm.return %[[MLIR_0]] : !llvm.ptr
// HIDDEN: }
-// HIDDEN: llvm.mlir.global internal hidden constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
-// HIDDEN: llvm.func hidden @decl()
+// HIDDEN: llvm.func protected @decl3()
+// HIDDEN: llvm.mlir.global internal protected constant @comdat3(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// HIDDEN: llvm.mlir.ifunc external protected @ifunc3 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
+// PROTECTED-LABEL: llvm.comdat @llvm_comdat {
+// PROTECTED: llvm.comdat_selector @any any
+// PROTECTED: }
+
+// PROTECTED-LABEL: llvm.func @func() {
+// PROTECTED: llvm.return
+// PROTECTED: }
+
+// PROTECTED-LABEL: llvm.func @ifunc_resolver() -> !llvm.ptr {
+// PROTECTED: %[[MLIR_0:.*]] = llvm.mlir.addressof @func : !llvm.ptr
+// PROTECTED: llvm.return %[[MLIR_0]] : !llvm.ptr
+// PROTECTED: }
-// PROTECTED-LABEL: llvm.func protected @func1() {
+// PROTECTED-LABEL: llvm.func @func1() {
// PROTECTED: llvm.return
// PROTECTED: }
-// PROTECTED: llvm.mlir.global internal protected constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+// PROTECTED: llvm.mlir.global internal constant @global1(0 : i32) {addr_space = 0 : i32} : i32
+
+// PROTECTED-LABEL: llvm.mlir.alias external @func1_alias {addr_space = 0 : i32} : !llvm.ptr {
+// PROTECTED: %[[MLIR_0:.*]] = llvm.mlir.addressof @func1 : !llvm.ptr
+// PROTECTED: llvm.return %[[MLIR_0]] : !llvm.ptr
+// PROTECTED: }
+// PROTECTED: llvm.func @decl1()
+// PROTECTED: llvm.mlir.global internal constant @comdat1(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// PROTECTED: llvm.mlir.ifunc external @ifunc1 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
// PROTECTED-LABEL: llvm.func hidden @func2() {
// PROTECTED: llvm.return
// PROTECTED: }
// PROTECTED: llvm.mlir.global internal hidden constant @global2(1 : i32) {addr_space = 0 : i32} : i32
+// PROTECTED-LABEL: llvm.mlir.alias external hidden @func2_alias {addr_space = 0 : i32} : !llvm.ptr {
+// PROTECTED: %[[MLIR_0:.*]] = llvm.mlir.addressof @func2 : !llvm.ptr
+// PROTECTED: llvm.return %[[MLIR_0]] : !llvm.ptr
+// PROTECTED: }
+// PROTECTED: llvm.func hidden @decl2()
+// PROTECTED: llvm.mlir.global internal hidden constant @comdat2(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// PROTECTED: llvm.mlir.ifunc external hidden @ifunc2 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
+
// PROTECTED-LABEL: llvm.func protected @func3() {
// PROTECTED: llvm.return
// PROTECTED: }
// PROTECTED: llvm.mlir.global internal protected constant @global3(2 : i32) {addr_space = 0 : i32} : i32
-// PROTECTED-LABEL: llvm.comdat @llvm_comdat {
-// PROTECTED: llvm.comdat_selector @any any
+// PROTECTED-LABEL: llvm.mlir.alias external protected @func3_alias {addr_space = 0 : i32} : !llvm.ptr {
+// PROTECTED: %[[MLIR_0:.*]] = llvm.mlir.addressof @func3 : !llvm.ptr
+// PROTECTED: llvm.return %[[MLIR_0]] : !llvm.ptr
// PROTECTED: }
-// PROTECTED: llvm.mlir.global internal protected constant @global_comdat(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
-// PROTECTED: llvm.func protected @decl()
+// PROTECTED: llvm.func protected @decl3()
+// PROTECTED: llvm.mlir.global internal protected constant @comdat3(1 : i64) comdat(@llvm_comdat::@any) {addr_space = 0 : i32} : i64
+// PROTECTED: llvm.mlir.ifunc external protected @ifunc3 : !llvm.func<void ()>, !llvm.ptr @ifunc_resolver
More information about the Mlir-commits
mailing list