On 5/8/24 1:36 AM, Christoph Müllner wrote:
The combiner attempts to optimize a zero-extension of a logical right shift
using zero_extract. We already utilize this optimization for those cases
that result in a single instructions.  Let's add a insn_and_split
pattern that also matches the generic case, where we can emit an
optimized sequence of a slli/srli.

Tested with SPEC CPU 2017 (rv64gc).

        PR 111501

gcc/ChangeLog:

        * config/riscv/riscv.md (*lshr<GPR:mode>3_zero_extend_4): New
        pattern for zero-extraction.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/extend-shift-helpers.h: New test.
        * gcc.target/riscv/pr111501.c: New test.
        * gcc.target/riscv/zero-extend-rshift-32.c: New test.
        * gcc.target/riscv/zero-extend-rshift-64.c: New test.
        * gcc.target/riscv/zero-extend-rshift.c: New test.
Doesn't your new pattern still match this one:

;; Canonical form for a zero-extend of a logical right shift.
(define_insn "*lshrsi3_zero_extend_2"   [(set (match_operand:DI                   0 
"register_operand" "=r")
        (zero_extract:DI (match_operand:DI  1 "register_operand" " r")
                         (match_operand     2 "const_int_operand")
                         (match_operand     3 "const_int_operand")))]
  "(TARGET_64BIT && (INTVAL (operands[3]) > 0)
    && (INTVAL (operands[2]) + INTVAL (operands[3]) == 32))"
{
  return "srliw\t%0,%1,%3";
}
  [(set_attr "type" "shift")
(set_attr "mode" "SI")])

Meaning that we'll start generating shift-pairs for this special case rather than using srliw directly. I'm pretty sure Lyut and I stumbled over this exact problem when evaluating his effort in this space.

?

Jeff

Reply via email to