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
