Gcc has traditionally used the concept of a compare operation that stores a comparison result in CC0 or a register, and then can be used with arbitrary comparison operators to compare it against zero to make a decision for a branch, store flag, or conditional move instruction. Since often the actual comparison instructions work differently, a number of ports need to stash away the comparison operands when they pretend to emit a comparison, and then emit the actual comparison later when its result is used. cbranch* / cstore* patterns had the promise to get rid of this bogosity, however, they are still don;t deliver. The only way to have a conditional move is to first perform a comparison, and then have the the actual move depende on the comparison result. Thus, if the architecture has conditional move, a comparison patterns are needed, even if the targets compare operations are ill-matched, compare patterns have to be defined, thus disabling cbranch* / cstore* patterns.
-- Summary: still can't get rid of phony compare patterns - cbranch* / cstore* patterns miss their goal Product: gcc Version: 4.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: amylaar at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35803