[llvm-dev] Field sensitive alias analysis?
Dmitry Polukhin via llvm-dev
llvm-dev at lists.llvm.org
Mon Dec 7 07:13:29 PST 2015
BTW, I have found why it doesn't work for arrays. TBAA information
propagation is not implemented in CodeGenFunction::EmitArraySubscriptExpr
with "TODO: Preserve/extend path TBAA metadata?".
On Fri, Dec 4, 2015 at 1:38 PM, Dmitry Polukhin <dmitry.polukhin at gmail.com>
wrote:
> As far as I can see it is specifics of arrays inside structs. Current TBAA
> does distinguish non-array members with path sensitive TBAA (see !1 and !6
> in my example below, TBAA has reference to struct !2 and offset). As for
> arrays information that it was member of some struct get lost completely
> (!7 has nothing about struct !2).
>
> struct S {
> int a;
> int b;
> int c[3];
> };
>
> void foo(struct S* p) {
> p->a = 1;
> p->b = 2;
> p->c[0] = 3;
> p->c[1] = 4;
> }
>
> define void @foo(%struct.S* nocapture %p) #0 {
> entry:
> %a = getelementptr inbounds %struct.S, %struct.S* %p, i64 0, i32 0
> store i32 1, i32* %a, align 4, !tbaa !1
> %b = getelementptr inbounds %struct.S, %struct.S* %p, i64 0, i32 1
> store i32 2, i32* %b, align 4, !tbaa !6
> %arrayidx = getelementptr inbounds %struct.S, %struct.S* %p, i64 0, i32
> 2, i64 0
> store i32 3, i32* %arrayidx, align 4, !tbaa !7
> %arrayidx2 = getelementptr inbounds %struct.S, %struct.S* %p, i64 0, i32
> 2, i64 1
> store i32 4, i32* %arrayidx2, align 4, !tbaa !7
> ret void
> }
>
> !0 = !{!"clang version 3.8.0 "}
> !1 = !{!2, !3, i64 0}
> !2 = !{!"S", !3, i64 0, !3, i64 4, !4, i64 8}
> !3 = !{!"int", !4, i64 0}
> !4 = !{!"omnipotent char", !5, i64 0}
> !5 = !{!"Simple C/C++ TBAA"}
> !6 = !{!2, !3, i64 4}
> !7 = !{!3, !3, i64 0}
>
> I'm just start learning how TBAA in clang works so I don't know why it was
> implemented this way.
>
> On Fri, Dec 4, 2015 at 11:06 AM, Vaivaswatha Nagaraj via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Hi,
>>
>> I'm trying to optimize a simple C code and came across a situation where
>> invariant code is not being moved out:
>>
>> On an -O3 compilation, I noticed that the "load" for the loop bounds
>> (which remain invariant throughout) happens on each iteration of both the
>> loops, even though it is not modified anywhere in the function "bigLoop".
>> It seems that alias analysis is not able to say that the writes to one
>> field in the structure does not impact the other field, leading to LICM
>> being ineffective.
>>
>> Do any of the alias analyses currently have some kind of field
>> sensitivity that can help in this case?
>>
>> ------------------------- test case ------------------------------------
>> #include <stdlib.h>
>> #include <stdio.h>
>>
>> #define SIZE 100
>>
>> struct AS {
>> int a[SIZE+4];
>> int size;
>> } A;
>>
>> void bigLoop(void)
>> {
>> unsigned i, j;
>>
>> for (i = 0; i < A.size; i++) {
>> A.a[i+2] += A.a[i];
>> }
>> for (i = 0; i < A.size; i++) {
>> A.a[i+2] *= A.a[i];
>> }
>> }
>>
>> int main()
>> {
>> A.size = random()%SIZE;
>> for (unsigned i = 0; i < A.size; i++) {
>> A.a[i] = random()%23;
>> }
>> bigLoop();
>> return 0;
>> }
>>
>> Thanks,
>>
>> - Vaivaswatha
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151207/0cd727a7/attachment.html>
More information about the llvm-dev
mailing list