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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, the change is that previously there was just one significant combination,
Trying 7 -> 8:
    7: r96:SI=r94:SI<<0xb
    8: r95:SI=r96:SI|r94:SI
      REG_DEAD r96:SI
      REG_DEAD r94:SI
Successfully matched this instruction:
(set (reg:SI 95)
    (ior:SI (ashift:SI (reg/v:SI 94 [ i ])
            (const_int 11 [0xb]))
        (reg/v:SI 94 [ i ])))
With the addition of 2 to 2 combination,
Trying 2 -> 7:
    2: r94:SI=zero_extend(x0:QI)
      REG_DEAD x0:QI
    7: r96:SI=r94:SI<<0xb
is replaced with:
(set (reg/v:SI 94 [ i ])
    (zero_extend:SI (reg:QI 0 x0 [ i ])))
and
(set (reg:SI 96)
    (and:SI (ashift:SI (reg:SI 0 x0 [ i ])
            (const_int 11 [0xb]))
        (const_int 522240 [0x7f800])))
and therefore the combination that was successful earlier no longer triggers.
So, I think it would be helpful to have a combiner splitter that would split
Trying 7, 2 -> 8:
    7: r96:SI=x0:SI<<0xb&0x7f800
      REG_DEAD x0:QI
    2: r94:SI=zero_extend(x0:QI)
    8: r95:SI=r96:SI|r94:SI
the zero_extend and
(set (reg:SI 95)
    (ior:SI (ashift:SI (reg/v:SI 94 [ i ])
            (const_int 11 [0xb]))
        (reg/v:SI 94 [ i ])))

Reply via email to