AArch64: use stable sorting in generating ldp/stp
In some corner cases, we have code as below: [base + 0x310] = A [base + 0x320] = B [base + 0x330] = C [base + 0x320] = D unstable sorting could result in wrong value in offset 0x320. The patch fixes it by using gcc_stablesort. 2021-07-28 Bin Cheng <bin.cheng@linux.alibaba.com> * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): use gcc_stablesort.
This commit is contained in:
parent
0f95c6b2f7
commit
b662250c1f
1 changed files with 10 additions and 2 deletions
|
@ -24441,8 +24441,16 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load,
|
|||
for (int i = 0; i < 8; i ++)
|
||||
temp_operands[i] = operands[i];
|
||||
|
||||
/* Sort the operands. */
|
||||
qsort (temp_operands, 4, 2 * sizeof (rtx *), aarch64_ldrstr_offset_compare);
|
||||
/* Sort the operands. Note for cases as below:
|
||||
[base + 0x310] = A
|
||||
[base + 0x320] = B
|
||||
[base + 0x330] = C
|
||||
[base + 0x320] = D
|
||||
We need stable sorting otherwise wrong data may be store to offset 0x320.
|
||||
Also note the dead store in above case should be optimized away, but no
|
||||
guarantees here. */
|
||||
gcc_stablesort(temp_operands, 4, 2 * sizeof (rtx *),
|
||||
aarch64_ldrstr_offset_compare);
|
||||
|
||||
/* Copy the memory operands so that if we have to bail for some
|
||||
reason the original addresses are unchanged. */
|
||||
|
|
Loading…
Add table
Reference in a new issue