[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 19:18:33 PST 2016


Thanks Daniel for the clarification :)

On Wed, Jan 27, 2016 at 10:04 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
> This is only the IR if you don't call mem2reg, which does SSA conversion.
>
> The IR you have listed operates on memory, and memory is not in SSA.  If you
> run mem2reg on it, you will see what John mentioned, and that is what most
> people would refer to.
>
> The answer for memory operations is "no, you cannot find all the places a
> given memory is *actually* defined". You can use memorydependence and find
> the places it *may be defined*, but this may be a large set and include
> false positives"
> The question of finding which memory locations are must-modified is
> statically undecidable :)
>
>
>
> On Wed, Jan 27, 2016 at 6:58 PM, Syed Rafiul Hussain via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>>
>> 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
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>



-- 
Rafi


More information about the llvm-dev mailing list