<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Arial, sans-serif" size="2">
<div>Hi,</div>
<div> </div>
<div>My fronted generates (bad) code, which I see that LLVM is unable to optimize. For example, code similar to:</div>
<div> </div>
<div style="padding-left: 19pt; ">%a = type [32 x i16]</div>
<div style="padding-left: 19pt; "> </div>
<div style="padding-left: 19pt; ">declare void @set_obj(%a*)</div>
<div style="padding-left: 19pt; ">declare void @use_obj(%a*)</div>
<div style="padding-left: 19pt; "> </div>
<div style="padding-left: 19pt; ">define void @foo() {</div>
<div style="padding-left: 19pt; ">entry:</div>
<div style="padding-left: 19pt; ">  %a1 = alloca %a</div>
<div style="padding-left: 19pt; ">  %a2 = alloca %a</div>
<div style="padding-left: 19pt; ">  call void @set_obj(%a* %a2)</div>
<div style="padding-left: 19pt; ">  %a3 = load %a* %a2</div>
<div style="padding-left: 19pt; ">  store %a %a3, %a* %a1</div>
<div style="padding-left: 19pt; ">  call void @use_obj(%a* %a1)</div>
<div style="padding-left: 19pt; ">  ret void</div>
<div style="padding-left: 19pt; ">}</div>
<div> </div>
<div>(Or with load/store replaced with memcpy).</div>
<div> </div>
<div>In C pseudo-code this is similar to:</div>
<div> </div>
<div style="padding-left: 19pt; ">a a1;</div>
<div style="padding-left: 19pt; ">a a2 = set_obj();</div>
<div style="padding-left: 19pt; ">a1 = a2; </div>
<div style="padding-left: 19pt; ">use_obj(a1);</div>
<div> </div>
<div>and the corresponding LLVM IR in foo() can be simplified to:</div>
<div> </div>
<div style="padding-left: 19pt; ">  %a1 = alloca %a</div>
<div style="padding-left: 19pt; ">  call void @set_obj(%a* %a1)</div>
<div style="padding-left: 19pt; ">  call void @use_obj(%a* %a1)</div>
<div> </div>
<div>Is it unreasonable to expect LLVM to do this kind of simplifications?</div>
<div> </div>
<div>On a side note: Why isn't there an assignment operator in the LLVM IR? Other compilers I have seen have some kind of assignment operator in the IR.</div>
<div> </div>
<div>/Patrik Hägglund</div>
<div> </div>
<div> </div>
</font>
</body>
</html>