How to update reg_dead notes
Georg-Johann Lay
avr@gjlay.de
Tue Feb 24 18:23:00 GMT 2015
Am 02/24/2015 um 06:06 PM schrieb Eric Botcazou:
>> 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?
>
> Take a look at the c6x and mep ports.
>
Thanks for the hint. I changed the execute method to:
unsigned int execute ()
{
compute_bb_for_insn ();
//df_clear_flags (DF_LR_RUN_DCE);
df_note_add_problem ();
df_analyze ();
df_finish_pass (false);
return 0;
}
bit it keeps aborting. Actually I am just copy pasting code from some other
passes / BEs, but these places also don't have explanation for why they must
use, may use, must not use specific functions.
Compiling the mentioned test case from libgcc with -Os (so that less insns are
left over) and patching df-scan.c:df_refs_verify to print the refs just before
it does gcc_assert (0):
new_ref = { u-1(18){ }}
*old_rec = { u-1(18){ }u-1(19){ }u-1(24){ }u-1(25){ }}
libgcc2-addvsi3.c: In function '__addvhi3':
libgcc2-addvsi3.c:1514:1: internal compiler error: in df_refs_verify, at
df-scan.c:4338
In df_insn_refs_verify which is in the call chain of df_refs_verify, insn reads:
(insn 21 19 22 5 (parallel [
(set (cc0)
(compare (reg/v:HI 18 r18 [orig:48 a ] [48])
(reg/v:HI 24 r24 [orig:46 w ] [46])))
(clobber (scratch:QI))
]) libgcc2-addvsi3.c:1511 408 {*cmphi}
(expr_list:REG_DEAD (reg/v:HI 18 r18 [orig:48 a ] [48])
(nil)))
r18 and r24 are ordinary general-purpose hard registers.
The latest pass which runs before the crash is .split5, i.e.
recog.c::pass_split_for_shorten_branches which executes split_all_insns_noflow
which in turn reads:
/* Same as split_all_insns, but do not expect CFG to be available.
Used by machine dependent reorg passes. */
unsigned int
split_all_insns_noflow (void)
{ ...
Does this mean CFG is (or might be) messed up after this pass and this is the
reason for why df crashes because df needs correct CFG?
Johann
More information about the Gcc
mailing list