[llvm-dev] A bug related with undef value when bootstrap MemorySSA.cpp

Juneyoung Lee via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 17 13:34:27 PDT 2017


Hello, some of the patches had conflicts with LLVM head, so I updated them.
If you experienced patch failure before then you can try it again.

I compiled your code (1.c) with LLVM r308173 with the 5 patches applied,
and it generated assembly like this. Now it contains store to c(%rip).
It tries to store a(%rip) + b(%rip) to c(%rip). I wish this translation is
now correct.

```
73   .globl  hoo                     # -- Begin function hoo
74   .p2align  4, 0x90
75   .type hoo, at function
76 hoo:                                    # @hoo
77   .cfi_startproc
78 # BB#0:
79   movq  a(%rip), %rax
80   movq  cnt(%rip), %rcx
81   cmpq  $0, i_hasval(%rip)
82   sete  %sil
83   xorl  %edx, %edx
84   .p2align  4, 0x90
85 .LBB1_1:                                # =>This Inner Loop Header:
Depth=1
86   testb $1, %sil
87   je  .LBB1_3
88 # BB#2:                                 #   in Loop: Header=BB1_1 Depth=1
89   movq  b(%rip), %rsi
90   addq  %rax, %rsi
91   movq  %rsi, c(%rip)
92   movq  $3, i_hasval(%rip)
93   incq  %rdx
94   xorl  %esi, %esi
95   cmpq  %rcx, %rdx
96   jl  .LBB1_1
97 .LBB1_3:
98   retq
```

IMHO, enhancing `isGuaranteedNotToBeUndefOrPoison` and using it as a
precondition in loop unswitching is
not enough. undef (and poison) value can be stored into memory, and also be
passed by a function argument.
`isGuaranteedNotToBeUndefOrPoison` will virtually return `false` for all
cases except the value is
some integer constant. Sanjoy's suggestion might be helpful (if I
understood correctly), but I'm
not sure how much it will be.

Best Regards,
Juneyoung Lee

On Tue, Jul 18, 2017 at 3:43 AM, Sanjoy Das via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> On Mon, Jul 17, 2017 at 11:21 AM, Daniel Berlin <dberlin at dberlin.org>
> wrote:
> >> On Mon, Jul 17, 2017 at 10:32 AM, Xinliang David Li <davidxl at google.com
> >
> >> wrote:
> >> > The issue blocks another optimization patch and Wei has spent huge
> >> > amount of
> >> > effort isolating the the bootstrap failure to this same problem. I
> agree
> >> > with Wei that other developers may also get hit by the same issue and
> >> > the
> >> > cost of leaving this issue open for long can be very high to the
> >> > community.
> >>
> >> I can't speak for others, but I am fine with adding a workaround for
> >> this.  However, I suspect isGuaranteedNotToBeUndefOrPoison in
> >> LoopUnswitch may regress other benchmarks.
> >
> > Any other thoughts on a more minimal fix?
>
> I can't think of any good answers here.
>
> The semantic we want is "branching on poison or undef is undefined
> behavior" (which lets us do propagateEquality).  Given that, we could
> be clever about implementing isGuaranteedNotToBeUndefOrPoison; for
> instance if we have:
>
> do {
>   if (a != b) {
>     ...
>   }
> } while (...);
>
> then we can use post-domination to prove that "a != b" is not undef
> (otherwise the loop is guaranteed to have undefined behavior).
>
> (I hate to say this), a more aggressive fix is to introduce a "freeze"
> intrinsic that freezes only an i1.  LoopUnswitch would wrap the loop
> invariant condition in this after hoisting the branch.  This would be
> a poor man's version of the more invasive patches Juneyoung already
> has developed.
>
> -- Sanjoy
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>



-- 

Juneyoung Lee
Software Foundation Lab, Seoul National University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170718/a1f22eeb/attachment.html>


More information about the llvm-dev mailing list