llvm opt中的SCEV打印

llvm opt中的SCEV打印,llvm,Llvm,我想分析IR中几个值的标量演化(SCEV)表示。我可以在不写入辅助工具的情况下显示SCEV吗?我的意思是在我的IR上运行opt(或其他现有工具),并指定一些命令行参数。我浏览了opt命令行参数,但没有找到合适的参数。据我所知,您可以在不接触任何代码的情况下了解SCEV的工作原理的唯一方法是启用统计信息(opt-stats)-您可以在中看到SCEV发出的统计信息(在全局范围内查找统计信息宏调用) 否则,SCEV类有一个dump方法,该方法可能更符合您所寻找的内容。只需在命令行工具中运行SCEV并手

我想分析IR中几个值的标量演化(SCEV)表示。我可以在不写入辅助工具的情况下显示SCEV吗?我的意思是在我的IR上运行opt(或其他现有工具),并指定一些命令行参数。我浏览了opt命令行参数,但没有找到合适的参数。

据我所知,您可以在不接触任何代码的情况下了解SCEV的工作原理的唯一方法是启用统计信息(
opt-stats
)-您可以在中看到SCEV发出的统计信息(在全局范围内查找
统计信息
宏调用)

否则,SCEV类有一个
dump
方法,该方法可能更符合您所寻找的内容。只需在命令行工具中运行SCEV并手动调用
dump
就非常容易了。如果您从其中一个开始,应该不会花费超过5分钟的时间来查看转储。

除了@eliben博士的答案之外,还有两个附加选项可能有用的
opt
选项(尽管可能不是您问题的直接答案)

-分析
这将调用
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
输出:

Pass Arguments:  -targetlibinfo -tti -assumption-cache-tracker -no-aa -domtree -loops -scalar-evolution -scev-aa -verify
Pass Arguments:  -targetlibinfo -tti -assumption-cache-tracker -no-aa -domtree -loops -scalar-evolution -scev-aa -verify