------- 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

Reply via email to