diff options
author | David Chisnall <csdavec@swan.ac.uk> | 2011-03-23 18:39:12 +0000 |
---|---|---|
committer | David Chisnall <csdavec@swan.ac.uk> | 2011-03-23 18:39:12 +0000 |
commit | f1a38cf32dc010ab3cf2d23aeb3d50c9a8944dc8 (patch) | |
tree | 8866b009093df5a5cd8041651b65ab78e5e0cb77 /clang/lib/CodeGen/CGObjCGNU.cpp | |
parent | a87d80cdcae9f8e4107556a1a8d4c9d15851aa16 (diff) | |
download | bcm5719-llvm-f1a38cf32dc010ab3cf2d23aeb3d50c9a8944dc8.tar.gz bcm5719-llvm-f1a38cf32dc010ab3cf2d23aeb3d50c9a8944dc8.zip |
Remove the redundant loads / stores to globals that we were generating for selectors (GNU runtimes).
llvm-svn: 128156
Diffstat (limited to 'clang/lib/CodeGen/CGObjCGNU.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjCGNU.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index dc91ec764ca..99132d6967c 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -521,9 +521,12 @@ llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel, Types.push_back(TypedSelector(TypeEncoding, SelValue)); } - if (lval) - return SelValue; - return Builder.CreateLoad(SelValue); + if (lval) { + llvm::Value *tmp = Builder.CreateAlloca(SelValue->getType()); + Builder.CreateStore(SelValue, tmp); + return tmp; + } + return SelValue; } llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel, @@ -1906,16 +1909,12 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { llvm::Constant *Idxs[] = {Zeros[0], llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), i), Zeros[0]}; // FIXME: We're generating redundant loads and stores here! - llvm::Constant *SelPtr = new llvm::GlobalVariable(TheModule, SelStructPtrTy, - true, llvm::GlobalValue::InternalLinkage, - llvm::ConstantExpr::getGetElementPtr(SelectorList, Idxs, 2), - ".objc_sel_ptr"); + llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr(SelectorList, + Idxs, 2); // If selectors are defined as an opaque type, cast the pointer to this // type. - if (isSelOpaque) { - SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, + SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, llvm::PointerType::getUnqual(SelectorTy)); - } SelectorAliases[i]->replaceAllUsesWith(SelPtr); SelectorAliases[i]->eraseFromParent(); } |