<div dir="ltr"><div>This is actually not a LLVM issue, but more an issue of my higher language,that I'm trying to target LLVM on. I'm seeing that if I do a naive translation of my language, it generates additional load stores.</div><div><br></div><div>For example (in my high level language):</div><div><br></div><div>  var1 = expression1;</div><div>  var2 = expression2;</div><div>  var3 = call(var1, var2);</div><div>  var4 = expression3;</div><div>  var5 = expression4;</div><div>  var6 = call(var4, var5);</div><div>  var7 = call(var6);</div><div>  var8 = call(var3, var7);</div><div><br></div><div>This can be effectively represented in my high level language as</div><div><br></div><div>var8 = call(call(expression1, expression2), call(call(expression3, expression4));</div><div><br></div><div>When I think about it naively. I would write code that would start from var8 and traverse and try to substitute all "vars" with expressions.</div><div><br></div><div>I can imagine not always wanting to do this, for example if the expression is duplicated, maybe I do want to pay for the load/store. And maybe sometimes the semantics are such that I need to reuse it.<br></div><div><br></div><div>Is there a formal algorithm or classical technique that describes this?</div><div><br></div><div>Hayden</div></div>