------- Comment #3 from jakub at gcc dot gnu dot org 2009-03-24 14:18 ------- Ok, so the reason why fwprop doesn't propagate this is:
forward_propagate_and_simplify doing: rtx use_set = single_set (use_insn); ... if (!use_set) return false; ASM_OPERANDS with multiple output regs obviously isn't single_set, so nothing is propagated. Paolo, any reason to restrict this, or at least could forward_propagate_and_simplify specially propagate also to memory addresses in asms? The reason why combiner doesn't do anything is that when the pseudos initialized to constants are used multiple times (not dead on the asm insn), try_combine sets added_sets_2 and as the insn is a PARALLEL, appends the added set to that, making it invalid (asm_noperands (body) returns -1). So, to fix this bug, either we can teach fwprop to do this kind of propagation (my preference), or e.g. temporarily set cse_not_expected in expand_asm_operands. I can easily test the latter as a fallback variant if the former is deemed too unsafe for 4.4. -- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bonzini at gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39543