[llvm] [NVPTX] Add support for calling aliases (PR #81170)
Alex MacLean via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 8 10:46:13 PST 2024
https://github.com/AlexMaclean created https://github.com/llvm/llvm-project/pull/81170
The current implementation of aliases tries to remove all the aliases in the module to prevent the generic version of `AsmPrinter` from emitting them incorrectly. Unfortunately, if the aliases are used this will fail. Instead let's override the function to print aliases directly.
>From d794687f0b3ca06dadc902db3dec4b980d24b1b3 Mon Sep 17 00:00:00 2001
From: Alex MacLean <amaclean at nvidia.com>
Date: Thu, 8 Feb 2024 02:09:09 +0000
Subject: [PATCH] [NVPTX] Add support for calling aliases
---
llvm/include/llvm/CodeGen/AsmPrinter.h | 2 +-
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 +-
llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 10 ----------
llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h | 2 +-
llvm/test/CodeGen/NVPTX/alias.ll | 10 ++++++++++
5 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index fbd198a75a2436..a7fbf4aeb74494 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -897,7 +897,7 @@ class AsmPrinter : public MachineFunctionPass {
virtual void emitModuleCommandLines(Module &M);
GCMetadataPrinter *getOrCreateGCPrinter(GCStrategy &S);
- void emitGlobalAlias(Module &M, const GlobalAlias &GA);
+ virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
void emitGlobalIFunc(Module &M, const GlobalIFunc &GI);
private:
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index b961fc2c338ae7..e89a1c26c23e6b 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -2127,7 +2127,7 @@ void AsmPrinter::emitGlobalGOTEquivs() {
emitGlobalVariable(GV);
}
-void AsmPrinter::emitGlobalAlias(Module &M, const GlobalAlias &GA) {
+void AsmPrinter::emitGlobalAlias(const Module &M, const GlobalAlias &GA) {
MCSymbol *Name = getSymbol(&GA);
bool IsFunction = GA.getValueType()->isFunctionTy();
// Treat bitcasts of functions as functions also. This is important at least
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
index 6c4879ba183c0a..3c52751721a3f7 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
@@ -932,16 +932,6 @@ bool NVPTXAsmPrinter::doFinalization(Module &M) {
GlobalsEmitted = true;
}
- // If we have any aliases we emit them at the end.
- SmallVector<GlobalAlias *> AliasesToRemove;
- for (GlobalAlias &Alias : M.aliases()) {
- emitGlobalAlias(M, Alias);
- AliasesToRemove.push_back(&Alias);
- }
-
- for (GlobalAlias *A : AliasesToRemove)
- A->eraseFromParent();
-
// call doFinalization
bool ret = AsmPrinter::doFinalization(M);
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h
index 7f0f37e7207d2d..cfd32ba72e5cf0 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h
+++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.h
@@ -174,7 +174,7 @@ class LLVM_LIBRARY_VISIBILITY NVPTXAsmPrinter : public AsmPrinter {
void printModuleLevelGV(const GlobalVariable *GVar, raw_ostream &O,
bool processDemoted, const NVPTXSubtarget &STI);
void emitGlobals(const Module &M);
- void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
+ void emitGlobalAlias(const Module &M, const GlobalAlias &GA) override;
void emitHeader(Module &M, raw_ostream &O, const NVPTXSubtarget &STI);
void emitKernelFunctionDirectives(const Function &F, raw_ostream &O) const;
void emitVirtualRegister(unsigned int vr, raw_ostream &);
diff --git a/llvm/test/CodeGen/NVPTX/alias.ll b/llvm/test/CodeGen/NVPTX/alias.ll
index d5dc3a12029ae6..df1b7647b49258 100644
--- a/llvm/test/CodeGen/NVPTX/alias.ll
+++ b/llvm/test/CodeGen/NVPTX/alias.ll
@@ -12,6 +12,12 @@ define void @noreturn() #0 {
}
@noreturn_alias = alias i32 (), ptr @noreturn
+define i32 @z() {
+ %val = call i32 @b()
+ ret i32 %val
+}
+
+
attributes #0 = { noreturn }
; CHECK: .visible .func (.param .b32 func_retval0) a()
@@ -24,6 +30,10 @@ attributes #0 = { noreturn }
; CHECK: .visible .func noreturn()
; CHECK-NEXT: .noreturn
+; CHECK: .visible .func (.param .b32 func_retval0) z()
+; CHECK: call.uni (retval0),
+; CHECK-NEXT: b,
+
; CHECK: .visible .func (.param .b32 func_retval0) b();
; CHECK-NEXT: .alias b, a;
More information about the llvm-commits
mailing list