http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54963



--- Comment #5 from Oleg Endo <olegendo at gcc dot gnu.org> 2012-10-29 11:13:19 
UTC ---

(In reply to comment #4)

> (In reply to comment #3)

> > Created attachment 28551 [details]

> > Proposed patch

> > 

> > This patch fixes the problem, by using 'emit_move_insn' instead of manually

> > doing the DImode reg copy.

> 

> Does the pattern in negdi_cond

> 

>   emit_insn (gen_negc (low_dst, low_src));

>   emit_label_after (skip_neg_label, emit_insn (gen_negc (high_dst, 
> high_src)));

> 

> work in the problematic situation?  Perhaps I've missed something.



Ugh, you're right.  The negdi will go wrong if input and output regs overlap. 

I guess making the output operand a "=&r" for DImode should fix the issue (as

it's done in the adddi3 or subdi3 patterns).  Moreover, I think it should be OK

to split up the absdi pattern before reload, except for negdi_cond.  I'll try

that out.

Reply via email to