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 Andric bool llvm::canTrackArgumentsInterprocedurally(Function *F) {
21*2cab237bSDimitry Andric   return F->hasLocalLinkage() && !F->hasAddressTaken();
22*2cab237bSDimitry Andric }
23*2cab237bSDimitry Andric 
canTrackReturnsInterprocedurally(Function * F)24*2cab237bSDimitry Andric bool 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 Andric bool 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