libcall problem during new unroller merge

Jan Hubicka jh@suse.cz
Thu Feb 6 14:57:00 GMT 2003


Hmm, there seems to be something bogus in cprop pass.
Comments says:

      if (newcnst && constprop_register (insn, x, newcnst, alter_jumps))
        {
          /* If we find a case where we can't fix the retval REG_EQUAL notes
             match the new register, we either have to abandon this replacement
             or fix delete_trivially_dead_insns to preserve the setting insn,
             or make it delete the REG_EUAQL note, and fix up all passes that
             require the REG_EQUAL note there.  */
          if (!adjust_libcall_notes (x, newcnst, insn, libcall_sp))
            abort ();

However delete_trivially_dead_insns should preserve the insn.  It is
dealing with REG_EQUAL notes in count_reg_usage:

    case INSN:
    case JUMP_INSN:
      count_reg_usage (PATTERN (x), counts, NULL_RTX, incr);

      /* Things used in a REG_EQUAL note aren't dead since loop may try to
         use them.  */

      count_reg_usage (REG_NOTES (x), counts, NULL_RTX, incr);
      return;

    case EXPR_LIST:
    case INSN_LIST:
      if (REG_NOTE_KIND (x) == REG_EQUAL
          || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE))
        count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
      count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
      return;

    default:
      break;
    }

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)

So what is wrong here?  Why the adjust_libcall_notes is needed at first
place?  Perhaps it is PRE who is killing the insn?

Honza



More information about the Gcc mailing list