Fix a logic error in ValueIsOnlyUsedLocallyOrStoredToOneGlobal that caused
authorChris Lattner <sabre@nondot.org>
Fri, 14 Sep 2007 03:41:21 +0000 (03:41 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 14 Sep 2007 03:41:21 +0000 (03:41 +0000)
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

lib/Transforms/IPO/GlobalOpt.cpp

index 8761e2265e29032a757341bebb074febc810ce41..5d8f969f3359598b510c465e4e9f5e3cc05f36ce 100644 (file)
@@ -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;
     }