https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84748
--- Comment #3 from ktkachov at gcc dot gnu.org --- Author: ktkachov Date: Thu Mar 8 15:50:25 2018 New Revision: 258366 URL: https://gcc.gnu.org/viewcvs?rev=258366&root=gcc&view=rev Log: [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. Added: trunk/gcc/testsuite/gcc.c-torture/execute/pr84748.c Modified: trunk/gcc/ChangeLog trunk/gcc/config/aarch64/aarch64.md trunk/gcc/testsuite/ChangeLog