[llvm-dev] Retrieving numeric value of instruction operand

Jeremy Lakeman via llvm-dev llvm-dev at lists.llvm.org
Sun Apr 24 19:36:37 PDT 2016


Let me repeat the above;
%a is a variable. It could have any value.
There could be any number of other calls to @summ(a,b) in other
translation units, or linked at runtime, which pass any value at all.

However, if you have a call site which calls @summ with constant
arguments, the method could be inlined at that call site...

There is a very big difference between compiling a method, and
interpreting a method.

You can write an LLVM pass to modify the method and change what it
does. For example you can add code to inspect the values of a and b at
run time.

It might help to think about what the final version of your function
would look like if you wrote it in your source language. eg;

int summ(int a, int b) {return a+b;} ==> int summ(int a, int b) {if
(a==2) return b*2; else return a+b;}

Then compile both versions to LLVM so you can start thinking about
what LLVM operations need to be performed to turn one into the other.


On Mon, Apr 25, 2016 at 5:45 AM, Ammar Naqvi via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> Hi John,
>
> Thank you so much for the valuable answer! :)
>
> However, i have one tough issue that i need to solve, in my pass :
>
> let's say here
>
> %s = add %a, %b
>
> I need to check if the value of %a or %b is 2 or 4 and then apply a
> transformation to the other operand accordingly,
>
> for example if the value of %a = 2 the i'll multiply %b by 2 in my transform
> pass.
>
> I'm having a hard time getting the integer value of variables since it is so
> simple in regular languages, it can't be possible that LLVM does not have a
> way for that, I've also tried casting the operand to a ConstantInt which
> wasn't successful.
>
> I'm a beginner with LLVM and i do apologize for my naivety.
>
> Best Regards,
> Ammar
>
> On 24 April 2016 at 10:51, John Criswell <jtcriswel at gmail.com> wrote:
>>
>> On 4/24/16 1:27 PM, Ammar Naqvi wrote:
>>
>> hey john,
>>
>> yes indeed, that's what I'm trying, retreiving the values of %a and %b in
>> an LLVM pass,  sorry about the confusion.
>>
>>
>> If you want to add an instruction that uses the values %a and %b, then
>> your solution is easy: in the LLVM IR, a value and the instruction that
>> creates it are one and the same, and they are both represented by the same
>> object.  For example, in the following instruction:
>>
>> %s = add %a, %b
>>
>> The "%s" and the "add %a, %b" are the same thing (because SSA only allows
>> one assignment to a virtual register).  Therefore, in memory, there is one
>> object (a sub-class of the Value class) that has name "%s" and represents
>> the instruction "add %a, %b."
>>
>> So, let's say you have the following code to get an operand from an object
>> of class Instruction:
>>
>> Instruction * i = <whatever>;
>> Value * Va = i->getOperand(0);
>>
>> The variable Va points to the object representing the first operand of the
>> instruction (in your case, %a).  You can then create new instructions that
>> use this value as an operand:
>>
>> BinaryOperator * Sub = BinaryOperator::CreateNeg (Va, "name", InsertPt);
>>
>> The above would create the following instruction (which is an integer
>> negation instruction):
>>
>> %name = sub 0, %a
>>
>> Regards,
>>
>> John Criswell
>>
>>
>> On Apr 24, 2016 7:18 AM, "John Criswell" <jtcriswel at gmail.com> wrote:
>>>
>>> Dear Ammar,
>>>
>>> It is not clear what you are asking.  %a and %b in your code below are
>>> not constants; there is no way, at compile time, to determine what numeric
>>> values they will hold at run-time.
>>>
>>> Are you asking how to write an LLVM pass that will add code to summ() to
>>> print out its result?
>>>
>>> Regards,
>>>
>>> John Criswell
>>>
>>> On 4/24/16 2:27 AM, Ammar Naqvi via llvm-dev wrote:
>>>
>>> Hello Everyone,
>>>
>>> I need some help in retrieving the numeric value of an instruction
>>> operand from LLVM IR.
>>>
>>> this is what the IR looks like for a simple add function that adds two
>>> i32 integers
>>>
>>> define i32 @summ(i32 %a, i32 %b) #0 {
>>> entry:
>>>   %add = add nsw i32 %b, %a
>>>   ret i32 %add
>>> }
>>>
>>> i would like to know the integer value of %a and %b.
>>>
>>> I've tried
>>>
>>> -i->getOpcodeName() which gives me the string add
>>>
>>> -i->getOperand(0) which gives me the string i32 %b
>>>
>>> -i->getOperand(0)->getName() which gives me the string a
>>>
>>> what method exists to get the actual integer value of the operands?
>>> for example we called summ(1,2), how to retrieve the values 1 and 2 held
>>> in the operands?
>>>
>>> Any help and guidance is greatly appreciated! :)
>>>
>>> Best,
>>> Ammar
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>>
>>>
>>> --
>>> John Criswell
>>> Assistant Professor
>>> Department of Computer Science, University of Rochester
>>> http://www.cs.rochester.edu/u/criswell
>>
>>
>>
>> --
>> John Criswell
>> Assistant Professor
>> Department of Computer Science, University of Rochester
>> http://www.cs.rochester.edu/u/criswell
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>


More information about the llvm-dev mailing list