The killloop-branch produces wrong code for the following test due to a bug in loop-invariant.c or code related to it.
extern "C" void abort(void); class runtime_error {}; void test01(int iters) { for (int i = 0; i < iters; ++i) { try { throw runtime_error(); abort(); } catch (runtime_error&) { } } } int main(int argc, char* argv[]) { test01(1); return 0; } The problem is that the following expression is moved out of the loop: (insn 64 63 54 3 (set (reg:DI 350) (reg:DI 16 r16)) 5 {*movdi_internal} (nil) (nil)) See the attached dumps. So far I can only reproduce the bug on IA-64. Obviously, exceptions are involved somehow. On ia64, there are also over 300 libjava failures that disappear when loop-invariant.c is disabled. -- Summary: [killloop-branch] code motion of non-invariant expressions with hard registers. Product: gcc Version: unknown Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: steven at gcc dot gnu dot org GCC target triplet: ia64 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24762