diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 110812c437..be2de0c00d 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -50,6 +50,7 @@ #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Triple.h" #include <algorithm> #include <cmath> using namespace llvm; @@ -3286,8 +3287,14 @@ static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps, // the size of a call to memcpy or memset (3 arguments + call). if (Limit != ~0U) { const Function *F = DAG.getMachineFunction().getFunction(); - if (F->hasFnAttr(Attribute::OptimizeForSize)) - Limit = 4; + if (F->hasFnAttr(Attribute::OptimizeForSize)) { + Triple T(((LLVMTargetMachine&)TLI.getTargetMachine()).getTargetTriple()); + if (T.getOS() != Triple::Darwin) + // A pretty terrible hack to defat the wild guess. On Darwin, -Os means + // optimize for size without hurting performance so we don't want to + // bump down the limit. + Limit = 4; + } } unsigned NumMemOps = 0; |