Skip to content

Instantly share code, notes, and snippets.

@maekawatoshiki
Last active August 30, 2020 16:04
Show Gist options
  • Save maekawatoshiki/004a087f96e837a4a907895550a5ddb8 to your computer and use it in GitHub Desktop.
Save maekawatoshiki/004a087f96e837a4a907895550a5ddb8 to your computer and use it in GitHub Desktop.
problem with gep

何がわからないのか

common subexpression elimination や loop invariant code motion を行うと, getelementptr が,本来含まれていた基本ブロックの外へと移動することがある.

一見問題なさそうだが,場合によっては生成される命令数が増える.(これは自作コンパイラ基盤の実装上の問題)

次のコードは,

A:
   a = gep ...
   b = load a

次のように解釈されるから,

A:
   b = load (gep ...)

最終的に combine されて

A:
   b = mov [...]

みたいな感じになる.

でも次のコードは,

A:
   a = gep ...
   br B
B:
   b = load a

ブロックBからブロックA内のaを参照するから,どうしてもgep ...の結果がaに代入されてしまう.(liveoutする値は,仮想レジスタ(ここではa)に代入されることになっている)

だから,最終的にこうなる.

A:
   a = lea ...
   br B
B:
   b = mov [a]

さっきは mov 一個で済んでいたのに,今回は lea と mov を使ってしまっている.

解決方法

gep を移動させない,liveoutする値の挙動を変えるなど. これ以外に思いつかないので,何か良い方法があれば教えていただきたい.

@maekawatoshiki
Copy link
Author

CodeGenPrepareというものが存在することを知らなかったのと,調べものをしているときによく見かけるsinkやsunkという言葉の意味がようやく理解できました.
本当にありがとうございます.解決できそうです.

@uenoku
Copy link

uenoku commented Aug 30, 2020

いえいえ、自分もあまり知らなかったので勉強になりました🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment