Hi, m68k currently doesn't bootstrap, which I think is dataflow related, the whole precompiled file is at http://www.xs4all.nl/~zippel/expmed.i.gz, but the small test below should be enough to demonstrate the problem (although it doesn't crash):
int fi1(int); int fi2(int); void *fp1(int, void *); void *fp2(int, int); void *f(int x, int a, int b) { if (x) { int y = fi1(1); void *p; y += fi2(3); p = fp1(2, 0); return fp1(y, p); } else { int z = fi2(2); z += fi1(z); return fp2(z, 3); } } The function is exited here via a sibcall, one important thing is that current_function_return_rtx is set to: (parallel/i:SI [ (expr_list:REG_DEP_TRUE (reg:SI 8 %a0 [ <result> ]) (const_int 0 [0x0])) (expr_list:REG_DEP_TRUE (reg:SI 0 %d0 [ <result> ]) (const_int 0 [0x0])) ]) This means the return value is returned in both %d0/%a0. The problem is now that this seems to produce incorrect REG_DEAD notes for %d0, they are missing at the last use before the sibcall. This now seems to confuse reload in the full test case, where it calls save_call_clobbered_regs(), which can't quite decide whether to save %d0 across a function call or not. setup_save_areas() doesn't create a stack slot for %d0 because it's not associated with a pseudo which lives across a function call, but later in save_call_clobbered_regs() %d0 is still live at a function call and it attempts to save the register, which fails due to the missing stack slot. AFAICT this behaviour is correct, the question is now how do I get correct REG_DEAD notes? It seems to be related to the unusual return expression above, but at this point I need some help to fix this. bye, Roman