Kostya Serebryany via llvm-dev
2017-Jan-31 23:13 UTC
[llvm-dev] llvm.read_register for %RIP on x86_64
On Tue, Jan 31, 2017 at 3:11 PM, Renato Golin <renato.golin at linaro.org> wrote:> On 31 Jan 2017 8:58 p.m., "Kostya Serebryany" <kcc at google.com> wrote: > > hmm. I am not sure I understood you. The last two paragraphs seem to > contradict each other. > So, you recommend to extend read_register to read the PC, or > "read_register is locked at the stack pointer as a design decision"? > > > Both. :-) > > There was a design decision to only support SP because we had no clear > case for anything other than the stack pointer. > > If you have one for the PC, it would be a much better technical decision > to reuse the machinery that already exists, is documented and tested, than > come up with an independent implementation. > > The discussion whether to support it in clang or not is orthogonal. But > once decided that we should support reading the PC, then read_register is > the obvious place. > > If the clang developers refuse the idea, then inline assembly is the only > option that would work across compilers. > > Makes sense? >Yep, will give it a try.> > Cheers, > Renato >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170131/e5bf7a07/attachment.html>
Kostya Serebryany via llvm-dev
2017-Feb-02 21:14 UTC
[llvm-dev] llvm.read_register for %RIP on x86_64
FTR: I've made a simple experiment with inline asm, it's as simple as InlineAsm::get(FunctionType::get(IntptrTy, false), StringRef("lea (%rip),$0"), StringRef("=r"), /*hasSideEffects=*/false); It generates a pretty efficient-looking code: 42194c: 48 8d 0d 00 00 00 00 lea 0x0(%rip),%rcx # 421953 <_Z3fooPi+0x13> 421953: 48 89 0c c5 60 3a 08 mov %rcx,0x1083a60(,%rax,8) (first instruction gets the PC, the other stores it somewhere) However, this introduces a significant slowdown in my case, over 20% (I need to execute this roughly for 50% of basic blocks) So, I'll be looking for some other solutions that don't require reading the PC this often. :( --kcc On Tue, Jan 31, 2017 at 3:13 PM, Kostya Serebryany <kcc at google.com> wrote:> > > On Tue, Jan 31, 2017 at 3:11 PM, Renato Golin <renato.golin at linaro.org> > wrote: > >> On 31 Jan 2017 8:58 p.m., "Kostya Serebryany" <kcc at google.com> wrote: >> >> hmm. I am not sure I understood you. The last two paragraphs seem to >> contradict each other. >> So, you recommend to extend read_register to read the PC, or >> "read_register is locked at the stack pointer as a design decision"? >> >> >> Both. :-) >> >> There was a design decision to only support SP because we had no clear >> case for anything other than the stack pointer. >> >> If you have one for the PC, it would be a much better technical decision >> to reuse the machinery that already exists, is documented and tested, than >> come up with an independent implementation. >> >> The discussion whether to support it in clang or not is orthogonal. But >> once decided that we should support reading the PC, then read_register is >> the obvious place. >> >> If the clang developers refuse the idea, then inline assembly is the only >> option that would work across compilers. >> >> Makes sense? >> > > Yep, will give it a try. > > >> >> Cheers, >> Renato >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170202/8c21975b/attachment.html>
Bruce Hoult via llvm-dev
2017-Feb-02 22:57 UTC
[llvm-dev] llvm.read_register for %RIP on x86_64
Efficient looking on a 386, sure, but I presume you're running AMD64 code on a modern CPU :-) I suggest you try: call foobar foobar: pop %rcx mov %rcx,0x1083a60(,%rax,8) On Fri, Feb 3, 2017 at 12:14 AM, Kostya Serebryany via llvm-dev < llvm-dev at lists.llvm.org> wrote:> FTR: > I've made a simple experiment with inline asm, it's as simple as > InlineAsm::get(FunctionType::get(IntptrTy, false), > StringRef("lea (%rip),$0"), StringRef("=r"), > /*hasSideEffects=*/false); > > It generates a pretty efficient-looking code: > 42194c: 48 8d 0d 00 00 00 00 lea 0x0(%rip),%rcx # 421953 > <_Z3fooPi+0x13> > 421953: 48 89 0c c5 60 3a 08 mov %rcx,0x1083a60(,%rax,8) > (first instruction gets the PC, the other stores it somewhere) > > However, this introduces a significant slowdown in my case, over 20% > (I need to execute this roughly for 50% of basic blocks) > > So, I'll be looking for some other solutions that don't require reading > the PC this often. :( > > --kcc > > > On Tue, Jan 31, 2017 at 3:13 PM, Kostya Serebryany <kcc at google.com> wrote: > >> >> >> On Tue, Jan 31, 2017 at 3:11 PM, Renato Golin <renato.golin at linaro.org> >> wrote: >> >>> On 31 Jan 2017 8:58 p.m., "Kostya Serebryany" <kcc at google.com> wrote: >>> >>> hmm. I am not sure I understood you. The last two paragraphs seem to >>> contradict each other. >>> So, you recommend to extend read_register to read the PC, or >>> "read_register is locked at the stack pointer as a design decision"? >>> >>> >>> Both. :-) >>> >>> There was a design decision to only support SP because we had no clear >>> case for anything other than the stack pointer. >>> >>> If you have one for the PC, it would be a much better technical decision >>> to reuse the machinery that already exists, is documented and tested, than >>> come up with an independent implementation. >>> >>> The discussion whether to support it in clang or not is orthogonal. But >>> once decided that we should support reading the PC, then read_register is >>> the obvious place. >>> >>> If the clang developers refuse the idea, then inline assembly is the >>> only option that would work across compilers. >>> >>> Makes sense? >>> >> >> Yep, will give it a try. >> >> >>> >>> Cheers, >>> Renato >>> >> >> > > _______________________________________________ > 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/20170203/200f0545/attachment.html>