[LLVMdev] RFC: Exception Handling Rewrite

Peter Lawrence peterl95124 at sbcglobal.net
Fri Aug 5 10:57:49 PDT 2011


Guys,
            on second thought...

doesn't making the exception registers live from the InvokeInst to  
the LandingpadInst
create problems for critical-edge-splitting ?

if a landingpad-edge is critical and needs to be split, won't we be  
creating and inserting
a new BB between the "invoke-block" and the "landingpad-block", and  
if we do then
isn't there the possibility of the register allocator spilling the  
contents of the exception
registers from within the newly created block --- but this block  
won't ever get executed
because the _Unwind_ / _personality_ functions will cause control  
flow to go directly
to the block with the LandingpadInst ?   If you really want to split  
a landingpad-edge
won't you have to move the LandingpadInst up into the new block  ?

if this is true (and I seem to be making a lot of logic errors  
lately, so maybe reread and
proof-read the above a few times...!...) then don't we need to add  
another invariant to
Bill's list:

*) there can be no code between an InvokeInst and its LandingpadInst  
other than
possibly PHINodes at the beginning of the landingpad-block.


It seems that if you really do need to split a landingpad-edge then  
you have to move
the LandingpadInst up into (the beginning of) the new block.

However it seems that if a landingpad-block has multiple predecessors  
(often the case,
multiple InvokeInst in the main body of a try-statement all go to the  
same landingpad-
block), then you cannot move the LandingpadInst in order to break a  
critical edge unless
you do it for _all_  landingpad-block predecessor edges  
simultaneously, but that seems
to be a messy conclusion (being forced to split other edges that  
don't need to be split).


my first guess is that all the nuances of whether it ever makes sense  
and/or is even
logically possible to split a critical landingpad-edge won't be  
discovered except by
painful trial-and-error, and that it might be best  to at first  
disallow it until proven doable
by someone working in an isolated branch  -- although proving it  
works may be difficult,
since so little code actually uses exceptions (only TableGen in llvm ?).


-Peter Lawrence.





On Aug 4, 2011, at 4:16 PM, Andrew Trick wrote:

> Hi Peter,
>
> Thanks for pointing this out. Some us who are concerned with  
> codegen have discussed the problem. Although the details aren't  
> decided, you can be sure that at the MachineInstr level we won't  
> have a landindpadInst to model liveness of exception values. Any  
> physical registers set by the personality function will be  
> considered live immediately after the call on the unwind path.
>
> -Andy
>
> On Aug 4, 2011, at 4:04 PM, Peter Lawrence wrote:
>
>> Chris,
>>            it is goodness that the LandingpadInst will be pinned  
>> to the beginning
>> of a BasicBlock,...  except for the possibility of PHINode  
>> instructions that _must_
>> come even earlier.?.
>>
>> I can't exactly put my finger on what's going to go wrong with this,
>> but it sure smells fishy...
>>
>>
>> my current understanding is that the LandingpadInst will "define"  
>> some hard
>> registers which will be used by following code to switch to the  
>> corresponding
>> catch-clause
>>
>> the lifetimes of these hard registers ostensibly starts at the  
>> LandingpadInst,
>> but for purposes of PHI lowering and Register Allocation they  
>> _must_ actually
>> start at the beginning of the BasicBlock -- since that is where  
>> control flow will
>> return to from the _Unwind_RaiseException / __gcc_personality_v0  
>> calls,
>> and it is the _Unwind_ and _personality_ functions that physically  
>> set those
>> hard registers, not the "LandingpadInst".
>>
>> Somehow PHI lowering and register allocation need to be prohibited  
>> from
>> using those hard registers for spill code at the beginning of a  
>> "landing pad block",
>> but I don't see how that will "fall out" of the current design.?.
>>
>>
>>
>> -Peter Lawrence.
>>
>>
>>
>>
>> On Aug 3, 2011, at 12:35 AM, llvmdev-request at cs.uiuc.edu wrote:
>>
>>>
>>> I agree with Bill in this case.  The reason for landingpad to be  
>>> an instruction is a) make it clear that it is magic in several  
>>> ways (e.g. pinned to the start of a block), and b) so that  
>>> LandingPadInst can have a bunch of useful accessors on it.
>>>
>>> -Chris
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110805/05541c99/attachment.html>


More information about the llvm-dev mailing list