https://github.com/daniel-donenfeld updated 
https://github.com/llvm/llvm-project/pull/205639

>From 6d246b8f91bea2fc384a29094653af39afac9f9a Mon Sep 17 00:00:00 2001
From: Daniel Donenfeld <[email protected]>
Date: Tue, 2 Jun 2026 20:15:39 +0000
Subject: [PATCH 1/3] Bug fix for device function pointer having same name as a
 generated callprototype

---
 llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp     |  2 +-
 llvm/lib/Target/NVPTX/NVPTXInstrInfo.td         |  2 +-
 llvm/test/CodeGen/NVPTX/call_bitcast_byval.ll   |  2 +-
 llvm/test/CodeGen/NVPTX/callchain.ll            |  2 +-
 .../CodeGen/NVPTX/callprototype-local-label.ll  | 17 +++++++++++++++++
 .../CodeGen/NVPTX/convert-call-to-indirect.ll   | 16 ++++++++--------
 llvm/test/CodeGen/NVPTX/indirect_byval.ll       |  8 ++++----
 .../CodeGen/NVPTX/lower-args-gridconstant.ll    | 16 ++++++++--------
 llvm/test/CodeGen/NVPTX/noreturn.ll             |  4 ++--
 llvm/test/CodeGen/NVPTX/param-align.ll          | 10 +++++-----
 10 files changed, 48 insertions(+), 31 deletions(-)
 create mode 100644 llvm/test/CodeGen/NVPTX/callprototype-local-label.ll

diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp 
b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
index 7854309c42e5d..425f480d83615 100644
--- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
@@ -1205,7 +1205,7 @@ std::string NVPTXTargetLowering::getPrototype(
 
   std::string Prototype;
   raw_string_ostream O(Prototype);
-  O << "prototype_" << UniqueCallSite << " : .callprototype ";
+  O << "$L__prototype_" << UniqueCallSite << " : .callprototype ";
 
   if (RetTy->isVoidTy()) {
     O << "()";
diff --git a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td 
b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
index ff3e5144c6fbe..ac44c2fcc5604 100644
--- a/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
+++ b/llvm/lib/Target/NVPTX/NVPTXInstrInfo.td
@@ -1845,7 +1845,7 @@ foreach is_convergent = [0, 1] in {
       NVPTXInst<(outs),
                 (ins ADDR_base:$addr, CallOperand:$rets, CallOperand:$params, 
                      i32imm:$proto),
-                "call${rets:RetList} $addr, (${params:ParamList}), 
prototype_$proto;">;
+                "call${rets:RetList} $addr, (${params:ParamList}), 
$$L__prototype_$proto;">;
 
     def CALL_UNI # convergent_suffix :
       NVPTXInst<(outs),
diff --git a/llvm/test/CodeGen/NVPTX/call_bitcast_byval.ll 
b/llvm/test/CodeGen/NVPTX/call_bitcast_byval.ll
index 483d48a1012c6..576af8d5db0cb 100644
--- a/llvm/test/CodeGen/NVPTX/call_bitcast_byval.ll
+++ b/llvm/test/CodeGen/NVPTX/call_bitcast_byval.ll
@@ -17,7 +17,7 @@ target triple = "nvptx64-nvidia-cuda"
 ; CHECK: .param .align 2 .b8 retval0[4];
 ; CHECK-DAG: st.param.b16   [param2], %rs{{[0-9]+}};
 ; CHECK-DAG: st.param.b16   [param2+2], %rs{{[0-9]+}};
-; CHECK: prototype_0 : .callprototype (.param .align 2 .b8 _[4]) _ (.param 
.b32 _, .param .b32 _, .param .align 2 .b8 _[4]);
+; CHECK: $L__prototype_0 : .callprototype (.param .align 2 .b8 _[4]) _ (.param 
.b32 _, .param .b32 _, .param .align 2 .b8 _[4]);
 ; CHECK: call (retval0),
 define weak_odr void @foo() {
 entry:
diff --git a/llvm/test/CodeGen/NVPTX/callchain.ll 
b/llvm/test/CodeGen/NVPTX/callchain.ll
index 847d8b80ad38a..be61a9fbe3291 100644
--- a/llvm/test/CodeGen/NVPTX/callchain.ll
+++ b/llvm/test/CodeGen/NVPTX/callchain.ll
@@ -4,7 +4,7 @@
 target triple = "nvptx"
 
 define void @foo(ptr %ptr) {
-; CHECK: prototype_0 : .callprototype ()_ ()
+; CHECK: $L__prototype_0 : .callprototype ()_ ()
   tail call void %ptr()
   ret void
 }
diff --git a/llvm/test/CodeGen/NVPTX/callprototype-local-label.ll 
b/llvm/test/CodeGen/NVPTX/callprototype-local-label.ll
new file mode 100644
index 0000000000000..371282a28745c
--- /dev/null
+++ b/llvm/test/CodeGen/NVPTX/callprototype-local-label.ll
@@ -0,0 +1,17 @@
+; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_75 | FileCheck %s
+; RUN: %if ptxas-sm_75 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_75 | 
%ptxas-verify --compile-only -arch=sm_75 %}
+
+target triple = "nvptx64-nvidia-cuda"
+
+@prototype_0 = addrspace(1) global ptr null, align 8
+
+define i32 @call_via_prototype_0(i32 %a, i32 %b, i32 %c, i32 %d) {
+; CHECK-LABEL: call_via_prototype_0(
+; CHECK: ld.global.{{u|b}}64 {{%rd[0-9]+}}, [prototype_0];
+; CHECK: $L__prototype_0 : .callprototype (.param .b32 _) _ (.param .b32 _, 
.param .b32 _, .param .b32 _, .param .b32 _);
+; CHECK-NEXT: call (retval0), %rd{{[0-9]+}}, (param0, param1, param2, param3), 
$L__prototype_0;
+; CHECK-NOT: prototype_0 : .callprototype
+  %fp = load ptr, ptr addrspace(1) @prototype_0, align 8
+  %ret = call i32 %fp(i32 %a, i32 %b, i32 %c, i32 %d)
+  ret i32 %ret
+}
diff --git a/llvm/test/CodeGen/NVPTX/convert-call-to-indirect.ll 
b/llvm/test/CodeGen/NVPTX/convert-call-to-indirect.ll
index d82a42ae5d56e..f881ac5f05d44 100644
--- a/llvm/test/CodeGen/NVPTX/convert-call-to-indirect.ll
+++ b/llvm/test/CodeGen/NVPTX/convert-call-to-indirect.ll
@@ -17,9 +17,9 @@ define %struct.64 @test_return_type_mismatch(ptr %p) {
 ; CHECK-NEXT:    .param .b64 param0;
 ; CHECK-NEXT:    .param .align 1 .b8 retval0[8];
 ; CHECK-NEXT:    st.param.b64 [param0], %rd1;
-; CHECK-NEXT:    prototype_0 : .callprototype (.param .align 1 .b8 _[8]) _ 
(.param .b64 _);
+; CHECK-NEXT:    $L__prototype_0 : .callprototype (.param .align 1 .b8 _[8]) _ 
(.param .b64 _);
 ; CHECK-NEXT:    mov.b64 %rd2, callee;
-; CHECK-NEXT:    call (retval0), %rd2, (param0), prototype_0;
+; CHECK-NEXT:    call (retval0), %rd2, (param0), $L__prototype_0;
 ; CHECK-NEXT:    ld.param.b8 %rd3, [retval0+7];
 ; CHECK-NEXT:    ld.param.b8 %rd4, [retval0+6];
 ; CHECK-NEXT:    ld.param.b8 %rd5, [retval0+5];
@@ -72,10 +72,10 @@ define i64 @test_param_type_mismatch(ptr %p) {
 ; CHECK-NEXT:    { // callseq 1, 0
 ; CHECK-NEXT:    .param .b64 param0;
 ; CHECK-NEXT:    .param .b64 retval0;
-; CHECK-NEXT:    prototype_1 : .callprototype (.param .b64 _) _ (.param .b64 
_);
+; CHECK-NEXT:    $L__prototype_1 : .callprototype (.param .b64 _) _ (.param 
.b64 _);
 ; CHECK-NEXT:    st.param.b64 [param0], 7;
 ; CHECK-NEXT:    mov.b64 %rd1, callee;
-; CHECK-NEXT:    call (retval0), %rd1, (param0), prototype_1;
+; CHECK-NEXT:    call (retval0), %rd1, (param0), $L__prototype_1;
 ; CHECK-NEXT:    ld.param.b64 %rd2, [retval0];
 ; CHECK-NEXT:    } // callseq 1
 ; CHECK-NEXT:    st.param.b64 [func_retval0], %rd2;
@@ -96,10 +96,10 @@ define i64 @test_param_count_mismatch(ptr %p) {
 ; CHECK-NEXT:    .param .b64 param1;
 ; CHECK-NEXT:    .param .b64 retval0;
 ; CHECK-NEXT:    st.param.b64 [param0], %rd1;
-; CHECK-NEXT:    prototype_2 : .callprototype (.param .b64 _) _ (.param .b64 
_, .param .b64 _);
+; CHECK-NEXT:    $L__prototype_2 : .callprototype (.param .b64 _) _ (.param 
.b64 _, .param .b64 _);
 ; CHECK-NEXT:    st.param.b64 [param1], 7;
 ; CHECK-NEXT:    mov.b64 %rd2, callee;
-; CHECK-NEXT:    call (retval0), %rd2, (param0, param1), prototype_2;
+; CHECK-NEXT:    call (retval0), %rd2, (param0, param1), $L__prototype_2;
 ; CHECK-NEXT:    ld.param.b64 %rd3, [retval0];
 ; CHECK-NEXT:    } // callseq 2
 ; CHECK-NEXT:    st.param.b64 [func_retval0], %rd3;
@@ -127,9 +127,9 @@ define %struct.64 @test_return_type_mismatch_variadic(ptr 
%p) {
 ; CHECK-NEXT:    add.u64 %rd2, %SP, 0;
 ; CHECK-NEXT:    st.param.b64 [param1], %rd2;
 ; CHECK-NEXT:    st.param.b64 [param0], %rd1;
-; CHECK-NEXT:    prototype_3 : .callprototype (.param .align 1 .b8 _[8]) _ 
(.param .b64 _, .param .b64 _);
+; CHECK-NEXT:    $L__prototype_3 : .callprototype (.param .align 1 .b8 _[8]) _ 
(.param .b64 _, .param .b64 _);
 ; CHECK-NEXT:    mov.b64 %rd3, callee_variadic;
-; CHECK-NEXT:    call (retval0), %rd3, (param0, param1), prototype_3;
+; CHECK-NEXT:    call (retval0), %rd3, (param0, param1), $L__prototype_3;
 ; CHECK-NEXT:    ld.param.b8 %rd4, [retval0+7];
 ; CHECK-NEXT:    ld.param.b8 %rd5, [retval0+6];
 ; CHECK-NEXT:    ld.param.b8 %rd6, [retval0+5];
diff --git a/llvm/test/CodeGen/NVPTX/indirect_byval.ll 
b/llvm/test/CodeGen/NVPTX/indirect_byval.ll
index e1fecdb76bd4d..6bee09ae21ff8 100644
--- a/llvm/test/CodeGen/NVPTX/indirect_byval.ll
+++ b/llvm/test/CodeGen/NVPTX/indirect_byval.ll
@@ -32,8 +32,8 @@ define internal i32 @foo() {
 ; CHECK-NEXT:    add.u64 %rd3, %SPL, 1;
 ; CHECK-NEXT:    ld.local.b8 %rs1, [%rd3];
 ; CHECK-NEXT:    st.param.b8 [param0], %rs1;
-; CHECK-NEXT:    prototype_0 : .callprototype (.param .b32 _) _ (.param .align 
1 .b8 _[1], .param .b64 _);
-; CHECK-NEXT:    call (retval0), %rd1, (param0, param1), prototype_0;
+; CHECK-NEXT:    $L__prototype_0 : .callprototype (.param .b32 _) _ (.param 
.align 1 .b8 _[1], .param .b64 _);
+; CHECK-NEXT:    call (retval0), %rd1, (param0, param1), $L__prototype_0;
 ; CHECK-NEXT:    ld.param.b32 %r1, [retval0];
 ; CHECK-NEXT:    } // callseq 0
 ; CHECK-NEXT:    st.param.b32 [func_retval0], %r1;
@@ -69,8 +69,8 @@ define internal i32 @bar() {
 ; CHECK-NEXT:    add.u64 %rd3, %SPL, 8;
 ; CHECK-NEXT:    ld.local.b64 %rd4, [%rd3];
 ; CHECK-NEXT:    st.param.b64 [param0], %rd4;
-; CHECK-NEXT:    prototype_1 : .callprototype (.param .b32 _) _ (.param .align 
8 .b8 _[8], .param .b64 _);
-; CHECK-NEXT:    call (retval0), %rd1, (param0, param1), prototype_1;
+; CHECK-NEXT:    $L__prototype_1 : .callprototype (.param .b32 _) _ (.param 
.align 8 .b8 _[8], .param .b64 _);
+; CHECK-NEXT:    call (retval0), %rd1, (param0, param1), $L__prototype_1;
 ; CHECK-NEXT:    ld.param.b32 %r1, [retval0];
 ; CHECK-NEXT:    } // callseq 1
 ; CHECK-NEXT:    st.param.b32 [func_retval0], %r1;
diff --git a/llvm/test/CodeGen/NVPTX/lower-args-gridconstant.ll 
b/llvm/test/CodeGen/NVPTX/lower-args-gridconstant.ll
index 4d9cb6ff97413..805fa1bef2296 100644
--- a/llvm/test/CodeGen/NVPTX/lower-args-gridconstant.ll
+++ b/llvm/test/CodeGen/NVPTX/lower-args-gridconstant.ll
@@ -130,9 +130,9 @@ define ptx_kernel void @grid_const_escape(ptr 
byval(%struct.s) align 4 "nvvm.gri
 ; PTX-NEXT:    .param .b64 param0;
 ; PTX-NEXT:    .param .b32 retval0;
 ; PTX-NEXT:    st.param.b64 [param0], %rd2;
-; PTX-NEXT:    prototype_0 : .callprototype (.param .b32 _) _ (.param .b64 _);
+; PTX-NEXT:    $L__prototype_0 : .callprototype (.param .b32 _) _ (.param .b64 
_);
 ; PTX-NEXT:    mov.b64 %rd3, escape;
-; PTX-NEXT:    call (retval0), %rd3, (param0), prototype_0;
+; PTX-NEXT:    call (retval0), %rd3, (param0), $L__prototype_0;
 ; PTX-NEXT:    } // callseq 0
 ; PTX-NEXT:    ret;
 ; OPT-LABEL: define ptx_kernel void @grid_const_escape(
@@ -173,9 +173,9 @@ define ptx_kernel void @multiple_grid_const_escape(ptr 
byval(%struct.s) align 4
 ; PTX-NEXT:    st.param.b64 [param2], %rd3;
 ; PTX-NEXT:    st.param.b64 [param1], %rd5;
 ; PTX-NEXT:    st.param.b64 [param0], %rd4;
-; PTX-NEXT:    prototype_1 : .callprototype (.param .b32 _) _ (.param .b64 _, 
.param .b64 _, .param .b64 _);
+; PTX-NEXT:    $L__prototype_1 : .callprototype (.param .b32 _) _ (.param .b64 
_, .param .b64 _, .param .b64 _);
 ; PTX-NEXT:    mov.b64 %rd7, escape3;
-; PTX-NEXT:    call (retval0), %rd7, (param0, param1, param2), prototype_1;
+; PTX-NEXT:    call (retval0), %rd7, (param0, param1, param2), $L__prototype_1;
 ; PTX-NEXT:    } // callseq 1
 ; PTX-NEXT:    ret;
 ; OPT-LABEL: define ptx_kernel void @multiple_grid_const_escape(
@@ -267,9 +267,9 @@ define ptx_kernel void @grid_const_partial_escape(ptr 
byval(i32) align 4 "nvvm.g
 ; PTX-NEXT:    .param .b64 param0;
 ; PTX-NEXT:    .param .b32 retval0;
 ; PTX-NEXT:    st.param.b64 [param0], %rd4;
-; PTX-NEXT:    prototype_2 : .callprototype (.param .b32 _) _ (.param .b64 _);
+; PTX-NEXT:    $L__prototype_2 : .callprototype (.param .b32 _) _ (.param .b64 
_);
 ; PTX-NEXT:    mov.b64 %rd5, escape;
-; PTX-NEXT:    call (retval0), %rd5, (param0), prototype_2;
+; PTX-NEXT:    call (retval0), %rd5, (param0), $L__prototype_2;
 ; PTX-NEXT:    } // callseq 2
 ; PTX-NEXT:    ret;
 ; OPT-LABEL: define ptx_kernel void @grid_const_partial_escape(
@@ -307,9 +307,9 @@ define ptx_kernel i32 @grid_const_partial_escapemem(ptr 
byval(%struct.s) align 4
 ; PTX-NEXT:    .param .b64 param0;
 ; PTX-NEXT:    .param .b32 retval0;
 ; PTX-NEXT:    st.param.b64 [param0], %rd4;
-; PTX-NEXT:    prototype_3 : .callprototype (.param .b32 _) _ (.param .b64 _);
+; PTX-NEXT:    $L__prototype_3 : .callprototype (.param .b32 _) _ (.param .b64 
_);
 ; PTX-NEXT:    mov.b64 %rd5, escape;
-; PTX-NEXT:    call (retval0), %rd5, (param0), prototype_3;
+; PTX-NEXT:    call (retval0), %rd5, (param0), $L__prototype_3;
 ; PTX-NEXT:    } // callseq 3
 ; PTX-NEXT:    st.param.b32 [func_retval0], %r3;
 ; PTX-NEXT:    ret;
diff --git a/llvm/test/CodeGen/NVPTX/noreturn.ll 
b/llvm/test/CodeGen/NVPTX/noreturn.ll
index 0062e62756d36..416418c7ffde7 100644
--- a/llvm/test/CodeGen/NVPTX/noreturn.ll
+++ b/llvm/test/CodeGen/NVPTX/noreturn.ll
@@ -32,8 +32,8 @@ define ptx_kernel void @ignore_kernel_noreturn() #0 {
 }
 
 ; CHECK-LABEL: .entry callprototype_noreturn(
-; CHECK: prototype_{{[0-9]+}} : .callprototype ()_ (.param .b32 _) .noreturn;
-; CHECK: prototype_{{[0-9]+}} : .callprototype (.param .b32 _) _ (.param .b32 
_);
+; CHECK: {{[$]}}L__prototype_{{[0-9]+}} : .callprototype ()_ (.param .b32 _) 
.noreturn;
+; CHECK: {{[$]}}L__prototype_{{[0-9]+}} : .callprototype (.param .b32 _) _ 
(.param .b32 _);
 
 define ptx_kernel void @callprototype_noreturn(i32) {
   %fn = load ptr, ptr addrspace(1) @function_pointer
diff --git a/llvm/test/CodeGen/NVPTX/param-align.ll 
b/llvm/test/CodeGen/NVPTX/param-align.ll
index c85080fdf295a..7f0a1646962ae 100644
--- a/llvm/test/CodeGen/NVPTX/param-align.ll
+++ b/llvm/test/CodeGen/NVPTX/param-align.ll
@@ -55,17 +55,17 @@ declare ptr @getfp(i32 %n)
 define ptx_device void @t6() {
 ; CHECK: .func t6
   %fp = call ptr @getfp(i32 0)
-; CHECK: prototype_2 : .callprototype ()_ (.param .align 8 .b8 _[8]);
+; CHECK: $L__prototype_2 : .callprototype ()_ (.param .align 8 .b8 _[8]);
   call void %fp(ptr byval(double) null);
 
   %fp2 = call ptr @getfp(i32 1)
-; NOALIGN4: prototype_4 : .callprototype ()_ (.param .align 2 .b8 _[4]);
-; ALIGN4: prototype_4 : .callprototype ()_ (.param .align 4 .b8 _[4]);
+; NOALIGN4: $L__prototype_4 : .callprototype ()_ (.param .align 2 .b8 _[4]);
+; ALIGN4: $L__prototype_4 : .callprototype ()_ (.param .align 4 .b8 _[4]);
   call void %fp(ptr byval(%struct.half2) null);
 
   %fp3 = call ptr @getfp(i32 2)
-; NOALIGN4: prototype_6 : .callprototype ()_ (.param .align 1 .b8 _[1]);
-; ALIGN4: prototype_6 : .callprototype ()_ (.param .align 4 .b8 _[1]);
+; NOALIGN4: $L__prototype_6 : .callprototype ()_ (.param .align 1 .b8 _[1]);
+; ALIGN4: $L__prototype_6 : .callprototype ()_ (.param .align 4 .b8 _[1]);
   call void %fp(ptr byval(i8) null);
   ret void
 }

>From b8d1f5c819bd3a7958f4674fa531f096957d5b1c Mon Sep 17 00:00:00 2001
From: Daniel Donenfeld <[email protected]>
Date: Wed, 24 Jun 2026 21:34:42 +0000
Subject: [PATCH 2/3] Fix missed test

---
 llvm/test/CodeGen/NVPTX/vaargs.ll | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/test/CodeGen/NVPTX/vaargs.ll 
b/llvm/test/CodeGen/NVPTX/vaargs.ll
index a03cf90f61a34..6769086ce93d0 100644
--- a/llvm/test/CodeGen/NVPTX/vaargs.ll
+++ b/llvm/test/CodeGen/NVPTX/vaargs.ll
@@ -207,9 +207,9 @@ define i32 @test_foo(i32 %i, i64 %l, double %d, ptr %p) {
 ; CHECK32-NEXT:    .param .b32 retval0;
 ; CHECK32-NEXT:    add.u32 %r6, %SP, 0;
 ; CHECK32-NEXT:    st.param.b32 [param1], %r6;
-; CHECK32-NEXT:    prototype_1 : .callprototype (.param .b32 _) _ (.param .b32 
_, .param .b32 _);
+; CHECK32-NEXT:    L__prototype_1 : .callprototype (.param .b32 _) _ (.param 
.b32 _, .param .b32 _);
 ; CHECK32-NEXT:    st.param.b32 [param0], 4;
-; CHECK32-NEXT:    call (retval0), %r5, (param0, param1), prototype_1;
+; CHECK32-NEXT:    call (retval0), %r5, (param0, param1), L__prototype_1;
 ; CHECK32-NEXT:    ld.param.b32 %r7, [retval0];
 ; CHECK32-NEXT:    } // callseq 1
 ; CHECK32-NEXT:    st.param.b32 [func_retval0], %r7;
@@ -243,9 +243,9 @@ define i32 @test_foo(i32 %i, i64 %l, double %d, ptr %p) {
 ; CHECK64-NEXT:    .param .b32 retval0;
 ; CHECK64-NEXT:    add.u64 %rd7, %SP, 0;
 ; CHECK64-NEXT:    st.param.b64 [param1], %rd7;
-; CHECK64-NEXT:    prototype_1 : .callprototype (.param .b32 _) _ (.param .b32 
_, .param .b64 _);
+; CHECK64-NEXT:    L__prototype_1 : .callprototype (.param .b32 _) _ (.param 
.b32 _, .param .b64 _);
 ; CHECK64-NEXT:    st.param.b32 [param0], 4;
-; CHECK64-NEXT:    call (retval0), %rd6, (param0, param1), prototype_1;
+; CHECK64-NEXT:    call (retval0), %rd6, (param0, param1), L__prototype_1;
 ; CHECK64-NEXT:    ld.param.b32 %r2, [retval0];
 ; CHECK64-NEXT:    } // callseq 1
 ; CHECK64-NEXT:    st.param.b32 [func_retval0], %r2;

>From f9d28d3eaa396bc7b4a909c8c737f02c43df8af6 Mon Sep 17 00:00:00 2001
From: Daniel Donenfeld <[email protected]>
Date: Mon, 29 Jun 2026 19:54:26 +0000
Subject: [PATCH 3/3] Add cuda C++ lit test for prototype collision

---
 .../CodeGenCUDA/callprototype-local-label.cu  | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 clang/test/CodeGenCUDA/callprototype-local-label.cu

diff --git a/clang/test/CodeGenCUDA/callprototype-local-label.cu 
b/clang/test/CodeGenCUDA/callprototype-local-label.cu
new file mode 100644
index 0000000000000..6f4bb2de0b02a
--- /dev/null
+++ b/clang/test/CodeGenCUDA/callprototype-local-label.cu
@@ -0,0 +1,29 @@
+// REQUIRES: nvptx-registered-target
+// RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -target-cpu sm_75 \
+// RUN:   -fcuda-is-device -S -o - -x cuda %s \
+// RUN:   | FileCheck %s
+
+// Test that a global named 'prototype_0' does not cause a callprototype label
+// collision: the label must be '$L__prototype_0', not 'prototype_0'.
+// extern "C" is used to keep the PTX global name unmangled.
+
+#define __device__ __attribute__((device))
+
+extern "C" {
+
+__device__ int simple_func() { return 42; }
+
+__device__ int (*prototype_0)(int, int, int, int) = nullptr;
+__device__ int call_via_prototype_0(int a, int b, int c, int d) {
+    if (prototype_0 != nullptr)
+        return prototype_0(a, b, c, d);
+    return a + b + c + d;
+}
+
+} // extern "C"
+
+// CHECK: .visible .global .align 8 .u64 prototype_0;
+// CHECK-LABEL: .visible .func  (.param .b32 func_retval0) 
call_via_prototype_0(
+// CHECK: $L__prototype_0 : .callprototype (.param .b32 _) _ (.param .b32 _, 
.param .b32 _, .param .b32 _, .param .b32 _);
+// CHECK-NEXT: call (retval0), %rd{{[0-9]+}}, (param0, param1, param2, 
param3), $L__prototype_0;
+// CHECK-NOT: prototype_0 : .callprototype

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to