我想分析一下我的IR中几个值的标量进化(SCEV)表示。我可以不写辅助工具来显示SCEV吗?我的意思是在我的IR上运行opt (或其他现有工具),并指定一些命令行参数。我查看了opt命令行参数,但没有找到合适的参数。
发布于 2015-04-26 00:38:54
据我所知,您可以在不接触任何代码的情况下深入了解SCEV的工作原理的唯一方法是启用统计信息(opt -stats) -您可以在the implementation中查看SCEV发出的统计信息(在全局范围内查找STATISTIC宏调用)。
另外,SCEV类有一个dump方法,它可能更符合您的需求。只需在命令行工具中运行SCEV并手动调用dump就非常简单。如果你从其中一个samples here开始,应该不会超过5分钟就能看到一个转储。
发布于 2015-04-26 10:37:51
除了@eliben博士的答案之外,opt还有两个额外的选项可能会有用(尽管可能不是对您的问题的直接答案)。
-analyze
这将调用Pass的Pass::print成员函数。例如,
opt -analyze -scalar-evolution test/Analysis/ScalarEvolution/incorrect-nsw.ll输出
Printing analysis 'Scalar Evolution Analysis' for function 'bad.nsw':
Classifying expressions for: @bad.nsw
%i = phi i8 [ -1, %entry ], [ %i.inc, %loop ]
--> {-1,+,-128}<%loop> U: [127,0) S: [127,0) Exits: 127
%counter = phi i8 [ 0, %entry ], [ %counter.inc, %loop ]
--> {0,+,1}<%loop> U: [0,2) S: [0,2) Exits: 1
%i.inc = add i8 %i, -128
--> {127,+,-128}<%loop> U: [-1,-128) S: [-1,-128) Exits: -1
%i.sext = sext i8 %i to i16
--> {-1,+,128}<nw><%loop> U: [-1,128) S: [-1,128) Exits: 127
%counter.inc = add i8 %counter, 1
--> {1,+,1}<%loop> U: [1,3) S: [1,3) Exits: 2
Determining loop execution counts for: @bad.nsw
Loop %loop: backedge-taken count is 1
Loop %loop: max backedge-taken count is 1-debug-pass
这个“打印PassManager调试信息”。您可以为不同级别的信息指定Arguments/Structure/Executions/Details。这是很有帮助的,因为SCEV依赖于其他的LLVM过程。例如,
opt /dev/null -scev-aa -scalar-evolution -disable-output -debug-pass=Arguments输出:
Pass Arguments: -targetlibinfo -tti -assumption-cache-tracker -no-aa -domtree -loops -scalar-evolution -scev-aa -verifyhttps://stackoverflow.com/questions/29863528
复制相似问题