Carlo Kok via llvm-dev
2017-Jan-27 13:15 UTC
[llvm-dev] llvm return value propagation & asm
Hi, I'm trying to have a pure asm function (non inlined) that returns it's own value to the caller. ; Function Attrs: naked noinline optnone define i32 @callcatch(i32, i32) #3 !dbg !10103 { BasicBlock8472: call void asm "\0D\0Apushl %ebp\0D\0Amovl 8(%esp),%eax\0D\0Amovl 12(%esp), %ebp\0D\0Acalll *%eax\0D\0Apopl %ebp\0D\0Aretl\0D\0A", ""(), !dbg !10104, !srcloc !10106 // this returns in eax ret i32 0, !dbg !10104 } ; Function Attrs: naked noinline optnone define void @jumptocont(i32, i32, i32) #3 !dbg !10107 { BasicBlock8473: call void asm "\0D\0A movl 12(%esp), %ebp\0D\0A movl 4(%esp), %eax\0D\0A movl 8(%esp), %esp\0D\0A jmpl *%eax\0D\0A", ""(), !dbg !10108, !srcloc !10110 ret void, !dbg !10108 } The calling code is like; %530 = call i32 @callcatch(i32 %528, i32 %529) #3, !dbg !7648 store i32 %530, i32* %20, !dbg !7648 %531 = load i32, i32* %20, !dbg !7630 ... call void @jumptocont(i32 %531, i32 %532, i32 %533) #3, !dbg However the return constant propagation code from http://llvm.org/docs/doxygen/html/IPConstantPropagation_8cpp_source.html finds the ret i32 0 and ends up calling jumptocont with i32 0 as a first parameter, which wasn't what I wanted. Ending up like: %189 = tail call i32 @callcatchn(i32 %188, i32 %12) #10, !dbg !7019 tail call void @jumptocont(i32 0, i32 %14, i32 %12) #10, !dbg !7022 I tried unreachable in the callcatch which would make the caller code turn into unreachable too. Is there a workaround for this, or a better way to do this? -- Carlo Kok RemObjects Software
Reid Kleckner via llvm-dev
2017-Jan-30 17:34 UTC
[llvm-dev] llvm return value propagation & asm
We need to disable most forms of IPO on naked functions. We already do this in DeadArgElimination.cpp. We need to do it in more places. On Fri, Jan 27, 2017 at 5:15 AM, Carlo Kok via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi, I'm trying to have a pure asm function (non inlined) that returns it's > own value to the caller. > > ; Function Attrs: naked noinline optnone > define i32 @callcatch(i32, i32) #3 !dbg !10103 { > BasicBlock8472: > call void asm "\0D\0Apushl %ebp\0D\0Amovl 8(%esp),%eax\0D\0Amovl > 12(%esp), %ebp\0D\0Acalll *%eax\0D\0Apopl %ebp\0D\0Aretl\0D\0A", ""(), !dbg > !10104, !srcloc !10106 // this returns in eax > ret i32 0, !dbg !10104 > } > > ; Function Attrs: naked noinline optnone > define void @jumptocont(i32, i32, i32) #3 !dbg !10107 { > BasicBlock8473: > call void asm "\0D\0A movl 12(%esp), %ebp\0D\0A movl 4(%esp), > %eax\0D\0A movl 8(%esp), %esp\0D\0A jmpl *%eax\0D\0A", ""(), !dbg > !10108, !srcloc !10110 > ret void, !dbg !10108 > } > > The calling code is like; > %530 = call i32 @callcatch(i32 %528, i32 %529) #3, !dbg !7648 > store i32 %530, i32* %20, !dbg !7648 > %531 = load i32, i32* %20, !dbg !7630 > ... > call void @jumptocont(i32 %531, i32 %532, i32 %533) #3, !dbg > > However the return constant propagation code from > > http://llvm.org/docs/doxygen/html/IPConstantPropagation_8cpp_source.html > > finds the ret i32 0 and ends up calling jumptocont with i32 0 as a first > parameter, which wasn't what I wanted. Ending up like: > > %189 = tail call i32 @callcatchn(i32 %188, i32 %12) #10, !dbg !7019 > tail call void @jumptocont(i32 0, i32 %14, i32 %12) #10, !dbg !7022 > > I tried unreachable in the callcatch which would make the caller code turn > into unreachable too. Is there a workaround for this, or a better way to do > this? > > -- > Carlo Kok > RemObjects Software > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170130/595a974d/attachment.html>
Davide Italiano via llvm-dev
2017-Jan-30 17:41 UTC
[llvm-dev] llvm return value propagation & asm
On Mon, Jan 30, 2017 at 9:34 AM, Reid Kleckner via llvm-dev <llvm-dev at lists.llvm.org> wrote:> We need to disable most forms of IPO on naked functions. We already do this > in DeadArgElimination.cpp. We need to do it in more places. >+1. Carlo, can you please open a bug? -- Davide "There are no solved problems; there are only problems that are more or less solved" -- Henri Poincare