------- Comment #4 from uweigand at gcc dot gnu dot org 2005-11-17 12:45 ------- It looks like the simplify-rtx patch is not really the cause of the problem, it simply exposes a pre-existing bug in combine and/or flow.
Before combine, we have a situation that looks like (simplified): insn 82: reg46 = reg49 ^ reg50 (REG_DEAD reg49) insn 87: reg50 = reg46 ^ reg50 (REG_READ reg46) Note that reg 50 is live both at the start and the end of the current basic block. Now, due to the improved XOR optimization in simplify-rtx, combine recognized these insn can be combined into: insn 87: reg50 = reg49 (REG_READ reg49) And suddenly reg50 is no longer live at the start of this basic block. Unfortunately, there appears to be no code in combine that recognizes this fact and schedules the basic block for updating of global life info. (The only cases where that happens are related to moving REG_DEAD notes, but in this situation we don't *have* a REG_DEAD note for reg50 in the first place.) Thus, reg50 remains marked live-at-start in this basic block, and when a later pass does a local live info update on the block, the sanity check in verify_local_life_at_start triggers. Right now I don't know how and where to fix this. -- uweigand at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2005-11-17 12:45:27 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24883