[PATCH] D92695: [X86ISelLowering] don't emit frame pointers for eflags intrinsics.

Nick Desaulniers via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 4 14:37:29 PST 2020


nickdesaulniers created this revision.
nickdesaulniers added reviewers: rnk, majnemer.
Herald added subscribers: pengfei, hiraditya.
nickdesaulniers requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

We're looking to use __builtin_ia32_readeflags_u64() and
__builtin_ia32_writeeflags_u64() in the Linux kernel in place of
handwritten inline assembly. We would like to minimize the overhead of
accessing the eflags, though that is already relatively slow.

It seems that the use of these compiler builtins was always injecting
frame pointers. The Linux kernel explicitly avoids frame pointers for
x86_64 and relies on custom binary post processing for handling
unwinding (so, also not DWARF .eh_frame or .debug_frame), and makes
Clang's codegen for these builtins less competitive with GCC.

Remove this logic. Users of these compiler builtins may want to specify
-fno-omit-frame-pointer or /Oy- to keep the previous behavior.

Fixes pr/47531.

Signed-off-by: Nick Desaulniers <ndesaulniers at google.com>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D92695

Files:
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/test/CodeGen/X86/win64_frame.ll
  llvm/test/CodeGen/X86/x86-64-flags-intrinsics.ll
  llvm/test/CodeGen/X86/x86-flags-intrinsics.ll


Index: llvm/test/CodeGen/X86/x86-flags-intrinsics.ll
===================================================================
--- llvm/test/CodeGen/X86/x86-flags-intrinsics.ll
+++ llvm/test/CodeGen/X86/x86-flags-intrinsics.ll
@@ -11,11 +11,8 @@
 }
 
 ; CHECK-LABEL: _read_flags:
-; CHECK:      pushl   %ebp
-; CHECK-NEXT: movl    %esp, %ebp
-; CHECK-NEXT: pushfl
+; CHECK:      pushfl
 ; CHECK-NEXT: popl    %eax
-; CHECK-NEXT: popl    %ebp
 
 define x86_fastcallcc void @write_flags(i32 inreg %arg) {
 entry:
@@ -24,8 +21,5 @@
 }
 
 ; CHECK-LABEL: @write_flags at 4:
-; CHECK:      pushl   %ebp
-; CHECK-NEXT: movl    %esp, %ebp
-; CHECK-NEXT: pushl   %ecx
+; CHECK:      pushl   %ecx
 ; CHECK-NEXT: popfl
-; CHECK-NEXT: popl    %ebp
Index: llvm/test/CodeGen/X86/x86-64-flags-intrinsics.ll
===================================================================
--- llvm/test/CodeGen/X86/x86-64-flags-intrinsics.ll
+++ llvm/test/CodeGen/X86/x86-64-flags-intrinsics.ll
@@ -11,14 +11,8 @@
 }
 
 ; CHECK-LABEL: read_flags:
-; CHECK:      pushq   %rbp
-; CHECK:      .seh_pushreg %rbp
-; CHECK:      movq    %rsp, %rbp
-; CHECK:      .seh_setframe %rbp, 0
-; CHECK:      .seh_endprologue
-; CHECK-NEXT: pushfq
+; CHECK:      pushfq
 ; CHECK-NEXT: popq    %rax
-; CHECK-NEXT: popq    %rbp
 
 define void @write_flags(i64 %arg) {
 entry:
@@ -27,11 +21,5 @@
 }
 
 ; CHECK-LABEL: write_flags:
-; CHECK:      pushq   %rbp
-; CHECK:      .seh_pushreg %rbp
-; CHECK:      movq    %rsp, %rbp
-; CHECK:      .seh_setframe %rbp, 0
-; CHECK:      .seh_endprologue
-; CHECK-NEXT: pushq   %rcx
+; CHECK:      pushq   %rcx
 ; CHECK-NEXT: popfq
-; CHECK-NEXT: popq    %rbp
Index: llvm/test/CodeGen/X86/win64_frame.ll
===================================================================
--- llvm/test/CodeGen/X86/win64_frame.ll
+++ llvm/test/CodeGen/X86/win64_frame.ll
@@ -188,16 +188,9 @@
 define i64 @f9() {
 ; CHECK-LABEL: f9:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    pushq %rbp
-; CHECK-NEXT:    .seh_pushreg %rbp
-; CHECK-NEXT:    movq %rsp, %rbp
-; CHECK-NEXT:    .seh_setframe %rbp, 0
-; CHECK-NEXT:    .seh_endprologue
 ; CHECK-NEXT:    pushfq
 ; CHECK-NEXT:    popq %rax
-; CHECK-NEXT:    popq %rbp
 ; CHECK-NEXT:    retq
-; CHECK-NEXT:    .seh_endproc
 entry:
   %call = call i64 @llvm.x86.flags.read.u64()
   ret i64 %call
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -25970,10 +25970,6 @@
     case llvm::Intrinsic::x86_flags_read_u64:
     case llvm::Intrinsic::x86_flags_write_u32:
     case llvm::Intrinsic::x86_flags_write_u64: {
-      // We need a frame pointer because this will get lowered to a PUSH/POP
-      // sequence.
-      MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
-      MFI.setHasCopyImplyingStackAdjustment(true);
       // Don't do anything here, we will expand these intrinsics out later
       // during FinalizeISel in EmitInstrWithCustomInserter.
       return Op;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D92695.309660.patch
Type: text/x-patch
Size: 3064 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201204/fdcdfedd/attachment.bin>


More information about the llvm-commits mailing list