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 !

Hi,

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.

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 !

Alexandru Ionut Diaconescu <alexandruionutdiaconescu@gmail.com> writes:

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"?

In this case, you get %c starting from I1 this way:

I1->getOperand(0)->getOperand(0)

because "%3 = load i32* %c, align 4" (or %3, for short) is the first
operand of I1, and %c is the first operand of %3.

Please note that some Instructions are Values too. This is the case for
the Instruction `load'.

Hi Óscar,

But if I do “I1->getOperand(0)->getOperand(0)” I get " ‘class llvm::Value’ has no member named ‘getOperand’ ". getOperand() I think it’s only defined for Instruction class. Do you know any equivalent method for Value?

Value is a base superclass, from which a lot of other classes are derived. Among the derived classes are User and Instruction (which itself is derived from User). If I remember correctly, the class User adds "getOperand". In your case, the simplest thing to do would be to down-cast the Value to Instruction, and if the cast returns non-zero, then you have a valur of type Instruction, for which you can use getOperand. For example:

   Value *V = ...
   if (Instruction *In = dyn_cast<Instruction>(V)) {
     // Now have Instruction, can use getOperand:
     ... = In->getOperand(i);
   }

-Krzysztof