+2002-04-18 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * flow.c (update_life_info): Ignore return value of cleanup_cfg.
+ Mask out PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE in
+ propagate_block calls after relaxation loop using new variable
+ stabilized_prop_flags.
+
2002-04-18 Richard Henderson <rth@redhat.com>
* config/ia64/ia64.c (ia64_function_arg_pass_by_reference): New.
regset tmp;
regset_head tmp_head;
int i;
+ int stabilized_prop_flags = prop_flags;
tmp = INITIALIZE_REG_SET (tmp_head);
ndead = 0;
| PROP_KILL_DEAD_CODE));
}
- if (! changed || ! cleanup_cfg (CLEANUP_EXPENSIVE))
+ /* Don't pass PROP_SCAN_DEAD_CODE or PROP_KILL_DEAD_CODE to
+ subsequent propagate_block calls, since removing or acting as
+ removing dead code can affect global register liveness, which
+ is supposed to be finalized for this call after this loop. */
+ stabilized_prop_flags
+ &= ~(PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE);
+
+ if (! changed)
break;
+
+ /* We repeat regardless of what cleanup_cfg says. If there were
+ instructions deleted above, that might have been only a
+ partial improvement (see MAX_MEM_SET_LIST_LEN usage).
+ Further improvement may be possible. */
+ cleanup_cfg (CLEANUP_EXPENSIVE);
}
/* If asked, remove notes from the blocks we'll update. */
basic_block bb = BASIC_BLOCK (i);
COPY_REG_SET (tmp, bb->global_live_at_end);
- propagate_block (bb, tmp, NULL, NULL, prop_flags);
+ propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
if (extent == UPDATE_LIFE_LOCAL)
verify_local_live_at_start (tmp, bb);
basic_block bb = BASIC_BLOCK (i);
COPY_REG_SET (tmp, bb->global_live_at_end);
- propagate_block (bb, tmp, NULL, NULL, prop_flags);
+
+ propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
if (extent == UPDATE_LIFE_LOCAL)
verify_local_live_at_start (tmp, bb);