Make early if conversion dependent upon the subtarget and add
authorEric Christopher <echristo@gmail.com>
Wed, 21 May 2014 23:40:26 +0000 (23:40 +0000)
committerEric Christopher <echristo@gmail.com>
Wed, 21 May 2014 23:40:26 +0000 (23:40 +0000)
a subtarget hook to enable. Unconditionally add to the pass pipeline
for targets that might want to use it. No functional change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209340 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetSubtargetInfo.h
lib/CodeGen/EarlyIfConversion.cpp
lib/Target/ARM64/ARM64Subtarget.cpp
lib/Target/ARM64/ARM64Subtarget.h
lib/Target/ARM64/ARM64TargetMachine.cpp
lib/Target/PowerPC/PPCSubtarget.h
lib/Target/PowerPC/PPCTargetMachine.cpp
lib/Target/X86/X86Subtarget.cpp
lib/Target/X86/X86Subtarget.h
lib/Target/X86/X86TargetMachine.cpp

index e3febfb40f2b24915659b6e8b0fd37d11490a5a3..c0c342b22ec6a406d231f5ee94342487192bdbab 100644 (file)
@@ -94,6 +94,9 @@ public:
   /// scheduling, DAGCombine, etc.).
   virtual bool useAA() const;
 
+  /// \brief Enable the use of the early if conversion pass.
+  virtual bool enableEarlyIfConversion() const { return false; }
+
   /// \brief Reset the features for the subtarget.
   virtual void resetSubtargetFeatures(const MachineFunction *MF) { }
 };
index e3190241cd6ea97299a7a4876b096854b91b8b1d..b621e101773adb715e7bf85de7721a7c20ccb007 100644 (file)
@@ -776,6 +776,10 @@ bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
 bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
   DEBUG(dbgs() << "********** EARLY IF-CONVERSION **********\n"
                << "********** Function: " << MF.getName() << '\n');
+  // Only run if conversion if the target wants it.
+  if (!MF.getTarget().getSubtarget().enableEarlyIfConversion())
+    return true;
+
   TII = MF.getTarget().getInstrInfo();
   TRI = MF.getTarget().getRegisterInfo();
   SchedModel =
index 528cfc97cbf704e27e990dfb9499d3628bbd25a0..d81e21b51df6cc44e05022f30e56de6fc1912606 100644 (file)
@@ -26,6 +26,10 @@ using namespace llvm;
 #define GET_SUBTARGETINFO_TARGET_DESC
 #include "ARM64GenSubtargetInfo.inc"
 
+static cl::opt<bool>
+EnableEarlyIfConvert("arm64-early-ifcvt", cl::desc("Enable the early if "
+                     "converter pass"), cl::init(true), cl::Hidden);
+
 ARM64Subtarget::ARM64Subtarget(const std::string &TT, const std::string &CPU,
                                const std::string &FS, bool LittleEndian)
     : ARM64GenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others),
@@ -105,3 +109,7 @@ void ARM64Subtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
   Policy.OnlyTopDown = false;
   Policy.OnlyBottomUp = false;
 }
+
+bool ARM64Subtarget::enableEarlyIfConversion() const override {
+  return EnableEarlyIfConvert;
+}
index 88b9c2e7aa3bf2befbda1198c6af8f6ce9fae567..9cea3c387d633b7c3643a81ef79b6b1d40bca373 100644 (file)
@@ -102,6 +102,8 @@ public:
   void overrideSchedPolicy(MachineSchedPolicy &Policy, MachineInstr *begin,
                            MachineInstr *end,
                            unsigned NumRegionInstrs) const override;
+
+  bool enableEarlyIfConversion() const override;
 };
 } // End llvm namespace
 
index f5c187ceb2787f3ebdedb91be2f22127d9ecea77..5a8c5c6015d0fc71cc399984d8578c12f48d807d 100644 (file)
@@ -24,10 +24,6 @@ static cl::opt<bool>
 EnableCCMP("arm64-ccmp", cl::desc("Enable the CCMP formation pass"),
            cl::init(true), cl::Hidden);
 
-static cl::opt<bool>
-EnableEarlyIfConvert("arm64-early-ifcvt", cl::desc("Enable the early if "
-                     "converter pass"), cl::init(true), cl::Hidden);
-
 static cl::opt<bool>
 EnableStPairSuppress("arm64-stp-suppress", cl::desc("Suppress STP for ARM64"),
                      cl::init(true), cl::Hidden);
@@ -169,8 +165,7 @@ bool ARM64PassConfig::addInstSelector() {
 bool ARM64PassConfig::addILPOpts() {
   if (EnableCCMP)
     addPass(createARM64ConditionalCompares());
-  if (EnableEarlyIfConvert)
-    addPass(&EarlyIfConverterID);
+  addPass(&EarlyIfConverterID);
   if (EnableStPairSuppress)
     addPass(createARM64StorePairSuppressPass());
   return true;
index 76f4a318e82d567910a75e523412f0b6870d0bbd..ee43fd5f807f8a7360ab61e6158520cea5aeb216 100644 (file)
@@ -205,6 +205,8 @@ public:
                              TargetSubtargetInfo::AntiDepBreakMode& Mode,
                              RegClassVector& CriticalPathRCs) const override;
 
+  bool enableEarlyIfConversion() const override { return hasISEL(); }
+
   // Scheduling customization.
   bool enableMachineScheduler() const override;
   void overrideSchedPolicy(MachineSchedPolicy &Policy,
index fdfb8c9bfc9d6d3a65295357b4281849b92f8811..e9c7797b504f6da87dd805687f8e331ad67f5e72 100644 (file)
@@ -148,12 +148,8 @@ bool PPCPassConfig::addPreISel() {
 }
 
 bool PPCPassConfig::addILPOpts() {
-  if (getPPCSubtarget().hasISEL()) {
-    addPass(&EarlyIfConverterID);
-    return true;
-  }
-
-  return false;
+  addPass(&EarlyIfConverterID);
+  return true;
 }
 
 bool PPCPassConfig::addInstSelector() {
index b94bd712ff72c1fab903c4e9f3453a47c0f7335b..a6ad386b0a948f121907b295c1b1ac221be5d55e 100644 (file)
@@ -35,6 +35,13 @@ using namespace llvm;
 #define GET_SUBTARGETINFO_CTOR
 #include "X86GenSubtargetInfo.inc"
 
+// Temporary option to control early if-conversion for x86 while adding machine
+// models.
+static cl::opt<bool>
+X86EarlyIfConv("x86-early-ifcvt", cl::Hidden,
+               cl::desc("Enable early if-conversion on X86"));
+
+
 /// ClassifyBlockAddressReference - Classify a blockaddress reference for the
 /// current subtarget according to how we should reference it in a non-pcrel
 /// context.
@@ -310,3 +317,8 @@ X86Subtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel,
   CriticalPathRCs.clear();
   return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
 }
+
+bool
+X86Subtarget::enableEarlyIfConversion() const override {
+  return hasCMOV() && X86EarlyIfConv;
+}
index 8ec680efff83bdad0fad17a79c40a867691899d0..703559a476484024b64d339a9a159d4f32c58c57 100644 (file)
@@ -430,6 +430,8 @@ public:
 
   bool postRAScheduler() const { return PostRAScheduler; }
 
+  bool enableEarlyIfConversion() const override;
+
   /// getInstrItins = Return the instruction itineraries based on the
   /// subtarget selection.
   const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
index d0449f42320c56ada96351e0fa26d60cbe70c999..dae6d4b2e15cf457069a13d6ce2766b8250f3742 100644 (file)
@@ -126,12 +126,6 @@ UseVZeroUpper("x86-use-vzeroupper", cl::Hidden,
   cl::desc("Minimize AVX to SSE transition penalty"),
   cl::init(true));
 
-// Temporary option to control early if-conversion for x86 while adding machine
-// models.
-static cl::opt<bool>
-X86EarlyIfConv("x86-early-ifcvt", cl::Hidden,
-              cl::desc("Enable early if-conversion on X86"));
-
 //===----------------------------------------------------------------------===//
 // X86 Analysis Pass Setup
 //===----------------------------------------------------------------------===//
@@ -192,11 +186,8 @@ bool X86PassConfig::addInstSelector() {
 }
 
 bool X86PassConfig::addILPOpts() {
-  if (X86EarlyIfConv && getX86Subtarget().hasCMov()) {
-    addPass(&EarlyIfConverterID);
-    return true;
-  }
-  return false;
+  addPass(&EarlyIfConverterID);
+  return true;
 }
 
 bool X86PassConfig::addPreRegAlloc() {