------- Comment #5 from steven at gcc dot gnu dot org 2009-06-09 08:34 ------- Hmm, I was under the impression that postreload-cse could move instructions too, but that was just wishful thinking.
I don't really see how the scheduler can solve this. The scheduler would have to know what the live ranges of r0 and r133 overlap, but we don't have an interference graph in the scheduler. Maybe calculating conflicts locally and adjusting scheduling priorities based on that? What improvement to pre-RA scheduling do you have in mind? Perhaps an easier solution would be to change the order of the parameter loads or stores. Right now GCC does this from this pre-RA to post-RA: (set (reg:SI 133) (reg:SI r0)) (set (reg:SI 134) (reg:SI r1)) (set (reg:SI r0) (const_int 0)) (set (reg:SI r1) (reg:SI r133)) (set (reg:SI r2) (reg:SI r134)) (call "foo") ==> (set (reg:SI r3) (reg:SI r0)) (set (reg:SI r2) (reg:SI r1)) (set (reg:SI r0) (const_int 0)) (set (reg:SI r1) (reg:SI r3)) (set (reg:SI r2) (reg:SI r2)) // NOP move, so eliminated (call "foo") ==> (set (reg:SI r3) (reg:SI r0)) (set (reg:SI r2) (reg:SI r1)) (set (reg:SI r0) (const_int 0)) (set (reg:SI r1) (reg:SI r3)) (call "foo") There is always going to be a conflict if GCC generate the above RTL before register allocation, so maybe the generated RTL should be changed. If GCC would emit the parameter stores before the call in reverse order, then the conflicts would go away too: (set (reg:SI 133) (reg:SI r0)) (set (reg:SI 134) (reg:SI r1)) (set (reg:SI r2) (reg:SI r134)) (set (reg:SI r1) (reg:SI r133)) (set (reg:SI r0) (const_int 0)) (call "foo") ==> (set (reg:SI r0) (reg:SI r0)) // NOP move, so eliminated (set (reg:SI r2) (reg:SI r1)) (set (reg:SI r2) (reg:SI r2)) // NOP move, so eliminated (set (reg:SI r1) (reg:SI r0)) (set (reg:SI r0) (const_int 0)) (call "foo") ==> (set (reg:SI r2) (reg:SI r1)) (set (reg:SI r1) (reg:SI r0)) (set (reg:SI r0) (const_int 0)) (call "foo") -- steven at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2009-06-09 08:34:25 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40375