2002-05-28 Richard Henderson * flow.c (calculate_global_regs_live): Rename call_used to invalidated_by_call. Initialize from regs_invalidated_by_call instead of call_used_regs. 2002-07-20 Jakub Jelinek * g++.dg/opt/life1.C: New test. --- gcc/flow.c 28 May 2002 12:53:39 -0000 1.527 +++ gcc/flow.c 28 May 2002 20:01:29 -0000 1.528 @@ -1048,19 +1048,19 @@ calculate_global_regs_live (blocks_in, b int flags; { basic_block *queue, *qhead, *qtail, *qend; - regset tmp, new_live_at_end, call_used; - regset_head tmp_head, call_used_head; + regset tmp, new_live_at_end, invalidated_by_call; + regset_head tmp_head, invalidated_by_call_head; regset_head new_live_at_end_head; int i; tmp = INITIALIZE_REG_SET (tmp_head); new_live_at_end = INITIALIZE_REG_SET (new_live_at_end_head); - call_used = INITIALIZE_REG_SET (call_used_head); + invalidated_by_call = INITIALIZE_REG_SET (invalidated_by_call_head); /* Inconveniently, this is only readily available in hard reg set form. */ for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i) - if (call_used_regs[i]) - SET_REGNO_REG_SET (call_used, i); + if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)) + SET_REGNO_REG_SET (invalidated_by_call, i); /* Create a worklist. Allocate an extra slot for ENTRY_BLOCK, and one because the `head == tail' style test for an empty queue doesn't @@ -1147,7 +1147,7 @@ calculate_global_regs_live (blocks_in, b if (e->flags & EDGE_EH) { bitmap_operation (tmp, sb->global_live_at_start, - call_used, BITMAP_AND_COMPL); + invalidated_by_call, BITMAP_AND_COMPL); IOR_REG_SET (new_live_at_end, tmp); } else @@ -1315,7 +1315,7 @@ calculate_global_regs_live (blocks_in, b FREE_REG_SET (tmp); FREE_REG_SET (new_live_at_end); - FREE_REG_SET (call_used); + FREE_REG_SET (invalidated_by_call); if (blocks_out) { --- gcc/testsuite/g++.dg/opt/life1.C.jj Sat Jul 20 18:57:05 2002 +++ gcc/testsuite/g++.dg/opt/life1.C Sat Jul 20 19:00:01 2002 @@ -0,0 +1,16 @@ +// This testcase did not set up the pic register on IA-32 due +// to bug in calculate_global_regs_live EH edge handling. +// { dg-do compile { target i?86-*-linux* } } +// { dg-options "-O2 -fPIC" } + +struct A { }; + +void foo (A (*fn)()) +{ + try { + A a = fn (); + } catch (...) { + } +} + +// { dg-final { scan-assembler "GLOBAL_OFFSET_TABLE" } }