[PATCH] D17782: [X86] Permit reading of the FLAGS register without it being previously defined

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 1 22:51:42 PST 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL262465: [X86] Permit reading of the FLAGS register without it being previously defined (authored by majnemer).

Changed prior to commit:
  http://reviews.llvm.org/D17782?vs=49550&id=49584#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D17782

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

Index: llvm/trunk/test/CodeGen/X86/x86-flags-intrinsics.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/x86-flags-intrinsics.ll
+++ llvm/trunk/test/CodeGen/X86/x86-flags-intrinsics.ll
@@ -1,4 +1,4 @@
-; RUN: llc < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s | FileCheck %s
 target triple = "i686-pc-win32"
 
 declare i32 @llvm.x86.flags.read.u32()
Index: llvm/trunk/test/CodeGen/X86/x86-64-flags-intrinsics.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/x86-64-flags-intrinsics.ll
+++ llvm/trunk/test/CodeGen/X86/x86-64-flags-intrinsics.ll
@@ -1,4 +1,4 @@
-; RUN: llc < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs < %s | FileCheck %s
 target triple = "x86_64-pc-win32"
 
 declare i64 @llvm.x86.flags.read.u64()
Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
@@ -23255,7 +23255,12 @@
         MI->getOpcode() == X86::RDFLAGS32 ? X86::PUSHF32 : X86::PUSHF64;
     unsigned Pop =
         MI->getOpcode() == X86::RDFLAGS32 ? X86::POP32r : X86::POP64r;
-    BuildMI(*BB, MI, DL, TII->get(PushF));
+    MachineInstr *Push = BuildMI(*BB, MI, DL, TII->get(PushF));
+    // Permit reads of the FLAGS register without it being defined.
+    // This intrinsic exists to read external processor state in flags, such as
+    // the trap flag, interrupt flag, and direction flag, none of which are
+    // modeled by the backend.
+    Push->getOperand(2).setIsUndef();
     BuildMI(*BB, MI, DL, TII->get(Pop), MI->getOperand(0).getReg());
 
     MI->eraseFromParent(); // The pseudo is gone now.
Index: llvm/trunk/lib/Target/X86/X86InstrInfo.td
===================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.td
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.td
@@ -1122,12 +1122,12 @@
 
 let mayLoad = 1, mayStore = 1, usesCustomInserter = 1,
     SchedRW = [WriteRMW], Defs = [ESP] in {
-  let Uses = [ESP, EFLAGS] in
+  let Uses = [ESP] in
   def RDFLAGS32 : PseudoI<(outs GR32:$dst), (ins),
                    [(set GR32:$dst, (int_x86_flags_read_u32))]>,
                 Requires<[Not64BitMode]>;
 
-  let Uses = [RSP, EFLAGS] in
+  let Uses = [RSP] in
   def RDFLAGS64 : PseudoI<(outs GR64:$dst), (ins),
                    [(set GR64:$dst, (int_x86_flags_read_u64))]>,
                 Requires<[In64BitMode]>;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17782.49584.patch
Type: text/x-patch
Size: 2556 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160302/0a8167c3/attachment.bin>


More information about the llvm-commits mailing list