簡體   English   中英

在LLVM中的兩個塊之間插入一個塊

[英]Inserting a block between two blocks in LLVM

我想在 LLVM 的兩個基本塊之間插入一個塊。 例如,如果一個基本塊 A 跳到基本塊 B,我想在它們之間插入一個基本塊 C,這樣 A 跳到 C,C 跳到 B。我該怎么做? 我確實有一個基本的想法,我需要更改基本塊 A 的終止指令,以便目標 B 被 C 替換,但是我如何繼續在其間添加新的基本塊 C?

是的,您需要更改(或替換)基本塊 A 的終止指令 - 例如,如果它是一個分支,則可以使用BranchInst::setSuccessor() 然后創建基本塊 C 並確保其終止指令跳轉到 B,這將使其介於兩者之間。

你需要做的就是改變終結者的目標——你不需要重新排列內存中的塊順序或類似的東西。

但是,您必須意識到有兩個特殊說明需要您擔心 - phi 節點和着陸點。

  • Phi 節點僅指塊的直接前驅。 這意味着如果在 A 和 B 之間插入 C,則必須通過刪除它們或使它們引用 C 而不是 A 來修復 B 中的所有 phi 節點。

  • 如果 B 是一個着陸板塊(包含一個着陸板指令),那么直接從 invoke 指令的展開目標跳轉到它是合法的。 如果從 A 跳轉到 B 是通過展開目標,則不能在中間添加基本塊,除非您將 C 本身設置為着陸場並從 B 上移除着陸場。

有一個名為llvm::splitEdge的函數。 它完全符合問題的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM