LLVM 20.0.0git
Macros | Enumerations | Functions | Variables
X86FlagsCopyLowering.cpp File Reference

Lowers COPY nodes of EFLAGS by directly extracting and preserving individual flag bits. More...

#include "X86.h"
#include "X86InstrBuilder.h"
#include "X86InstrInfo.h"
#include "X86Subtarget.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/MachineSSAUpdater.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSchedule.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/MC/MCSchedule.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <utility>

Go to the source code of this file.

Macros

#define PASS_KEY   "x86-flags-copy-lowering"
 
#define DEBUG_TYPE   PASS_KEY
 
#define FROM_TO(A, B)
 
#define CASE(A)
 

Enumerations

enum  EFLAGSClobber { NoClobber , EvitableClobber , InevitableClobber }
 

Functions

 STATISTIC (NumCopiesEliminated, "Number of copies of EFLAGS eliminated")
 
 STATISTIC (NumSetCCsInserted, "Number of setCC instructions inserted")
 
 STATISTIC (NumTestsInserted, "Number of test instructions inserted")
 
 STATISTIC (NumAddsInserted, "Number of adds instructions inserted")
 
 STATISTIC (NumNFsConvertedTo, "Number of NF instructions converted to")
 
 INITIALIZE_PASS_BEGIN (X86FlagsCopyLoweringPass, DEBUG_TYPE, "X86 EFLAGS copy lowering", false, false) INITIALIZE_PASS_END(X86FlagsCopyLoweringPass
 
static bool isArithmeticOp (unsigned Opc)
 
static MachineBasicBlocksplitBlock (MachineBasicBlock &MBB, MachineInstr &SplitI, const X86InstrInfo &TII)
 
static EFLAGSClobber getClobberType (const MachineInstr &MI)
 
static X86::CondCode getImplicitCondFromMI (unsigned Opc)
 
static unsigned getOpcodeWithCC (unsigned Opc, X86::CondCode CC)
 

Variables

 DEBUG_TYPE
 
X86 EFLAGS copy lowering
 
X86 EFLAGS copy false
 

Detailed Description

Lowers COPY nodes of EFLAGS by directly extracting and preserving individual flag bits.

We have to do this by carefully analyzing and rewriting the usage of the copied EFLAGS register because there is no general way to rematerialize the entire EFLAGS register safely and efficiently. Using popf both forces dynamic stack adjustment and can create correctness issues due to IF, TF, and other non-status flags being overwritten. Using sequences involving SAHF don't work on all x86 processors and are often quite slow compared to directly testing a single status preserved in its own GPR.

Definition in file X86FlagsCopyLowering.cpp.

Macro Definition Documentation

◆ CASE

#define CASE (   A)
Value:
case X86::CMOVB_##A: \
case X86::CMOVE_##A: \
case X86::CMOVP_##A: \
case X86::CMOVBE_##A: \
case X86::CMOVNB_##A: \
case X86::CMOVNE_##A: \
case X86::CMOVNP_##A: \
case X86::CMOVNBE_##A: \
return (CC == X86::COND_E) ? X86::CMOVE_##A : X86::CMOVNE_##A;
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

◆ DEBUG_TYPE

#define DEBUG_TYPE   PASS_KEY

Definition at line 63 of file X86FlagsCopyLowering.cpp.

◆ FROM_TO

#define FROM_TO (   A,
  B 
)
Value:
case X86::CMOV##A##_Fp32: \
case X86::CMOV##A##_Fp64: \
case X86::CMOV##A##_Fp80: \
return X86::COND_##B;
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

◆ PASS_KEY

#define PASS_KEY   "x86-flags-copy-lowering"

Definition at line 62 of file X86FlagsCopyLowering.cpp.

Enumeration Type Documentation

◆ EFLAGSClobber

Enumerator
NoClobber 
EvitableClobber 
InevitableClobber 

Definition at line 240 of file X86FlagsCopyLowering.cpp.

Function Documentation

◆ getClobberType()

static EFLAGSClobber getClobberType ( const MachineInstr MI)
static

◆ getImplicitCondFromMI()

static X86::CondCode getImplicitCondFromMI ( unsigned  Opc)
static

Definition at line 844 of file X86FlagsCopyLowering.cpp.

References A, B, llvm::X86::COND_INVALID, FROM_TO, and P.

◆ getOpcodeWithCC()

static unsigned getOpcodeWithCC ( unsigned  Opc,
X86::CondCode  CC 
)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( X86FlagsCopyLoweringPass  ,
DEBUG_TYPE  ,
"X86 EFLAGS copy lowering"  ,
false  ,
false   
)

◆ isArithmeticOp()

static bool isArithmeticOp ( unsigned  Opc)
static

Definition at line 135 of file X86FlagsCopyLowering.cpp.

◆ splitBlock()

static MachineBasicBlock & splitBlock ( MachineBasicBlock MBB,
MachineInstr SplitI,
const X86InstrInfo TII 
)
static

◆ STATISTIC() [1/5]

STATISTIC ( NumAddsInserted  ,
"Number of adds instructions inserted"   
)

◆ STATISTIC() [2/5]

STATISTIC ( NumCopiesEliminated  ,
"Number of copies of EFLAGS eliminated"   
)

◆ STATISTIC() [3/5]

STATISTIC ( NumNFsConvertedTo  ,
"Number of NF instructions converted to"   
)

◆ STATISTIC() [4/5]

STATISTIC ( NumSetCCsInserted  ,
"Number of setCC instructions inserted"   
)

◆ STATISTIC() [5/5]

STATISTIC ( NumTestsInserted  ,
"Number of test instructions inserted"   
)

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 121 of file X86FlagsCopyLowering.cpp.

◆ false

X86 EFLAGS copy false

Definition at line 122 of file X86FlagsCopyLowering.cpp.

◆ lowering

X86 EFLAGS copy lowering

Definition at line 122 of file X86FlagsCopyLowering.cpp.