Bernd Schmidt wrote: > On 07/12/11 13:11, Georg-Johann Lay wrote: >> 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))) > > You could try the following, which allows 2->2 insn combinations > assuming the costs are right. > > Bernd
The patch leads to wrong code: The extend is inserted into the first mul-insn and the extend discarded so that the second mul which remains unchanged gets garbage for one of its inputs. Johann