> Let's be conservative instead and distinguish the two cases: in the barrier > case, we don't change anything and just add the missing comment, along the > lines of "Crossing a barrier resets all the use information". In the > volatile > case, we unconditionally invalidate with a similar comment.
Ok. Here is an updated version. Bootstrapped and regtested on s390x and x86_64. Ok for mainline? Bye, -Andreas- 2011-11-21 Andreas Krebbel <andreas.kreb...@de.ibm.com> * postreload.c (reload_combine): Mark reg_state as invalid at volatile insns if there has been a use already. Index: gcc/postreload.c =================================================================== *** gcc/postreload.c.orig --- gcc/postreload.c *************** reload_combine (void) *** 1312,1322 **** is and then later disable any optimization that would cross it. */ if (LABEL_P (insn)) last_label_ruid = reload_combine_ruid; ! else if (BARRIER_P (insn) ! || (INSN_P (insn) && volatile_insn_p (PATTERN (insn)))) ! for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) ! if (! fixed_regs[r]) reg_state[r].use_index = RELOAD_COMBINE_MAX_USES; if (! NONDEBUG_INSN_P (insn)) continue; --- 1312,1332 ---- is and then later disable any optimization that would cross it. */ if (LABEL_P (insn)) last_label_ruid = reload_combine_ruid; ! else if (BARRIER_P (insn)) ! { ! /* Crossing a barrier resets all the use information. */ ! for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) ! if (! fixed_regs[r]) reg_state[r].use_index = RELOAD_COMBINE_MAX_USES; + } + else if (INSN_P (insn) && volatile_insn_p (PATTERN (insn))) + /* Optimizations across insns being marked as volatile must be + prevented. All the usage information is invalidated + here. */ + for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) + if (! fixed_regs[r] + && reg_state[r].use_index != RELOAD_COMBINE_MAX_USES) + reg_state[r].use_index = -1; if (! NONDEBUG_INSN_P (insn)) continue;