This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to update reg_dead notes

It is generally as easy as just adding the problem and calling df_analyze. You tend to get into trouble if the rtl is not good, i.e. there is improper sharing or other violations of the canonical rtl rules. DF does not like improperly shared rtl and it has not been uncommon for port specific passes to play loose with these rules. I would suggest that first you try a build where you turn on all of the rtl checking and see if that comes out clean.


On 02/24/2015 06:41 AM, Georg-Johann Lay wrote:
Hi, in order to fix PR64331 I tried to implement new target-specific passes whose sole purpose is to recompute REG_DEAD notes.

The avr BE relies on correct dead notes which are used in avr.c:reg_unused_after which uses dead_or_set_p. avr BE needs correct dead notes in ADJUST_INSN_LENGTH, get_attr_length, get_attr_min_length, etc.

After trying for more than one day I am really frustrated; each approach ended up in seg_faults somewhere in df.

Following the source comments in df-core.c, recomputing dead notes should be as easy as

  df_note_add_problem ();
  df_analyze ();

in the execute() method of the new pass.

As this (and many many other tries using df_scan_alloc, df_scan_blocks df_finish_pass, df_insn_rescan_all, etc.) always crashes the compiler, I must do something completely wrong...

Could you give me some advice on correct usage of df or even more preferred point me to a comprehensible documentation of df which is more complete than in df-core.c?

Internals don't treat df, and the source comments are not really helpful, e.g. the complete documentation of df_analyze is /* Analyze dataflow info. */. Not a single word about prerequisites (except that it must run after df_init and before df_finish and needs correct cfg).

One example of a crash is that df->insns[uid] is being accessed and dereferenced where uid is a valid uid but df->insns[uid] is NULL.

df-core.c mentions "given instances of df". How do I get one? The only instance I can find is the global struct df_f *df. Does this mean one has to mess around with that global variable?

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]