作者mshockwave (夏克维夫)
看板CompilerDev
标题Re: [问题] llvm opt工具应用
时间Wed Oct 13 12:26:38 2021
※ 引述《shane87123 (阳光大肥宅)》之铭言:
: 大家好,编译器版首po,问题如果太白痴还请见谅~
: 最近在研究 Cmpiler 的 Optimizer 这块,我选择使用 LLVM,毕竟他的模组性是大家有
: 目共睹的。
: 近期在研究 Optimizer 的 Phase ordering Problem 这个问题(我发现繁中关键字很少
: )
: 感觉讨论度不高,不知道为什麽XD
: 最近想用 opt 这个工具去玩玩看 pass 的 order
: 那因为我想先使用 new passmanager 的 cmmand,所以我的指令一开始是这样打:
: opt -S -passes=always-inline,licm input.ll -o output.ll
: 结果出现 error,内容大概是要先 memorySSA
有详细的错误讯息吗?很有可能是IR内容的问题 因为我刚刚随便拿一个 .ll 档
然後用你的 command line flag,但是啥事也没发生
: 但我使用 legacy passmanager,就可以:
: opt -S --always-inline --licm input.ll -o output.ll
: 为什麽会这样呢?
: 我是比较想要使用新版的,我担心用旧版的之後会不支援。
: 另外,假如我 command 这样使用:
: clang -S -emit-llvm input.c -o output.ll
: 出来的 IR 内容最底下的 attributes 会有一个参数是这样:optnone
: 甚至会有noinline
: 想请问大家,这些参数该怎麽一开始就消除?以及这些参数的相关含义要去哪里查才查得
: 到?
optnone是 -O0 的时候会加在每个function的attribute,意思是请 optimizer 不要去
处理该 function,你可以用这个flag请clang在 -O0 的时候不要加它:
clang -Xclang -disable-O0-optnone ...
要注意的是一定要加 "-Xclang" 因为 -disable-O0-optnone 是 frontend flag 不是
driver flag
至於各 attribute 的意思,LLVM Language Reference 里就有了:
https://llvm.org/docs/LangRef.html
: 有这些参数,我每一次都要去 vim 一次修掉,才能 opt 他。
: 然後,opt 传入的 passes 理论上不论顺序如何,出来的 code 都不会执行错误对吧?
大部分的时候都不会错 但不是绝对。事实上有一个领域就是在检查这种错误 --
也就是 miscompilation 或者 misoptimization。
有兴趣的话也可以查查 "compiler translation validation" 这个领域在做的东西
: 先谢谢版友了,有这个版真的很棒。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 169.234.228.237 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1634099202.A.823.html