forked from OSchip/llvm-project
				
			Simplify iterator management. NFC.
Not passing an iterator to processGlobal will allow it to work with other GlobalValues. llvm-svn: 256271
This commit is contained in:
		
							parent
							
								
									5784ae2d67
								
							
						
					
					
						commit
						e4ed0e56ce
					
				| 
						 | 
				
			
			@ -83,9 +83,8 @@ namespace {
 | 
			
		|||
    bool OptimizeFunctions(Module &M);
 | 
			
		||||
    bool OptimizeGlobalVars(Module &M);
 | 
			
		||||
    bool OptimizeGlobalAliases(Module &M);
 | 
			
		||||
    bool ProcessGlobal(GlobalVariable *GV,Module::global_iterator &GVI);
 | 
			
		||||
    bool ProcessInternalGlobal(GlobalVariable *GV,Module::global_iterator &GVI,
 | 
			
		||||
                               const GlobalStatus &GS);
 | 
			
		||||
    bool processGlobal(GlobalVariable *GV);
 | 
			
		||||
    bool processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS);
 | 
			
		||||
    bool OptimizeEmptyGlobalCXXDtors(Function *CXAAtExitFn);
 | 
			
		||||
 | 
			
		||||
    bool isPointerValueDeadOnEntryToFunction(const Function *F,
 | 
			
		||||
| 
						 | 
				
			
			@ -500,7 +499,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
 | 
			
		|||
                                               GV->getThreadLocalMode(),
 | 
			
		||||
                                              GV->getType()->getAddressSpace());
 | 
			
		||||
      NGV->setExternallyInitialized(GV->isExternallyInitialized());
 | 
			
		||||
      Globals.insert(GV->getIterator(), NGV);
 | 
			
		||||
      Globals.push_back(NGV);
 | 
			
		||||
      NewGlobals.push_back(NGV);
 | 
			
		||||
 | 
			
		||||
      // Calculate the known alignment of the field.  If the original aggregate
 | 
			
		||||
| 
						 | 
				
			
			@ -534,7 +533,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
 | 
			
		|||
                                               GV->getThreadLocalMode(),
 | 
			
		||||
                                              GV->getType()->getAddressSpace());
 | 
			
		||||
      NGV->setExternallyInitialized(GV->isExternallyInitialized());
 | 
			
		||||
      Globals.insert(GV->getIterator(), NGV);
 | 
			
		||||
      Globals.push_back(NGV);
 | 
			
		||||
      NewGlobals.push_back(NGV);
 | 
			
		||||
 | 
			
		||||
      // Calculate the known alignment of the field.  If the original aggregate
 | 
			
		||||
| 
						 | 
				
			
			@ -842,13 +841,10 @@ OptimizeGlobalAddressOfMalloc(GlobalVariable *GV, CallInst *CI, Type *AllocTy,
 | 
			
		|||
 | 
			
		||||
  // Create the new global variable.  The contents of the malloc'd memory is
 | 
			
		||||
  // undefined, so initialize with an undef value.
 | 
			
		||||
  GlobalVariable *NewGV = new GlobalVariable(*GV->getParent(),
 | 
			
		||||
                                             GlobalType, false,
 | 
			
		||||
                                             GlobalValue::InternalLinkage,
 | 
			
		||||
                                             UndefValue::get(GlobalType),
 | 
			
		||||
                                             GV->getName()+".body",
 | 
			
		||||
                                             GV,
 | 
			
		||||
                                             GV->getThreadLocalMode());
 | 
			
		||||
  GlobalVariable *NewGV = new GlobalVariable(
 | 
			
		||||
      *GV->getParent(), GlobalType, false, GlobalValue::InternalLinkage,
 | 
			
		||||
      UndefValue::get(GlobalType), GV->getName() + ".body", nullptr,
 | 
			
		||||
      GV->getThreadLocalMode());
 | 
			
		||||
 | 
			
		||||
  // If there are bitcast users of the malloc (which is typical, usually we have
 | 
			
		||||
  // a malloc + bitcast) then replace them with uses of the new global.  Update
 | 
			
		||||
| 
						 | 
				
			
			@ -1292,12 +1288,10 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
 | 
			
		|||
    Type *FieldTy = STy->getElementType(FieldNo);
 | 
			
		||||
    PointerType *PFieldTy = PointerType::get(FieldTy, AS);
 | 
			
		||||
 | 
			
		||||
    GlobalVariable *NGV =
 | 
			
		||||
      new GlobalVariable(*GV->getParent(),
 | 
			
		||||
                         PFieldTy, false, GlobalValue::InternalLinkage,
 | 
			
		||||
                         Constant::getNullValue(PFieldTy),
 | 
			
		||||
                         GV->getName() + ".f" + Twine(FieldNo), GV,
 | 
			
		||||
                         GV->getThreadLocalMode());
 | 
			
		||||
    GlobalVariable *NGV = new GlobalVariable(
 | 
			
		||||
        *GV->getParent(), PFieldTy, false, GlobalValue::InternalLinkage,
 | 
			
		||||
        Constant::getNullValue(PFieldTy), GV->getName() + ".f" + Twine(FieldNo),
 | 
			
		||||
        nullptr, GV->getThreadLocalMode());
 | 
			
		||||
    FieldGlobals.push_back(NGV);
 | 
			
		||||
 | 
			
		||||
    unsigned TypeSize = DL.getTypeAllocSize(FieldTy);
 | 
			
		||||
| 
						 | 
				
			
			@ -1457,10 +1451,9 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, CallInst *CI,
 | 
			
		|||
 | 
			
		||||
/// This function is called when we see a pointer global variable with a single
 | 
			
		||||
/// value stored it that is a malloc or cast of malloc.
 | 
			
		||||
static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV, CallInst *CI,
 | 
			
		||||
static bool tryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV, CallInst *CI,
 | 
			
		||||
                                               Type *AllocTy,
 | 
			
		||||
                                               AtomicOrdering Ordering,
 | 
			
		||||
                                               Module::global_iterator &GVI,
 | 
			
		||||
                                               const DataLayout &DL,
 | 
			
		||||
                                               TargetLibraryInfo *TLI) {
 | 
			
		||||
  // If this is a malloc of an abstract type, don't touch it.
 | 
			
		||||
| 
						 | 
				
			
			@ -1499,8 +1492,7 @@ static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV, CallInst *CI,
 | 
			
		|||
    // (2048 bytes currently), as we don't want to introduce a 16M global or
 | 
			
		||||
    // something.
 | 
			
		||||
    if (NElements->getZExtValue() * DL.getTypeAllocSize(AllocTy) < 2048) {
 | 
			
		||||
      GVI = OptimizeGlobalAddressOfMalloc(GV, CI, AllocTy, NElements, DL, TLI)
 | 
			
		||||
                ->getIterator();
 | 
			
		||||
      OptimizeGlobalAddressOfMalloc(GV, CI, AllocTy, NElements, DL, TLI);
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1545,20 +1537,18 @@ static bool TryToOptimizeStoreOfMallocToGlobal(GlobalVariable *GV, CallInst *CI,
 | 
			
		|||
        CI = cast<CallInst>(Malloc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    GVI = PerformHeapAllocSRoA(GV, CI, getMallocArraySize(CI, DL, TLI, true),
 | 
			
		||||
                               DL, TLI)
 | 
			
		||||
              ->getIterator();
 | 
			
		||||
    PerformHeapAllocSRoA(GV, CI, getMallocArraySize(CI, DL, TLI, true), DL,
 | 
			
		||||
                         TLI);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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,
 | 
			
		||||
// 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,
 | 
			
		||||
                                     AtomicOrdering Ordering,
 | 
			
		||||
                                     Module::global_iterator &GVI,
 | 
			
		||||
                                     const DataLayout &DL,
 | 
			
		||||
                                     TargetLibraryInfo *TLI) {
 | 
			
		||||
  // Ignore no-op GEPs and bitcasts.
 | 
			
		||||
| 
						 | 
				
			
			@ -1579,9 +1569,8 @@ static bool OptimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal,
 | 
			
		|||
        return true;
 | 
			
		||||
    } else if (CallInst *CI = extractMallocCall(StoredOnceVal, TLI)) {
 | 
			
		||||
      Type *MallocType = getMallocAllocatedType(CI, TLI);
 | 
			
		||||
      if (MallocType &&
 | 
			
		||||
          TryToOptimizeStoreOfMallocToGlobal(GV, CI, MallocType, Ordering, GVI,
 | 
			
		||||
                                             DL, TLI))
 | 
			
		||||
      if (MallocType && tryToOptimizeStoreOfMallocToGlobal(GV, CI, MallocType,
 | 
			
		||||
                                                           Ordering, DL, TLI))
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1693,8 +1682,7 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) {
 | 
			
		|||
 | 
			
		||||
/// Analyze the specified global variable and optimize it if possible.  If we
 | 
			
		||||
/// make a change, return true.
 | 
			
		||||
bool GlobalOpt::ProcessGlobal(GlobalVariable *GV,
 | 
			
		||||
                              Module::global_iterator &GVI) {
 | 
			
		||||
bool GlobalOpt::processGlobal(GlobalVariable *GV) {
 | 
			
		||||
  // Do more involved optimizations if the global is internal.
 | 
			
		||||
  GV->removeDeadConstantUsers();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1721,7 +1709,7 @@ bool GlobalOpt::ProcessGlobal(GlobalVariable *GV,
 | 
			
		|||
  if (GV->isConstant() || !GV->hasInitializer())
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  return ProcessInternalGlobal(GV, GVI, GS);
 | 
			
		||||
  return processInternalGlobal(GV, GS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GlobalOpt::isPointerValueDeadOnEntryToFunction(const Function *F, GlobalValue *GV) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1858,8 +1846,7 @@ static void makeAllConstantUsesInstructions(Constant *C) {
 | 
			
		|||
 | 
			
		||||
/// Analyze the specified global variable and optimize
 | 
			
		||||
/// it if possible.  If we make a change, return true.
 | 
			
		||||
bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
 | 
			
		||||
                                      Module::global_iterator &GVI,
 | 
			
		||||
bool GlobalOpt::processInternalGlobal(GlobalVariable *GV,
 | 
			
		||||
                                      const GlobalStatus &GS) {
 | 
			
		||||
  auto &DL = GV->getParent()->getDataLayout();
 | 
			
		||||
  // If this is a first class global and has only one accessing function and
 | 
			
		||||
| 
						 | 
				
			
			@ -1938,10 +1925,8 @@ bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
 | 
			
		|||
    return true;
 | 
			
		||||
  } else if (!GV->getInitializer()->getType()->isSingleValueType()) {
 | 
			
		||||
    const DataLayout &DL = GV->getParent()->getDataLayout();
 | 
			
		||||
    if (GlobalVariable *FirstNewGV = SRAGlobal(GV, DL)) {
 | 
			
		||||
      GVI = FirstNewGV->getIterator(); // Don't skip the newly produced globals!
 | 
			
		||||
    if (SRAGlobal(GV, DL))
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  } else if (GS.StoredType == GlobalStatus::StoredOnce && GS.StoredOnceValue) {
 | 
			
		||||
    // If the initial value for the global was an undef value, and if only
 | 
			
		||||
    // one other value was stored into it, we can just change the
 | 
			
		||||
| 
						 | 
				
			
			@ -1960,8 +1945,6 @@ bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
 | 
			
		|||
                       << "simplify all users and delete global!\n");
 | 
			
		||||
          GV->eraseFromParent();
 | 
			
		||||
          ++NumDeleted;
 | 
			
		||||
        } else {
 | 
			
		||||
          GVI = GV->getIterator();
 | 
			
		||||
        }
 | 
			
		||||
        ++NumSubstitute;
 | 
			
		||||
        return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -1969,8 +1952,7 @@ bool GlobalOpt::ProcessInternalGlobal(GlobalVariable *GV,
 | 
			
		|||
 | 
			
		||||
    // Try to optimize globals based on the knowledge that only one value
 | 
			
		||||
    // (besides its initializer) is ever stored to the global.
 | 
			
		||||
    if (OptimizeOnceStoredGlobal(GV, GS.StoredOnceValue, GS.Ordering, GVI,
 | 
			
		||||
                                 DL, TLI))
 | 
			
		||||
    if (optimizeOnceStoredGlobal(GV, GS.StoredOnceValue, GS.Ordering, DL, TLI))
 | 
			
		||||
      return true;
 | 
			
		||||
 | 
			
		||||
    // Otherwise, if the global was not a boolean, we can shrink it to be a
 | 
			
		||||
| 
						 | 
				
			
			@ -2095,7 +2077,7 @@ bool GlobalOpt::OptimizeGlobalVars(Module &M) {
 | 
			
		|||
      if (const Comdat *C = GV->getComdat())
 | 
			
		||||
        if (NotDiscardableComdats.count(C) && !GV->hasLocalLinkage())
 | 
			
		||||
          continue;
 | 
			
		||||
      Changed |= ProcessGlobal(GV, GVI);
 | 
			
		||||
      Changed |= processGlobal(GV);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return Changed;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue