https://gcc.gnu.org/g:4ef09dd8ce8866e4f64dd918890c97a67af8fd15
commit r14-10187-g4ef09dd8ce8866e4f64dd918890c97a67af8fd15 Author: Georg-Johann Lay <a...@gjlay.de> Date: Tue May 7 19:39:55 2024 +0200 AVR: target/114975 - Add combine-pattern for __popcountqi2. PR target/114975 gcc/ * config/avr/avr.md: Add combine pattern for 8-bit popcount detection. gcc/testsuite/ * gcc.target/avr/pr114975-popcount.c: New test. (cherry picked from commit c8f4bbb824fafecf021a802324cd79e64b03b947) Diff: --- gcc/config/avr/avr.md | 13 +++++++++++++ gcc/testsuite/gcc.target/avr/pr114975-popcount.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 97f42be7729c..36fe384828f9 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -8527,6 +8527,19 @@ operands[2] = gen_reg_rtx (HImode); }) +(define_insn_and_split "*popcounthi2.split8" + [(set (reg:HI 24) + (zero_extend:HI (popcount:QI (match_operand:QI 0 "register_operand"))))] + "! reload_completed" + { gcc_unreachable(); } + "&& 1" + [(set (reg:QI 24) + (match_dup 0)) + (set (reg:QI 24) + (popcount:QI (reg:QI 24))) + (set (reg:QI 25) + (const_int 0))]) + (define_insn_and_split "*popcounthi2.libgcc_split" [(set (reg:HI 24) (popcount:HI (reg:HI 24)))] diff --git a/gcc/testsuite/gcc.target/avr/pr114975-popcount.c b/gcc/testsuite/gcc.target/avr/pr114975-popcount.c new file mode 100644 index 000000000000..87eb56b56c5a --- /dev/null +++ b/gcc/testsuite/gcc.target/avr/pr114975-popcount.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-Os" } */ + +typedef __UINT8_TYPE__ uint8_t; + +uint8_t use_pop1 (int y, uint8_t x) +{ + return 1 + __builtin_popcount (x); +} + +uint8_t use_pop2 (uint8_t x) +{ + x += 1; + return 1 - __builtin_popcount (x); +} + +/* { dg-final { scan-assembler-times "__popcountqi2" 2 } } */