<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145398>145398</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Failure to recognize that `int` and `int[1]` cannot alias
</td>
</tr>
<tr>
<th>Labels</th>
<td>
missed-optimization,
TBAA
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Kmeakin
</td>
</tr>
</table>
<pre>
Thanks to C's strict aliasing rules, `s->x` and `a->xs[0]` cannot alias.
Therefore the second load of `s->x` in `src` is unnecessary.
https://godbolt.org/z/dcEPvE3ef
```c
typedef struct Singleton {
int x;
} Singleton;
typedef struct Array {
int xs[1];
} Array;
int src(Singleton* s, Array* a) {
s->x = 0;
a->xs[0] = 1;
return s->x;
}
int tgt(Singleton* s, Array* a) {
s->x = 0;
a->xs[0] = 1;
return 0;
}
```
```asm
src:
mov w8, #1
str wzr, [x0]
str w8, [x1]
ldr w0, [x0]
ret
tgt:
mov w8, #1
str wzr, [x0]
mov w0, wzr
str w8, [x1]
ret
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVMFuozAQ_ZrhMkpkDAQ4cCBNuexlpe0PGOMQb40d2Sbb5OtXJm7Sdltto0hoPG_evHmYYc7JUQvRQLGFYpew2R-MbX5Mgj1LnfRmODdPB6afHXqDD0BLh85byT0yJZmTekQ7K-GAPiBsiFtB9vgCG4JMD-GALQcOii2BYhcSnGltYvkaSPt0EFbsjRXoDwKd4EYPqAwb0OzfU0q9xJYvgcNZa8GFc8yeAxGQ9uD90UHWAu2AdqMZeqP82tgRaHcB2g388efpMRP7AN-Q658Daf35KAaxD7PN3OMvqUclvNEI5RZIi4gotccXyEII5e4OiUf_cLTWsvPH-mBEGoy48SywG0cAhQFpdeenLS72XpG0RQa0fkN8NQgh2yG5EuF715dUGlOIaIWfrY51NyV3AX703xfwSXfE7wkg73q_vo6rjlvI3ASkDZ5k4RwncwoU-KdarhzN0ki6WOHtNXmxS7bYvizX7hNE9QpII0ANMUO-KLXCxxc9-igm_v6r6Ws9t9Kla8B9R2uU8upRMjTZUGc1S0STlgUpSZXnZXJoOCFZ2W-qjFVFUfflftjnJa1Zvx84L9MikQ0ltCAbmqV1kZNy3fckZWRIK15XdZbXkBMxManWSp2m8CUl0rlZNGleZHWVKNYL5ZbtQekknRPDyhy9nOSFeRnuDgX6AJQ-bds2BMUusU3gWvXz6CAnSjrv7uxeeiWajkk1h41g0ApuRi0vYT0wHxaA1P7NgglR_KY-LJdktqr5sBGkP8z9mpsJaBd6xsfqaM1vwT3QbhnPAe3ihKeG_g0AAP__k8Fveg">