[LLVMdev] LLVM Instruction*->getOperand() not working properly for ICMP
Alexandru Ionut Diaconescu
alexandruionutdiaconescu at gmail.com
Fri Jan 11 02:12:28 PST 2013
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>
More information about the llvm-dev
mailing list