diff options
| author | Pete Cooper <peter_cooper@apple.com> | 2011-11-03 00:56:36 +0000 |
|---|---|---|
| committer | Pete Cooper <peter_cooper@apple.com> | 2011-11-03 00:56:36 +0000 |
| commit | e6173d81ae3a4db5c306c3b494f70817a3d4aafc (patch) | |
| tree | 78f17bee746e87d183615220474b9daa3990aefa /llvm/lib | |
| parent | 2e10cf9620885bb2d81b93ecd98421beb51c4889 (diff) | |
| download | bcm5719-llvm-e6173d81ae3a4db5c306c3b494f70817a3d4aafc.tar.gz bcm5719-llvm-e6173d81ae3a4db5c306c3b494f70817a3d4aafc.zip | |
Treat objc selector reference globals as invariant so that MachineLICM can hoist them out of loops. Fixes <rdar://problem/6027699>
llvm-svn: 143600
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index a240667f7d6..a2fd3c46bf0 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1232,6 +1232,19 @@ bool MachineInstr::hasVolatileMemoryRef() const { return false; } +/// pointsToRuntimeConstantMemory - Return true if this value points to data +/// which does never changes once the program starts running +static bool pointsToRuntimeConstantMemory(const Value *V) { + if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { + StringRef Name = GV->getName(); + // These special values are known to be constant at runtime + // TODO: a new linkage type for these would be far better than this check + if (Name.startswith("\01L_OBJC_SELECTOR_REFERENCES_")) + return true; + } + return false; +} + /// isInvariantLoad - Return true if this instruction is loading from a /// location whose value is invariant across the function. For example, /// loading a value from the constant pool or from the argument area @@ -1259,6 +1272,8 @@ bool MachineInstr::isInvariantLoad(AliasAnalysis *AA) const { if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(V)) if (PSV->isConstant(MFI)) continue; + if (pointsToRuntimeConstantMemory(V)) + continue; // If we have an AliasAnalysis, ask it whether the memory is constant. if (AA && AA->pointsToConstantMemory( AliasAnalysis::Location(V, (*I)->getSize(), |

