Skip to content

Instantly share code, notes, and snippets.

@maekawatoshiki
Last active October 6, 2019 09:03
Show Gist options
  • Save maekawatoshiki/d60eccd28879bebce32f7897c75bb735 to your computer and use it in GitHub Desktop.
Save maekawatoshiki/d60eccd28879bebce32f7897c75bb735 to your computer and use it in GitHub Desktop.
以下のようなコードがあるとする.
block.1:
vreg.1 = load [stack.0]
br block.2 if vreg.1 < 100
br block.3
block.2:
call @something
inc = add vreg.1, 1
store inc, [stack.0]
br block.1
block.3:
ret
ここで,call @somethingのせいでvreg.1はkillされるので,
call @somethingの周りでvreg.1の退避・リロードをする必要がある.
例えば以下の通り.
block.1:
vreg.1 = load [stack.0]
br block.2 if vreg.1 < 100
br block.3
block.2:
store vreg.1, [stack.1] // 退避
call @something
vreg.2 = load [stack.1] // リロード.SSAなのでvreg.2が誕生.
inc = add vreg.2, 1 // vreg.1はvreg.2に置き換えられた.
store inc, [stack.0]
br block.1
block.3:
ret
しかし上記のようなコードだと,block.2からblock.1へとbrするため,再びvreg.1が現れてしまう.block.2でvreg.1は死んだはずなのに.
どうすればいいのでしょうか.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment