On 5/23/23 06:27, Richard Sandiford wrote:
Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
On 5/17/23 03:03, Jin Ma wrote:
For example:
(define_insn "mov_lowpart_sidi2"
    [(set (match_operand:SI            0 "register_operand" "=r")
          (subreg:SI (match_operand:DI 1 "register_operand" " r") 0))]
    "TARGET_64BIT"
    "mov\t%0,%1")

(define_insn "mov_highpart_sidi2"
    [(set (match_operand:SI            0 "register_operand" "=r")
          (subreg:SI (match_operand:DI 1 "register_operand" " r") 1))]
    "TARGET_64BIT"
    "movh\t%0,%1")

When defining the above patterns, the generated file insn-recog.cc will
appear 'switch (SUBREG_BYTE (op))', but since the return value of
SUBREG_BYTE is poly_uint16_pod, the following error will occur:
"error: switch quantity not an integer".

gcc/ChangeLog:

        * genrecog.cc (print_nonbool_test): Fix type error of
        'switch (SUBREG_BYTE (op))'.
Thanks.  Installed.

We shouldn't add to_constant just because it's a convenient
way of getting rid of errors :)  There has to be a good reason
in principle why the value is known at compile time.
Agreed. I fully expected the constant to be known at compile time. I wasn't aware we had real uses of polys in the SUBREG_BYTE field.


So I think this should be reverted.  Nothing guarantees that
SUBREG_BYTEs are constant on AArch64 and RISC-V.  And for SVE
it's common for them not to be.
That's fine with me.

Jeff

Reply via email to