[llvm-dev] Where and how to report an optimisation issue that doesn't cause a crash

David Blaikie via llvm-dev llvm-dev at lists.llvm.org
Sat Oct 26 15:08:01 PDT 2019


can't say I know much about TBAA, so I'll leave it up to you/others :)

On Sat, Oct 26, 2019 at 1:40 PM Momchil Velikov <momchil.velikov at gmail.com>
wrote:

> Using the shorter test case:
>
>     struct S {
>       int a[3];
>       int b;
>     };
>
>     int f(struct S *p, int i) {
>       if (p->b)
>         return 42;
>
>       p->a[i] = 3;
>       return p->b;
>     }
>
> one can see that the the TBAA metadata loses information about the array
> member:
>
>     !4 = !{!"S", !5, i64 0, !7, i64 12}
>     !5 = !{!"omnipotent char", !6, i64 0}
>
> The "new struct path TBAA" looks better, it seems to say "there are 12
> bytes of
> `int`s at offset 0 in struct S"
>
> (Command line was ./bin/clang -target armv7m-eabi -O2 -S y.c -emit-llvm
> -Xclang
> -new-struct-path-tbaa)
>
>
>     !3 = !{!4, !7, i64 12, i64 4}
>     !4 = !{!5, i64 16, !"S", !7, i64 0, i64 12, !7, i64 12, i64 4}
>     !5 = !{!6, i64 1, !"omnipotent char"}
>     !6 = !{!"Simple C/C++ TBAA"}
>     !7 = !{!5, i64 4, !"int"}
>     !8 = !{!7, !7, i64 0, i64 4}
>
> but then, the access tag for the store to the array
>
>
>     %arrayidx = getelementptr inbounds %struct.S, %struct.S* %p, i32 0,
> i32 0, i32 %i
>     store i32 3, i32* %arrayidx, align 4, !tbaa !8
>
> says just "it's in int" and there it still a redundant load:
>
>     f:
>         ldr     r2, [r0, #12]
>         cmp     r2, #0
>         itt     ne
>         movne   r0, #42
>         bxne    lr
>         movs    r2, #3
>         str.w   r2, [r0, r1, lsl #2]
>         ldr     r0, [r0, #12]
>         bx      lr
>
> So, I manually hacked the metadata too look like:
>
>     !8 = !{!4, !7, i64 0, i64 4}
>
> i.e. as if we access the first element of the array.
>
> Running that through `opt -O2` and `llc` yields:
>
>     f:
>         ldr     r2, [r0, #12]
>         cmp     r2, #0
>         iteee   ne
>         movne   r0, #42
>         moveq   r2, #3
>         streq.w r2, [r0, r1, lsl #2]
>         moveq   r0, #0
>         bx      lr
>
> That seems like something that Clang can do by itself for access tags for
> index
> expressions with member arrays: state that they access the offset in the
> struct
> that corresponds to the first array element, so unknown indices would still
> conservatively alias between each other, but not with other struct members.
>
> Thoughts? Pitfalls? I may give it a shot.
>
> ~chill
>
> --
> Compiler scrub, Arm
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191026/31e17d89/attachment.html>


More information about the llvm-dev mailing list