我想在我的IR中分析几个值的标量演化(SCEV)表示。我可以在不编写辅助工具的情况下显示SCEV吗?我的意思是在我的IR上运行opt(或其他现有工具)并指定一些命令行参数。我概述了opt命令行参数,但没有找到合适的东西。
答案 0 :(得分:1)
据我所知,您可以在不触及任何代码的情况下获得SCEV工作的唯一见解是启用统计信息(let ... and let ...
) - 您可以在the implementation中看到SCEV发布的统计信息(在全局范围内查找in
宏调用。)
否则SCEV类采用opt -stats
方法,可能更符合您的要求。在命令行工具中运行SCEV并手动调用STATISTIC
非常容易。如果您从其中一个samples here开始,则不应该花费超过5分钟的时间来查看转储。
答案 1 :(得分:1)
除了 Dr. @ eliben的回答之外,opt
还有2个可能有用的选项(尽管可能不是您问题的直接答案)。
-analyze
这会调用Pass::print
的{{1}}成员函数。如,
Pass
输出
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
此&#34;打印PassManager调试信息&#34; 。您可以为不同级别的信息指定-debug-pass
/ Arguments
/ Structure
/ Executions
。这很有用,因为Details
依赖于其他LLVM通行证。如,
SCEV
outpus:
opt /dev/null -scev-aa -scalar-evolution -disable-output -debug-pass=Arguments