This is rather old code for you folks, but I'm not quite sure how to deal with this issue.

I've converted vec.[hc] to C++ and this meant some subtle changes to how VEC(T,stack) works. We no longer need all those macro expansions.

This means that the allocation function for vectors can detect when a stack vector is initially allocated on the heap. This happens when the vector is implicitly allocated when the first element is pushed (and the vector is nil).

This was causing an ICE in df_bb_verify() because of this code:

  collection_rec.def_vec = VEC_alloc (df_ref, stack, 128);
  collection_rec.use_vec = VEC_alloc (df_ref, stack, 32);
  collection_rec.eq_use_vec = VEC_alloc (df_ref, stack, 32);
  collection_rec.mw_vec = VEC_alloc (df_mw_hardreg_ptr, stack, 32);

  gcc_assert (bb_info);

  /* Scan the block, one insn at a time, from beginning to end.  */
  FOR_BB_INSNS_REVERSE (bb, insn)
    {
      if (!INSN_P (insn))
        continue;
      df_insn_refs_verify (&collection_rec, bb, insn, true);
      df_free_collection_rec (&collection_rec);
    }


Note that we initially allocate the various vectors on the stack, but then the FOR_BB_INSNS_REVERSE loop explicitly deallocates them. The next time df_insns_ref_verify tries to push something on these VECs, the pushing routine will try to do an initial allocation on the heap, which causes an ICE.

I *think* what you meant in that loop is to clear COLLECTION_REC? Or should we clear it and reallocate the vectors? I am currently running with the call to df_free_collection_rec() taken out, but I'm not sure if that's the right thing here.


Thanks.  Diego.

Reply via email to