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>
Apparently Analagous Threads
- [LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
- [LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
- [LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
- [LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
- [LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*