Ammar Naqvi via llvm-dev
2016-Apr-24 17:27 UTC
[llvm-dev] Retrieving numeric value of instruction operand
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. 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 listllvm-dev at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > > > -- > John Criswell > Assistant Professor > Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160424/62122b5e/attachment.html>
John Criswell via llvm-dev
2016-Apr-24 17:51 UTC
[llvm-dev] Retrieving numeric value of instruction operand
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 > <mailto: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 <mailto: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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160424/52bc8bfc/attachment-0001.html>
Ammar Naqvi via llvm-dev
2016-Apr-24 20:15 UTC
[llvm-dev] Retrieving numeric value of instruction operand
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 listllvm-dev at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> >> >> -- >> John Criswell >> Assistant Professor >> Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell >> >> > > -- > John Criswell > Assistant Professor > Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160424/9590446e/attachment.html>