Richard Kenner wrote: > > > The problem appears to be that an RTX expression like > > > > > > (minus:QI (subreg:QI (reg:SI 64 [ a ]) 0) > > > (subreg:QI (reg:SI 66 [ b ]) 0)) > > > > > > seems to be considered non-canonical by combine, and is instead > > > transformed into > > > > > > (subreg:QI (minus:SI (reg:SI 64 [ a ]) > > > (reg:SI 66 [ b ])) 0) > > > On the one hand, this seems odd, as SUBREGs with a non-trivial > > > expression inside will usually not match any insn pattern. On > > > the other hand, I guess this might still be useful behaviour > > > for combine on platforms that support only word arithmetic, > > > when the SUBREG might be considered a "split" point. > > No, I think the idea was that the outer SUBREG would be moved to the LHS > of the assignment to make a "paradoxical SUBREG". Except, as you point > out, there doesn't seem to be an advantage of doing this for arithmetic > unless you only have it in SImode (which it could, of course, check).
Right, I was mistaken about the "split" point case; this is done only for SUBREG (MEM). But you're correct that there is a special optimization in simplify_set that will move the outer SUBREG to the LHS: /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation, and X being a REG or (subreg (reg)), we may be able to convert this to (set (subreg:m2 x) (op)). However, it would appear that this particular location is in fact the only place where (subreg (op ...)) is handled; I don't see any other place where this type of pattern would provide any benefit. Maybe the best solution would be to remove the SUBREG case from the generic apply_distributive_law subroutine, and instead add a special check for the distributed subreg case right at the above place in simplify_set; i.e. to perform the inverse distribution only if it is already guaranteed that we will also be able to move the subreg to the LHS ... Bye, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com