[cfe-dev] Possible bug when using -O2/-O3 in clang 13 for ARMv7
David Spickett via cfe-dev
cfe-dev at lists.llvm.org
Tue Dec 14 01:58:05 PST 2021
> I see, but I was thinking about something simpler: adding -O2 and -fno-foo flags to disable optimizations (e.g., -fno-slp-vectorizer), WDYT?
Worth a go for sure. I wasn't sure if all the passes would have an
-fno for them but if it's one of those then all the better.
> Done: https://github.com/llvm/llvm-project/issues/52669
Great. I'll see if I can reproduce it myself.
On Mon, 13 Dec 2021 at 18:08, Mikhail R. Gadelha
<mikhail.ramalho at gmail.com> wrote:
>
>
>
> Em seg., 13 de dez. de 2021 às 07:45, David Spickett <david.spickett at linaro.org> escreveu:
>>
>> Caveat that I'm on shaky ground when it comes to my understanding of
>> how the pass managers work.
>>
>> I think clang 13 uses the new pass manager, so this would be what you want:
>> $ ./bin/clang /tmp/test.c -c -o /dev/null -O1 -Xclang -fdebug-pass-manager
>
>
> Someone suggested looking into Alias Analysis as well.
>
>>
>> Certainly I see a lot of differences trying that myself.
>> (https://llvm.org/docs/NewPassManager.html#invoking-opt)
>>
>> That tells you what the target generic passes being run are, then the
>> target specific things use the old pass manager which you can use
>> "-mllvm -debug-pass=Structure" for instead.
>> (https://llvm.org/docs/NewPassManager.html#status-of-the-new-and-legacy-pass-managers)
>>
>> How you get an option from clang to opt to change which passes are
>> run, I couldn't work out. There is "-passes=" for opt but that won't
>> get through from clang with "-mllvm", maybe I just didn't do it
>> correctly.
>>
>> Though I found a good suggestion from Medhi Amini in another thread,
>> that would mean you could use opt directly:
>> "But you may start by bisecting the input files compiling half of them
>> with O1 and the other half with O0 and recurse till you find the file
>> that is miscompiled with O1. Then you can use opt to test variant of
>> the pipeline on this file and relink manually."
>> (https://groups.google.com/g/llvm-dev/c/Y1HHgpmBidM)
>>
>
> I see, but I was thinking about something simpler: adding -O2 and -fno-foo flags to disable optimizations (e.g., -fno-slp-vectorizer), WDYT?
>
> I've found this post from '14 about that: https://stackoverflow.com/questions/15548023/clang-optimization-levels
>
>>
>> Hope that helps but in any case please go ahead and open an issue and
>> we can narrow it down further.
>
>
> Done: https://github.com/llvm/llvm-project/issues/52669
>
>>
>>
>> On Mon, 13 Dec 2021 at 10:27, David Spickett <david.spickett at linaro.org> wrote:
>> >
>> > FWIW I think opening an issue with what you've got would be fine.
>> >
>> > > when I build JSC using either -O2 or -O3, I get random garbage when querying for the "Infinity" constant from javascript
>> >
>> > Can you elaborate on what JSC is and how you do the query? Is it something like:
>> > * build an interpreter
>> > * interpret javascript code that prints infinity
>> > * check for expected value
>> >
>> > I know zero about javascript in general but if we can get a script to
>> > do that then we could bisect it. It'll take a while but we (Linaro)
>> > have access to some machines that could help there.
>> > (assuming this presents on armv8 hardware, but if it doesn't it's at
>> > least a data point)
>> >
>> > > It seems like some optimization introduced by -O2 is causing the issue.
>> >
>> > Agreed
>> >
>> > > Is there a flag in clang to print which optimizations are enabled for -O1 and -O2 so I can diff them?
>> >
>> > Yes but I can never remember which one it is, so let me try to find
>> > it. Unless someone else knows it already and can reply.
>> >
>> > On Sat, 11 Dec 2021 at 18:01, Mikhail R. Gadelha via cfe-dev
>> > <cfe-dev at lists.llvm.org> wrote:
>> > >
>> > > Hi everyone,
>> > >
>> > > This is kind of a follow-up to my previous email about compiling JSC using clang for ARMv7: when I build JSC using either -O2 or -O3, I get random garbage when querying for the "Infinity" constant from javascript, as if the constant was not being initialized. The variable is being initialized correctly, that I'm sure.
>> > >
>> > > Some tests I did:
>> > > 1. Using -O1 or no optimization doesn't trigger the issue.
>> > > 2. Using either -O2 or -O3 with address or the undef behavior sanitizers doesn't trigger the issue.
>> > > 3. Building JSC with clang 11.0.1-2 (from Debian) and clang 12.0.1 (from github) doesn't trigger the issue.
>> > > 4. The issue happens with clang 13.0.0 (from github) and the 13.0.1-rc1 (also from github).
>> > >
>> > > It seems like some optimization introduced by -O2 is causing the issue.
>> > >
>> > > Does anyone have any tips I can follow to improve this bug report? I'll try to compile JSC with -O2 and disable the optimizations manually to pinpoint what's causing the issue (hopefully it's a single optimization and not a combination of them). Is there a flag in clang to print which optimizations are enabled for -O1 and -O2 so I can diff them?
>> > >
>> > > I wish I had more information, but I'm still trying to debug why this is happening. I wanted to try to get more information first before opening a github issue.
>> > >
>> > > Thanks in advance,
>> > >
>> > > --
>> > >
>> > > Mikhail R. Gadelha.
>> > > _______________________________________________
>> > > cfe-dev mailing list
>> > > cfe-dev at lists.llvm.org
>> > > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
>
> --
>
> Mikhail Ramalho.
More information about the cfe-dev
mailing list