[llvm-dev] [RFC] Turn the MachineOutliner on by default in AArch64 under -Oz
Friedman, Eli via llvm-dev
llvm-dev at lists.llvm.org
Mon Apr 23 15:55:13 PDT 2018
Sorry, I was using a modified compiler, which by coincidence made the
bug much easier to reproduce.
In some rare cases, the compiler will use x30 as a general-purpose
register; in that case, outlining breaks because the "ret" branches to
the wrong address. Testcase (reproduce with "clang -O3
--target=aarch64-pc-linux-gnu -mllvm -enable-machine-outliner"):
extern long g1;
extern long g2;
void foo() {
register long *x asm("x27") = &g1;
register long *y asm("x29") = &g1;
register long *z asm("x30") = &g2;
asm(""::"r"(x),"r"(y),"r"(z));
}
void foo2() {
register long *x asm("x27") = &g1;
register long *y asm("x29") = &g1;
register long *z asm("x30") = &g2;
asm(""::"r"(x),"r"(y),"r"(z));
}
void foo3() {
register long *x asm("x27") = &g1;
register long *y asm("x29") = &g1;
register long *z asm("x30") = &g2;
asm(""::"r"(x),"r"(y),"r"(z));
}
-Eli
On 4/23/2018 2:37 PM, Jessica Paquette wrote:
> I just ran SPEC at -O3 with the outliner enabled for AArch64 and
> didn’t get any failures on my end. Which flags did you use? I’m
> curious about what’s going on here...
>
> I used -O3 -mllvm -enable-machine-outliner -arch arm64.
>
> - Jessica
>
>> On Apr 23, 2018, at 1:41 PM, Jessica Paquette <jpaquette at apple.com
>> <mailto:jpaquette at apple.com>> wrote:
>>
>> Hi Eli,
>>
>>> I just tried some tests, and I'm seeing a bunch of failures on SPEC
>>> at -O3; looks like mostly crashes at runtime. I can try to reduce
>>> a testcase if you need it.
>> If you could do that, that would be great. Our testing has been
>> primarily for -Oz and -O2, so I haven’t looked at -O3 at all.
>>
>>> I don't think this is really the right approach. With LTO, you can
>>> have a mix of functions, some of which are minsize, and some of
>>> which are not. Or with profile info, we might want to outline only
>>> cold code (I guess this isn't implemented yet, but potentially
>>> future work). Tying whether we run the outliner to a command-line
>>> flag restricts the possible uses; either the entire module gets
>>> outlining, or none of it does.
>> I’m worried that walking the entire list of functions in the module
>> when nothing has the minsize attribute would incur unnecessary
>> compile-time overhead. If that’s a reasonable thing to do though, I’m
>> fine with that approach. It’d be a less invasive change, and would
>> give us the desired LTO behaviour for free.
>>
>> - Jessica
>>
>>
>>> On Apr 23, 2018, at 1:24 PM, Friedman, Eli <efriedma at codeaurora.org
>>> <mailto:efriedma at codeaurora.org>> wrote:
>>>
>>> On 4/20/2018 7:06 PM, Jessica Paquette via llvm-dev wrote:
>>>> We perform regular testing to ensure the outliner produces correct
>>>> AArch64 code at -Oz. Tests include the LLVM test suite and standard
>>>> external test suites such as SPEC. All tests compile and
>>>> execute. We've also been making sure that the outliner produces
>>>> debuggable code. Users are still guaranteed to have sane backtraces
>>>> in the presence of outlined functions.
>>>>
>>>> Added exposure to various programs would help the outlining
>>>> algorithm mature further. This, in turn, will help the overall
>>>> outlining project. For example, there have been a few discussions
>>>> on implementing an IR-level outlining pass [3, 4]. Ultimately, the
>>>> goal is to create a shared outlining interface. This interface
>>>> would allow the outliner to exist at any level of representation
>>>> [4]. The general outlining algorithm will be part of the shared
>>>> interface. Thus, in the spirit of incremental improvement, it makes
>>>> sense to begin "stress-testing" it sooner than later.
>>>
>>> I just tried some tests, and I'm seeing a bunch of failures on SPEC
>>> at -O3; looks like mostly crashes at runtime. I can try to reduce
>>> a testcase if you need it.
>>>
>>>>
>>>> There are a few patches necessary to facilitate this. They are
>>>> available in the patches section of this email. I’ll summarize what
>>>> they do here for the sake of discussion though.
>>>>
>>>> The first patch is one that teaches the backend about size
>>>> optimization levels. This is comparable to what's done in the
>>>> inliner. Today, the only way to tell if something is optimizing for
>>>> size is by looking at function attributes. This is fine for
>>>> function passes, but insufficient for module passes like the
>>>> MachineOutliner. The function attribute approach forces the
>>>> outliner to iterate over every function in the module before
>>>> deciding to take action. If -Oz isn't passed in, then the outliner
>>>> will not find any functions worth outlining from. This would incur
>>>> unnecessary compile-time overhead. Thus, we decided the best course
>>>> of action is to teach the backend about size options.
>>>
>>> I don't think this is really the right approach. With LTO, you can
>>> have a mix of functions, some of which are minsize, and some of
>>> which are not. Or with profile info, we might want to outline only
>>> cold code (I guess this isn't implemented yet, but potentially
>>> future work). Tying whether we run the outliner to a command-line
>>> flag restricts the possible uses; either the entire module gets
>>> outlining, or none of it does.
>>>
>>> In general, we've been moving away from global settings so we can
>>> optimize more effectively in this sort of scenario.
>>>
>>> -Eli
>>> --
>>> Employee of Qualcomm Innovation Center, Inc.
>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
>>
>
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180423/8d7f7c96/attachment.html>
More information about the llvm-dev
mailing list