<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/90446>90446</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Align attribute doesn't dereferenceability
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nunoplopes
</td>
</tr>
</table>
<pre>
InstCombine does the following propagation of align(32) in the function argument to the load.
However these `align` have different semantics. Align in load/store imply dereferenceability of the size rounded up to the alignment (per LangRef). Align in a function argument does not.
```llvm
define i32 @foo2(ptr align(32) %a) {
%#0 = load i32, ptr %a, align 4
ret i32 %#0
}
=>
define i32 @foo2(ptr align(32) %a) {
%#0 = load i32, ptr align(32) %a, align 32
ret i32 %#0
}
Transformation doesn't verify! (unsound)
ERROR: Source is more defined than target
Example:
ptr align(32) %a = pointer(non-local, block_id=1, offset=0)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0U01v6zYQ_DWrCxGDXurzoIMTxWiBAgXc3gtKWslsKVIgKafury8oOmnQl8O7PMCwJHJnZ2Y_pPdqNkQtFM9QdJncwtW61mzGrtqu5LPejvf2Z-PDi116ZYiNljwLV2KT1dq-KTOz1dlVzjIoa5idmNRqNoC1QMCGKZOiNzPsAdLN20ImsGD3C23leADeAT_9ZN_oRi4ee2JQ8pSp5Owqb8RGNU3kItTTIk1Qgz-wUwyJJDEP4NkH64ipZdV3NpKjHTGQ7JVW4R7lRVKv_iHm7GZGGtm2vmvZ-XZxgPVKjv0izXyhCbD5xCS_MLNXxdjwcPL4L3n6aX1b0tFIUyyiEsgg55O1GJmC-1_RAAu5P6vnhGPxCFBwBqLbvcYcgC8sglP4S0rC8neIo5CYEvQhquoeL6ID8fojZX0Ffhcp8PtU_u6k8ZN1SxqvWGcDWAV2I6emO-Ax9mozPjYTsEmo18vl1wuIE_vNbm4gpjxb4lwknyMLV2lYkG6m8Llhr3_LZdUE4vH9tYnd62qVCeQAa2PNk7aD1NFcr-3w1x9qBNEd47edJk8BRMc_tH1MRTa2YmxEIzNqj9UxF3WBRZVd2yGfjkN5bEQxFAUf-UQNn4q6ruqyrEVdZ6pFjjnPsTlyXonqkNfU9xJRFlPZS15DzmmRSh_i5B2smzPl_UZtw_O8zLTsSft95xEX5Qe7rErvBQaM3QPEfWTFSRkfhrT58aroMtfGq6d-mz3kXCsf_H8sQQVNbdoUGYJT_RboU9O-3chsc7q9hrD6WHU8A55nFa5bfxjsAnjedaTH0-rsnzQEwPPuxgOed0P_BgAA__9e1XW3">