C++ 如何在llvm::value(C+;+;)上应用if语句

C++ 如何在llvm::value(C+;+;)上应用if语句,c++,llvm-ir,C++,Llvm Ir,我试图从左到右计算寄存器中的零数。为此,我需要一个循环。摆脱这个循环很困难,因为我不知道如何将if语句放在llvm::value上 llvm::Value* intermediateValue = llvm::ConstantInt::get(llvm::Type::getInt32Ty(llvm::getGlobalContext()), 1, true); for(int64_t i =31; i>=0; i--) { //Shifting the register r

我试图从左到右计算寄存器中的零数。为此,我需要一个循环。摆脱这个循环很困难,因为我不知道如何将if语句放在llvm::value上

llvm::Value* intermediateValue = llvm::ConstantInt::get(llvm::Type::getInt32Ty(llvm::getGlobalContext()), 1, true); 

  for(int64_t i =31; i>=0; i--)
  {
  //Shifting the register right
   CountFirstOne = irBuilder->CreateLShr(llvmRegFirstOperand,i,"CountFirstOneCal");
   if(CountFirstOne == intermediateValue)
    {
      break;
    } 
    count = count+1;  // count has number of zeros
  }

看起来你把你想让编译器做什么和你想让编译后的代码做什么混淆了。例如,您的循环存在于编译器过程中(例如,编译器将在编译时运行此循环),而不存在于LVM IR中。但是,您正在每个循环过程中创建新的LLVM IR指令(左移),循环过程的数量取决于寄存器的值(直到运行时才知道)。

我想我必须使用LLVM库中的跳转或分支来创建循环?我将从编写您想做的任何事情的等效C代码开始,然后用
-O0
运行它,并让它发出LLVM IR。这将使您了解要构建的基本未优化IR应该是什么样子。执行此操作的命令是
clang-O0-c-emit llvm code.c
。这将创建一个
code.bc
文件,其中包含LLVM IR二进制文件。然后可以运行
llvm dis code.bc
,它将生成
code.ll
。这个
code.ll
文件包含LLVM IR,它是人类可读的。你也可以运行<代码> LCC-MULL= CPP代码。BC/<代码>生成等效的C++ API调用。假设你想在LLVM IR层中添加指令,而不是在后端机器代码层中添加指令。