Skip to content
  • Duncan Sands's avatar
    Fix PR1628. When exception handling is turned on, · 3c1b7fc0
    Duncan Sands authored
    labels are generated bracketing each call (not just
    invokes).  This is used to generate entries in
    the exception table required by the C++ personality.
    However it gets in the way of tail-merging.  This
    patch solves the problem by no longer placing labels
    around ordinary calls.  Instead we generate entries
    in the exception table that cover every instruction
    in the function that wasn't covered by an invoke
    range (the range given by the labels around the invoke).
    As an optimization, such entries are only generated for
    parts of the function that contain a call, since for
    the moment those are the only instructions that can
    throw an exception [1].  As a happy consequence, we
    now get a smaller exception table, since the same
    region can cover many calls.  While there, I also
    implemented folding of invoke ranges - successive
    ranges are merged when safe to do so.  Finally, if
    a selector contains only a cleanup, there's a special
    shorthand for it - place a 0 in the call-site entry.
    I implemented this while there.  As a result, the
    exception table output (excluding filters) is now
    optimal - it cannot be made smaller [2].  The
    problem with throw filters is that folding them
    optimally is hard, and the benefit of folding them is
    minimal.
    
    [1] I tested that having trapping instructions (eg
    divide by zero) in such a region doesn't cause trouble.
    [2] It could be made smaller with the help of higher
    layers, eg by having branch folding reorder basic blocks
    ending in invokes with the same landing pad so they
    follow each other.  I don't know if this is worth doing.
    
    llvm-svn: 41718
    3c1b7fc0
Loading