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