diff options
author | Chris Lattner <sabre@nondot.org> | 2007-09-14 03:41:21 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-09-14 03:41:21 +0000 |
commit | 5e6e494a977614568ed5582dacb548f8d466d398 (patch) | |
tree | 82e2cbbde0ed00384801a7fa82c3f68aac76f11e | |
parent | ce4e7485651fbccf41578c9bb149995de099021f (diff) | |
download | external_llvm-5e6e494a977614568ed5582dacb548f8d466d398.zip external_llvm-5e6e494a977614568ed5582dacb548f8d466d398.tar.gz external_llvm-5e6e494a977614568ed5582dacb548f8d466d398.tar.bz2 |
Fix a logic error in ValueIsOnlyUsedLocallyOrStoredToOneGlobal that caused
miscompilation of 188.ammp. Reject select and bitcast in
ValueIsOnlyUsedLocallyOrStoredToOneGlobal because RewriteHeapSROALoadUser can't handle it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41950 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 8761e22..5d8f969 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -813,15 +813,14 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV, static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal(Instruction *V, GlobalVariable *GV, SmallPtrSet<PHINode*, 8> &PHIs) { - for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI) + for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI) if (isa<LoadInst>(*UI) || isa<CmpInst>(*UI)) { // Fine, ignore. } else if (StoreInst *SI = dyn_cast<StoreInst>(*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<GetElementPtrInst>(*UI) || isa<SelectInst>(*UI) || - isa<BitCastInst>(*UI)) { + } else if (isa<GetElementPtrInst>(*UI)) { if (!ValueIsOnlyUsedLocallyOrStoredToOneGlobal(cast<Instruction>(*UI), GV, PHIs)) return false; @@ -829,7 +828,8 @@ static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal(Instruction *V, // PHIs are ok if all uses are ok. Don't infinitely recurse through PHI // cycles. if (PHIs.insert(PN)) - return ValueIsOnlyUsedLocallyOrStoredToOneGlobal(PN, GV, PHIs); + if (!ValueIsOnlyUsedLocallyOrStoredToOneGlobal(PN, GV, PHIs)) + return false; } else { return false; } |