combine: Fix up simplify_shift_const_1 for nested ROTATEs [PR97386]
authorJakub Jelinek <jakub@redhat.com>
Tue, 13 Oct 2020 17:13:26 +0000 (19:13 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 13 Oct 2020 17:13:26 +0000 (19:13 +0200)
commitf76949cee9560d04d5417481dbcda5ca089c9ebc
treeea08e15479dd07b8d8fc78dd9c1f8ed4b36fc985
parent0e0beddd7fb4c0d2157c7f0c7d3f39e9533bb323
combine: Fix up simplify_shift_const_1 for nested ROTATEs [PR97386]

The following testcases are miscompiled (the first one since my improvements
to rotate discovery on GIMPLE, the other one for many years) because
combiner optimizes nested ROTATEs with narrowing SUBREG in between (i.e.
the outer rotate is performed in shorter precision than the inner one) to
just one ROTATE of the rotated constant.  While that (under certain
conditions) can work for shifts, it can't work for rotates where we can only
do that with rotates of the same precision.

2020-10-13  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/97386
* combine.c (simplify_shift_const_1): Don't optimize nested ROTATEs if
they have different modes.

* gcc.c-torture/execute/pr97386-1.c: New test.
* gcc.c-torture/execute/pr97386-2.c: New test.
gcc/combine.c
gcc/testsuite/gcc.c-torture/execute/pr97386-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr97386-2.c [new file with mode: 0644]