[llvm-dev] Find the instructions where a particular value is defined

Syed Rafiul Hussain via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 27 18:58:59 PST 2016


Thank you all for your reply.

if(a>10)
 b=10;
else if (a<10)
 b = 5;
Here is the IR of the if-elseif:

 56   %0 = load i32, i32* %a, align 4
 57   %cmp = icmp sgt i32 %0, 10
 58   br i1 %cmp, label %if.then, label %if.else
 60 if.then:                                          ; preds = %entry
 61   store i32 10, i32* %b, align 4
 62   br label %if.end.4
 63
 64 if.else:                                          ; preds = %entry
 65   %1 = load i32, i32* %a, align 4
 66   %cmp2 = icmp slt i32 %1, 10
 67   br i1 %cmp2, label %if.then.3, label %if.end
 68
 69 if.then.3:                                        ; preds = %if.else
 70   store i32 5, i32* %b, align 4
 71   br label %if.end
 72
 73 if.end:                                           ; preds =
%if.then.3, %if.else
 74   br label %if.end.4
 75
 76 if.end.4:                                         ; preds =
%if.end, %if.then
 77   %2 = load i32, i32* %a, align 4
 78   %call5 = call dereferenceable(272) %"class.std::basic_ostream"*
@_ZNSolsEi(%"class.std::basic_ostream"* @_ZSt4cout, i32 %2)
 79   %3 = load i32, i32* %b, align 4
 80   %call6 = call dereferenceable(272) %"class.std::basic_ostream"*
@_ZNSolsEi(%"class.std::basic_ostream"* %call5, i32 %3)
 81   ret i32 0


at line 79 of the IR, I have found %b. Now I would like to find lines
61 and 70 where %b has been assigned with some values using store
instruction. Can I achieve this at IR level?


On Wed, Jan 27, 2016 at 9:15 PM, John Criswell <jtcriswel at gmail.com> wrote:
> On 1/27/16 8:42 PM, Syed Rafiul Hussain via llvm-dev wrote:
>>
>> Sorry, I should ask the following:
>> finds all the instructions of a function where a particular variable is
>> defined?
>> Lets consider the following code snippet:
>>
>> 1. void foo(){
>> 2. int a, b;
>> 3. if(a > 10)
>> 4.   b = 10;
>> 5. if(a<10)
>> 6.   b = 5;
>> 7. cout << b;
>> 8. }
>>
>> I would like to know the instructions where variable b can be be
>> defined, i.e, in this case, the instructions 4 and 6.
>
>
> The LLVM IR is not best suited for this.  During the conversion to SSA form,
> the variable b will be replaced with several variables, each with a unique
> definition.  A phi-node will merge the two b values at line 7.  If you use
> clang -emit-llvm -S on this input file, you will see.
>
> You may want to do your analysis on the AST generated by Clang; Clang ASTs
> represent the original C code and its variables.
>
> Regards,
>
> John Criswell
>
>
>
>>
>> On Wed, Jan 27, 2016 at 8:15 PM, Tim Northover <t.p.northover at gmail.com>
>> wrote:
>>>
>>> On 27 January 2016 at 17:08, Syed Rafiul Hussain via llvm-dev
>>> <llvm-dev at lists.llvm.org> wrote:
>>>>
>>>> I am wondering if there is anything like def-use chain which finds all
>>>> the instructions of a function where a particular value is defined?
>>>
>>> How do you mean? LLVM IR is in SSA form, which means that each Value
>>> has precisely one definition (which may or may not be an instruction).
>>> If you've got a "Value *V" in C++ you can just
>>> "dyn_cast<Instruction>(V)" to find the instruction (again, if it
>>> exists).
>>>
>>> Cheers.
>>>
>>> Tim.
>>
>>
>>
>
>
> --
> John Criswell
> Assistant Professor
> Department of Computer Science, University of Rochester
> http://www.cs.rochester.edu/u/criswell
>



-- 
Rafi


More information about the llvm-dev mailing list