https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93333

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |wilson at gcc dot gnu.org

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Can't reproduce with very similarly configured cross.
I do see:
Trying 14 -> 15:
   14: r86:SI=r90:SI 0>>r89:SI#0
      REG_DEAD r90:SI
      REG_DEAD r89:SI
   15: r87:SI=r86:SI&0x1f
      REG_DEAD r86:SI
Failed to match this instruction:
(set (reg:SI 87)
    (zero_extract:SI (reg:SI 90)
        (const_int 5 [0x5])
        (zero_extend:SI (subreg:QI (reg:SI 89) 0))))
Failed to match this instruction:
(set (reg:SI 87)
    (zero_extract:SI (reg:SI 90)
        (const_int 5 [0x5])
        (and:SI (reg:SI 89)
            (const_int 255 [0xff]))))
and
Failed to match this instruction:
(set (reg:SI 88 [ i ])
    (lshiftrt:SI (reg/v:SI 84 [ i ])
        (subreg:QI (zero_extract:SI (reg:SI 90)
                (const_int 5 [0x5])
                (zero_extend:SI (subreg:QI (reg:SI 89) 0))) 0)))
Failed to match this instruction:
(set (reg:SI 88 [ i ])
    (lshiftrt:SI (reg/v:SI 84 [ i ])
        (subreg:QI (zero_extract:SI (reg:SI 90)
                (const_int 5 [0x5])
                (and:SI (reg:SI 89)
                    (const_int 255 [0xff]))) 0)))
etc. in the combine dump, but no such zero_extract was ever matched (I couldn't
see how it could be, all the zero_extract riscv patterns require CONST_INT in
the last two operands) and I see no ZERO_EXTRACT in all the set_src_cost calls
called from make_extraction.

So, any special tuning/whatever that isn't shown?

The fix would likely be something along the lines of
--- gcc/config/riscv/riscv.c    2020-01-12 11:54:36.385413831 +0100
+++ gcc/config/riscv/riscv.c    2020-01-20 20:06:04.729542828 +0100
@@ -1642,7 +1642,10 @@ riscv_rtx_costs (rtx x, machine_mode mod

     case ZERO_EXTRACT:
       /* This is an SImode shift.  */
-      if (outer_code == SET && (INTVAL (XEXP (x, 2)) > 0)
-         && (INTVAL (XEXP (x, 1)) + INTVAL (XEXP (x, 2)) == 32))
+      if (outer_code == SET
+         && CONST_INT_P (XEXP (x, 1))
+         && CONST_INT_P (XEXP (x, 2))
+         && INTVAL (XEXP (x, 2)) > 0
+         && INTVAL (XEXP (x, 1)) + INTVAL (XEXP (x, 2)) == 32)
        {
          *total = COSTS_N_INSNS (SINGLE_SHIFT_COST);

but I'd say being able to reproduce is important.

Reply via email to