使用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
}
我要写一个循环传递来查找循环体中的指令号。
答案 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;
}
如果需要动态计数指令,则必须为每个循环分配一个计数器,然后让循环中的每个块根据其大小递增该计数器。请注意,如果循环嵌套,这可能会导致块具有多个计数器。