Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[IPSCCP] Move common functions to ValueLatticeUtils (NFC)
This patch moves some common utility functions out of IPSCCP and makes them available globally. The functions determine if interprocedural data-flow analyses can propagate information through function returns, arguments, and global variables. Differential Revision: https://reviews.llvm.org/D37638 llvm-svn: 315719
- Loading branch information
Showing
4 changed files
with
113 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
//===-- ValueLatticeUtils.h - Utils for solving lattices --------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file declares common functions useful for performing data-flow analyses | ||
// that propagate values across function boundaries. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_ANALYSIS_VALUELATTICEUTILS_H | ||
#define LLVM_ANALYSIS_VALUELATTICEUTILS_H | ||
|
||
namespace llvm { | ||
|
||
class Function; | ||
class GlobalVariable; | ||
|
||
/// Determine if the values of the given function's arguments can be tracked | ||
/// interprocedurally. The value of an argument can be tracked if the function | ||
/// has local linkage and its address is not taken. | ||
bool canTrackArgumentsInterprocedurally(Function *F); | ||
|
||
/// Determine if the values of the given function's returns can be tracked | ||
/// interprocedurally. Return values can be tracked if the function has an | ||
/// exact definition and it doesn't have the "naked" attribute. Naked functions | ||
/// may contain assembly code that returns untrackable values. | ||
bool canTrackReturnsInterprocedurally(Function *F); | ||
|
||
/// Determine if the value maintained in the given global variable can be | ||
/// tracked interprocedurally. A value can be tracked if the global variable | ||
/// has local linkage and is only used by non-volatile loads and stores. | ||
bool canTrackGlobalVariableInterprocedurally(GlobalVariable *GV); | ||
|
||
} // end namespace llvm | ||
|
||
#endif // LLVM_ANALYSIS_VALUELATTICEUTILS_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
//===-- ValueLatticeUtils.cpp - Utils for solving lattices ------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file implements common functions useful for performing data-flow | ||
// analyses that propagate values across function boundaries. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "llvm/Analysis/ValueLatticeUtils.h" | ||
#include "llvm/IR/GlobalVariable.h" | ||
#include "llvm/IR/Instructions.h" | ||
using namespace llvm; | ||
|
||
bool llvm::canTrackArgumentsInterprocedurally(Function *F) { | ||
return F->hasLocalLinkage() && !F->hasAddressTaken(); | ||
} | ||
|
||
bool llvm::canTrackReturnsInterprocedurally(Function *F) { | ||
return F->hasExactDefinition() && !F->hasFnAttribute(Attribute::Naked); | ||
} | ||
|
||
bool llvm::canTrackGlobalVariableInterprocedurally(GlobalVariable *GV) { | ||
if (GV->isConstant() || !GV->hasLocalLinkage() || | ||
!GV->hasDefinitiveInitializer()) | ||
return false; | ||
return !any_of(GV->users(), [&](User *U) { | ||
if (auto *Store = dyn_cast<StoreInst>(U)) { | ||
if (Store->getValueOperand() == GV || Store->isVolatile()) | ||
return true; | ||
} else if (auto *Load = dyn_cast<LoadInst>(U)) { | ||
if (Load->isVolatile()) | ||
return true; | ||
} else { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters