[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