# Reason to remove address spaces

**URL:** <https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932>\
**Category:** Internals & Design\
**Created:** [July 2, 2021, 12:07pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932 "2021-07-02T12:07:21Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![KavinduZoysa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kavinduzoysa/32/25259_2.png) [@KavinduZoysa](https://discourse.julialang.org/u/KavinduZoysa)\
**Post date:** [July 2, 2021, 12:07pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/1 "2021-07-02T12:07:21Z")

</div>

Hi all,

Can you please help me to understand the reason to remove address spaces as shown in [julia/llvm-remove-addrspaces.cpp at 5650c93f1aa45a17c10c9482e5d3e0042cf4cc6b · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/blob/5650c93f1aa45a17c10c9482e5d3e0042cf4cc6b/src/llvm-remove-addrspaces.cpp)

Thank you,  
Kavindu

---

<div class="post-metadata">

**Author:** ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)\
**Post date:** [July 2, 2021, 1:04pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/2 "2021-07-02T13:04:11Z")

</div>

Only the Julia-specific address space information (used to model the garbage collector) is removed, because certain LLVM back-ends don’t handle that information. It also makes the LLVM IR look ugly (if you pass `raw=true` to `code_llvm` the information is retained).

---

<div class="post-metadata">

**Author:** ![KavinduZoysa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kavinduzoysa/32/25259_2.png) [@KavinduZoysa](https://discourse.julialang.org/u/KavinduZoysa)\
**Post date:** [July 2, 2021, 1:13pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/3 "2021-07-02T13:13:44Z")

</div>

@maleadt Thank you, I was able to see the address space by passing `raw=true` as you mentioned.

So address spaces are removing using `RemoveJuliaAddrspaces` pass, because those information cannot be hadled by the LLVM back-end.

Can you please let me know at which phase address spaces are removed?

---

<div class="post-metadata">

**Author:** ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)\
**Post date:** [July 2, 2021, 1:18pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/4 "2021-07-02T13:18:11Z")

</div>

> <https://github.com/JuliaLang/julia/blob/4270d3b44e53e9fa68dcdbb6cb416d232615db4c/src/disasm.cpp#L448>

We don’t for the main CPU back-ends because those handle Julia’s address spaces (i.e. they ignore it). GPU back-ends do need to put the pass in their pipeline.

---

<div class="post-metadata">

**Author:** ![KavinduZoysa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kavinduzoysa/32/25259_2.png) [@KavinduZoysa](https://discourse.julialang.org/u/KavinduZoysa)\
**Post date:** [July 2, 2021, 1:40pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/5 "2021-07-02T13:40:54Z")

</div>

Since address spaces are used to identify GC-tracked pointers within the optimizations phases, after the optimization phases, is address space information used for some other reason?

---

<div class="post-metadata">

**Author:** ![jpsamaroo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jpsamaroo/32/46804_2.png) [@jpsamaroo](https://discourse.julialang.org/u/jpsamaroo)\
**Post date:** [July 2, 2021, 1:43pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/6 "2021-07-02T13:43:35Z")

</div>

Not the Julia addrspaces, but for GPU backends, non-zero addrspaces are used to identify the GPU memory region being accessed. For example, in the AMDGPU LLVM backend, 0 is used for Generic pointers, 1 is for Global pointers, 5 is used for Private (stack) pointers, etc.

---

<div class="post-metadata">

**Author:** ![KavinduZoysa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kavinduzoysa/32/25259_2.png) [@KavinduZoysa](https://discourse.julialang.org/u/KavinduZoysa)\
**Post date:** [July 2, 2021, 4:18pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/7 "2021-07-02T16:18:12Z")

</div>

@jpsamaroo, thank you for your input.

Let me summarize this. Please correct me if I am wrong.

- Julia uses address spaces for two purposes,
  1. Julia specific address spaces(AS) to identify GC-tracked pointers for optimization phases
  2. GPU backend-specific AS to identify GPU memory regions

- Julia specific AS are removed after the optimization phases.
- GPU backend-specific AS are not removed like that.

---

<div class="post-metadata">

**Author:** ![jpsamaroo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jpsamaroo/32/46804_2.png) [@jpsamaroo](https://discourse.julialang.org/u/jpsamaroo)\
**Post date:** [July 2, 2021, 6:23pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/8 "2021-07-02T18:23:27Z")

</div>

That sounds about right to me!

If you don’t mind me asking, why are you asking about these addrspaces? Are you doing any work on Julia’s optimizations passes?

---

<div class="post-metadata">

**Author:** ![KavinduZoysa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kavinduzoysa/32/25259_2.png) [@KavinduZoysa](https://discourse.julialang.org/u/KavinduZoysa)\
**Post date:** [July 2, 2021, 7:22pm UTC](https://discourse.julialang.org/t/reason-to-remove-address-spaces/63932/9 "2021-07-02T19:22:51Z")

</div>

Nope, I am reading on LLVM’s non-integral address space. Julia is the only thing I found that is used the non-integral address spaces.
