aboutsummaryrefslogtreecommitdiff
path: root/gcc/recog.c
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2018-03-08 15:50:25 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2018-03-08 15:50:25 +0000
commitc8574943c1178b72c96c34eca2f2e684201260f4 (patch)
tree005276771a440d1d92a8b12943f3a1ea917fe037 /gcc/recog.c
parent24545562ca5ece2615f8178ad6c6eb0be4fe6b3f (diff)
downloadgcc-c8574943c1178b72c96c34eca2f2e684201260f4.zip
gcc-c8574943c1178b72c96c34eca2f2e684201260f4.tar.gz
gcc-c8574943c1178b72c96c34eca2f2e684201260f4.tar.bz2
[AArch64] PR target/84748: Mark *compare_cstore<mode>_insn as clobbering CC reg
In this wrong-code PR the combine pass ends up moving a CC-using instruction past a *compare_cstore<mode>_insn insn_and_split. After reload the *compare_cstore<mode>_insn splitter ends up generating a SUBS instruction that clobbers the condition flags, and things go bad. The solution is simple, the *compare_cstore<mode>_insn pattern should specify that it clobbers the CC register so that combine (or any other pass) does not assume that it can move CC-using patterns across it. This patch does that and fixes the testcase. The testcase FAILs on GCC 8 only, but the buggy pattern is in GCC 6 onwards, so we should backport this as a latent bug fix after it's had some time to bake in trunk. Bootstrapped and tested on aarch64-none-linux-gnu. PR target/84748 * config/aarch64/aarch64.md (*compare_cstore<mode>_insn): Mark pattern as clobbering CC_REGNUM. * gcc.c-torture/execute/pr84748.c: New test. From-SVN: r258366
Diffstat (limited to 'gcc/recog.c')
0 files changed, 0 insertions, 0 deletions