<div dir="ltr">This is happening because there is undefined behaviour in your example. In C, a `struct P*` must point to the start of a `struct P`, so the compiler can assume references to two different members do not alias. In your example, you've constructed `p2` to point to the second member of the struct, which is not correct.<div><br></div><div>Clang reports this as a warning:</div><div><br></div><div><i>######################################################</i><br></div><div>$ /work/llvm/build/bin/clang -fsyntax-only -c test.c<br>test.c:15:11: warning: incompatible pointer types passing 'float *' to parameter of type 'struct P *' [-Wincompatible-pointer-types]<br>  foo(&p, &(p.f2));<br>          ^~~~~~~<br>test.c:8:34: note: passing argument to parameter 'p2' here<br>void foo(struct P *p1, struct P *p2) {<br>                                 ^<br>test.c:16:1: warning: non-void function does not return a value [-Wreturn-type]<br>}<br>^<br>2 warnings generated.<br></div><div><i>######################################################</i><br></div><div><br></div><div>Oliver</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 28 Feb 2020 at 06:18, Tiwary, Siddharth via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<p align="Left" style="margin:0px"><span style="font-size:10pt;font-family:Arial;color:rgb(0,120,215)">[AMD Official Use Only - Internal Distribution Only]</span></p>
<br>
<div class="gmail-m_6525604889076691672WordSection1">
<p class="MsoNormal">Hi,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Following issue is observed with Type Based Alias Analysis(TBAA).<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">#######################################################<u></u><u></u></p>
<p class="MsoNormal"><i>struct P {<u></u><u></u></i></p>
<p class="MsoNormal"><i>  float f1;<u></u><u></u></i></p>
<p class="MsoNormal"><i>  float f2;<u></u><u></u></i></p>
<p class="MsoNormal"><i>  float f3[3];<u></u><u></u></i></p>
<p class="MsoNormal"><i>  float f4;<u></u><u></u></i></p>
<p class="MsoNormal"><i>};<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal"><i>void foo(struct P* p1, struct P* p2) {<u></u><u></u></i></p>
<p class="MsoNormal"><i>  p1->f2 = 1.2;<u></u><u></u></i></p>
<p class="MsoNormal"><i>  p2->f1 = 3.7;<u></u><u></u></i></p>
<p class="MsoNormal"><i>}<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal"><i>int callFoo() {<u></u><u></u></i></p>
<p class="MsoNormal"><i>  struct P p;<u></u><u></u></i></p>
<p class="MsoNormal"><i>  foo(&p, &(p.f2));<u></u><u></u></i></p>
<p class="MsoNormal"><i>}<u></u><u></u></i></p>
<p class="MsoNormal"><i>######################################################<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Printing alias-sets using commands:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>  clang -O1 -S -emit-llvm struct_tbaa.c<u></u><u></u></i></p>
<p class="MsoNormal"><i>  opt -basicaa -tbaa -print-alias-sets -disable-output struct_tbaa.ll<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">yields:<i><u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>Alias sets for function 'foo':<u></u><u></u></i></p>
<p class="MsoNormal"><i>Alias Set Tracker: 2 alias sets for 2 pointer values.<u></u><u></u></i></p>
<p class="MsoNormal"><i>  AliasSet[0x563d8f6a8bd0, 1] must alias, Mod       Pointers: (i32* %f2, LocationSize::precise(4))<u></u><u></u></i></p>
<p class="MsoNormal"><i>  AliasSet[0x563d8f6bc080, 1] must alias, Mod       Pointers: (float* %f1, LocationSize::precise(4))<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal">IR of foo:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>; Function Attrs: nofree norecurse nounwind uwtable writeonly<u></u><u></u></i></p>
<p class="MsoNormal"><i>define dso_local void @foo(%struct.P* nocapture %p1, %struct.P* nocapture %p2) local_unnamed_addr #0 {<u></u><u></u></i></p>
<p class="MsoNormal"><i>entry:<u></u><u></u></i></p>
<p class="MsoNormal"><i>  %f2 = getelementptr inbounds %struct.P, %struct.P* %p1, i64 0, i32 1<u></u><u></u></i></p>
<p class="MsoNormal"><i>  store float 0x3FF3333340000000, float* %f2, align 4, !tbaa !2<u></u><u></u></i></p>
<p class="MsoNormal"><i>  %f1 = getelementptr inbounds %struct.P, %struct.P* %p2, i64 0, i32 0<u></u><u></u></i></p>
<p class="MsoNormal"><i>  store float 0x400D9999A0000000, float* %f1, align 4, !tbaa !7<u></u><u></u></i></p>
<p class="MsoNormal"><i>  ret void<u></u><u></u></i></p>
<p class="MsoNormal"><i>}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!2 = !{!3, !4, i64 4}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!3 = !{!"P", !4, i64 0, !4, i64 4, !5, i64 8, !4, i64 20}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!4 = !{!"float", !5, i64 0}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!5 = !{!"omnipotent char", !6, i64 0}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!6 = !{!"Simple C/C++ TBAA"}<u></u><u></u></i></p>
<p class="MsoNormal"><i>!7 = !{!3, !4, i64 0}<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal">TBAA returns p1->f2 and p2->f1 in different alias-sets. But p1->f2 and p2->f1 do actually have the same address!
<span style="font-size:10.5pt;font-family:"Segoe UI",sans-serif">Shouldn't the alias result be conservative while doing TBAA, especially when it needs interprocedural analysis?<u></u><u></u></span></p>
<p class="MsoNormal">If instead of the above, p1->f2 and p2->f2 are the ones being accessed, then p1->f2 and p2->f2 are returned in same alias-sets. So, in second case, it is indeed conservative!
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Could someone please explain the rationale behind above behavior?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Siddharth<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>