作者查詢 / Lipraxde
作者 Lipraxde 在 PTT [ CompilerDev ] 看板的留言(推文), 共148則
限定看板:CompilerDev
看板排序:
1F→: 這個寫要四年經驗耶12/19 13:22
5F→: LLVM 最為一個 SSA form 的 IR,value 「只能被賦值一12/01 19:45
6F→: 次」,def-use chain 就是你要找的「value 的關係」了12/01 19:45
7F→: 。由於 SSA 的 value 只能被賦值一次的關係,宣告變數12/01 19:45
8F→: 的一種替代方式就是先 allocate 一塊空間,對其做 load12/01 19:45
9F→: /store,一般 dependency analysis 是在分析這些 alloc12/01 19:45
10F→: ate 出來的空間。12/01 19:45
11F→: 應該是 compiler 要依 backend pipeline 來決定 instru12/01 23:32
12F→: ction scheduling,dependency 是用來避免 schedule 排12/01 23:32
13F→: 錯的 (例如本來是 RAW,結果你把 R 排到 W 前面,那 R12/01 23:32
14F→: 讀到的值就跟沒排前不同)。12/01 23:32
15F→: 至於 variable def 後到很後面才用到,代表的是這個 va12/01 23:32
16F→: riable 的 lifetime 很長,不代表它們之間沒有 depende12/01 23:32
17F→: ncy。12/01 23:32
18F→: 更正一下:「compiler 要依 backend pipeline...」-> c12/01 23:34
19F→: ompiler 要參考 backend pipeline...,這樣比較精確12/01 23:34
20F→: 第一份跑得比較快是因為 br 和 div 可以同時做,而第二12/02 12:24
21F→: 份要等到 br 做完 (或是 branch predict 有對) 才能跑12/02 12:24
22F→: ,又因為 mul 需要 div 的結果,mul 不能偷跑。12/02 12:24
23F→: Data dependency 跟 instruction scheduling 有關,但12/02 12:33
24F→: 這不代表它就是這個 case 的原因。兩份 binary 的 data12/02 12:33
25F→: dependency 都一樣,你下的結論從何而來?12/02 12:33
26F→: 是啊,原因是你的「pipeline一次可以做5個inst」,div12/02 20:05
27F→: 、mul 間隔的遠只是一種現象。12/02 20:05
1F→: -print-ir-after-all,然後開使 debug 吧,不過你只是11/28 02:20
2F→: 想插入新的 pass 的話其實直接改 pass builder 就好了11/28 02:20
3F→: -stats 要有 assertion build11/28 02:20
4F→: 試試看 -aa-eval,以前好像遇過類似的問題,不過有點忘11/28 15:51
5F→: 了是因為 lazy analysis 的關係還是啥的11/28 15:51
2F→: Assembly 都在你眼前了,再加點油分析一下。11/09 01:55
3F→: LLVM 可以在每個 pass 跑完後 dump IR / machine IR,11/09 01:55
4F→: 對了解優化、為什麼生出這樣的 pattern 很有幫助。11/09 01:55
5F→: 另外就是不太確定你有沒有讀過 System V ABI,如果要做11/09 01:55
6F→: 的這麼深的優化的話熟悉 ABI 是很重要的!11/09 01:55
7F→: 啊...好像講了些不太相干的東西,回到你的問題,雖然給11/09 02:04
8F→: 的資訊有點少,不過從執行時間的差距、codegen 結果的11/09 02:04
9F→: 差異來看,我會覺得有可能是由於 cache 所造成的。11/09 02:04
10F→: Branch miss 呢?11/09 09:19
11F→: 有開 frame-pointer 的版本因為有多的 push、move 個關11/09 16:50
12F→: 係,因此不建議直接對 instruction num per cycles 下11/09 16:50
13F→: 定論。然後我注意到一個地方,all、none 的 instructio11/09 16:50
14F→: n 數量是差不多的,可以看看是為什麼 :)11/09 16:50
3F→: 那這樣的話你可以用 opt 去指定跑你要的優化,然後用 l11/03 00:55
4F→: lc 做 codegen、codegen 的優化。opt、llc 兩個 tool11/03 00:55
5F→: 分別是用來跑 target-independent、target-dependent11/03 00:55
6F→: 的 pass pipeline 的11/03 00:55
7F→: 要跑自己的 pass 去比較差異會比較建議用上述的作法,11/03 01:02
8F→: 這樣還可以拿到 object file 來看有沒有如預期 codegen11/03 01:02
9F→: 。用 clang 的話要指定 pass、優化程度比較麻煩,而 ll11/03 01:02
10F→: i 則是用 interpreter + JIT 的方式,要看到 codegen11/03 01:02
11F→: 的結果會比較難一些。11/03 01:02
18F→: 痾... opt -O3 && llc -O2 的 performance 比 opt -O311/03 19:52
19F→: && llc -O0 還好好像還蠻合理的吧?還是我理解錯你的意11/03 19:52
20F→: 思?11/03 19:52
21F→: 如果是做調整 target-independent 的 pass 順序的調整11/05 12:27
22F→: 的話,把 llc 固定用 O2 吧XD11/05 12:27
3F→: 小於 64bits 的話可以用 getZExtValue、getSExtValue08/26 15:13
3F→: 確實是 object layer 在做的事。其實在做 LiteJIT 更早07/12 18:40
4F→: 之前,有跟同實驗室的一位同學嘗試 port RISC-V,看能07/12 18:40
5F→: 不能讓 LLVM 可以直接支援 JIT RISC-V,不過那時好像在07/12 18:40
6F→: 插 stub、算 address 時遇到了些障礙,做出來的東西還07/12 18:40
7F→: 不夠用。比較熟 OrcJIT、relocation 後,覺得 OrcJIT07/12 18:40
8F→: 大部分功能不太需要、relocation 自己做比較快,所以就07/12 18:40
9F→: 沒去動 LLVM 了 XD07/12 18:40
1F推: 恭喜~04/02 19:19
2F推: Instruction selection 和 register allocation 確實是02/19 22:49
3F→: 佔蠻多時間,不過在 function 小且數量多的時候花在舊02/19 22:49
4F→: 的 pass manager 上的時間我是覺得蠻有感的02/19 22:49
5F→: 不過我不知道換成用新的可以快多少就是了02/19 22:50
1F→: (3) 那邊好像有筆誤,應該是 B.val * 2 ^ (Ls1.len)?12/24 08:04