On Mon, Sep 23, 2019 at 12:56:20PM +0100, Jozef Lawrynowicz wrote: > (insn 2 4 3 2 (set (reg/v:HI 25 [ i ]) > (zero_extend:HI (reg:QI 12 R12 [ i ]))) > (nil)) > ..... > (insn 7 6 8 2 (set (reg:PSI 28) > (subreg:PSI (sign_extend:SI (reg/v:HI 25 [ i ])) 0)) > (nil)) > > All we really need is: > > (insn (set (reg:PSI 28 [ i ]) > (zero_extend:PSI (reg:QI 12 R12 [ i ]))) > (nil)) > > The zero extend is implicit with byte sized register operations, so this would > result in assembly such as: > MOV.B R12, R12 > > My question is whether this is the type of thing that should be handled with a > peephole optimization or if it is worth trying to fix the initial RTL > generated > by expand (or in a later RTL pass e.g. combine)?
combine does (well, it did in June, I don't think things changed since then) Trying 2 -> 7: 2: r25:HI=zero_extend(R12:QI) REG_DEAD R12:QI 7: r28:PSI=sign_extend(r25:HI)#0 REG_DEAD r25:HI Failed to match this instruction: (set (reg:PSI 28 [ i ]) (sign_extend:PSI (zero_extend:HI (reg:QI 12 R12 [ i ])))) Failed to match this instruction: (set (reg:PSI 28 [ i ]) (sign_extend:PSI (and:HI (reg:HI 12 R12) (const_int 255 [0xff])))) It could have just done that as (set (reg:PSI 28) (zero_extend:PSI (reg:QI 12))) as far as I can see? Do you already have a machine pattern that matches that? Please file a PR for this. Thanks! Segher