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

    <tr>
        <th>Summary</th>
        <td>
            Maybe mis-optimization: Move const array optimized inplace to unname_addr const
        </td>
    </tr>

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

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

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

<pre>
    This happens in real word code in rust: https://github.com/rust-lang/rust/issues/73825
Clang and zig generates better IR so llvm could optimize const non-mutated arrays to `.rodata`.

Godbolt link of LLVM-IR: https://godbolt.org/z/PGdYYx54r
Consider this:
```llvm
define i32 @square(i64 noundef %x) local_unnamed_addr #0 {
  %base = alloca [256 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %base)
  store <4 x i32> <i32 67, i32 754, i32 860, i32 559>, ptr %base, align 16
  %1 = getelementptr inbounds [64 x i32], ptr %base, i64 0, i64 4
  store <4 x i32> <i32 368, i32 870, i32 548, i32 972>, ptr %1, align 16
...
  %_3 = and i64 %x, 63
  %16 = getelementptr inbounds [64 x i32], ptr %base, i64 0, i64 %_3
  %_0 = load i32, ptr %16, align 4
 call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %base)
  ret i32 %_0
}
```

I expect the above IR optimized to:
```llvm
@square.base = private unnamed_addr constant <{ [256 x i8] }> <{ [256 x i8] c"C\00\00\00\F2\02\00\00\\\03\00\00/\02\00\00p\01\00\00f\03\00\00$\02\00\00\CC\03\00\00\8D\00\00\00\DB\02\00\00_\01\00\00\98\02\00\00 \00\00\00\04\00\00\00\E4\03\00\00\E5\02\00\00\CB\00\00\00$\01\00\00\ED\00\00\00\E0\01\00\00\97\00\00\00\AC\03\00\00\09\03\00\00\1C\02\00\00\8F\00\00\00K\02\00\00\EB\02\00\00A\00\00\00\98\00\00\00\05\02\00\00r\03\00\00p\03\00\00\C8\02\00\00S\02\00\00r\01\00\00\85\03\00\00\ED\00\00\005\00\00\00\15\03\00\00\11\03\00\00\90\03\00\00\8A\02\00\00\80\03\00\00o\01\00\00<\01\00\00\88\01\00\00>\00\00\00\D9\01\00\00\A3\02\00\00\B3\02\00\00\19\01\00\00\C0\00\00\00\BD\01\00\00\CA\03\00\00\E1\00\00\00\A9\01\00\00t\02\00\00D\01\00\00B\01\00\00\CE\00\00\00\90\03\00\00c\03\00\00\CE\01\00\00\\\00\00\00" }>, align 4

define i32 @square(i64 noundef %x) unnamed_addr #0 {
 %_3 = and i64 %x, 63
  %0 = getelementptr inbounds [64 x i32], ptr @square.base, i64 0, i64 %_3,
  %_0 = load i32, ptr %0, align 4, !noundef !11
  ret i32 %_0
}
```

I know the IR that rustc generates is poor. I try to improve it but some people wonder if LLVM could do its marvelous job again with current IR.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV02P4jgT_jXmUurIceIEDhwgwKj1zkivelcrzanlJAV4xthZ2-mP-fUrJ9ANSbY1s7sSCsbUx1PlKtcT4Zw8aMQl4WvCNzPR-qOxS4-u_SZnpalfl78fpYOjaBrUDqQGi0LBs7E1VKbGbqd1niQrOHrfOJKsCNsRtjtIf2zLqDInwnZB5E4JfTivCdtJ51p0hO3yZM44oRtCV0UQAaFr-CEPcECNVnh0UKL3aOH-AZwBpZ5OUJlW1WAaL0_yB0JltPOgjb47tV54rEFYK14deAMko5E1tfAirHpH_fOTqUujPCipv4PZw-fPf3y5u3-YiKUXjIwNAfwgbPf_T_XXry88tWfgRjtZowV_lJ1a7yWj_SdA7rdq3EuNIBMGJKXuz1ZYJGwusxS0aXWNeyCMvxC2AGUqoR5brcUJ60dR1xYISyiQfN3bgiBaCodAkg0IFRSA8DXjGbyAnBO-IawAoeRBQ5xdlCqhFDwZWQcEAVmk5B69PGHkvLA-augZEeNZMNB4G1KrW6UuHglbXMw5b2xAUKTBacJIsg2_QoRZHtTDKufpZTnP6GXJ-YIk24uLN9NjyITxuAvygB4VnlD7oCF1GXLmQtDZxX0f9MBgiIZeFulPQE-y-Rvg_B1w-ra7yNkt9ngMPIqiqwgek_6cdN2h6I-5gCy5jjL778LsXF77p51tZUTdWbiCnr1jvyTngypBXf9ijVj0fckHFOfeyDeDJrnuzHvAlwYrD_6IIErzhKH5L-1egzcfNdlbZ0Vv3dFY-SQ8wk07dbeG0D4cOsnXg96BALGviIk_K8JYQXhB6c1jx8KK3ez1H5pcbbLdQKwJz_j9936kkY4NFyO7vJhvxqA264Hu48Ab4cViPpCBsR2ajve26RjDlk9gXQ91-4huUWwn0G_pBNp8LLeayAZdjPfiYoxuvhvY-99YZjvM4mqMoc_iIGvDbNgBpmaMsRiexm9TNm5zMucTJzHMJx_jiyf04ni8t6AT1baayOVQzgyxJsUE-vlIajtRyYux5ioZY1hP7MUTugUd-1hvJuRWE7mNJ2pw6MMPcAxtryd8TcQ9yn01UTPbsa3z1XPTdux8sY3u_F9mKB9xk58cePQfzLub2_1vxh4rfmry0esksAIIi9-DjOP4Xwyw79o8d-Pr_gH8UfiOJldXpFY6aIyxEdyDt6-BqcpTY8Ookx7K1oMzJ4QGTaMQno0O9FL2JPVMf2sD0js4CfuEyrQOvpkSxEFIDc_SH6FqrUXt4f4hmtXLpF4kCzHDZZzHeTpPOKez43JelZymfJ8xwQQXLOdU5HuOiCnfVzyeySWjLKUZTWmWck6jRZXnSb7fL-JyP08STlKKJyFV1LEEYw-zjtovF2kS85kSJSrXvV8wpvEZuj8JCyc6s8ugc1e2BxdYhnTevVvx0itcfhGvJcJJurvz9BdeGh0o-peQqp74d2T_ih5I3ShRYchpX6NX837WWrX84FWloxH9111jzTesbt5W-qieluyvAAAA__-JYXJz">