Not familiar with combine inerts, I'd like to know if
it's low hanging fruit to teach insn combine to perform
optimizations like the following.

Suppose following C code, int = HI

int y15;
int x15;

void qmul8_xy (char c, int x, int y)
{
    y15 = y * c;
    x15 = x * c;
}

and that the target has an insn like

(set (reg:HI)
     (mult:HI (sign_extend:HI (reg:QI))
              (reg:HI)))

If there was just one multiplication, combine would
combine the sign_extend into the special mul insn.
(Provided costs are advantageous, of course)

However, with the code example from above, combine
won't insert the sign_extend even if it was an
improvement, i.e. the sign_extend does not disappear
but the special mult is cheaper (or same cost) as the
ordinary mult.

The original RTL reads:

== Stage 0 ==

(set (reg:HI 42)
     (sign_extend:HI (reg:QI 24)))

(set (reg:HI 48)
     (mult:HI (reg:HI 42)
              (reg:HI 47)))

(set (reg:HI 49)
     (mult:HI (reg:HI 42)
              (reg:HI 46)))

== Stage 1 ==

Cheaper than Stage 0 but not performed

(set (reg:HI 42)
     (sign_extend:HI (reg:QI 24)))

(set (reg:HI 48)
     (mult:HI (sign_extend:HI (reg:QI 24))
              (reg:HI 47)))

(set (reg:HI 49)
     (mult:HI (reg:HI 42)
              (reg:HI 46)))

== Stage 2 ==

Cheaper than Stage 0 and Stage 1, would be performed
if we had Stage 1.

(set (reg:HI 48)
     (mult:HI (sign_extend:HI (reg:QI 24))
              (reg:HI 47)))

(set (reg:HI 49)
     (mult:HI (sign_extend:HI (reg:QI 24))
              (reg:HI 46)))



I also observe this for other examples where insns could
be consumed in other insns without disappearing but
with decreasing cost.


Thanks for comments.

Johann

Reply via email to