Skip to content
  • Bill Wendling's avatar
    Machine sink could potentially sink instructions into a block where the physical · f82aea63
    Bill Wendling authored
    registers it defines then interfere with an existing preg live range.
    
    For instance, if we had something like these machine instructions:
    
    BB#0
      ... = imul ... EFLAGS<imp-def,dead>
      test ..., EFLAGS<imp-def>
      jcc BB#2 EFLAGS<imp-use>
    
    BB#1
      ... ; fallthrough to BB#2
    
    BB#2
      ... ; No code that defines EFLAGS
      jcc ... EFLAGS<imp-use>
    
    Machine sink will come along, see that imul implicitly defines EFLAGS, but
    because it's "dead", it assumes that it can move imul into BB#2. But when it
    does, imul's "dead" imp-def of EFLAGS is raised from the dead (a zombie) and
    messes up the condition code for the jump (and pretty much anything else which
    relies upon it being correct).
    
    The solution is to know which pregs are live going into a basic block. However,
    that information isn't calculated at this point. Nor does the LiveVariables pass
    take into account non-allocatable physical registers. In lieu of this, we do a
    *very* conservative pass through the basic block to determine if a preg is live
    coming out of it.
    
    llvm-svn: 105387
    f82aea63
Loading