when i suggested that you do a build with all of the checking turned on, i wanted you to this without you new code in it. there is a good possibility that the problem is that your port is generating bad rtl. Also, you should generate a debuggable compiler so that the line numbers have some relevance to reality.


On 02/24/2015 01:23 PM, Georg-Johann Lay wrote:
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





Reply via email to