Run code placement optimization for targets that want it (arm and x86 for now).
authorEvan Cheng <evan.cheng@apple.com>
Wed, 13 May 2009 21:42:09 +0000 (21:42 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 13 May 2009 21:42:09 +0000 (21:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71726 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLowering.h
lib/CodeGen/CodePlacementOpt.cpp
lib/CodeGen/SelectionDAG/TargetLowering.cpp
lib/Target/ARM/ARMISelLowering.cpp
lib/Target/X86/X86ISelLowering.cpp

index dcff47d24bc18fb0d624cdbc0df2a135978b0f80..0576e3e1a8bda337cbf4125410d086b77a7898ca 100644 (file)
@@ -620,6 +620,13 @@ public:
     return allowUnalignedMemoryAccesses;
   }
 
+  /// This function returns true if the target would benefit from code placement
+  /// optimization.
+  /// @brief Determine if the target should perform code placement optimization.
+  bool shouldOptimizeCodePlacement() const {
+    return benefitFromCodePlacementOpt;
+  }
+
   /// getOptimalMemOpType - Returns the target specific optimal type for load
   /// and store operations as a result of memset, memcpy, and memmove lowering.
   /// It returns MVT::iAny if SelectionDAG should be responsible for
@@ -1652,6 +1659,10 @@ protected:
   /// operations when copying small arrays and other similar tasks.
   /// @brief Indicate whether the target permits unaligned memory accesses.
   bool allowUnalignedMemoryAccesses;
+
+  /// This field specifies whether the target can benefit from code placement
+  /// optimization.
+  bool benefitFromCodePlacementOpt;
 };
 } // end llvm namespace
 
index 61a8b12860a278bd08c20e02d9071c5af21be33e..919ee54fb3f48752a7a7044872f8b5545663a0f7 100644 (file)
@@ -104,6 +104,9 @@ FunctionPass *llvm::createCodePlacementOptPass() {
 ///       jcc <cond> C, [exit]
 ///
 bool CodePlacementOpt::OptimizeIntraLoopEdges() {
+  if (!TLI->shouldOptimizeCodePlacement())
+    return false;
+
   bool Changed = false;
   for (unsigned i = 0, e = UncondJmpMBBs.size(); i != e; ++i) {
     MachineBasicBlock *MBB = UncondJmpMBBs[i].first;
index d7abd32727bdb4a2b34f5d0de9dc402ce7a4ab5c..1bb3959e68f656cf848eb8b60eebe849b662bd02 100644 (file)
@@ -483,6 +483,7 @@ TargetLowering::TargetLowering(TargetMachine &tm)
   memset(TargetDAGCombineArray, 0, array_lengthof(TargetDAGCombineArray));
   maxStoresPerMemset = maxStoresPerMemcpy = maxStoresPerMemmove = 8;
   allowUnalignedMemoryAccesses = false;
+  benefitFromCodePlacementOpt = false;
   UseUnderscoreSetJmp = false;
   UseUnderscoreLongJmp = false;
   SelectIsExpensive = false;
index 48e197d04f6c6dea1d2c1c3e77cf8aa1df1a3672..f5b33b02cabf3ae4529662cf4571f03f6a0b2424 100644 (file)
@@ -288,6 +288,7 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
   setIfCvtDupBlockSizeLimit(Subtarget->isThumb() ? 0 : 2);
 
   maxStoresPerMemcpy = 1;   //// temporary - rewrite interface to use type
+  benefitFromCodePlacementOpt = true;
 }
 
 const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
index 9ac59df5bd9decc5691e96e42b0969299ebae81d..debfac486718969325447f8f2728c6967bef330e 100644 (file)
@@ -844,6 +844,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
   maxStoresPerMemmove = 3; // For @llvm.memmove -> sequence of stores
   allowUnalignedMemoryAccesses = true; // x86 supports it!
   setPrefLoopAlignment(16);
+  benefitFromCodePlacementOpt = true;
 }