Skip to content
  • Bob Wilson's avatar
    Last week, ARMConstantIslandPass was failing to converge for the · cc121aa7
    Bob Wilson authored
    MultiSource/Benchmarks/MiBench/automotive-susan test.  The failure has
    since been masked by an unrelated change (just randomly), so I don't have
    a testcase for this now.  Radar 7291928.
    
    The situation where this happened is that a constant pool entry (CPE) was
    placed at a lower address than the load that referenced it.  There were in
    fact 2 CPEs placed at adjacent addresses and referenced by 2 loads that were
    close together in the code.  The distance from the loads to the CPEs was
    right at the limit of what they could handle, so that only one of the CPEs
    could be placed within range.  On every iteration, the first CPE was found
    to be out of range, causing a new CPE to be inserted.  The second CPE had
    been in range but the newly inserted entry pushed it too far away.  Thus the
    second CPE was also replaced by a new entry, which in turn pushed the first
    CPE out of range.  Etc.
    
    Judging from some comments in the code, the initial implementation of this
    pass did not support CPEs placed _before_ their references.  In the case
    where the CPE is placed at a higher address, the key to making the algorithm
    terminate is that new CPEs are only inserted at the end of a group of adjacent
    CPEs.  This is implemented by removing a basic block from the "WaterList"
    once it has been used, and then adding the newly inserted CPE block to the
    list so that the next insertion will come after it.  This avoids the ping-pong
    effect where CPEs are repeatedly moved to the beginning of a group of
    adjacent CPEs.  This does not work when going backwards, however, because the
    entries at the end of an adjacent group of CPEs are closer than the CPEs
    earlier in the group.
    
    To make this pass terminate, we need to maintain a property that changes can
    only happen in some sort of monotonic fashion.  The fix used here is to require
    that the CPE for a particular constant pool load can only move to lower
    addresses.  This is a very simple change to the code and should not cause
    any significant degradation in the results.
    
    llvm-svn: 83902
    cc121aa7
Loading