rs6000: powerpc suboptimal boolean test of contiguous bits [PR102239]
authorXionghu Luo <luoxhu@linux.ibm.com>
Mon, 13 Dec 2021 05:17:13 +0000 (23:17 -0600)
committerXionghu Luo <luoxhu@linux.ibm.com>
Tue, 11 Jan 2022 09:20:43 +0000 (03:20 -0600)
commit19d81fda48f30c4fc11c8912749351acd9159c17
tree3715827fd18e96c63b6f582684880e9a7de4d183
parent8e86086bd33134467cc9c2a75327d1238dc71df9
rs6000: powerpc suboptimal boolean test of contiguous bits [PR102239]

Add specialized version to combine two instructions from

 9: {r123:CC=cmp(r124:DI&0x600000000,0);clobber scratch;}
       REG_DEAD r124:DI
 10: pc={(r123:CC==0)?L15:pc}
      REG_DEAD r123:CC

to:

 10: {pc={(r123:DI&0x600000000==0)?L15:pc};clobber scratch;clobber %0:CC;}

then split2 will split it to one rotate dot instruction (to save one
rotate back instruction) as shifted result doesn't matter when comparing
to 0 in CCEQmode.

Bootstrapped and regression tested pass on Power 8/9/10.

gcc/ChangeLog:

PR target/102239
* config/rs6000/rs6000-protos.h (rs6000_is_valid_rotate_dot_mask): New
declare.
* config/rs6000/rs6000.c (rs6000_is_valid_rotate_dot_mask): New
function.
* config/rs6000/rs6000.md (*branch_anddi3_dot): New.

gcc/testsuite/ChangeLog:

PR target/102239
* gcc.target/powerpc/pr102239.c: New test.
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md
gcc/testsuite/gcc.target/powerpc/pr102239.c [new file with mode: 0644]