1*2cab237bSDimitry Andric //===-- ValueLatticeUtils.cpp - Utils for solving lattices ------*- C++ -*-===// 2*2cab237bSDimitry Andric // 3*2cab237bSDimitry Andric // The LLVM Compiler Infrastructure 4*2cab237bSDimitry Andric // 5*2cab237bSDimitry Andric // This file is distributed under the University of Illinois Open Source 6*2cab237bSDimitry Andric // License. See LICENSE.TXT for details. 7*2cab237bSDimitry Andric // 8*2cab237bSDimitry Andric //===----------------------------------------------------------------------===// 9*2cab237bSDimitry Andric // 10*2cab237bSDimitry Andric // This file implements common functions useful for performing data-flow 11*2cab237bSDimitry Andric // analyses that propagate values across function boundaries. 12*2cab237bSDimitry Andric // 13*2cab237bSDimitry Andric //===----------------------------------------------------------------------===// 14*2cab237bSDimitry Andric 15*2cab237bSDimitry Andric #include "llvm/Analysis/ValueLatticeUtils.h" 16*2cab237bSDimitry Andric #include "llvm/IR/GlobalVariable.h" 17*2cab237bSDimitry Andric #include "llvm/IR/Instructions.h" 18*2cab237bSDimitry Andric using namespace llvm; 19*2cab237bSDimitry Andric canTrackArgumentsInterprocedurally(Function * F)20*2cab237bSDimitry Andricbool llvm::canTrackArgumentsInterprocedurally(Function *F) { 21*2cab237bSDimitry Andric return F->hasLocalLinkage() && !F->hasAddressTaken(); 22*2cab237bSDimitry Andric } 23*2cab237bSDimitry Andric canTrackReturnsInterprocedurally(Function * F)24*2cab237bSDimitry Andricbool llvm::canTrackReturnsInterprocedurally(Function *F) { 25*2cab237bSDimitry Andric return F->hasExactDefinition() && !F->hasFnAttribute(Attribute::Naked); 26*2cab237bSDimitry Andric } 27*2cab237bSDimitry Andric canTrackGlobalVariableInterprocedurally(GlobalVariable * GV)28*2cab237bSDimitry Andricbool llvm::canTrackGlobalVariableInterprocedurally(GlobalVariable *GV) { 29*2cab237bSDimitry Andric if (GV->isConstant() || !GV->hasLocalLinkage() || 30*2cab237bSDimitry Andric !GV->hasDefinitiveInitializer()) 31*2cab237bSDimitry Andric return false; 32*2cab237bSDimitry Andric return !any_of(GV->users(), [&](User *U) { 33*2cab237bSDimitry Andric if (auto *Store = dyn_cast<StoreInst>(U)) { 34*2cab237bSDimitry Andric if (Store->getValueOperand() == GV || Store->isVolatile()) 35*2cab237bSDimitry Andric return true; 36*2cab237bSDimitry Andric } else if (auto *Load = dyn_cast<LoadInst>(U)) { 37*2cab237bSDimitry Andric if (Load->isVolatile()) 38*2cab237bSDimitry Andric return true; 39*2cab237bSDimitry Andric } else { 40*2cab237bSDimitry Andric return true; 41*2cab237bSDimitry Andric } 42*2cab237bSDimitry Andric return false; 43*2cab237bSDimitry Andric }); 44*2cab237bSDimitry Andric } 45