Hi, I have thinking about how to overcome part of the "double-setter" difficulties that arise when implementing cc0->CCmode conversion for a couple of targets:
IIUC correctly one of the two or three difficulties with cc0->CCmode conversion is, that combine in it's present form is not able to recognize that in a sequence like (parallel[ (set reg:SI 100) (minus:SI (reg:SI 101) (reg:SI 102)) (set reg:CC_xxx CC) (compare (reg:SI 101) (reg:SI 102)))]) ((set reg:CC_xxx CC) (compare (reg:SI 101) (reg:SI 102))) the compare instruction could be avoided. IIUC it is presently suggested to make use of *many* peephole2 patterns for solving this problem. IIUC the key reason why present combine would miss the oportunity is that many optimizations are not possible for "double-set" instructions. In order to overcome this problem, it seems to be a possible approach to expand double-set instructions that, e.g., leave the condition code in a useful state to sequences containing "announce" instructions. I.e. expand would insert two instructions after the double-set instruction that contain the two individual sets and an additional "use" statement. I.e. above sequence after expand then would look like (parallel[ (set reg:SI 100) (minus:SI (reg:SI 101) (reg:SI 102)) (set reg:CC CC_xxx) (compare (reg:SI 101) (reg:SI 102)))]) (parallel[ (set reg:SI 100) (minus:SI (reg:SI 101) (reg:SI 102)) (use (reg:SI 100) ]) (parallel[ (set reg:CC_xxx CC) (compare (reg:SI 101) (reg:SI 102))) (use (reg:CC]) ((set reg:CC_xx CC) (compare (reg:SI 101) (reg:SI 102))) . The patterns for the "announce" instructions would never generate any assembly output and would have length "0". They are merely used for communicating to the mid-end that a double-set instruction has a possibly useful side-product. When inserting such "announce" instructions, I think that even the present combiner will be able to realize that the second compare instruction is not necessary. I have confirmed with another example of double-set instructions (divmodsi4 for the AVR target) that above approach indeed works. It seems, however, that what one is using is kind of an undocumented side-effect that could be subject to change in future releases. I.e. the documentation on (use) presently "warns" that some optimization *could* take place when using the (use) statements, resulting in bugs when using (use) in a wrong way. I think that it would be helpful to make this partially documented behaviour of the (use) clauses an official feature. I.e. I think that it would help to agree on that the optimizations the present documentation "warns" of, "are supposed" take place. (Maybe this is already commonly agreed on.?) Comments? Yours, Bj�rn