LLVM循环传递指令计数器

时间:2014-03-08 08:26:18

标签: loops llvm

使用llvm循环传递查找循环中的指令数。我无法在文档中获得太多信息。我们的测试文件:

#include<stdio.h>
int main(void)
{
    int a,b;
    for(a=0;a<10;a++){
  b=1;
  b=20;
  b=33;
}
return 0;
}

IR档案:

 ; ModuleID = 'test.c'
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-     f80:32:32-n8:16:32-S128"
 target triple = "i386-pc-linux-gnu"

 define i32 @main() nounwind {
 entry:
   %retval = alloca i32, align 4
   %a = alloca i32, align 4
   %b = alloca i32, align 4
   store i32 0, i32* %retval
   store i32 0, i32* %a, align 4
   br label %for.cond

 for.cond:                                         ; preds = %for.inc, %entry
   %0 = load i32* %a, align 4
   %cmp = icmp slt i32 %0, 10
   br i1 %cmp, label %for.body, label %for.end

 for.body:                                         ; preds = %for.cond
   store i32 1, i32* %b, align 4
   store i32 20, i32* %b, align 4
   store i32 33, i32* %b, align 4
   br label %for.inc

 for.inc:                                          ; preds = %for.body
   %1 = load i32* %a, align 4
   %inc = add nsw i32 %1, 1
   store i32 %inc, i32* %a, align 4
   br label %for.cond

 for.end:                                          ; preds = %for.cond
   ret i32 0
 }

我要写一个循环传递来查找循环体中的指令号。

1 个答案:

答案 0 :(得分:4)

您可以迭代Loop对象中的所有基本块。因此,如果您想要静态编号,可以使用以下内容:

bool runOnLoop(Loop * L, LPPassManager &LPM) {
  int Count = 0;
  for (auto Iter = L->block_begin(), End = L->block_end(); Iter != End; ++Iter) {
    Count += Iter->size();
  }
  // Do something with Count
  return false;
}

如果需要动态计数指令,则必须为每个循环分配一个计数器,然后让循环中的每个块根据其大小递增该计数器。请注意,如果循环嵌套,这可能会导致块具有多个计数器。