<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145363>145363</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
riscv64 and aarch64 backends propagating range metadata too aggressively
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
let's take this function:
```llvm
define i32 @f(ptr %0) {
%2 = load i32, ptr %0, align 4, !range !0
%3 = load i32, ptr %0, align 4
%4 = add i32 1206154280, %3
ret i32 %4
}
!0 = !{i32 1, i32 2, i32 3, i32 4}
```
both the risc64 and aarch64 backends lower it to something that does an `or` instead of an `add`:
```
f:
lw a0, 0(a0)
lui a1, 294471
addi a1, a1, 1064
or a0, a0, a1
ret
```
this would work fine if it was `%2` that was getting added, but it's `%3`. if the range invariant isn't respected by the data in memory `%2` harmlessly gets poison, but this doesn't allow us to infer anything about `%3`
cc @nunoplopes
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVG-PuygQ_jT4ZvJrEAXtC190d9PvMcqo3FIwgG367S9gm9275JJrGh3hmX_PPIAxmsURDUx-MPlV4Z5WH4ZAC62hGr1-DpYSE12EhN8EaTUR5t1NyXjHmgvjF6b48bf2fmP8omk2jsA0AljLZyb6LQVgQnImzsC6D8YvkL8FsOYLrEedwUx8wg_wE9CaxUGbTSbqgG6hbPC3d_O_vF_gtoBRFyzUgqtatqLnR3TZFFygdFQtZHZk3Vd-8kvOWvyZqFn3USJkx2yIt9G8jfbl92aF8cvo0wppJQgmTqoFdBoQw7SqFkacvsnpCNY_KIBJkDxEf6O0GrdAWjGB9hQBHTDFfWCKg3ExEWrw82sZtc6p_jkPxi_zsQSvn30Alp45E322zr83d1PeWJoT57bt6l_bqLX52T6eNVeFYh9emIN7_kL8OAdK_6qsCOnhd6vh4cM3HJqZMwEPjLmnrJDcbKEgry2UUuYEtSadU4x7AnOI88A3TPFTjlLILpIx7o7BoEtgomOiSxAobjQl0jA-C1BjQjAObnTz4fk79YrhZilG-8zJI2zeRO_eqUsLeTZHXLTWP2CPeYDGzRQA3fOYIo5-T79qPHQ1TfmAuN35zfqNIjB-qfTQ6HNzxoqGupNcnfv2LKt1wPPU9Yo3tcJJ1o1Ssq8bIeZazq2qm74yg-BCciWauuN9LU9STarrpVZ9p2Y1StZyuqGxp3xOTz4slYlxp6FuZaOayuJINpZ7QAhHDyi7TIh8LYQhO_0Z9yWyllsTU_wJk0yyNGRt3_9L3FvwGy5YxnfM5UYJC_HJe8BlCRSjuZN9Vnuww5rSFrN2xZWJ62LSuo-nyd-YuJZb5nj92YL_i6bExLUUG5m4vrq5D-LvAAAA__-_j2Yv">