diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-01-03 18:14:24 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-01-03 18:14:24 +0000 |
| commit | fd11f49b4e320c1fb43b99c42235273675d32642 (patch) | |
| tree | b1e2561c5b1039ed3374e5749b2aa328255e3200 | |
| parent | f6a585fc2fb056809184a4f1a963234409a88024 (diff) | |
| download | bcm5719-llvm-fd11f49b4e320c1fb43b99c42235273675d32642.tar.gz bcm5719-llvm-fd11f49b4e320c1fb43b99c42235273675d32642.zip | |
it isn't safe to speculative load from a malloc, it might have
returned null, and may not have been big enough in any case.
Thanks to Jay Foad for pointing this out!
llvm-svn: 92452
| -rw-r--r-- | llvm/lib/VMCore/Instruction.cpp | 33 |
1 files changed, 1 insertions, 32 deletions
diff --git a/llvm/lib/VMCore/Instruction.cpp b/llvm/lib/VMCore/Instruction.cpp index a5500e6de48..170a15f216f 100644 --- a/llvm/lib/VMCore/Instruction.cpp +++ b/llvm/lib/VMCore/Instruction.cpp @@ -374,37 +374,6 @@ bool Instruction::isCommutative(unsigned op) { } } -// Code here matches isMalloc from MemoryBuiltins, which is not in VMCore. -static bool isMalloc(const Value* I) { - const CallInst *CI = dyn_cast<CallInst>(I); - if (!CI) { - const BitCastInst *BCI = dyn_cast<BitCastInst>(I); - if (!BCI) return false; - - CI = dyn_cast<CallInst>(BCI->getOperand(0)); - } - - if (!CI) - return false; - Function *Callee = CI->getCalledFunction(); - if (Callee == 0 || !Callee->isDeclaration() || Callee->getName() != "malloc") - return false; - - // Check malloc prototype. - // FIXME: workaround for PR5130, this will be obsolete when a nobuiltin - // attribute will exist. - const FunctionType *FTy = Callee->getFunctionType(); - if (FTy->getNumParams() != 1) - return false; - if (IntegerType *ITy = dyn_cast<IntegerType>(FTy->param_begin()->get())) { - if (ITy->getBitWidth() != 32 && ITy->getBitWidth() != 64) - return false; - return true; - } - - return false; -} - bool Instruction::isSafeToSpeculativelyExecute() const { for (unsigned i = 0, e = getNumOperands(); i != e; ++i) if (Constant *C = dyn_cast<Constant>(getOperand(i))) @@ -430,7 +399,7 @@ bool Instruction::isSafeToSpeculativelyExecute() const { case Load: { if (cast<LoadInst>(this)->isVolatile()) return false; - if (isa<AllocaInst>(getOperand(0)) || isMalloc(getOperand(0))) + if (isa<AllocaInst>(getOperand(0))) return true; if (GlobalVariable *GV = dyn_cast<GlobalVariable>(getOperand(0))) return !GV->hasExternalWeakLinkage(); |

