[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