From: Chris Lattner Date: Thu, 2 Dec 2004 07:11:07 +0000 (+0000) Subject: Implement a FIXME by checking to make sure that a malloc is not being used X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fa07e4fc302b1e274c292c2db4604e61d69458d5;p=oota-llvm.git Implement a FIXME by checking to make sure that a malloc is not being used in scary and unknown ways before we promote it. This fixes the miscompilation of 188.ammp that has been plauging us since a globalopt patch went in. Thanks a ton to Tanya for helping me diagnose the problem! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18418 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index db2d0b3535a..0fde1d94a3d 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -738,6 +738,29 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV, return NewGV; } +/// ValueIsOnlyUsedLocallyOrStoredToOneGlobal - Scan the use-list of V checking +/// to make sure that there are no complex uses of V. We permit simple things +/// like dereferencing the pointer, but not storing through the address, unless +/// it is to the specified global. +static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal(Instruction *V, + GlobalVariable *GV) { + for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI) + if (isa(*UI) || isa(*UI)) { + // Fine, ignore. + } else if (StoreInst *SI = dyn_cast(*UI)) { + if (SI->getOperand(0) == V && SI->getOperand(1) != GV) + return false; // Storing the pointer itself... bad. + // Otherwise, storing through it, or storing into GV... fine. + } else if (isa(*UI) || isa(*UI)) { + if (!ValueIsOnlyUsedLocallyOrStoredToOneGlobal(cast(*UI),GV)) + return false; + } else { + return false; + } + return true; + +} + // OptimizeOnceStoredGlobal - Try to optimize globals based on the knowledge // that only one value (besides its initializer) is ever stored to the global. static bool OptimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal, @@ -783,9 +806,8 @@ static bool OptimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal, if (MI->getAllocatedType()->isSized() && NElements->getRawValue()* TD.getTypeSize(MI->getAllocatedType()) < 2048 && - AllUsesOfLoadedValueWillTrapIfNull(GV)) { - // FIXME: do more correctness checking to make sure the result of the - // malloc isn't squirrelled away somewhere. + AllUsesOfLoadedValueWillTrapIfNull(GV) && + ValueIsOnlyUsedLocallyOrStoredToOneGlobal(MI, GV)) { GVI = OptimizeGlobalAddressOfMalloc(GV, MI); return true; }