<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/58866>58866</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            GlobalISel falls back for thread-local variable access
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            globalisel
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          BertalanD
      </td>
    </tr>
</table>

<pre>
    GlobalISel cannot select the new `@llvm.threadlocal.address` intrinsic that was introduced in 9701053517100045ca9fb0fd81233314ab08f600.

Example C code:
```c
_Thread_local int foo;

int main(void) {
    foo = 2;
    return foo;
}
```

Generated IR:
```llvm
@foo = thread_local global i32 0, align 4, !dbg !0

define i32 @main() local_unnamed_addr #0 !dbg !14 {
  %1 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @foo), !dbg !18
  store i32 2, ptr %1, align 4, !dbg !19, !tbaa !20
  ret i32 2, !dbg !24
}

declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1

attributes #0 = { mustprogress nofree nosync nounwind ssp willreturn memory(write, inaccessiblemem: none) uwtable(sync) "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8a,+zcm,+zcz" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```

Compile with Clang trunk using `--target=aarch64-apple-darwin22.2 -fglobal-isel -Rpass-missed=gisel-* -O2` ([Godbolt](https://godbolt.org/z/baxbj7Wja)):
```
<source>:4:5: remark: cannot select: %0:gpr64sp(p0) = G_INTRINSIC intrinsic(@llvm.threadlocal.address), %1:gpr(p0) [-Rpass-missed=gisel-select]
    foo = 2;
    ^
warning: Instruction selection used fallback path for main [-Wbackend-plugin]
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVk1v4zgM_TXORXAgy3biHHJo02nRyywwM8AcC1qWHbWyZEhyM51fv5RsJ2nnY7dIY0qmyEfyiUxtmrf9gzI1qMevQhEOWhtPnFCCe-KPgmhxIsmGJgVV6rVf-6MV0CjDQa2haaxwDt8Sqb2V2kmOZ8CTE7i4ZZqRiwZFstvSjJZ5mW0zSmlRcti1NW2bKmN5nmcF1LRqN5SuE3qX0Jvp-9MP6AclyIFw04gkn7cDnPjh0_rpWwT1FFEFv6Q1Jslvr02F3R6kTlj1amSTsB1JtrMGwT88QZL8jrDzubBrhR-tfm9ue_cBxbWbB6GFBY8xP375FW_I4LxV0MWjvwbfxVIQmTNCE3YgoGSnSRHEhGVN3YXHO4-NaKUW8QQanUMM4UWDT6PW0IvmKdQKz-b0yk5WXOcgYWU2AQIZiKDU4p0M3pK_EGA9INYqKC0HpvAQxXvgWbU4c97YCTQLKtEB-v9jyNliydcA4cnoYgprdDF0OcGKj_Wa08UVoGtttB4xxP8d2nwgEofl2bVN8Ej-evTCzRnGJGJiST86P1jTBUN4vrUi-HVvmuNj1CepG-LcQE5SqZlpveiNfUOXJyu9CBFJDZyjAVkrgW-RVAGKCDjGkwfcRe1gc0LGWov1TgeDhBcW1wgGv_FIqgS0KAalXoZlByp9xXtubHqSjT-etemspk3qLQyD1F3aw5WCt6OYdZwH_pJimH6yVI9tK2zq5E9xVq9mXQ-2Ez7lw3h-hdaVSPvsvUYrANMh3FktYbcQlgcUuOWL8DZ4M8mNCalupkU7pGD712pZZZu2V_MCaxg2ppVyYhK0MHqSLMxuLB9mP7bpJ8EdgZ2lfJb6YhJeq3UGZ5FdxPwiFhexPIuz8JP3i_AzZmMh7nt6ZX-iV7ixNdbij0wbBB8VRMr8lnILrf7e4Q6mH2S04I_koEB3BNmgX8jokCZhVKTpVEXECWD5cVOkU5UbsIiEsTUjaTt1ulTiqCHplwGcS3vpnGjwWBd204TdkPQfFsZLaGnl7YNpaqN8UiIjqqP3gwstlt3jp5terY3tcIX5u6_hR_28_f4MsQvtfm3G8zI_ODNajtPlE-oU-F-GO2ZFD_YlSO9GYtjARkXx2Q12U7ghtAca04ZleXh6_Pzty-Pnr4-Hy0gM4P8yPZcmid0vGr0YLG9_n5gZSnn3X-MrKT9NixNYjdUJ6B-1w3pxL42eYwrSiPZJuzBowLuOJm2cmBHH97AvdJMOauxwxJQfKbIS-2yz2VZVlRds1ezzZpfvYOWlV-L6B0bw4Uj0EhxMCUmn4fcKVkZ2Th1vNVq1_1BmJN1Yr7nBq3Ifp-n0CP3nOeSE3WOqxtAp7suq2mxWx_1OZG1V87wGtqPbdkvbXYO_QHZZXRe8FNuVgloot8cw8drNcaLHm5vI3dh8Qn3YxNhQgbBX3q3knlGGs4lWdJPtKFvTTcsY3253ZV1Vosqw7Egjqdax-MjNld1HuPXYucAJ6by7vMRS4-gTIkJB-zD6o7H7W2E94EVDhyG2fQzsXxMy54o">