[LLVMdev] About LLVM switch instruction

Milind Chabbi Milind.Chabbi at rice.edu
Wed Jul 17 23:17:01 PDT 2013


Mark,

I am basically trying to do a specialized form of unreachable block
elimination. I bumped into this issue when I was thinking of
eliminating unreachable cases (including default). In the following
code, assertion propagation should easily infer that the default is
unreachable. But, llvm at -O3 leaves the code in default intact.  Your
technique of placing  "unreachable" instruction in the default case
makes a difference though.

--------------------------------------------------
int foo(unsigned int i , unsigned int j){
        if(i >= 0 && i < 3) {
                switch(i){
                        case 0: i = i + j;
                        case 1: i = i + j;
                        case 2: i = i + j; break;
                        default : i = i * j;
                }
        }
        return i;
}
--------------------------------------------------



On Wed, Jul 17, 2013 at 10:28 PM, Mark Lacey <mark.lacey at apple.com> wrote:
>
> On Jul 17, 2013, at 10:09 PM, Milind Chabbi <Milind.Chabbi at rice.edu> wrote:
>> Hi Mark,
>>
>> This will workaround the problem of "default" branch restriction on
>> the switch instruction. The trouble with this technique is that it
>> will trump later optimization phases such as constant propagation.
>> When a block was part of a case, because of the knowledge of the case
>> value, the block was a candidate for better optimization. However,
>> when we move the body of the case into the default, the knowledge of
>> the case value is lost and the body is less optimizable.
>
> Yes, it is not ideal for a variety of reasons, and I am actually looking at improving how we deal with unreachable switch defaults now because of that.
>
> Could you provide any additional detail about the transforms you are doing and what you are trying to accomplish?
>
> Mark
>
>



More information about the llvm-dev mailing list