[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