On 08/03/14 08:32, Richard Sandiford wrote:
The old for_each_inc_dec callback had a for_each_rtx-like return value,
with >0 being returned directly, 0 meaning "continue" and <0 meaning
"skip subrtxes".  But there's no reason to distinguish the latter two
cases since auto-inc/dec expressions aren't allowed to contain other
auto-inc/dec expressions.  And if for_each_rtx is going away, there's
no longer any consistency argument for using the same interface.


gcc/
        * rtl.h (for_each_inc_dec_fn): Remove special case for -1.
        * cselib.c (cselib_record_autoinc_cb): Update accordingly.
        (cselib_record_sets): Likewise.
        * dse.c (emit_inc_dec_insn_before, check_for_inc_dec_1)
        (check_for_inc_dec): Likewise.
        * rtlanal.c (for_each_inc_dec_ops): Delete.
        (for_each_inc_dec_find_inc_dec): Take the MEM as argument,
        rather than a pointer to the memory address.  Replace
        for_each_inc_dec_ops argument with separate function and data
        arguments.  Abort on non-autoinc addresses.
        (for_each_inc_dec_find_mem): Delete.
        (for_each_inc_dec): Use FOR_EACH_SUBRTX_VAR to visit every
        autoinc MEM.
So this patch has me a little bit concerned.

@@ -2523,7 +2523,7 @@ cselib_record_sets (rtx insn)

    data.sets = sets;
    data.n_sets = n_sets_before_autoinc = n_sets;
-  for_each_inc_dec (&insn, cselib_record_autoinc_cb, &data);
+  for_each_inc_dec (&PATTERN (insn), cselib_record_autoinc_cb, &data);
    n_sets = data.n_sets;
So wouldn't this miss an autoincrement operation embedded in a note, such as a REG_EQUAL note? My memory is very fuzzy here, but I can't recall any policy which prohibits an autoincrement addressing mode from appearing in a REG_EQUAL note. Worse yet, I have vague memories of embedded side effects actually showing up in REG_EQUAL notes.

Similarly for other places where you're passing down the pattern rather than the insn itself.

Thoughts/comments? Does this trigger any disturbing memories for anyone else?

jeff


Reply via email to