<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54634>54634</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
loop-vectorize introduces bad ptrtoint for non-integral address space
</td>
</tr>
<tr>
<th>Labels</th>
<td>
julialang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Keno
</td>
</tr>
</table>
<pre>
Consider the following (reduced) .ll:
```
; ModuleID = 'reduced.ll'
source_filename = "reduced.ll"
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
@SUM.CoreDOT.Tuple5334 = external dso_local global {}*
@jlplt_ijl_alloc_array_1d_10294_got = external dso_local global void ()*
@llvm.compiler.used = appending global [4 x i8*] [i8* bitcast (void ({} addrspace(10)*)* @ijl_gc_queue_root to i8*), i8* bitcast (void ({} addrspace(10)*)* @jl_gc_queue_binding to i8*), i8* bitcast ({} addrspace(10)* (i8*, i32, i32)* @ijl_gc_pool_alloc to i8*), i8* bitcast ({} addrspace(10)* (i8*, i64)* @ijl_gc_big_alloc to i8*)], section "llvm.metadata"
declare {}*** @julia.get_pgcstack()
define {} addrspace(10)* @japi1_vect_42283({} addrspace(10)** %0, i32 %1) #0 {
top:
%2 = sext i32 %1 to i64
%3 = load atomic {} addrspace(10)* ({} addrspace(10)*, i64)*, {} addrspace(10)* ({} addrspace(10)*, i64)** bitcast (void ()** @jlplt_ijl_alloc_array_1d_10294_got to {} addrspace(10)* ({} addrspace(10)*, i64)**) unordered, align 8
%4 = call {} addrspace(10)* %3({} addrspace(10)* null, i64 0)
br label %L26
L26: ; preds = %L26, %top
%value_phi5 = phi i64 [ 0, %top ], [ %value_phi8, %L26 ]
%value_phi6 = phi i64 [ 0, %top ], [ %10, %L26 ]
%5 = bitcast {} addrspace(10)** %0 to { {} addrspace(10)*, i64 } addrspace(10)**
%6 = load { {} addrspace(10)*, i64 } addrspace(10)*, { {} addrspace(10)*, i64 } addrspace(10)** %5, align 8, !tbaa !0
%7 = bitcast {} addrspace(10)* %4 to { {} addrspace(10)*, i64 } addrspace(13)* addrspace(10)*
%8 = addrspacecast { {} addrspace(10)*, i64 } addrspace(13)* addrspace(10)* %7 to { {} addrspace(10)*, i64 } addrspace(13)* addrspace(11)*
%9 = load { {} addrspace(10)*, i64 } addrspace(13)*, { {} addrspace(10)*, i64 } addrspace(13)* addrspace(11)* %8, align 8, !tbaa !5
%.elt = getelementptr inbounds { {} addrspace(10)*, i64 }, { {} addrspace(10)*, i64 } addrspace(10)* %6, i64 0, i32 0
%.unpack = load {} addrspace(10)*, {} addrspace(10)* addrspace(10)* %.elt, align 8, !tbaa !8
%.elt1 = getelementptr inbounds { {} addrspace(10)*, i64 }, { {} addrspace(10)*, i64 } addrspace(10)* %6, i64 0, i32 1
%.unpack2 = load i64, i64 addrspace(10)* %.elt1, align 8, !tbaa !8
%.repack = getelementptr inbounds { {} addrspace(10)*, i64 }, { {} addrspace(10)*, i64 } addrspace(13)* %9, i64 %value_phi6, i32 0
store {} addrspace(10)* %.unpack, {} addrspace(10)* addrspace(13)* %.repack, align 8, !tbaa !10
%.repack4 = getelementptr inbounds { {} addrspace(10)*, i64 }, { {} addrspace(10)*, i64 } addrspace(13)* %9, i64 %value_phi6, i32 1
store i64 %.unpack2, i64 addrspace(13)* %.repack4, align 8, !tbaa !10
%10 = add i64 %value_phi6, 1
%.not = icmp eq i64 %value_phi5, %2
%11 = add i64 %value_phi5, 1
%value_phi8 = select i1 %.not, i64 0, i64 %11
br i1 %.not, label %L44, label %L26
L44: ; preds = %L26
ret {} addrspace(10)* null
}
; Function Attrs: inaccessiblemem_or_argmemonly
declare void @ijl_gc_queue_root({} addrspace(10)*) #1
; Function Attrs: inaccessiblemem_or_argmemonly
declare void @jl_gc_queue_binding({} addrspace(10)*) #1
; Function Attrs: allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_pool_alloc(i8*, i32, i32) #2
; Function Attrs: allocsize(1)
declare noalias nonnull {} addrspace(10)* @ijl_gc_big_alloc(i8*, i64) #2
attributes #0 = { "target-cpu"="skylake-avx512" "target-features"="+xsaves,+xsavec,+prfchw,+lzcnt,+sahf,+pku,+avx512vl,+avx512bw,+avx512cd,+clwb,+clflushopt,+adx,+avx512dq,+avx512f,+bmi2,+avx2,+bmi,+fsgsbase,+f16c,+avx,+xsave,+aes,+popcnt,+movbe,+sse4.2,+sse4.1,+cx16,+fma,+ssse3,+pclmul,+sse3,-rdrnd,-rtm,-rdseed,-avx512ifma,-avx512pf,-avx512er,-sha,-prefetchwt1,-avx512vbmi,-waitpkg,-avx512vbmi2,-shstk,-gfni,-vaes,-vpclmulqdq,-avx512vnni,-avx512bitalg,-avx512vpopcntdq,-rdpid,-cldemote,-movdiri,-movdir64b,-enqcmd,-avx512vp2intersect,-serialize,-tsxldtrk,-pconfig,-amx-bf16,-amx-tile,-amx-int8,-sse4a,-xop,-lwp,-fma4,-tbm,-mwaitx,-xsaveopt,-clzero,-wbnoinvd,-avx512bf16,-ptwrite,+sse2,+mmx,+fxsr,+64bit,+cx8" }
attributes #1 = { inaccessiblemem_or_argmemonly }
attributes #2 = { allocsize(1) }
!0 = !{!1, !1, i64 0}
!1 = !{!"jtbaa_value", !2, i64 0}
!2 = !{!"jtbaa_data", !3, i64 0}
!3 = !{!"jtbaa", !4, i64 0}
!4 = !{!"jtbaa"}
!5 = !{!6, !6, i64 0}
!6 = !{!"jtbaa_arrayptr", !7, i64 0}
!7 = !{!"jtbaa_array", !3, i64 0}
!8 = !{!9, !9, i64 0}
!9 = !{!"jtbaa_immut", !1, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"jtbaa_arraybuf", !2, i64 0}
```
On LLVM 14.0.0, running `opt -O3` introduces
```
%77 = ptrtoint <4 x {} addrspace(10)*> %broadcast.splat9 to <4 x i64>
%interleaved.vec12.epil = shufflevector <4 x i64> %77, <4 x i64> %broadcast.splat11, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
store <8 x i64> %interleaved.vec12.epil, <8 x i64> addrspace(13)* %71, align 8, !tbaa !10
```
The `ptrtoint` here is not legal, because addrspace 10 is non-integral.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVGdtu27jya5wXwYZEybb84IcmaYGD06IP291Xg5IomQ1FKiTlOP36M7zoYseXFPFi9xSpNZTmPsPhjJSJ4nX9ILiiBZGB3pKgFIyJF8qrYIJSSYo2J8UErYIZY5P40yR8nISfJovQ_7llfB98E0XLyH8eg0kM_9HSUxoqtHRoSrQyJ5uSMsJxTTwmGmMih6mxrIgOtKQN6_H26WKzSKYtf-LihU8Z5e1-WvH2mKrAGjP8KlrdUZJpDaqTKV0kcAUeZRoCEKF0ylMDLOAnRu7ZH_Y2NbctUmQxzU_cS_K_SfjHn99mD0KSx-8_Zj9aUHYex4kVS_aaSI5ZUCixYSIHqGIig8tkeT9ZPk7QwOUna5je0J9sg8H3-QZLiV83UbGJQrRKNpXQV1juBC1MuCBOY76M7epZLuoGPC5nrSKF5YObhvDCRLjTaH6fBPuApoZ4_mjWFg4yqnOstGHdi7DaB7gopGpwTuAW-MnJtb8BCDamVPnmuSUt2UgB-mvh2Ruch-Bj7MfcM-pMuSbgAmPz2NMCIeRBdzkypxHCR-h20iAjj8VktDohZf5o8BXJNRXcJLUNbk00Nvl-lJkFyRmWZJRq9s_6rmUUz2CfbJoqVxrnTz5vDshLyjvqM0YAJ9zQaLMDjTYJQml8LXrG8nnonWvgyJSVCYpDK8ltYdH0RSYwOMhmrILU76msW8BvA1JskZjARYC1qGl-WfUreo6iYhY3Y3U63wfnvKsOgO23U8j4v-VCQuk3Nf4hwIxWPEhHrnXFDEoNuyJ3fiX-AW9NgbcKBGGfcEGQyYDhjDDD4ytajPPQLGNA-Z1_5ixqwBzli7_lacKI5ia5Bst2mEH5aLZ0bjEBsKpB7QvCgSDwG8_cHhOlHgW4W5QTfBe_wTcKz_Jz6vWpc32H-Ry5jOricIHVSIPFsL0-zPfhBqpZr4zT1bou0hnG5hqOVF--13ku1z_gudjzOUk0KJS6E7hD6tS6uUhn_K3tid7Ys_p4bsQfz41Lylqvn8-W-ciYGWGu04LjkTBSE64bLQPKM9FyU1Herd4NEt3uvFHBdMfmOLlnLQeap4MIXNl5Z4Wd08C45Lzz0iPnRf9y70VvvYcG99mj0VFcckf0Tn9I0kfnH_VIPKi_6pHG59Sb3FJayCvtX--_30qskSrePed9eVDHPXbyf-TN6NCbHq_LupOJ9tY9yTv9E4XduXJaoYPE536epHndBOT5DcXc9yJoLCA6K2B-LGBoknzzzmBGCGjUCT_clo5bFI36wUPUoTtMksP1UbeYJLfpFr0iklzuGGxD6-QvHw_eCwDTLy13k9onraUyelGO85woRTOTu_VGSOjvK4AEZ6-HY5sbDk6M0VcHZDNORX-LLidm7ltpY4cdRX9Z6n4y6BTgAvIfK7hy4_FrU-mbWf3scG-0Q_-Mdv2I__ZdwButMChCs1YT5Wdlk6imeCHkXnhN88a-A4uhriH19MrwE5ni3X4egZVohFcSrFtJVI88Qfd7hXfmzkMH5w5uZJlvXxzMfuVcO1DhbekRnloHOEk7Nl5lL-NVXrhVzl6yDipZq7ai8WxxsR8TFM_jlReY1RT1t1F_zwGlqlSGFfGraJH3qCPb_L3O3kY0vWG12GX-uVIkmaERHHml99HC869x91iR2DPLWd2ynsrcncpC8sICunZrReyg7cNDHSO_asoBJtLAamsfQ4EqiYZw2NbDY-yc7dMXTHXzVB0-QI5aaXO-TquSW9Sds3y6c7o-Wzd3VNzh-PhRjdmYp3OVI5BFQ60ROSugYmjjtin4r6CSDuAiMbGeEv6c18WYE6JcE2leZFkliaSwg35ZJlrtWaGlVbrJBS-p06HeT7PSOt_CmjLSwcAstXwgUNZZexjy4cJe7AUcnFjOmQ1Abby1t2gmH1z-gR2_iBTWmRkXlO9G-nZyG_0iqR4yxOdHXfv8KvdKOggMp7rLmNTuwO54ONzKUb-VL5bjc-SoJz-uUMHxeYR8ewCAqU8oinwvEQ1HcU-C_FHfI4MJP03TsbHnui0blhidJEZniLu3lI42Pkkbn6YdyJKTZMl5shHW_BDLvxSKFidZLs5YYd_IQdc5qLQ8Sb-8RH_NDekh8cojr04ir85IonXd6kHSmUgf50WfGGfwz6WGtStry8vZcfjV6DsPvn7961sQJbNwZntB2UIVMh-eFiFszWD6PQYIdoeWwnwiUifZuPc8zuEQGQ0b2LS3D-aLxqX2JP5sCDMJk595CzNTDcN6ZV-ZOGL7tejzSIgtXIxA4ShmcFBGaEYaylyPu23LkhHzMlzIQwZOPeuV49tHwr3344fUYJnvUZ_Nyo1mfqpIhvHCA_MO6FqboB9B4g5Yjgzxw52X0uty2rixQg713MCyvDAWd6PKUeR-bIkJdRc0E-stMaOSaad0wEiFrQIZyXGryCA6gLy1SNzUf1JJzGZ3xTouVvEK32mqGVkzIZqpiwdUxlESBRmM-n2ilBCuMR8rBEpxYAXdtZKtt1o3phOcoC_wV1G9bTPzVQ0W5huMv8ApLX7aQ-0LVao1J-2XebKIk7vtGq2SZZ6FcZITqFaLqAiToihJlM1JscxSdGdHGrWezO_NjjJfaBg2_TWazB_v6BqFCIVxHIbwlyxmqxQYYJLmCC3itEDQV5IaUzazn4SErO7k2qqUtZUynwGp0mp4iOGgqTghVhzwx63eCrn-L-Hizqq-tnr_DyGYOHw">