[LLVMdev] unwinds to in the CFG

Nick Lewycky nicholas at mxc.ca
Sat Mar 29 12:07:46 PDT 2008


Gordon Henriksen wrote:
> On 2008-03-29, at 00:57, Nick Lewycky wrote:
> 
>> Gordon Henriksen wrote:
>>
>>> What blocks would a phi node in %catch require for a case like this?
>>>
>>>    define i8 @f(i1 %b) {
>>>    entry:
>>>      b label %try
>>>    try: unwinds to %catch
>>>      b i1 %b, label %then, label %else
>>>    then: unwinds to %catch
>>>      ret void
>>>    else: unwinds to %catch
>>>      ret void
>>>    catch:  ; What are my predecessors?
>>>      ret void
>>>    }
>> 'catch' has 3 preds, %try, %then and %else.
> 
> Would it be more natural to claim %entry and %try as the predecessors?  
> This is similar to how a high level language disallows variable  
> declarations from a try block to be visible from the catch.

In LLVM the rule is that an instruction must be dominated by its 
operands. Predecessors and successors don't enter into it, except to 
define the dominance tree.

> object x;
> try { x = null; }
> catch { use(x); } // error, x is uninitialized
> 

Yes, I know. I'm planning to accomplish this by defining pred/succ 
sensibly such that we get a domtree where the equivalent LLVM code would 
be invalid.

> Also, consider a phi node:
> 
> phi i32 [%x, %bb1] ; %x defined in %bb1.
> 
> Depending on what type of predecessor %bb1 is, some of the models  
> you've mentioned declare this phi node illegal.

Oh. Now that's a very good point.

bb1: unwinds to %cleanup
   %x = add i32 @foo, @bar
   ret i32 %x
cleanup:
   %y = phi i32 [%x, bb1]

If %cleanup has %bb1 as a predecessor then the above is legal. (PHI 
nodes being the only Instruction that works on pred/succ and not 
dominators.)

And you're right, the fix for that it to make the predecessor be bb1's 
preds (if it has any). This is nastier than I was expecting...

Nick



More information about the llvm-dev mailing list