<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><br><div dir="ltr">On Jun 27, 2019, at 10:31 PM, Mehdi AMINI <<a href="mailto:joker.eph@gmail.com">joker.eph@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jun 26, 2019 at 3:04 PM Gerolf Hoflehner 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-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br>
I finally got back to this. It is a known and endemic issue that pops up from time to time. The issues I’m aware of so far are related to random sets being used where strict order is required. This may result in non-deterministic uselists issued by the bitcode/assembly writers.<br>
<br>
There is no great way to go about pro-active testing for this. Collecting the tests so far and running them as regression tests occasionally might serve as a feel better bandage. Neither can I think of good checks in a verifier. These bugs show up from time to time, disappear, show up again, and essentially any commit could expose them or make them disappear. The medicine to take may well be supplying deterministic implementations for DenseMap, SmallPtrSet, and probably DenseSet  - and have current usage limited to cases where order is irrelevant, like in data flow analysis etc.<br></blockquote><div><br></div><div>Isn't LLVM_REVERSE_ITERATION intended to catch issues where we depend on the iteration order? I don't know if we have bots using this flag though.</div></div></div></div></div></blockquote><blockquote type="cite"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div>Would building something like LLVM itself with a host clang built with and without this flag and comparing the output be enough?</div></div></div></div></div></blockquote>This is a good idea. You would want to check the usual test suites first. For debugging simplicity, but also to increase the probability of finding issues. The crux is that you usually need a random number of runs before you can spot the issue. A simple a/b I would not consider prove for the absence of the issue,  even with the forward/reverse perturbation. But I could see a bot running many a/b tests to spit them out over time. <blockquote type="cite"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><br></div></div></div></div></blockquote><blockquote type="cite"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>-- </div><div>Mehdi</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
I pushed back one fix for sccp, and will post one for adce later. Hopefully they will help in your case, but I doubt they are exhaustive.<br>
<br>
FWIW, there is one bright spot here: I have no (not yet…) example where incorrect code is generated.<br>
<br>
-Gerolf<br>
<br>
<br>
<br>
> On May 31, 2019, at 2:08 AM, Gerolf Hoflehner via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> <br>
> <br>
> There is a non-deterministic problem with the uselists. The code causing this is almost identical in the IR and the bc writer. In some invocations of opt the uselists are shuffled in others (same input) they are not. I haven’t nailed the root cause yet. It has the flavor of a stack memory corruption. <br>
> For a quick check that you see the same issue you could disable the shuffle code in the writers.<br>
> <br>
> Gerolf<br>
> <br>
> <br>
> Sent from my iPhone<br>
> <br>
>> On May 30, 2019, at 1:41 PM, Sébastien Michelland via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>> <br>
>> Hello again,<br>
>> <br>
>>> It may be desirable to sort the table before writing the bitcode out, adding Peter to the thread for his opinion.<br>
>> <br>
>> Thanks for this!<br>
>> <br>
>> Now it seems I've been optimistic about this result. I have instrumented the test suite to check it on a wider amount of files and quickly discovered that it fails for larger optimization sequences.<br>
>> <br>
>> In particular, the default -O3 set in which I'm interested is not reproduced easily. I'm attaching a script that demonstrates this.<br>
>> <br>
>> It contains the extracted -O3 set in two groups, and checks that [opt -debug-pass=Arguments] reports the same sequences when called with -O3 and the individual arguments. If a file name is provided, it also checks that the outputs are the same (or in our case, different).<br>
>> <br>
>> Many real files fail to pass this test, for instance bilateral_grid.bc:<br>
>> <br>
>> <<a href="https://github.com/llvm/llvm-test-suite/blob/master/Bitcode/Benchmarks/Halide/bilateral_grid/bilateral_grid.bc" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-test-suite/blob/master/Bitcode/Benchmarks/Halide/bilateral_grid/bilateral_grid.bc</a>><br>
>> <br>
>> The diffs are very large even in text mode, and include lots of code.<br>
>> <br>
>> I'm puzzled again. Any clue on the behavior of opt is very welcome. :)<br>
>> <br>
>> Cheers,<br>
>> Sébastien Michelland<br>
>> <not-associative.sh><br>
>> _______________________________________________<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>
> _______________________________________________<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>
<br>
_______________________________________________<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></div></div>
</div></blockquote></body></html>