[LLVMdev] clang branching using label
Jim Grosbach
grosbach at apple.com
Fri Apr 27 14:35:34 PDT 2012
Sometimes the anonymous numbering confuses things. Try running the .ll file through "opt -instnamer" first.
-Jim
On Apr 27, 2012, at 2:17 PM, Nong Li <nongli at gmail.com> wrote:
>
> How does the verifier deal with this? I'm noticing that if I load a clang
> compiled function (with -emit-llvm) and run the verifier, there is no
> problem. If I start mucking with the function body (adding an instruction),
> the verifier is unhappy saying the instructions that would have been in the
> commented out block aren't part of a basic block. Does the clang compiled
> function have some special attributes?
>
>
> Duncan Sands wrote:
>>
>> Hi Chris,
>>
>>> Clang normally generates code that looks like
>>>
>>> ....
>>> ;<label>:22 ; preds = %0
>>> %23 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([24 x
>>> i8]*
>>> @.str, i32 0, i32 0))
>>> br label %24
>>>
>>> ;<label>:24 ; preds = %22, %0
>>> %25 = load i32* %tmphigh, align 4
>>> %26 = and i32 %25, 65535
>>> store i32 %26, i32* %high1, align 4
>>> .....
>>>
>>>
>>> If I insert some instructions before %25 so it will look like:
>>> ....
>>> ;<label>:22 ; preds = %0
>>> %23 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([24 x
>>> i8]*
>>> @.str, i32 0, i32 0))
>>> br label %24
>>>
>>> ;<label>:24
>>> %var = add i32 %7, 0 ; for testing
>>> %25 = load i32* %tmphigh, align 4
>>> %26 = and i32 %25, 65535
>>> store i32 %26, i32* %high1, align 4
>>> .....
>>>
>>> Will %var get evaluated or it will be skipped?
>>
>> It will be evaluated.
>>
>>> How does the branching work since the label is commented out?
>>
>> Labels and most other names only exist for the convenience of human
>> readers.
>> LLVM knows that a basic block has ended because of "br label %24". This
>> is
>> an example of a terminator instruction: an instruction that only occurs as
>> the last instruction of a basic block (every basic block must finish with
>> one). Thus LLVM knows where all basic blocks start and end by just
>> looking
>> at the terminator instructions. It doesn't need labels.
>>
>> Does it assume
>>> %24 is the nop before %25?
>>
>> I didn't understand this question. When printing human readable IR, LLVM
>> prints
>> a numerical name like %24 for things which have no name internally. It
>> has to
>> put something since otherwise it wouldn't be able to read the IR back in
>> again.
>> The numbers it chooses just increment sequentially. This makes it hard to
>> modify such human readable IR by hand since you have to preserve the
>> sequential
>> numbering. (If you want everything to have a real name use opt's
>> -instnamer
>> pass).
>>
>>>
>>> How about the following case where a variable assignment does not occur?
>>
>> I'm not sure what you mean by "a variable assignment does not occur".
>> An instruction like "%var = add i32 %7, 0" isn't really an assignment to
>> a variable "%var" since (thanks to SSA form) it isn't possible to "assign"
>> anything else to "%var" later. Instead "%var" is just a name for the
>> value
>> of "add i32 %7, 0". In any case it is exactly the same:
>>
>>>
>>> ....
>>> %37 = icmp sle i32 %33, %36
>>> br i1 %37, label %38, label %217
>> ^^ Terminator instruction, so basic block finishes here
>>>
>>> ;38:
>>> store i32 0, i32* %j, align 4
>> ^^ Thus this is the first instruction of the next basic block
>>> br label %39
>>>
>>> .....
>>> which is changed to
>>>
>>> ......
>>> %37 = icmp sle i32 %33, %36
>>> br i1 %37, label %38, label %217
>> ^^ Terminator instruction, so basic block finishes here
>>>
>>> ;38:
>>> store i32 0, i32* %p, align 4
>> ^^ Thus this is the first instruction of the next basic block
>>> store i32 0, i32* %j, align 4
>>> br label %39
>>> .....
>>>
>>> Will both store instructions get executed?
>>
>> Yes.
>>
>>> Does the empty line before the commented out label number have any real
>>> function?
>>
>> No.
>>
>> Ciao, Duncan.
>>
>>>
>>>
>>> Thanks,
>>>
>>> Chris
>>>
>>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>
> --
> View this message in context: http://old.nabble.com/clang-branching-using-label-tp33192112p33760679.html
> Sent from the LLVM - Dev mailing list archive at Nabble.com.
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list