Alexandru Ionut Diaconescu
2013-Jan-10 09:56 UTC
[LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
Hello everyone ! In my pass I inspect the penultimate instruction from every basic block in runOnFunction(). I am interested in ICMP instructions only. if(BB->size()>1) if(last->getPrevNode()) { previous = last->getPrevNode(); ok=1; } I want to get the operands of previous, which is of type Instruction*. Due tests based on getNumOperands, ICMP has 2 (as normal). if ( ok && ((previous->getNumOperands())>=2) ) errs()<<"\nTTTTT "<<previous->getOperand(0)->getName()<<" | " <<previous->getOperand(0)->getValueName()<<" | " <<previous->getOperand(0)->getValueID()<<" | " <<previous->getOperand(0)->getNumUses()<<" TTTTT\n"; The results with getOperand(1) are similar. The output is: *PREVIOUS: store i32 %conv15, i32* %i, align 4 TTTTT conv15 | 0x9b69090 | 59 | 1 TTTTT ... *PREVIOUS: store i32 %inc13, i32* %i, align 4 TTTTT inc13 | 0x9b76478 | 30 | 1 TTTTT ... *PREVIOUS: %cmp11 = icmp sgt i32 %8, 3 TTTTT | 0x0 | 49 | 1 TTTTT ... *PREVIOUS: store i32 %dec, i32* %i, align 4 TTTTT dec | 0x9b69130 | 30 | 1 TTTTT ... *PREVIOUS: %cmp8 = icmp sle i32 %6, 2 TTTTT | 0x0 | 49 | 1 TTTTT ... *PREVIOUS: store i32 %inc, i32* %i, align 4 TTTTT inc | 0x9b761c8 | 30 | 1 TTTTT Do you know how I can get the operands from ICMP instructions? I need to use them in some conditions? (also their attributes). Thank you a lot ! -- Best regards, Alexandru Ionut Diaconescu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130110/79ebbe2f/attachment.html>
Duncan Sands
2013-Jan-10 10:21 UTC
[LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
Hi, On 10/01/13 10:56, Alexandru Ionut Diaconescu wrote:> Hello everyone ! > > In my pass I inspect the penultimate instruction from every basic block in > runOnFunction(). I am interested in ICMP instructions only. > > |if(BB->size()>1) > if(last->getPrevNode()) > { > previous = last->getPrevNode(); > ok=1; > } > | > > I want to get the operands of previous, which is of type Instruction*. Due tests > based on getNumOperands, ICMP has 2 (as normal). > > |if ( ok && ((previous->getNumOperands())>=2) ) > > errs()<<"\nTTTTT "<<previous->getOperand(0)->getName()<<" | " > <<previous->getOperand(0)->getValueName()<<" | " > <<previous->getOperand(0)->getValueID()<<" | " > <<previous->getOperand(0)->getNumUses()<<" TTTTT\n"; > | > > The results with getOperand(1) are similar. The output is: > > |*PREVIOUS: store i32 %conv15, i32* %i, align 4 > TTTTT conv15 | 0x9b69090 | 59 | 1 TTTTT > ... > *PREVIOUS: store i32 %inc13, i32* %i, align 4 > TTTTT inc13 | 0x9b76478 | 30 | 1 TTTTT > ... > *PREVIOUS: %cmp11 = icmp sgt i32 %8, 3 > TTTTT | 0x0 | 49 | 1 TTTTT > ... > *PREVIOUS: store i32 %dec, i32* %i, align 4 > TTTTT dec | 0x9b69130 | 30 | 1 TTTTT > ... > *PREVIOUS: %cmp8 = icmp sle i32 %6, 2 > TTTTT | 0x0 | 49 | 1 TTTTT > ... > *PREVIOUS: store i32 %inc, i32* %i, align 4 > TTTTT inc | 0x9b761c8 | 30 | 1 TTTTT > | > > Do you know how I can get the operands from ICMP instructions? I need to use > them in some conditions? (also their attributes). Thank you a lot !this is the correct way to get the operands. However you are wrongly assuming that all instructions have a name. If you look at %cmp11 = icmp sgt i32 %8, 3 the fact that the first operand is %8 (rather than something like %i) tells you it has no name. That is why the name comes out as null. Ciao, Duncan.> > > > -- > Best regards, > Alexandru Ionut Diaconescu > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Alexandru Ionut Diaconescu
2013-Jan-11 10:12 UTC
[LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
Hi Duncan, Thank you for your response! Now it works. But I have another problem: Do you know how can I iterate through a Value*? For instance, I have : Instruction *I1; // I take only I1 that are ICmp errs()<<"\n "<<*I1->getOperand(0)<<" \n"; // %3 = load i32* %c, align 4 As expected. Now I want to get %c from the previous to use "%c" in comparisons. I tried : for (llvm::Value::use_iterator VI=(*I1->getOperand(0)).use_begin(), VE=(*I1->getOperand(0)).use_end(); VI != VE ; ++VI) { errs()<<"\n "<<**VI<<" \n"; // %cmp3 = icmp ne i32 %3, 0 } Not as expected. It is printing the I1 instruction. Do you know how I can get %c from the "load instruction"? Thank you a lot ! On Thu, Jan 10, 2013 at 11:21 AM, Duncan Sands <baldrick at free.fr> wrote:> Hi, > > > On 10/01/13 10:56, Alexandru Ionut Diaconescu wrote: > >> Hello everyone ! >> >> In my pass I inspect the penultimate instruction from every basic block in >> runOnFunction(). I am interested in ICMP instructions only. >> >> |if(BB->size()>1) >> if(last->getPrevNode()) >> { >> previous = last->getPrevNode(); >> ok=1; >> } >> | >> >> I want to get the operands of previous, which is of type Instruction*. >> Due tests >> based on getNumOperands, ICMP has 2 (as normal). >> >> |if ( ok && ((previous->getNumOperands())>**=2) ) >> >> errs()<<"\nTTTTT "<<previous->getOperand(0)->**getName()<<" | " >> <<previous->getOperand(0)->**getValueName()<<" | " >> <<previous->getOperand(0)->**getValueID()<<" | " >> <<previous->getOperand(0)->**getNumUses()<<" TTTTT\n"; >> | >> >> The results with getOperand(1) are similar. The output is: >> >> |*PREVIOUS: store i32 %conv15, i32* %i, align 4 >> TTTTT conv15 | 0x9b69090 | 59 | 1 TTTTT >> ... >> *PREVIOUS: store i32 %inc13, i32* %i, align 4 >> TTTTT inc13 | 0x9b76478 | 30 | 1 TTTTT >> ... >> *PREVIOUS: %cmp11 = icmp sgt i32 %8, 3 >> TTTTT | 0x0 | 49 | 1 TTTTT >> ... >> *PREVIOUS: store i32 %dec, i32* %i, align 4 >> TTTTT dec | 0x9b69130 | 30 | 1 TTTTT >> ... >> *PREVIOUS: %cmp8 = icmp sle i32 %6, 2 >> TTTTT | 0x0 | 49 | 1 TTTTT >> ... >> *PREVIOUS: store i32 %inc, i32* %i, align 4 >> TTTTT inc | 0x9b761c8 | 30 | 1 TTTTT >> | >> >> Do you know how I can get the operands from ICMP instructions? I need to >> use >> them in some conditions? (also their attributes). Thank you a lot ! >> > > this is the correct way to get the operands. However you are wrongly > assuming > that all instructions have a name. If you look at > > %cmp11 = icmp sgt i32 %8, 3 > the fact that the first operand is %8 (rather than something like %i) > tells you > it has no name. That is why the name comes out as null. > > Ciao, Duncan. > > > >> >> >> -- >> Best regards, >> Alexandru Ionut Diaconescu >> >> >> ______________________________**_________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> >> >> > ______________________________**_________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> >-- Best regards, Alexandru Ionut Diaconescu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130111/79f556a5/attachment.html>