Make ARM an X86 memcpy expansion more similar to each other.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 31 Oct 2007 11:52:06 +0000 (11:52 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 31 Oct 2007 11:52:06 +0000 (11:52 +0000)
Now both subtarget define getMaxInlineSizeThreshold and the expansion uses it.

This should not change generated code.

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

lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMSubtarget.h
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86Subtarget.cpp
lib/Target/X86/X86Subtarget.h

index 154832b62bdc726199ef7101877366a4cefcbd00..ef1c86d22a8f8f782d3f0e9882c630dff6f6af4c 100644 (file)
@@ -1315,7 +1315,8 @@ SDOperand ARMTargetLowering::LowerMEMCPY(SDOperand Op, SelectionDAG &DAG,
   // this once Thumb ldmia / stmia support is added.
   unsigned Size = I->getValue();
   if (AlwaysInline ||
-      (!ST->isThumb() && Size < 64 && (Align & 3) == 0))
+      (!ST->isThumb() && Size <= Subtarget->getMaxInlineSizeThreshold() &&
+       (Align & 3) == 0))
     return LowerMEMCPYInline(ChainOp, DestOp, SourceOp, Size, Align, DAG);
   return LowerMEMCPYCall(ChainOp, DestOp, SourceOp, CountOp, DAG);
 }
index 62367cadb911674fbd676a1e6af3f095fe3711af..5b5ee39ced079e9547c2e58a932a54f8dbdb04be 100644 (file)
@@ -62,6 +62,7 @@ protected:
   ///
   ARMSubtarget(const Module &M, const std::string &FS, bool thumb);
 
+  unsigned getMaxInlineSizeThreshold() const { return 64; }
   /// ParseSubtargetFeatures - Parses features string setting specified 
   /// subtarget options.  Definition of function is auto generated by tblgen.
   void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU);
index 17c7534377d44ad0b883066b3a46de3bb4ddae2a..f1bf150e1f9e8dcae071a88a58bae448b1bf92ce 100644 (file)
@@ -4332,7 +4332,7 @@ SDOperand X86TargetLowering::LowerMEMSET(SDOperand Op, SelectionDAG &DAG) {
   // The libc version is likely to be faster for these cases. It can use the
   // address value and run time information about the CPU.
   if ((Align & 3) != 0 ||
-      (I && I->getValue() > Subtarget->getMinRepStrSizeThreshold())) {
+      (I && I->getValue() > Subtarget->getMaxInlineSizeThreshold())) {
     MVT::ValueType IntPtr = getPointerTy();
     const Type *IntPtrTy = getTargetData()->getIntPtrType();
     TargetLowering::ArgListTy Args; 
@@ -4510,7 +4510,7 @@ SDOperand X86TargetLowering::LowerMEMCPY(SDOperand Op, SelectionDAG &DAG) {
     return LowerMEMCPYCall(ChainOp, DestOp, SourceOp, CountOp, DAG);
 
   // If size is more than the threshold, call memcpy.
-  if (Size > Subtarget->getMinRepStrSizeThreshold())
+  if (Size > Subtarget->getMaxInlineSizeThreshold())
     return LowerMEMCPYCall(ChainOp, DestOp, SourceOp, CountOp, DAG);
 
   return LowerMEMCPYInline(ChainOp, DestOp, SourceOp, Size, Align, DAG);
index 51406c392792a6c8f36de9cde90211a356028d84..2ddf9e2d2a3f65c3fd039bc7ca07a6110b9d7ee5 100644 (file)
@@ -223,7 +223,7 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
   , HasX86_64(false)
   , stackAlignment(8)
   // FIXME: this is a known good value for Yonah. How about others?
-  , MinRepStrSizeThreshold(128)
+  , MaxInlineSizeThreshold(128)
   , Is64Bit(is64Bit)
   , HasLow4GUserAddress(true)
   , TargetType(isELF) { // Default to ELF unless otherwise specified.
index d939bc00c54d5d4d90f5ccee91423272a221c703..c0a4f2410c0a0d665a4cc4bc087c99ecbd5f2b07 100644 (file)
@@ -69,9 +69,9 @@ protected:
   /// entry to the function and which must be maintained by every function.
   unsigned stackAlignment;
 
-  /// Min. memset / memcpy size that is turned into rep/movs, rep/stos ops.
+  /// Max. memset / memcpy size that is turned into rep/movs, rep/stos ops.
   ///
-  unsigned MinRepStrSizeThreshold;
+  unsigned MaxInlineSizeThreshold;
 
 private:
   /// Is64Bit - True if the processor supports 64-bit instructions and module
@@ -97,11 +97,9 @@ public:
   /// function for this subtarget.
   unsigned getStackAlignment() const { return stackAlignment; }
 
-  /// getMinRepStrSizeThreshold - Returns the minimum memset / memcpy size
-  /// required to turn the operation into a X86 rep/movs or rep/stos
-  /// instruction. This is only used if the src / dst alignment is not DWORD
-  /// aligned.
-  unsigned getMinRepStrSizeThreshold() const { return MinRepStrSizeThreshold; }
+  /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
+  /// that still makes it profitable to inline the call.
+  unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; }
 
   /// ParseSubtargetFeatures - Parses features string setting specified
   /// subtarget options.  Definition of function is auto generated by tblgen.