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

Ivan Kosarev via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 30 02:00:19 PDT 2019


Hi Alex,

This is an internal option used to test the new TBAA. As far as I'm 
aware, there are some defects that may cause AA to yield incorrect 
results under some conditions, so yes, as of today enabling it is not 
safe. I'd be happy to have a chance to work further on this, but 
currently there are no any plans. I know there are other people 
interested in this work who may have some plans, though.


On 29/10/2019 22:12, אלכס לופ' wrote:
> Thanks Ivan,
>
> Any guess what side effects it can cause? I mean, this option is 
> available today, right? Just not by default.
> So how can I see if this option causes "damages"? Just by comparing 
> the binary outputs with and without it?
> By the way, are there any plans to make this option a default one in 
> some future release? If yes, then what release is the target?
>
>
>     ב אוק׳ 29, 2019 21:20, Ivan Kosarev כתב:
>
>         Answering the second question, the new TBAA representation is
>         a work in progress; it's not mature enough to be enabled by
>         default.
>
>
>         On 29/10/2019 19:55, אלכס לופ' wrote:
>
>             So I have a couple of question regarding the approach
>             provided by Chill.
>
>             1. How to prevent such memory re-reads in the future? Is
>             there any BKM (best known method) for programming
>             guidelines which could eliminate or reduce those re-reads?
>             2. What could be the downside of the flag -Xclang
>             -new-struct-path-tbaa? Why not using it by default if it
>             makes better aliasing analysis?
>             Thanks,
>             Alex.
>
>
>                 ב אוק׳ 28, 2019 12:33, Ivan Kosarev כתב:
>
>                     It's just that the work on the new TBAA machinery
>                     is not completed and we do not have all the
>                     required logic for the new representation in place.
>
>
>                     On 27/10/2019 20:23, אלכס לופ' wrote:
>
>                         "...The idea behind the new representation was
>                         to address existing limitations by giving the
>                         TBAA accurate information about accesses. If
>                         memory servers me, in this specific case of an
>                         unknown index, the tag shall refer to the
>                         whole member array, which is supposed to mean
>                         that all and any of its elements can actually
>                         be accessed."
>                         So what about this case
>                         https://godbolt.org/z/xFC4Rp :
>                         struct S {
>                             int a[256];
>                             int b;
>                         };
>                         int f(struct S *p, unsigned char i) {
>                             if (p->b)
>                                 return42;
>                             p->a[i] = 3;
>                             return p->b;
>                         }
>                         "p->b" is re-read althoug the index "i" cannot
>                         acces beyond the array boundary. What went
>                         wrong here?
>                         Thanks,
>                         Alex.
>
>
>                             ב אוק׳ 27, 2019 17:47, Ivan Kosarev כתב:
>
>                                 Hi Momchil,
>
>                                 > 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.
>
>                                 Then all by-known-index array accesses
>                                 would need to be encoded as if there
>                                 were accessing the first element,
>                                 wouldn't they? The idea behind the new
>                                 representation was to address existing
>                                 limitations by giving the TBAA
>                                 accurate information about accesses.
>                                 If memory servers me, in this specific
>                                 case of an unknown index, the tag
>                                 shall refer to the whole member array,
>                                 which is supposed to mean that all and
>                                 any of its elements can actually be
>                                 accessed.
>
>                                 -- 
>                                 Regards,
>                                 Ivan
>
>
>
>                                 On 26/10/2019 23:39, Momchil Velikov
>                                 via llvm-dev wrote:
>
>
>                                           CAUTION:**This email
>                                           originated from outside of
>                                           the organization. Do not
>                                           click links or open
>                                           attachments unless you
>                                           recognize the sender and
>                                           know the content is
>                                           safe.  If you suspect
>                                           potential phishing or spam
>                                           email, report it to
>                                           ReportSpam at accesssoftek.com
>                                           <mailto:ReportSpam at accesssoftek.com>
>
>                                     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
>
>                                     _______________________________________________
>                                     LLVM Developers mailing list
>                                     llvm-dev at lists.llvm.org  <mailto:llvm-dev at lists.llvm.org>
>
>                                     https://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/20191030/cdecea13/attachment-0001.html>


More information about the llvm-dev mailing list