[Bug target/84748] [8 Regression] wrong code with u128 at aarch64 at -O and and above
ktkachov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Mar 8 15:51:00 GMT 2018
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
More information about the Gcc-bugs
mailing list