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

    <tr>
        <th>Summary</th>
        <td>
            Legalized load leads to unexpected alias analysis result
        </td>
    </tr>

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

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

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

<pre>
    ```llvm
%elt = type <{ [1 x i8] }>

define signext i32 @foo() {
entry:
  %idx = alloca [5 x %elt], align 1
  %idx1 = getelementptr inbounds i8, ptr %idx, i64 3
  store i8 68, ptr %idx1, align 1
  %r = load <5 x i8>, ptr %idx, align 1
  %r1 = icmp eq <5 x i8> %r, <i8 46, i8 46, i8 46, i8 52, i8 43>
  %r2 = extractelement <5 x i1> %r1, i32 0
  %r3 = sext i1 %r2 to i32
  ret i32 %r3
}
```

I found this case doesn't work as expected on both AArch64 and PowerPC, but this should be a generic problem. I pick vector size as 5 here because it's almost illegal on all platforms, other illegal types like `<4 x i8>` or `<2 x i16>` also have such issue on PowerPC.

### Problem

In the final generated assembly, load might be scheduled before the store, because they don't have memory dependency:

```
SU(1):   STRBBui %0:gpr32, %stack.0.idx, 3 :: (store (s8) into %ir.idx1)
  Predecessors:
    SU(0): Data Latency=3 Reg=%0
SU(2):   %1:fpr64 = LDRDui %stack.0.idx, 0 :: (dereferenceable load (s64) from %ir.idx)
  Successors:
    SU(5): Data Latency=3 Reg=%1
```

The reason is that AA thinks it's NoAlias if the load size is larger than the alloca: https://github.com/llvm/llvm-project/blob/2ada5cbea47bdf7d8df70981315f352237cc2222/llvm/lib/Analysis/BasicAliasAnalysis.cpp#L1507-L1516

But such legalization is necessary. And the legalizer tries to find suitable load size from large to small (for example, to find suitable memory type for `<2 x i16>` on PowerPC, it looks for `i128`, then `i64`, and stopped, although `i32` is better and won't touch any extra stack space): https://github.com/llvm/llvm-project/blob/2ada5cbea47bdf7d8df70981315f352237cc2222/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp#L6600-L6617
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VsGSmzgQ_Rp8UcUFwoA5-GCPd1KpmtqaymRzF9AY7QjESmIS5-v3SWCPk0x2ay875cFGdKtfd7_XotLNeRfl8fxR6qWP4mMU7yOekXIsSo_MnUfCj7uoOLAoOyTsK5PbKDuyqDhG6W-Lfbg21MqBmJWngb46JlPOok3cah3xbcRLeBxmQxqcOUfp4sYYwsnmawgnlNK18JEyRJpxIFrE7_AIG7Pke6ckeJ3IkaIe-47OMDlUehoa64HCzy_Nxv5O5huWXvawThuCGct_sEzeDmhCNKVF40uSzbVAEX6K8obrjFTW_cjor-_cw2PvhUVg2eQB51s_Mn5ZSa-1n3fnYXeU3Yj6UotrkOQSJKTl-xLf-qbB14aeJctuTnu7i5WhpZ3eemk52j__uNDnlgofWOtbwFwnLauFJdZoskPEC8e-aPPMhAXYkYC1YXpglXYd2-9N3aE9Ao6P-guZxzuPt5rcvI_t9KQaVhET6PhARtZsNLpCtmv2gY2yfmYv2FIbcPAb-RgZ6wgdrqgWE0BIBwQW3em1RUZK0UkoHx-0Y6MSrtWmtz4o8JC5WngRWKbkM6SARNO7zbX1ecwQb17lodj5siyU1awTL1DEVHdMWjuRj7Wktr6tV8TT-cMe54S-K-aA_IlBXIASEhe-bMJa6it19nADJXt56pwvj607aiZFvlatZ7h3D1wP9VyKgcUz2jI3JeDsqdcGazTS0NBQv2r0zVY__QFhg1IlzBhjT58-Hg6T9CRBMfan0aSBrri3TtTP63i9qMMTbu-d4D9L0P8IM0IOYJ7XkVnPMiwvHHw01FBN1mpjb2YH4noY8QLjKJxgD6hPQH9M2Uc64TtgegXNr6DxAOrYt6MB8bwMHo4fj3MSP4COb0A3IFWL_6EmgW4tEwE55BufRGt0_5rETQ5PU_3LDLJ_zSD5B8F9QocNCQt-QSmuEw5y8rIZnu2F9r_rvZIQhWwDIQLoIBR4KGFOIDwcZ7LNc9jj6ZwbA1x-j89Jum6q1rXucRMOjPnrHYT4J7SH20rpCl9cNCKrKxKbomraotniEpfbJE2yNs04T4u65vi72Ud6vz1YfrYSKrw_CCvrgPmyuK7HESp5SLK4eIcrxHZThAMmRdBaUK38Jpyc6zEE4ghzXrN9mEp0MfE5Gwlxg3YQGAoySffa01Ce0M5QIG9lez8s0DAoCzNM9KMKsvppg0VN4QBtfzEjXsdBmMwOUTUatpjLBAcnvPzuHQ1hCQybV_yUhHjGkZr5xHEYj6cuGEF42ByJV-QcUvS2XxalO-0rJIbzfFqwQHNmR1HTwsD_u-N3uqH3BHT3Tzi5at-04_49bh-WHn0OQ_2TH8IXAuR5HL_DNSlWtEvyfJuVCcdNs0ubMi3FykmnaHfZoZnbqUg0odXTcD19RNCEWAgGEdlJudVk1O4_1yGMeE_crIw5X3W7OC2SKtm0SZ5VRZInCc-zsiy2lFdNXObJSomKlN3hdSfivEIjMHgRcTkJI74M0JtHV7pwvBat5I4jUpIkeVymaVqsi4qqTVby7Wa74VVR4gWMeiHV2kNda3NamV1AXU0ni4dKWmdfH-JM8W9vFBBhfzGBVWZH9UCwJLsKKe5Cfn8DVOEOTQ">