Beginner question: Calling intrinsic

Hello,

I’m not sure if this is the right place to ask beginner questions.

If not, please direct me to the appropriate place.

I’m writing my first llvm program and I’m trying to call an intrinsic, but failing.

So far this is what I have:

declare ccc i32 @llvm.x86.bmi.pdep.32(i32, i32)

@.str2 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1

declare i32 @printf(i8*, ...) nounwind

; Definition of main function
define i32 @main() {
  %res = call ccc i32 (i32, i32) @llvm.x86.bmi.pdep.32( i32 1, i32 1 )

  %a = alloca i32, align 8
  %1 = load i32, i32* %a, align 8
  %ss = getelementptr inbounds [4 x i8], [4 x i8]*  @.str2, i32 0, i32 0
  call i32 (i8*, ...) @printf( i8* %ss, i32 %res)

  ret i32 0
}

When I run this code, I get the following error:

$ lli helloWorld.ll
LLVM ERROR: Cannot select: intrinsic %llvm.x86.bmi.pdep.32

Where am I going wrong?

Also, what’s the best resource for learning llvm?

Cheers,

-John

Hi John,
What targer are you trying to compile this for? I imagine this is just a case of using an X86 intrinsic on a non-X86 back end. Or is this an intrinsic you added and didn’t provide a selection pattern for?

In any case, this intrinsic makes it into the selection DAG and the instruction selector tries to select a sequence of instructions for it. However, it fails to find a pattern that it can match in your back end, so you get this error.

As far as learning LLVM, The documentation at llvm.org is the best place to start. However, it is a huge project so you probably want to be a bit more specific in terms of what it is you want to learn. Based on your question, I imagine you want to learn how code generation works, so you might want to check out http://llvm.org/docs/CodeGenerator.html

Hope this helps.

If you are using x86, you probably need to pass something like -mcpu=haswell or -mattr=bmi2 to enable support for the intrinsic. It seems to -mcpu=native doesn’t work for lli so it can’t just autodetect your CPU.

Nice!

Thanks so much!