vtjnash wrote:

So the IR change here looks correct. The ABI information specified that 
`_ZNKSt16initializer_listIiE5beginEv`  should take an addrspacecast value, 
since the function declaration claims it should accept a generic `ptr` created 
in any addrspace (for the `this` pointer argument) and returns a generic `ptr` 
(which turns out to mustalias the `ptr %il.coerce0` here). The caller needed to 
create an alloca (it chooses the local addrspace) to satisfy that demand and 
then casts that as required by the source code.

Is the header file wrong? Is the `this` pointer argument to this function not 
supposed to be in the generic addrspace?

```diff
--- hip_old.ll  2026-05-28 14:45:25.509326799 +0000
+++ hip_new.ll  2026-05-28 14:36:51.875256872 +0000
@@ -10,8 +10,8 @@
 $_ZNKSt16initializer_listIiE5beginEv = comdat any
 
 @__const.__assert_fail.fmt = private unnamed_addr addrspace(4) constant [47 x 
i8] c"%s:%u: %s: Device-side assertion `%s' failed.\0A\00", align 16
-@__hip_cuid_4db5332c33b34f3b = addrspace(1) global i8 0
[email protected] = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_4db5332c33b34f3b to ptr)], section 
"llvm.metadata"
+@__hip_cuid_e0514e128f7d7a66 = addrspace(1) global i8 0
[email protected] = appending addrspace(1) global [1 x ptr] [ptr 
addrspacecast (ptr addrspace(1) @__hip_cuid_e0514e128f7d7a66 to ptr)], section 
"llvm.metadata"
 
 ; Function Attrs: convergent mustprogress noinline noreturn nounwind optnone
 define weak void @__cxa_pure_virtual() #0 {
@@ -234,12 +234,12 @@
 define hidden noundef i32 @_Z1fSt16initializer_listIiE(ptr %il.coerce0, i64 
%il.coerce1) #2 {
 entry:
   %il = alloca %"class.std::initializer_list", align 8, addrspace(5)
-  %il1 = addrspacecast ptr addrspace(5) %il to ptr
-  %0 = getelementptr inbounds nuw %"class.std::initializer_list", ptr %il1, 
i32 0, i32 0
-  store ptr %il.coerce0, ptr %0, align 8
-  %1 = getelementptr inbounds nuw %"class.std::initializer_list", ptr %il1, 
i32 0, i32 1
-  store i64 %il.coerce1, ptr %1, align 8
-  %call = call noundef ptr @_ZNKSt16initializer_listIiE5beginEv(ptr noundef 
nonnull align 8 dereferenceable(16) %il1) #6
+  %0 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %il, i32 0, i32 0
+  store ptr %il.coerce0, ptr addrspace(5) %0, align 8
+  %1 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %il, i32 0, i32 1
+  store i64 %il.coerce1, ptr addrspace(5) %1, align 8
+  %il.ascast = addrspacecast ptr addrspace(5) %il to ptr
+  %call = call noundef ptr @_ZNKSt16initializer_listIiE5beginEv(ptr noundef 
nonnull align 8 dereferenceable(16) %il.ascast) #6
   %2 = load i32, ptr %call, align 4
   ret i32 %2
 }

@@ -263,22 +263,19 @@
   %out.addr = alloca ptr, align 8, addrspace(5)
   %agg.tmp = alloca %"class.std::initializer_list", align 8, addrspace(5)
   %ref.tmp = alloca [1 x i32], align 4, addrspace(5)
-  %out.ascast = addrspacecast ptr addrspace(5) %out to ptr
   %out.addr.ascast = addrspacecast ptr addrspace(5) %out.addr to ptr
-  %agg.tmp.ascast = addrspacecast ptr addrspace(5) %agg.tmp to ptr
-  %ref.tmp.ascast = addrspacecast ptr addrspace(5) %ref.tmp to ptr
-  store ptr addrspace(1) %out.coerce, ptr %out.ascast, align 8
-  %out1 = load ptr, ptr %out.ascast, align 8
+  store ptr addrspace(1) %out.coerce, ptr addrspace(5) %out, align 8
+  %out1 = load ptr, ptr addrspace(5) %out, align 8
   store ptr %out1, ptr %out.addr.ascast, align 8
-  store i32 42, ptr %ref.tmp.ascast, align 4
-  %_M_array = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
%agg.tmp.ascast, i32 0, i32 0
-  store ptr %ref.tmp.ascast, ptr %_M_array, align 8
-  %_M_len = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
%agg.tmp.ascast, i32 0, i32 1
-  store i64 1, ptr %_M_len, align 8
-  %0 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
%agg.tmp.ascast, i32 0, i32 0
-  %1 = load ptr, ptr %0, align 8
-  %2 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
%agg.tmp.ascast, i32 0, i32 1
-  %3 = load i64, ptr %2, align 8
+  store i32 42, ptr addrspace(5) %ref.tmp, align 4
+  %_M_array = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %agg.tmp, i32 0, i32 0
+  store ptr addrspace(5) %ref.tmp, ptr addrspace(5) %_M_array, align 8
+  %_M_len = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %agg.tmp, i32 0, i32 1
+  store i64 1, ptr addrspace(5) %_M_len, align 8
+  %0 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %agg.tmp, i32 0, i32 0
+  %1 = load ptr, ptr addrspace(5) %0, align 8
+  %2 = getelementptr inbounds nuw %"class.std::initializer_list", ptr 
addrspace(5) %agg.tmp, i32 0, i32 1
+  %3 = load i64, ptr addrspace(5) %2, align 8
   %call = call noundef i32 @_Z1fSt16initializer_listIiE(ptr %1, i64 %3) #6
   %4 = load ptr, ptr %out.addr.ascast, align 8
   %arrayidx = getelementptr inbounds i32, ptr %4, i64 0
```

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

Reply via email to