<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 12, 2013 at 6:17 PM, Guo, Xiaoyi <span dir="ltr"><<a href="mailto:Xiaoyi.Guo@amd.com" target="_blank">Xiaoyi.Guo@amd.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
I have the following test case:<br>
<br>
define  void @foo(<2 x float>* noalias nocapture %out, <2 x float>* noalias nocapture %data0) nounwind {<br>
entry:<br>
  %val1 = load <2 x float>* %data0, align 8<br>
  store <2 x float> %val1, <2 x float>* %out, align 8<br>
  fence acq_rel<br>
  %val2 = load <2 x float>* %data0, align 8<br>
  store <2 x float> %val2, <2 x float>* %out, align 8<br>
  ret void<br>
}<br>
<br>
If I run it though GVN with BasicAliasAnalysis, GVN does not remove the load after the fence.<br></blockquote><div><br>According to the LLVM atomics rules, the 
compiler is actually completely free to either hoist the fence to the 
top of the function or sink it to the bottom because your loads/stores aren't 
atomic.  The fact that LLVM doesn't actually do this is just because I didn't put much effort into alias analysis for fences; see <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?revision=182755&view=markup#l431">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?revision=182755&view=markup#l431</a> . <br>
<br></div><div>-Eli<br></div></div></div></div>