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

    <tr>
        <th>Summary</th>
        <td>
            [InferAddress] infer address space of the vector pointers.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    I would like to use the `InferAddress` pass to infer the address space of loading and storing operations.

In the `TestInferAS` test, i can obtain the desired result correctly, but it doesn't work in `TestInferAS2`.
```llvm
define void @TestInferAS(ptr addrspace(1) %out, i64 %offset, <4 x i32> %value) {
entry:
  %out.1 = addrspacecast ptr addrspace(1) %out to ptr
  %out.2 = getelementptr inbounds i32, ptr %out.1, i64 %offset
  store <4 x i32> %value, ptr %out.2, align 256
  ret void
}
define void @TestInferAS2(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) {
entry:
 %out.1 = addrspacecast ptr addrspace(1) %out to ptr
  %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index
  tail call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %value, <4 x ptr> %ptrs, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)
  ret void
}
declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32 immarg, <4 x i1>)
```
`opt test.ll -o opt.ll -S -passes=infer-address-spaces -assume-default-is-flat-addrspace`:
```llvm
define void @TestInferAS(ptr addrspace(1) %out, i64 %offset, <4 x i32> %value) {
entry:
  %out.2 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %offset
  store <4 x i32> %value, ptr addrspace(1) %out.2, align 256
  ret void
}
define void @TestInferAS2(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) {
entry:
  %out.1 = addrspacecast ptr addrspace(1) %out to ptr
  %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index
  tail call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %value, <4 x ptr> %ptrs, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)
  ret void
}
declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32 immarg, <4 x i1>)
```
My expected output looks like this:
```llvm
define void @TestInferAS2(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) {
entry:
  %ptrs = getelementptr inbounds i32, ptr addrspace(1) %out, <4 x i64> %index
  tail call void @llvm.masked.scatter.v4i32.v4p1(<4 x i32> %value, <4 x ptr addrspace(1)> %ptrs, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)
  ret void
}
declare void @llvm.masked.scatter.v4i32.v4p1(<4 x i32>, <4 x ptr addrspace(1)>, i32 immarg, <4 x i1>)
```

The reason seems to be that:
https://github.com/llvm/llvm-project/blob/release/16.x/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp#L463
https://github.com/llvm/llvm-project/blob/release/16.x/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp#L473
Does not support vector of pointers, and does not handle the intrinsic `@llvm.masked.scatter`.

When implementation of the appendsFlatAddressExpressionToPostorderStack, will triggers this assert:
https://github.com/llvm/llvm-project/blob/release/16.x/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp#L399
https://github.com/llvm/llvm-project/blob/release/16.x/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp#L415
It's also because doesn't support vector of pointers.

I want to do the infer address space for the `TestInferAS2`, how can I do this?

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWFFr4zgQ_jXKyxBjy46TPORht9lA4Q4OWjjuUbbGia6KJKRx0v77Q7KTttvttg0H1-MOgmNb8sw3M59G_ixCUFuDuGKzr2y2noiedtavroTzfwiznTRWPqyu4Wh7LUGrOwSy0AcE2iGwOr82HfovUnoMgdU5OBFCnKLi_TRJDIMQnGgRbAfaCqnMFoSREMj6eG4dekHKmpCxfM3yL8Px2pz83GKgwddNdEMYiPErUNAKA7YhoYapEoPyKMFj6DVBa73HlvRDnNz0BIpAWgyG8TnB0fo7UOY7-5zV-QlFnQ8_rQ_74ZbEThmEg1USWPUMF1848ineFCvji4LxJTA-s_2Atq7SVdcFTDdYeVXBPaiSs_JbHDoI3WN6aP518IeG_AMrx4TAaC0rgJXrR1-tCAQ_8R5L4sh_Z4QnI1sk1LhHQ9GAMo3tjQwJFL9KRk8-X8Yw2otlxFejeWYkGRVabQ3wWX0y4JFSSse0z9dvJZu_ne0TnLoa4Sgj8f6ytP9dWXfkwwVJfyWU0S4JpaEVWp8TFema7UW4Q5mFVhChzw6VKnl2qFzO-OL1Uo0jEfYwEiGnwpccqqdgijShvFIFkB8e_vlp-Y3x5ZsVb7XweGEkLwI4AVf7vfDb79Gf4ZzX-fnSOkpNJtMaphasG85uYBo7HAZWrlOLm47tbZrKH2AqQuj3OJXYiV7TVIVppwVNHxlS52dafd728t7O8G40H2gUr9j8l3aO_1vHf6p1_PoAeO-wJZRge3I9gbb2LozvTjsVLlv9_wBrP0C4j6O6jH_FO_n3AtDnJ-SL0N6O6MLNLR1vdwgeRbAGAuI-vbM3kaCCzizYEblEV75hfLNVtOubrLV7xjeJssPf1Hn7J7bE-KbRtmF841GjCMj4pqiz-yezVRy99cKEzvp9YHxz0wotPOObpzriJm2lWesc4-UvVV1-KjjzEc7aYgBjCULvnPUEB2zJ-qhwnFWGcKBaVDnyNHUnjNSDdlKGvDJBtVF9_JgcT3RIOv6-QwNq74a1mORS9JZElnNoZNhoQSPqb_cu_ilrbu1vNu67Ev0NifYuojoqrYG82m7Rh9SWIL7W-M9W_HK5_ExwqmI2ClNifB5A6BCXTSuiIn7Ula8z4rm6haMwaaeXduREFM3PBXNn_Q80cNSosY47e0wK-HowEXeXzWB8IlelXJZLMcFVUS94sajmy3yyW5Vihm1dV5h3Rd2IblEu2xZxyUs-X84xn6gVz3mZV5wX87Is8mwhOcd5UbcFb7u8WbIqx71QOkuctX47USH0uKp5mfOJFg3qkL4ncG7wCGmQcc5m64lfpTI1_TZEzqtA4dEKKdLpQ8Szjwqz9Q_zMhJ_TPE5v5Pe69WHyZIgRg6kEP4KAAD__3hhLd4">