Instruction arguments


I am loop over the arguments of a call instruction :

                   for (Value *arg: c->args()){
					errs() << *arg << "\n";
					arg->print(llvm::errs(), false);

How can I convert the arg for binary comparison(== etc.)? If I am correct, it is not a string. If the argument is “i32 1”, Is there a way to access the content value “1” directly?


Assuming you want to extract the constant number from a Value, you may want to try to cast it to a ConstantInt.
For example:

if (auto *CI = dyn_cast(arg)) {
const APInt &Integer = CI->getValue();
// Or if you know that it is a signed (or unsigned), and just want the actual integer then use:
int64_t SExtInt = CI->getSExtValue(); // signed
uint64_t ZExtInt = CI->getZExtValue(); // unsigned
// Now you may use either one of the 3 options above…


You don't want to access "1" directly if you want to compare it to
something other than a native C++ integer type such as
`int/unsigned/long/...`. These are SSA values on which pointer equality
works, especially since constants, e.g., i32 1, are unique.


Thanks, Ehud.

Thanks, Johannes.
I am trying to compare the call instruction (openMP ) compatibility wrt scheduling, iteration, and chunk size. I think accessing these constant values makes sense to form the set of call of instructions which are compatible. What do you think?

Can you elaborate?
“These are SSA values on which pointer equality
works, especially since constants, e.g., i32 1, are unique.”

“i32 1” is constant. But how I can use this constant for equality check? It is not a sting or datatype that can be used for binary equality check.


Constants are created via the getXXX routines. They are cached internally in the LLVMContext, so a particular constant won’t be created twice in the same context ( → unique). The common idiom for testing a constant is to compare the pointer itself with the one that you want. Look through the source code and you will see many examples.

To actually get the value inside the constant you will need to use the API I described before, which seems like what you are actually looking for.

If all you need is to compare with 1, then there is even a simpler API for this: Constant::isOneValue().