On 02/09/2011 07:07 AM, Ian Lance Taylor wrote: > "Paulo J. Matos" <pocma...@gmail.com> writes: > >> But then this is combined by cse into: >> >> (set (mem/s:QI (reg:QI 41)) (const_int 0)) >> >> and bammm, same problem. No loop hoisting. What's the best way to >> handle this? Any suggestions? > > You need to set TARGET_RTX_COSTS to indicate that this operation is > relatively expensive. That should stop combine from generating it.
If constants are never valid as the source of a store, then you could try something like register_operand (operands[0], <mode>) || register_operand (operands[1], <mode>) in the extra-predicate field of your move insns. This is not unlike the check for two memories that many ports use at the moment. C.f. movsi_internal for i386. That will prevent combine, or anyone else for that matter, from re-combining the constant load. r~