diff options
author | Manolis Tsamis <manolis.tsamis@vrull.eu> | 2024-08-20 09:16:29 +0200 |
---|---|---|
committer | Philipp Tomsich <philipp.tomsich@vrull.eu> | 2024-08-23 20:19:55 +0200 |
commit | a9f5e23aba1a6f4ec32f1147b340a8145d827da9 (patch) | |
tree | 8a1d9a1b9573204188842d8536b268d338c59b9c /libgcc/config/rx | |
parent | c9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b (diff) | |
download | gcc-a9f5e23aba1a6f4ec32f1147b340a8145d827da9.zip gcc-a9f5e23aba1a6f4ec32f1147b340a8145d827da9.tar.gz gcc-a9f5e23aba1a6f4ec32f1147b340a8145d827da9.tar.bz2 |
ifcvt: Do not overwrite results in noce_convert_multiple_sets [PR116372, PR116405]
Now that more operations are allowed for noce_convert_multiple_sets,
it is possible that the same register appears multiple times as target
in a basic block. After noce_convert_multiple_sets_1 is called we
potentially also emit register moves from temporaries back to the
original targets. In some cases where the target registers overlap
with the block's condition, these register moves may overwrite
intermediate variables because they're emitted after the if-converted
code. To address this issue we now iterate backwards and keep track
of seen registers when emitting these final register moves.
PR rtl-optimization/116372
PR rtl-optimization/116405
gcc/ChangeLog:
* ifcvt.cc (noce_convert_multiple_sets): Iterate backwards and track
target registers.
gcc/testsuite/ChangeLog:
* gcc.dg/pr116372.c: New test.
* gcc.dg/pr116405.c: New test.
Diffstat (limited to 'libgcc/config/rx')
0 files changed, 0 insertions, 0 deletions