[llvm-dev] byval argument causes llvm to crash after inlining
Mikael Holmén via llvm-dev
llvm-dev at lists.llvm.org
Wed Sep 26 02:14:19 PDT 2018
Hi,
The normal inliner avoids inlining in cases like this, see the fix in
r322181.
Now I see that you lean towards making some use of byval illegal, but I
suppose a similar change could be done somewhere in the AlwaysInliner as
well?
What exactly is it that should be disallowed?
If we do make something illegal I suppose there needs to be fixes in
other places too, since someone seems to produce such code?
Regards,
Mikael
On 09/26/2018 12:11 AM, Pan, Wei via llvm-dev wrote:
> This sounds right to me. If there is no objection, I will implement a patch to enforce this in langref and IR verifier.
>
> -----Original Message-----
> From: Friedman, Eli [mailto:efriedma at codeaurora.org]
> Sent: Tuesday, September 25, 2018 3:07 PM
> To: Pan, Wei <wei.pan at intel.com>; Reid Kleckner <rnk at google.com>
> Cc: llvm-dev <llvm-dev at lists.llvm.org>
> Subject: Re: [llvm-dev] byval argument causes llvm to crash after inlining
>
> Probably, yes: lowering a byval parameter requires allocating space on the stack, so it has to be in the same address space.
>
> -Eli
>
> On 9/25/2018 3:00 PM, Pan, Wei via llvm-dev wrote:
>> It is problematic when byval argument is not from address space 0. When the default alloca address space is 0, should we consider this IR illegal?
>>
>> define internal i32 @bar(i32 addrspace(1)* byval %a) alwaysinline
>>
>>
>> From: Reid Kleckner [mailto:rnk at google.com]
>> Sent: Tuesday, September 25, 2018 2:38 PM
>> To: Pan, Wei <wei.pan at intel.com>
>> Cc: llvm-dev <llvm-dev at lists.llvm.org>
>> Subject: Re: [llvm-dev] byval argument causes llvm to crash after
>> inlining
>>
>> Well, they are from address space zero, just like all allocas and other stack memory, right?
>>
>> On Tue, Sep 25, 2018 at 1:45 PM Pan, Wei via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>> Hello,
>>
>> With the following reduced test case, cmd “opt -always-inline t.ll” crashes after inlining. Notice that byval argument %a will be remapped to %1 below, and consequently produces an illegal store.
>>
>> %1 = alloca i32, align 4
>> store i32 * %1, i32 addrspace(1)** %a.addr, align 8
>>
>> Looks like Inliner assumes that byval arguments are from address space 0. Or this is just a bug in inliner?
>>
>> Thanks,
>> Wei
>>
>> t.ll:
>>
>> define i32 @foo(i32 addrspace(1)* %x) {
>> entry:
>> %y = call i32 @bar(i32 addrspace(1)* %x)
>> ret i32 %y
>> }
>>
>> define internal i32 @bar(i32 addrspace(1)* byval %a) alwaysinline {
>> %a.addr = alloca i32 addrspace(1)*, align 8
>> store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 8
>> %a1 = load i32 addrspace(1)* , i32 addrspace(1)** %a.addr, align 8
>> %b = load i32, i32 addrspace(1)* %a1, align 4
>> ret i32 %b
>> }
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
> --
> Employee of Qualcomm Innovation Center, Inc.
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
More information about the llvm-dev
mailing list