<div dir="ltr">But what happens if %data is null? Can LLVM prove that it isn't?<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Feb 5, 2014 at 7:12 PM, James Courtier-Dutton <span dir="ltr"><<a href="mailto:james.dutton@gmail.com" target="_blank">james.dutton@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On 5 February 2014 04:37, Pete Calvert <<a href="mailto:prc33@cam.ac.uk">prc33@cam.ac.uk</a>> wrote:<br>

> Hi,<br>
><br>
> Is there anyway I can coerce LLVM into performing the following<br>
> transformation?<br>
><br>
>   %1 = icmp eq i32 %flag, 1<br>
>   %2 = select i1 %1, %foo* %data, %struct.cell_t* null<br>
>   %3 = icmp eq %foo* %2, null<br>
>   br i1 %3, label %failure, label %success<br>
><br>
> Into:<br>
><br>
>   %1 = icmp eq i32 %flag, 1<br>
>   br i1 %1, label %success, label %failure<br>
><br>
> With %data substituted for %2 in %success and its successors, and null for<br>
> %2 in %failure. The way that code generation deals with the select means<br>
> that this is actually making a small but noticeable difference to<br>
> performance due to the number of branches involved.<br>
><br>
<br>
</div>I think the first step in optimization here is to be able to convert:<br>
<div class="im">%1 = icmp eq i32 %flag, 1<br>
%2 = select i1 %1, %foo* %data, %struct.cell_t* null<br>
%3 = icmp eq %foo* %2, null<br>
br i1 %3, label %failure, label %success<br>
<br>
</div>to<br>
<div class="im">%1 = icmp eq i32 %flag, 1<br>
%2 = select i1 %1, %foo* %data, %struct.cell_t* null<br>
</div>%3 = icmp eq i32 %flag, 1<br>
<div class="im">br i1 %3, label %failure, label %success<br>
<br>
</div>This would then permit instruction %2 to move down past the br.<br>
This could also be achieved, in the short term, by changing your<br>
source code to base  the if after return on "flag" instead of the<br>
returned value being NULL.<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br></div>