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