[LLVMdev] 'Address of Label and Indirect Branches in LLVM IR' blog post

Török Edwin edwintorok at gmail.com
Sun Jan 3 03:45:43 PST 2010


On 2010-01-03 13:33, Eli Friedman wrote:
> 2010/1/3 Török Edwin <edwintorok at gmail.com>:
>   
>> On 2010-01-03 10:33, Chris Lattner wrote:
>>     
>>> If you're interested in this new extension, here is some more information with some less-than-obvious aspects of the design:
>>> http://blog.llvm.org/2010/01/address-of-label-and-indirect-branches.html
>>>
>>> This feature was added to LLVM by Bob Wilson, Dan Gohman and I to mainline back in November.  If you have questions or comments about the post, this is a good thread to discuss them on :)
>>>
>>>       
>> Can a label be listed multiple times in indirectbr?
>>     
>
> Yes; it's not particularly meaningful, but it's not difficult to
> construct a case where the optimizer will introduce such a construct.
>   

Ok.

>   
>> Clang generates this:
>> foo:                                              ; preds =
>> %indirectgoto, %indirectgoto, %indirectgoto, %indirectgoto, %indirectgoto
>>  store i32 1, i32* %retval
>>  br label %return
>>
>> indirectbr i8* %indirect.goto.dest, [label %foo, label %foo, label %bar,
>> label %foo, label %hack, label %foo, label %foo]
>>
>> For this code taken from the gcc manual:
>> ....
>>     static const int array[] = { &&foo - &&foo, &&bar - &&foo,
>>                                  &&hack - &&foo };
>>     goto *(&&foo + array[i]);
>> .....
>>
>> If I remove &&foo - &&foo from the array, clang still thinks that &&foo
>> is a possible destination, even if I run some optimizers on it.
>> Since the argument to goto is an array of constants, it should be
>> possible for an optimizer to determine the exact list of destinations.
>>     
>
> Missed optimization, I guess... put it into lib/Target/README.txt if
> you think it's an interesting case to try to optimize.  (It doesn't
> strike me as particularly interesting because anyone using indirect
> gotos is going to coding carefully anyway.)
>   

If the code generator isn't confused by the multiple destinations then
its fine.
I can't think of a situation where the presence or the lack of that one
extra edge would matter.

>   
>> Also the intent of that code is to allow it to go into a readonly
>> section, however with Clang it only goes to a .data.rel.ro section (with
>> -fPIC):
>>     
>
> Another missed optimization; this one seems pretty important, though.
>   


On 2010-01-03 13:14, Anton Korobeynikov wrote:
> Hello, Edwin
>
>   
>> Also the intent of that code is to allow it to go into a readonly
>> section, however with Clang it only goes to a .data.rel.ro section (with
>> -fPIC):
>>     
> Sounds like a bug. Fill a PR and assign to me. I will look into it
> when I return from vacations.
>
>   

Done, PR5929.

Best regards,
--Edwin



More information about the llvm-dev mailing list