2003-05-21 05:01:22 +08:00
|
|
|
//===- SCCP.cpp - Sparse Conditional Constant Propagation -----------------===//
|
2005-04-22 07:48:37 +08:00
|
|
|
//
|
2003-10-21 03:43:21 +08:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-30 04:36:04 +08:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-22 07:48:37 +08:00
|
|
|
//
|
2003-10-21 03:43:21 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2001-06-28 07:38:11 +08:00
|
|
|
//
|
2003-05-21 05:01:22 +08:00
|
|
|
// This file implements sparse conditional constant propagation and merging:
|
2001-06-28 07:38:11 +08:00
|
|
|
//
|
|
|
|
// Specifically, this:
|
|
|
|
// * Assumes values are constant unless proven otherwise
|
|
|
|
// * Assumes BasicBlocks are dead unless proven otherwise
|
|
|
|
// * Proves values to be constant, and replaces them with constants
|
2002-08-31 07:39:00 +08:00
|
|
|
// * Proves conditional branches to be unconditional
|
2001-06-28 07:38:11 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2002-05-08 04:03:00 +08:00
|
|
|
#include "llvm/Transforms/Scalar.h"
|
2012-12-04 00:50:05 +08:00
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
|
|
#include "llvm/ADT/DenseSet.h"
|
|
|
|
#include "llvm/ADT/PointerIntPair.h"
|
|
|
|
#include "llvm/ADT/SmallPtrSet.h"
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
|
|
#include "llvm/ADT/Statistic.h"
|
2015-09-10 18:22:12 +08:00
|
|
|
#include "llvm/Analysis/GlobalsModRef.h"
|
2012-12-04 00:50:05 +08:00
|
|
|
#include "llvm/Analysis/ConstantFolding.h"
|
2015-03-24 03:32:43 +08:00
|
|
|
#include "llvm/Analysis/TargetLibraryInfo.h"
|
2014-03-04 19:01:28 +08:00
|
|
|
#include "llvm/IR/CallSite.h"
|
2013-01-02 19:36:10 +08:00
|
|
|
#include "llvm/IR/Constants.h"
|
|
|
|
#include "llvm/IR/DataLayout.h"
|
|
|
|
#include "llvm/IR/DerivedTypes.h"
|
2014-03-06 11:23:41 +08:00
|
|
|
#include "llvm/IR/InstVisitor.h"
|
2013-01-02 19:36:10 +08:00
|
|
|
#include "llvm/IR/Instructions.h"
|
2002-02-27 05:46:54 +08:00
|
|
|
#include "llvm/Pass.h"
|
2004-09-02 06:55:40 +08:00
|
|
|
#include "llvm/Support/Debug.h"
|
2009-07-11 21:10:19 +08:00
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
2009-07-25 08:23:56 +08:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2012-12-04 00:50:05 +08:00
|
|
|
#include "llvm/Transforms/IPO.h"
|
|
|
|
#include "llvm/Transforms/Utils/Local.h"
|
2001-06-28 07:38:11 +08:00
|
|
|
#include <algorithm>
|
2004-01-09 14:02:20 +08:00
|
|
|
using namespace llvm;
|
2003-11-12 06:41:34 +08:00
|
|
|
|
2014-04-22 10:55:47 +08:00
|
|
|
#define DEBUG_TYPE "sccp"
|
|
|
|
|
2006-12-20 05:40:18 +08:00
|
|
|
STATISTIC(NumInstRemoved, "Number of instructions removed");
|
|
|
|
STATISTIC(NumDeadBlocks , "Number of basic blocks unreachable");
|
|
|
|
|
2008-03-08 15:48:41 +08:00
|
|
|
STATISTIC(IPNumInstRemoved, "Number of instructions removed by IPSCCP");
|
2006-12-20 05:40:18 +08:00
|
|
|
STATISTIC(IPNumArgsElimed ,"Number of arguments constant propagated by IPSCCP");
|
|
|
|
STATISTIC(IPNumGlobalConst, "Number of globals found to be constant by IPSCCP");
|
|
|
|
|
2002-04-30 05:26:08 +08:00
|
|
|
namespace {
|
2006-12-20 14:21:33 +08:00
|
|
|
/// LatticeVal class - This class represents the different lattice values that
|
|
|
|
/// an LLVM value may occupy. It is a simple class with value semantics.
|
|
|
|
///
|
2009-09-02 14:11:42 +08:00
|
|
|
class LatticeVal {
|
2009-11-02 10:20:32 +08:00
|
|
|
enum LatticeValueTy {
|
2006-12-20 14:21:33 +08:00
|
|
|
/// undefined - This LLVM Value has no known value yet.
|
|
|
|
undefined,
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
/// constant - This LLVM Value has a specific constant value.
|
|
|
|
constant,
|
|
|
|
|
|
|
|
/// forcedconstant - This LLVM Value was thought to be undef until
|
|
|
|
/// ResolvedUndefsIn. This is treated just like 'constant', but if merged
|
|
|
|
/// with another (different) constant, it goes to overdefined, instead of
|
|
|
|
/// asserting.
|
|
|
|
forcedconstant,
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
/// overdefined - This instruction is not known to be constant, and we know
|
|
|
|
/// it has a value.
|
|
|
|
overdefined
|
2009-11-02 10:20:32 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/// Val: This stores the current lattice value along with the Constant* for
|
|
|
|
/// the constant if this is a 'constant' or 'forcedconstant' value.
|
|
|
|
PointerIntPair<Constant *, 2, LatticeValueTy> Val;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
LatticeValueTy getLatticeValue() const {
|
|
|
|
return Val.getInt();
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2001-06-28 07:38:11 +08:00
|
|
|
public:
|
2014-04-25 13:29:35 +08:00
|
|
|
LatticeVal() : Val(nullptr, undefined) {}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
bool isUndefined() const { return getLatticeValue() == undefined; }
|
|
|
|
bool isConstant() const {
|
2009-11-02 10:20:32 +08:00
|
|
|
return getLatticeValue() == constant || getLatticeValue() == forcedconstant;
|
|
|
|
}
|
2009-11-02 11:03:42 +08:00
|
|
|
bool isOverdefined() const { return getLatticeValue() == overdefined; }
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
Constant *getConstant() const {
|
2009-11-02 10:20:32 +08:00
|
|
|
assert(isConstant() && "Cannot get the constant of a non-constant!");
|
|
|
|
return Val.getPointer();
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
/// markOverdefined - Return true if this is a change in status.
|
2009-11-02 11:03:42 +08:00
|
|
|
bool markOverdefined() {
|
2009-11-02 10:20:32 +08:00
|
|
|
if (isOverdefined())
|
|
|
|
return false;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
Val.setInt(overdefined);
|
|
|
|
return true;
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
/// markConstant - Return true if this is a change in status.
|
2009-11-02 11:03:42 +08:00
|
|
|
bool markConstant(Constant *V) {
|
2009-11-04 00:50:11 +08:00
|
|
|
if (getLatticeValue() == constant) { // Constant but not forcedconstant.
|
2009-11-02 10:20:32 +08:00
|
|
|
assert(getConstant() == V && "Marking constant with different value");
|
|
|
|
return false;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
if (isUndefined()) {
|
|
|
|
Val.setInt(constant);
|
|
|
|
assert(V && "Marking constant with NULL");
|
|
|
|
Val.setPointer(V);
|
2001-06-28 07:38:11 +08:00
|
|
|
} else {
|
2012-01-19 05:16:33 +08:00
|
|
|
assert(getLatticeValue() == forcedconstant &&
|
2009-11-02 10:20:32 +08:00
|
|
|
"Cannot move from overdefined to constant!");
|
|
|
|
// Stay at forcedconstant if the constant is the same.
|
|
|
|
if (V == getConstant()) return false;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:20:32 +08:00
|
|
|
// Otherwise, we go to overdefined. Assumptions made based on the
|
|
|
|
// forced value are possibly wrong. Assuming this is another constant
|
|
|
|
// could expose a contradiction.
|
|
|
|
Val.setInt(overdefined);
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
2009-11-02 10:20:32 +08:00
|
|
|
return true;
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 11:21:36 +08:00
|
|
|
/// getConstantInt - If this is a constant with a ConstantInt value, return it
|
|
|
|
/// otherwise return null.
|
|
|
|
ConstantInt *getConstantInt() const {
|
|
|
|
if (isConstant())
|
|
|
|
return dyn_cast<ConstantInt>(getConstant());
|
2014-04-25 13:29:35 +08:00
|
|
|
return nullptr;
|
2009-11-02 11:21:36 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
void markForcedConstant(Constant *V) {
|
2009-11-02 10:20:32 +08:00
|
|
|
assert(isUndefined() && "Can't force a defined value!");
|
|
|
|
Val.setInt(forcedconstant);
|
|
|
|
Val.setPointer(V);
|
2004-01-12 11:57:30 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
};
|
2009-11-02 10:47:51 +08:00
|
|
|
} // end anonymous namespace.
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
2001-06-28 07:38:11 +08:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
2004-11-15 12:44:20 +08:00
|
|
|
/// SCCPSolver - This class is a general purpose solver for Sparse Conditional
|
|
|
|
/// Constant Propagation.
|
|
|
|
///
|
|
|
|
class SCCPSolver : public InstVisitor<SCCPSolver> {
|
2015-03-05 02:43:29 +08:00
|
|
|
const DataLayout &DL;
|
2011-12-02 05:29:16 +08:00
|
|
|
const TargetLibraryInfo *TLI;
|
2011-07-26 05:16:04 +08:00
|
|
|
SmallPtrSet<BasicBlock*, 8> BBExecutable; // The BBs that are executable.
|
2009-11-02 13:55:40 +08:00
|
|
|
DenseMap<Value*, LatticeVal> ValueState; // The state each value is in.
|
2004-07-16 07:36:43 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
/// StructValueState - This maintains ValueState for values that have
|
|
|
|
/// StructType, for example for formal arguments, calls, insertelement, etc.
|
|
|
|
///
|
|
|
|
DenseMap<std::pair<Value*, unsigned>, LatticeVal> StructValueState;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
/// GlobalValue - If we are tracking any values for the contents of a global
|
|
|
|
/// variable, we keep a mapping from the constant accessor to the element of
|
|
|
|
/// the global, to the currently known value. If the value becomes
|
|
|
|
/// overdefined, it's entry is simply removed from this map.
|
2007-02-03 04:38:30 +08:00
|
|
|
DenseMap<GlobalVariable*, LatticeVal> TrackedGlobals;
|
2004-12-11 13:15:59 +08:00
|
|
|
|
2008-03-11 13:46:42 +08:00
|
|
|
/// TrackedRetVals - If we are tracking arguments into and the return
|
2004-12-10 16:02:06 +08:00
|
|
|
/// value out of a function, it will have an entry in this map, indicating
|
|
|
|
/// what the known return value for the function is.
|
2008-03-11 13:46:42 +08:00
|
|
|
DenseMap<Function*, LatticeVal> TrackedRetVals;
|
|
|
|
|
|
|
|
/// TrackedMultipleRetVals - Same as TrackedRetVals, but used for functions
|
|
|
|
/// that return multiple values.
|
2008-08-24 07:36:38 +08:00
|
|
|
DenseMap<std::pair<Function*, unsigned>, LatticeVal> TrackedMultipleRetVals;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
/// MRVFunctionsTracked - Each function in TrackedMultipleRetVals is
|
|
|
|
/// represented here for efficient lookup.
|
|
|
|
SmallPtrSet<Function*, 16> MRVFunctionsTracked;
|
2004-12-10 16:02:06 +08:00
|
|
|
|
2009-11-04 04:52:57 +08:00
|
|
|
/// TrackingIncomingArguments - This is the set of functions for whose
|
|
|
|
/// arguments we make optimistic assumptions about and try to prove as
|
|
|
|
/// constants.
|
2009-11-04 03:24:51 +08:00
|
|
|
SmallPtrSet<Function*, 16> TrackingIncomingArguments;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
/// The reason for two worklists is that overdefined is the lowest state
|
|
|
|
/// on the lattice, and moving things to overdefined as fast as possible
|
|
|
|
/// makes SCCP converge much faster.
|
|
|
|
///
|
|
|
|
/// By having a separate worklist, we accomplish this because everything
|
|
|
|
/// possibly overdefined will become overdefined at the soonest possible
|
|
|
|
/// point.
|
2008-08-24 07:36:38 +08:00
|
|
|
SmallVector<Value*, 64> OverdefinedInstWorkList;
|
|
|
|
SmallVector<Value*, 64> InstWorkList;
|
2004-07-16 07:36:43 +08:00
|
|
|
|
|
|
|
|
2008-08-24 07:36:38 +08:00
|
|
|
SmallVector<BasicBlock*, 64> BBWorkList; // The BasicBlock work list
|
2003-10-09 00:55:34 +08:00
|
|
|
|
|
|
|
/// KnownFeasibleEdges - Entries in this set are edges which have already had
|
|
|
|
/// PHI nodes retriggered.
|
2008-08-24 07:36:38 +08:00
|
|
|
typedef std::pair<BasicBlock*, BasicBlock*> Edge;
|
|
|
|
DenseSet<Edge> KnownFeasibleEdges;
|
2002-04-30 05:26:08 +08:00
|
|
|
public:
|
2015-03-05 02:43:29 +08:00
|
|
|
SCCPSolver(const DataLayout &DL, const TargetLibraryInfo *tli)
|
|
|
|
: DL(DL), TLI(tli) {}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
/// MarkBlockExecutable - This method can be used by clients to mark all of
|
|
|
|
/// the blocks that are known to be intrinsically live in the processed unit.
|
2009-11-02 14:11:23 +08:00
|
|
|
///
|
|
|
|
/// This returns true if the block was not considered live before.
|
|
|
|
bool MarkBlockExecutable(BasicBlock *BB) {
|
2014-11-19 15:49:26 +08:00
|
|
|
if (!BBExecutable.insert(BB).second)
|
|
|
|
return false;
|
2013-06-26 08:30:18 +08:00
|
|
|
DEBUG(dbgs() << "Marking Block Executable: " << BB->getName() << '\n');
|
2004-11-15 12:44:20 +08:00
|
|
|
BBWorkList.push_back(BB); // Add the block to the work list!
|
2009-11-02 14:11:23 +08:00
|
|
|
return true;
|
2004-11-15 12:44:20 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
/// TrackValueOfGlobalVariable - Clients can use this method to
|
2004-12-10 16:02:06 +08:00
|
|
|
/// inform the SCCPSolver that it should track loads and stores to the
|
|
|
|
/// specified global variable if it can. This is only legal to call if
|
|
|
|
/// performing Interprocedural SCCP.
|
2004-12-11 13:15:59 +08:00
|
|
|
void TrackValueOfGlobalVariable(GlobalVariable *GV) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// We only track the contents of scalar globals.
|
2016-01-17 04:30:46 +08:00
|
|
|
if (GV->getValueType()->isSingleValueType()) {
|
2004-12-11 13:15:59 +08:00
|
|
|
LatticeVal &IV = TrackedGlobals[GV];
|
|
|
|
if (!isa<UndefValue>(GV->getInitializer()))
|
|
|
|
IV.markConstant(GV->getInitializer());
|
|
|
|
}
|
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
|
|
|
|
/// AddTrackedFunction - If the SCCP solver is supposed to track calls into
|
|
|
|
/// and out of the specified function (which cannot have its address taken),
|
|
|
|
/// this method must be called.
|
|
|
|
void AddTrackedFunction(Function *F) {
|
|
|
|
// Add an entry, F -> undef.
|
2011-07-18 12:54:35 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(F->getReturnType())) {
|
2009-11-04 07:40:48 +08:00
|
|
|
MRVFunctionsTracked.insert(F);
|
2008-03-11 13:46:42 +08:00
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
|
2008-04-23 13:38:20 +08:00
|
|
|
TrackedMultipleRetVals.insert(std::make_pair(std::make_pair(F, i),
|
|
|
|
LatticeVal()));
|
|
|
|
} else
|
|
|
|
TrackedRetVals.insert(std::make_pair(F, LatticeVal()));
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
|
|
|
|
2009-11-04 03:24:51 +08:00
|
|
|
void AddArgumentTrackedFunction(Function *F) {
|
|
|
|
TrackingIncomingArguments.insert(F);
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
/// Solve - Solve for constants and executable blocks.
|
|
|
|
///
|
|
|
|
void Solve();
|
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
/// ResolvedUndefsIn - While solving the dataflow for a function, we assume
|
2004-12-11 04:41:50 +08:00
|
|
|
/// that branches on undef values cannot reach any of their successors.
|
|
|
|
/// However, this is not a safe assumption. After we solve dataflow, this
|
|
|
|
/// method should be use to handle this. If this returns true, the solver
|
|
|
|
/// should be rerun.
|
2006-12-20 14:21:33 +08:00
|
|
|
bool ResolvedUndefsIn(Function &F);
|
2004-12-11 04:41:50 +08:00
|
|
|
|
2008-08-24 07:39:31 +08:00
|
|
|
bool isBlockExecutable(BasicBlock *BB) const {
|
|
|
|
return BBExecutable.count(BB);
|
2002-04-30 05:26:08 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2009-11-02 10:54:24 +08:00
|
|
|
LatticeVal getLatticeValueFor(Value *V) const {
|
2009-11-02 13:55:40 +08:00
|
|
|
DenseMap<Value*, LatticeVal>::const_iterator I = ValueState.find(V);
|
2009-11-02 10:54:24 +08:00
|
|
|
assert(I != ValueState.end() && "V is not in valuemap!");
|
|
|
|
return I->second;
|
2004-11-15 12:44:20 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-03-11 13:46:42 +08:00
|
|
|
/// getTrackedRetVals - Get the inferred return value map.
|
2004-12-11 10:53:57 +08:00
|
|
|
///
|
2008-03-11 13:46:42 +08:00
|
|
|
const DenseMap<Function*, LatticeVal> &getTrackedRetVals() {
|
|
|
|
return TrackedRetVals;
|
2004-12-11 10:53:57 +08:00
|
|
|
}
|
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
/// getTrackedGlobals - Get and return the set of inferred initializers for
|
|
|
|
/// global variables.
|
2007-02-03 04:38:30 +08:00
|
|
|
const DenseMap<GlobalVariable*, LatticeVal> &getTrackedGlobals() {
|
2004-12-11 13:15:59 +08:00
|
|
|
return TrackedGlobals;
|
|
|
|
}
|
|
|
|
|
2009-11-02 11:21:36 +08:00
|
|
|
void markOverdefined(Value *V) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(!V->getType()->isStructTy() && "Should use other method");
|
2007-03-04 12:50:21 +08:00
|
|
|
markOverdefined(ValueState[V], V);
|
|
|
|
}
|
2004-12-11 10:53:57 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
/// markAnythingOverdefined - Mark the specified value overdefined. This
|
|
|
|
/// works with both scalars and structs.
|
|
|
|
void markAnythingOverdefined(Value *V) {
|
2011-07-18 12:54:35 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(V->getType()))
|
2009-11-04 07:40:48 +08:00
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
|
|
|
|
markOverdefined(getStructValueState(V, i), V);
|
|
|
|
else
|
|
|
|
markOverdefined(V);
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2001-06-28 07:38:11 +08:00
|
|
|
private:
|
2004-07-16 07:36:43 +08:00
|
|
|
// markConstant - Make a value be marked as "constant". If the value
|
2005-04-22 07:48:37 +08:00
|
|
|
// is not already a constant, add it to the instruction work list so that
|
2001-06-28 07:38:11 +08:00
|
|
|
// the users of the instruction are updated later.
|
|
|
|
//
|
2009-11-02 11:03:42 +08:00
|
|
|
void markConstant(LatticeVal &IV, Value *V, Constant *C) {
|
|
|
|
if (!IV.markConstant(C)) return;
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "markConstant: " << *C << ": " << *V << '\n');
|
2010-04-09 09:14:31 +08:00
|
|
|
if (IV.isOverdefined())
|
|
|
|
OverdefinedInstWorkList.push_back(V);
|
|
|
|
else
|
|
|
|
InstWorkList.push_back(V);
|
2003-10-09 00:21:03 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
void markConstant(Value *V, Constant *C) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(!V->getType()->isStructTy() && "Should use other method");
|
2004-12-10 16:02:06 +08:00
|
|
|
markConstant(ValueState[V], V, C);
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
void markForcedConstant(Value *V, Constant *C) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(!V->getType()->isStructTy() && "Should use other method");
|
2010-04-09 09:14:31 +08:00
|
|
|
LatticeVal &IV = ValueState[V];
|
|
|
|
IV.markForcedConstant(C);
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "markForcedConstant: " << *C << ": " << *V << '\n');
|
2010-04-09 09:14:31 +08:00
|
|
|
if (IV.isOverdefined())
|
|
|
|
OverdefinedInstWorkList.push_back(V);
|
|
|
|
else
|
|
|
|
InstWorkList.push_back(V);
|
2009-11-02 13:55:40 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
|
|
|
|
2004-07-16 07:36:43 +08:00
|
|
|
// markOverdefined - Make a value be marked as "overdefined". If the
|
2005-04-22 07:48:37 +08:00
|
|
|
// value is not already overdefined, add it to the overdefined instruction
|
2004-07-16 07:36:43 +08:00
|
|
|
// work list so that the users of the instruction are updated later.
|
2009-11-02 11:03:42 +08:00
|
|
|
void markOverdefined(LatticeVal &IV, Value *V) {
|
|
|
|
if (!IV.markOverdefined()) return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "markOverdefined: ";
|
2009-11-02 11:03:42 +08:00
|
|
|
if (Function *F = dyn_cast<Function>(V))
|
2010-01-05 09:27:15 +08:00
|
|
|
dbgs() << "Function '" << F->getName() << "'\n";
|
2009-11-02 11:03:42 +08:00
|
|
|
else
|
2010-01-05 09:27:15 +08:00
|
|
|
dbgs() << *V << '\n');
|
2009-11-02 11:03:42 +08:00
|
|
|
// Only instructions go on the work list
|
|
|
|
OverdefinedInstWorkList.push_back(V);
|
2003-10-09 00:21:03 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
void mergeInValue(LatticeVal &IV, Value *V, LatticeVal MergeWithV) {
|
2004-12-10 16:02:06 +08:00
|
|
|
if (IV.isOverdefined() || MergeWithV.isUndefined())
|
|
|
|
return; // Noop.
|
|
|
|
if (MergeWithV.isOverdefined())
|
|
|
|
markOverdefined(IV, V);
|
|
|
|
else if (IV.isUndefined())
|
|
|
|
markConstant(IV, V, MergeWithV.getConstant());
|
|
|
|
else if (IV.getConstant() != MergeWithV.getConstant())
|
|
|
|
markOverdefined(IV, V);
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
void mergeInValue(Value *V, LatticeVal MergeWithV) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(!V->getType()->isStructTy() && "Should use other method");
|
2009-11-02 11:21:36 +08:00
|
|
|
mergeInValue(ValueState[V], V, MergeWithV);
|
2006-02-08 10:38:11 +08:00
|
|
|
}
|
|
|
|
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
/// getValueState - Return the LatticeVal object that corresponds to the
|
|
|
|
/// value. This function handles the case when the value hasn't been seen yet
|
|
|
|
/// by properly seeding constants etc.
|
2009-11-02 11:03:42 +08:00
|
|
|
LatticeVal &getValueState(Value *V) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(!V->getType()->isStructTy() && "Should use getStructValueState");
|
2004-10-17 02:09:41 +08:00
|
|
|
|
2009-11-05 22:33:27 +08:00
|
|
|
std::pair<DenseMap<Value*, LatticeVal>::iterator, bool> I =
|
|
|
|
ValueState.insert(std::make_pair(V, LatticeVal()));
|
|
|
|
LatticeVal &LV = I.first->second;
|
|
|
|
|
|
|
|
if (!I.second)
|
|
|
|
return LV; // Common case, already in the map.
|
2009-11-02 11:21:36 +08:00
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
if (Constant *C = dyn_cast<Constant>(V)) {
|
2009-11-02 11:21:36 +08:00
|
|
|
// Undef values remain undefined.
|
|
|
|
if (!isa<UndefValue>(V))
|
2007-02-03 04:38:30 +08:00
|
|
|
LV.markConstant(C); // Constants are constant
|
2002-08-31 07:39:00 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// All others are underdefined by default.
|
2009-11-02 11:21:36 +08:00
|
|
|
return LV;
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
/// getStructValueState - Return the LatticeVal object that corresponds to the
|
|
|
|
/// value/field pair. This function handles the case when the value hasn't
|
|
|
|
/// been seen yet by properly seeding constants etc.
|
|
|
|
LatticeVal &getStructValueState(Value *V, unsigned i) {
|
2010-02-16 19:11:14 +08:00
|
|
|
assert(V->getType()->isStructTy() && "Should use getValueState");
|
2009-11-04 07:40:48 +08:00
|
|
|
assert(i < cast<StructType>(V->getType())->getNumElements() &&
|
|
|
|
"Invalid element #");
|
2009-11-05 22:33:27 +08:00
|
|
|
|
|
|
|
std::pair<DenseMap<std::pair<Value*, unsigned>, LatticeVal>::iterator,
|
|
|
|
bool> I = StructValueState.insert(
|
|
|
|
std::make_pair(std::make_pair(V, i), LatticeVal()));
|
|
|
|
LatticeVal &LV = I.first->second;
|
|
|
|
|
|
|
|
if (!I.second)
|
|
|
|
return LV; // Common case, already in the map.
|
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
if (Constant *C = dyn_cast<Constant>(V)) {
|
2012-01-26 10:32:04 +08:00
|
|
|
Constant *Elt = C->getAggregateElement(i);
|
2012-07-24 18:51:42 +08:00
|
|
|
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!Elt)
|
2009-11-04 07:40:48 +08:00
|
|
|
LV.markOverdefined(); // Unknown sort of constant.
|
2012-01-26 10:32:04 +08:00
|
|
|
else if (isa<UndefValue>(Elt))
|
|
|
|
; // Undef values remain undefined.
|
|
|
|
else
|
|
|
|
LV.markConstant(Elt); // Constants are constant.
|
2009-11-04 07:40:48 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// All others are underdefined by default.
|
|
|
|
return LV;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
/// markEdgeExecutable - Mark a basic block as executable, adding it to the BB
|
|
|
|
/// work list if it is not already executable.
|
2003-10-09 00:55:34 +08:00
|
|
|
void markEdgeExecutable(BasicBlock *Source, BasicBlock *Dest) {
|
|
|
|
if (!KnownFeasibleEdges.insert(Edge(Source, Dest)).second)
|
|
|
|
return; // This edge is already known to be executable!
|
|
|
|
|
2009-11-02 14:11:23 +08:00
|
|
|
if (!MarkBlockExecutable(Dest)) {
|
|
|
|
// If the destination is already executable, we just made an *edge*
|
2003-10-09 00:56:11 +08:00
|
|
|
// feasible that wasn't before. Revisit the PHI nodes in the block
|
|
|
|
// because they have potentially new operands.
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "Marking Edge Executable: " << Source->getName()
|
2013-06-26 08:30:18 +08:00
|
|
|
<< " -> " << Dest->getName() << '\n');
|
2003-04-25 10:50:03 +08:00
|
|
|
|
2009-11-02 14:11:23 +08:00
|
|
|
PHINode *PN;
|
|
|
|
for (BasicBlock::iterator I = Dest->begin();
|
|
|
|
(PN = dyn_cast<PHINode>(I)); ++I)
|
|
|
|
visitPHINode(*PN);
|
2003-04-25 10:50:03 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
// getFeasibleSuccessors - Return a vector of booleans to indicate which
|
|
|
|
// successors are reachable from a given terminator instruction.
|
|
|
|
//
|
2013-07-14 12:42:23 +08:00
|
|
|
void getFeasibleSuccessors(TerminatorInst &TI, SmallVectorImpl<bool> &Succs);
|
2004-11-15 12:44:20 +08:00
|
|
|
|
|
|
|
// isEdgeFeasible - Return true if the control flow edge from the 'From' basic
|
2009-11-02 10:33:50 +08:00
|
|
|
// block to the 'To' basic block is currently feasible.
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
|
|
|
bool isEdgeFeasible(BasicBlock *From, BasicBlock *To);
|
|
|
|
|
|
|
|
// OperandChangedState - This method is invoked on all of the users of an
|
2009-11-02 10:33:50 +08:00
|
|
|
// instruction that was just changed state somehow. Based on this
|
2004-11-15 12:44:20 +08:00
|
|
|
// information, we need to update the specified user of this instruction.
|
|
|
|
//
|
2009-11-03 11:42:51 +08:00
|
|
|
void OperandChangedState(Instruction *I) {
|
|
|
|
if (BBExecutable.count(I->getParent())) // Inst is executable?
|
|
|
|
visit(*I);
|
2004-11-15 12:44:20 +08:00
|
|
|
}
|
2010-12-01 04:23:21 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
private:
|
|
|
|
friend class InstVisitor<SCCPSolver>;
|
2001-06-30 07:56:23 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// visit implementations - Something changed in this instruction. Either an
|
2001-06-30 07:56:23 +08:00
|
|
|
// operand made a transition, or the instruction is newly executable. Change
|
|
|
|
// the value type of I to reflect these changes if appropriate.
|
2002-06-26 00:13:24 +08:00
|
|
|
void visitPHINode(PHINode &I);
|
2002-04-18 23:13:15 +08:00
|
|
|
|
|
|
|
// Terminators
|
2004-12-10 16:02:06 +08:00
|
|
|
void visitReturnInst(ReturnInst &I);
|
2002-06-26 00:13:24 +08:00
|
|
|
void visitTerminatorInst(TerminatorInst &TI);
|
2002-04-18 23:13:15 +08:00
|
|
|
|
2002-08-15 01:53:45 +08:00
|
|
|
void visitCastInst(CastInst &I);
|
2004-03-12 13:52:44 +08:00
|
|
|
void visitSelectInst(SelectInst &I);
|
2002-06-26 00:13:24 +08:00
|
|
|
void visitBinaryOperator(Instruction &I);
|
2006-12-23 14:05:41 +08:00
|
|
|
void visitCmpInst(CmpInst &I);
|
2006-01-11 03:05:05 +08:00
|
|
|
void visitExtractElementInst(ExtractElementInst &I);
|
2006-01-18 04:06:55 +08:00
|
|
|
void visitInsertElementInst(InsertElementInst &I);
|
2006-04-08 09:19:12 +08:00
|
|
|
void visitShuffleVectorInst(ShuffleVectorInst &I);
|
2008-06-20 09:15:44 +08:00
|
|
|
void visitExtractValueInst(ExtractValueInst &EVI);
|
|
|
|
void visitInsertValueInst(InsertValueInst &IVI);
|
2011-08-13 04:24:12 +08:00
|
|
|
void visitLandingPadInst(LandingPadInst &I) { markAnythingOverdefined(&I); }
|
[IR] Reformulate LLVM's EH funclet IR
While we have successfully implemented a funclet-oriented EH scheme on
top of LLVM IR, our scheme has some notable deficiencies:
- catchendpad and cleanupendpad are necessary in the current design
but they are difficult to explain to others, even to seasoned LLVM
experts.
- catchendpad and cleanupendpad are optimization barriers. They cannot
be split and force all potentially throwing call-sites to be invokes.
This has a noticable effect on the quality of our code generation.
- catchpad, while similar in some aspects to invoke, is fairly awkward.
It is unsplittable, starts a funclet, and has control flow to other
funclets.
- The nesting relationship between funclets is currently a property of
control flow edges. Because of this, we are forced to carefully
analyze the flow graph to see if there might potentially exist illegal
nesting among funclets. While we have logic to clone funclets when
they are illegally nested, it would be nicer if we had a
representation which forbade them upfront.
Let's clean this up a bit by doing the following:
- Instead, make catchpad more like cleanuppad and landingpad: no control
flow, just a bunch of simple operands; catchpad would be splittable.
- Introduce catchswitch, a control flow instruction designed to model
the constraints of funclet oriented EH.
- Make funclet scoping explicit by having funclet instructions consume
the token produced by the funclet which contains them.
- Remove catchendpad and cleanupendpad. Their presence can be inferred
implicitly using coloring information.
N.B. The state numbering code for the CLR has been updated but the
veracity of it's output cannot be spoken for. An expert should take a
look to make sure the results are reasonable.
Reviewers: rnk, JosephTremoulet, andrew.w.kaylor
Differential Revision: http://reviews.llvm.org/D15139
llvm-svn: 255422
2015-12-12 13:38:55 +08:00
|
|
|
void visitFuncletPadInst(FuncletPadInst &FPI) {
|
|
|
|
markAnythingOverdefined(&FPI);
|
|
|
|
}
|
|
|
|
void visitCatchSwitchInst(CatchSwitchInst &CPI) {
|
2015-08-04 16:21:40 +08:00
|
|
|
markAnythingOverdefined(&CPI);
|
|
|
|
visitTerminatorInst(CPI);
|
|
|
|
}
|
2002-04-18 23:13:15 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Instructions that cannot be folded away.
|
2009-11-02 13:55:40 +08:00
|
|
|
void visitStoreInst (StoreInst &I);
|
2004-01-12 12:29:41 +08:00
|
|
|
void visitLoadInst (LoadInst &I);
|
2002-08-31 07:39:00 +08:00
|
|
|
void visitGetElementPtrInst(GetElementPtrInst &I);
|
2009-10-24 12:23:03 +08:00
|
|
|
void visitCallInst (CallInst &I) {
|
2010-07-29 06:50:26 +08:00
|
|
|
visitCallSite(&I);
|
2009-09-19 06:35:49 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
void visitInvokeInst (InvokeInst &II) {
|
2010-07-29 06:50:26 +08:00
|
|
|
visitCallSite(&II);
|
2004-12-10 16:02:06 +08:00
|
|
|
visitTerminatorInst(II);
|
2003-08-27 09:08:35 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
void visitCallSite (CallSite CS);
|
2014-06-13 22:54:09 +08:00
|
|
|
void visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) {
|
|
|
|
markAnythingOverdefined(&I);
|
|
|
|
}
|
2011-08-03 05:35:16 +08:00
|
|
|
void visitAtomicRMWInst (AtomicRMWInst &I) { markOverdefined(&I); }
|
2009-10-24 05:09:37 +08:00
|
|
|
void visitAllocaInst (Instruction &I) { markOverdefined(&I); }
|
2009-11-04 07:40:48 +08:00
|
|
|
void visitVAArgInst (Instruction &I) { markAnythingOverdefined(&I); }
|
2002-06-26 00:13:24 +08:00
|
|
|
|
|
|
|
void visitInstruction(Instruction &I) {
|
2009-11-02 10:33:50 +08:00
|
|
|
// If a new instruction is added to LLVM that we don't handle.
|
2013-06-26 08:30:18 +08:00
|
|
|
dbgs() << "SCCP: Don't know how to handle: " << I << '\n';
|
2009-11-04 07:40:48 +08:00
|
|
|
markAnythingOverdefined(&I); // Just in case
|
2002-04-18 23:13:15 +08:00
|
|
|
}
|
2001-06-30 07:56:23 +08:00
|
|
|
};
|
2002-07-24 02:06:35 +08:00
|
|
|
|
2007-07-20 16:56:21 +08:00
|
|
|
} // end anonymous namespace
|
|
|
|
|
|
|
|
|
2002-05-03 05:44:00 +08:00
|
|
|
// getFeasibleSuccessors - Return a vector of booleans to indicate which
|
|
|
|
// successors are reachable from a given terminator instruction.
|
|
|
|
//
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::getFeasibleSuccessors(TerminatorInst &TI,
|
2013-07-14 12:42:23 +08:00
|
|
|
SmallVectorImpl<bool> &Succs) {
|
2003-04-25 10:50:03 +08:00
|
|
|
Succs.resize(TI.getNumSuccessors());
|
2002-06-26 00:13:24 +08:00
|
|
|
if (BranchInst *BI = dyn_cast<BranchInst>(&TI)) {
|
2002-05-03 05:44:00 +08:00
|
|
|
if (BI->isUnconditional()) {
|
|
|
|
Succs[0] = true;
|
2009-11-02 10:30:06 +08:00
|
|
|
return;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal BCValue = getValueState(BI->getCondition());
|
2009-11-02 11:21:36 +08:00
|
|
|
ConstantInt *CI = BCValue.getConstantInt();
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!CI) {
|
2009-11-02 10:30:06 +08:00
|
|
|
// Overdefined condition variables, and branches on unfoldable constant
|
|
|
|
// conditions, mean the branch could go either way.
|
2009-11-02 11:21:36 +08:00
|
|
|
if (!BCValue.isUndefined())
|
|
|
|
Succs[0] = Succs[1] = true;
|
2009-11-02 10:30:06 +08:00
|
|
|
return;
|
2002-05-03 05:44:00 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:30:06 +08:00
|
|
|
// Constant condition variables mean the branch can only go a single way.
|
2009-11-02 11:21:36 +08:00
|
|
|
Succs[CI->isZero()] = true;
|
2009-10-29 09:21:20 +08:00
|
|
|
return;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2015-08-01 01:58:14 +08:00
|
|
|
// Unwinding instructions successors are always executable.
|
|
|
|
if (TI.isExceptional()) {
|
|
|
|
Succs.assign(TI.getNumSuccessors(), true);
|
2009-10-29 09:21:20 +08:00
|
|
|
return;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-10-29 09:21:20 +08:00
|
|
|
if (SwitchInst *SI = dyn_cast<SwitchInst>(&TI)) {
|
SwitchInst refactoring.
The purpose of refactoring is to hide operand roles from SwitchInst user (programmer). If you want to play with operands directly, probably you will need lower level methods than SwitchInst ones (TerminatorInst or may be User). After this patch we can reorganize SwitchInst operands and successors as we want.
What was done:
1. Changed semantics of index inside the getCaseValue method:
getCaseValue(0) means "get first case", not a condition. Use getCondition() if you want to resolve the condition. I propose don't mix SwitchInst case indexing with low level indexing (TI successors indexing, User's operands indexing), since it may be dangerous.
2. By the same reason findCaseValue(ConstantInt*) returns actual number of case value. 0 means first case, not default. If there is no case with given value, ErrorIndex will returned.
3. Added getCaseSuccessor method. I propose to avoid usage of TerminatorInst::getSuccessor if you want to resolve case successor BB. Use getCaseSuccessor instead, since internal SwitchInst organization of operands/successors is hidden and may be changed in any moment.
4. Added resolveSuccessorIndex and resolveCaseIndex. The main purpose of these methods is to see how case successors are really mapped in TerminatorInst.
4.1 "resolveSuccessorIndex" was created if you need to level down from SwitchInst to TerminatorInst. It returns TerminatorInst's successor index for given case successor.
4.2 "resolveCaseIndex" converts low level successors index to case index that curresponds to the given successor.
Note: There are also related compatability fix patches for dragonegg, klee, llvm-gcc-4.0, llvm-gcc-4.2, safecode, clang.
llvm-svn: 149481
2012-02-01 15:49:51 +08:00
|
|
|
if (!SI->getNumCases()) {
|
2011-08-17 05:12:35 +08:00
|
|
|
Succs[0] = true;
|
|
|
|
return;
|
|
|
|
}
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal SCValue = getValueState(SI->getCondition());
|
2009-11-02 11:21:36 +08:00
|
|
|
ConstantInt *CI = SCValue.getConstantInt();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!CI) { // Overdefined or undefined condition?
|
2002-05-03 05:44:00 +08:00
|
|
|
// All destinations are executable!
|
2009-11-02 11:21:36 +08:00
|
|
|
if (!SCValue.isUndefined())
|
|
|
|
Succs.assign(TI.getNumSuccessors(), true);
|
|
|
|
return;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2012-03-08 15:06:20 +08:00
|
|
|
Succs[SI->findCaseValue(CI).getSuccessorIndex()] = true;
|
2009-10-29 09:21:20 +08:00
|
|
|
return;
|
2002-05-03 05:44:00 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-10-29 09:21:20 +08:00
|
|
|
// TODO: This could be improved if the operand is a [cast of a] BlockAddress.
|
|
|
|
if (isa<IndirectBrInst>(&TI)) {
|
|
|
|
// Just mark all destinations executable!
|
|
|
|
Succs.assign(TI.getNumSuccessors(), true);
|
|
|
|
return;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-10-29 09:21:20 +08:00
|
|
|
#ifndef NDEBUG
|
2010-01-05 09:27:15 +08:00
|
|
|
dbgs() << "Unknown terminator instruction: " << TI << '\n';
|
2009-10-29 09:21:20 +08:00
|
|
|
#endif
|
|
|
|
llvm_unreachable("SCCP: Don't know how to handle this terminator!");
|
2002-05-03 05:44:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-05-03 05:18:01 +08:00
|
|
|
// isEdgeFeasible - Return true if the control flow edge from the 'From' basic
|
2009-11-02 10:33:50 +08:00
|
|
|
// block to the 'To' basic block is currently feasible.
|
2002-05-03 05:18:01 +08:00
|
|
|
//
|
2004-11-15 12:44:20 +08:00
|
|
|
bool SCCPSolver::isEdgeFeasible(BasicBlock *From, BasicBlock *To) {
|
2002-05-03 05:18:01 +08:00
|
|
|
assert(BBExecutable.count(To) && "Dest should always be alive!");
|
|
|
|
|
|
|
|
// Make sure the source basic block is executable!!
|
|
|
|
if (!BBExecutable.count(From)) return false;
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Check to make sure this edge itself is actually feasible now.
|
2003-10-08 23:47:41 +08:00
|
|
|
TerminatorInst *TI = From->getTerminator();
|
|
|
|
if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
|
|
|
|
if (BI->isUnconditional())
|
2002-05-03 05:44:00 +08:00
|
|
|
return true;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal BCValue = getValueState(BI->getCondition());
|
2004-01-13 01:40:36 +08:00
|
|
|
|
2009-11-02 10:30:06 +08:00
|
|
|
// Overdefined condition variables mean the branch could go either way,
|
|
|
|
// undef conditions mean that neither edge is feasible yet.
|
2009-11-02 11:21:36 +08:00
|
|
|
ConstantInt *CI = BCValue.getConstantInt();
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!CI)
|
2009-11-02 11:21:36 +08:00
|
|
|
return !BCValue.isUndefined();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:30:06 +08:00
|
|
|
// Constant condition variables mean the branch can only go a single way.
|
2009-11-02 11:21:36 +08:00
|
|
|
return BI->getSuccessor(CI->isZero()) == To;
|
2009-10-29 09:21:20 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2015-08-01 01:58:14 +08:00
|
|
|
// Unwinding instructions successors are always executable.
|
|
|
|
if (TI->isExceptional())
|
2003-10-08 23:47:41 +08:00
|
|
|
return true;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-10-29 09:21:20 +08:00
|
|
|
if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
|
SwitchInst refactoring.
The purpose of refactoring is to hide operand roles from SwitchInst user (programmer). If you want to play with operands directly, probably you will need lower level methods than SwitchInst ones (TerminatorInst or may be User). After this patch we can reorganize SwitchInst operands and successors as we want.
What was done:
1. Changed semantics of index inside the getCaseValue method:
getCaseValue(0) means "get first case", not a condition. Use getCondition() if you want to resolve the condition. I propose don't mix SwitchInst case indexing with low level indexing (TI successors indexing, User's operands indexing), since it may be dangerous.
2. By the same reason findCaseValue(ConstantInt*) returns actual number of case value. 0 means first case, not default. If there is no case with given value, ErrorIndex will returned.
3. Added getCaseSuccessor method. I propose to avoid usage of TerminatorInst::getSuccessor if you want to resolve case successor BB. Use getCaseSuccessor instead, since internal SwitchInst organization of operands/successors is hidden and may be changed in any moment.
4. Added resolveSuccessorIndex and resolveCaseIndex. The main purpose of these methods is to see how case successors are really mapped in TerminatorInst.
4.1 "resolveSuccessorIndex" was created if you need to level down from SwitchInst to TerminatorInst. It returns TerminatorInst's successor index for given case successor.
4.2 "resolveCaseIndex" converts low level successors index to case index that curresponds to the given successor.
Note: There are also related compatability fix patches for dragonegg, klee, llvm-gcc-4.0, llvm-gcc-4.2, safecode, clang.
llvm-svn: 149481
2012-02-01 15:49:51 +08:00
|
|
|
if (SI->getNumCases() < 1)
|
2011-08-17 05:12:35 +08:00
|
|
|
return true;
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal SCValue = getValueState(SI->getCondition());
|
2009-11-02 11:21:36 +08:00
|
|
|
ConstantInt *CI = SCValue.getConstantInt();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!CI)
|
2009-11-02 11:21:36 +08:00
|
|
|
return !SCValue.isUndefined();
|
|
|
|
|
2012-03-08 15:06:20 +08:00
|
|
|
return SI->findCaseValue(CI).getCaseSuccessor() == To;
|
2009-10-29 09:21:20 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-10-29 09:21:20 +08:00
|
|
|
// Just mark all destinations executable!
|
|
|
|
// TODO: This could be improved if the operand is a [cast of a] BlockAddress.
|
2011-05-22 03:13:10 +08:00
|
|
|
if (isa<IndirectBrInst>(TI))
|
2009-10-29 09:21:20 +08:00
|
|
|
return true;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-07-11 21:10:19 +08:00
|
|
|
#ifndef NDEBUG
|
2010-01-05 09:27:15 +08:00
|
|
|
dbgs() << "Unknown terminator instruction: " << *TI << '\n';
|
2009-07-11 21:10:19 +08:00
|
|
|
#endif
|
2015-11-26 05:03:36 +08:00
|
|
|
llvm_unreachable("SCCP: Don't know how to handle this terminator!");
|
2002-05-03 05:18:01 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// visit Implementations - Something changed in this instruction, either an
|
2001-06-28 07:38:11 +08:00
|
|
|
// operand made a transition, or the instruction is newly executable. Change
|
|
|
|
// the value type of I to reflect these changes if appropriate. This method
|
|
|
|
// makes sure to do the following actions:
|
|
|
|
//
|
|
|
|
// 1. If a phi node merges two constants in, and has conflicting value coming
|
|
|
|
// from different branches, or if the PHI node merges in an overdefined
|
|
|
|
// value, then the PHI node becomes overdefined.
|
|
|
|
// 2. If a phi node merges only constants in, and they all agree on value, the
|
|
|
|
// PHI node becomes a constant value equal to that.
|
|
|
|
// 3. If V <- x (op) y && isConstant(x) && isConstant(y) V = Constant
|
|
|
|
// 4. If V <- x (op) y && (isOverdefined(x) || isOverdefined(y)) V = Overdefined
|
|
|
|
// 5. If V <- MEM or V <- CALL or V <- (unknown) then V = Overdefined
|
|
|
|
// 6. If a conditional branch has a value that is constant, make the selected
|
|
|
|
// destination executable
|
|
|
|
// 7. If a conditional branch has a value that is overdefined, make all
|
|
|
|
// successors executable.
|
|
|
|
//
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitPHINode(PHINode &PN) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this PN returns a struct, just mark the result overdefined.
|
|
|
|
// TODO: We could do a lot better than this if code actually uses this.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (PN.getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
return markAnythingOverdefined(&PN);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2011-11-11 09:16:15 +08:00
|
|
|
if (getValueState(&PN).isOverdefined())
|
2004-01-12 11:57:30 +08:00
|
|
|
return; // Quick exit
|
2002-04-18 23:13:15 +08:00
|
|
|
|
2004-03-17 03:49:59 +08:00
|
|
|
// Super-extra-high-degree PHI nodes are unlikely to ever be marked constant,
|
|
|
|
// and slow us down a lot. Just mark them overdefined.
|
2009-11-02 11:03:42 +08:00
|
|
|
if (PN.getNumIncomingValues() > 64)
|
2009-11-02 13:55:40 +08:00
|
|
|
return markOverdefined(&PN);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2002-04-18 23:13:15 +08:00
|
|
|
// Look at all of the executable operands of the PHI node. If any of them
|
|
|
|
// are overdefined, the PHI becomes overdefined as well. If they are all
|
|
|
|
// constant, and they agree with each other, the PHI becomes the identical
|
|
|
|
// constant. If they are constant and don't agree, the PHI is overdefined.
|
|
|
|
// If there are no executable operands, the PHI remains undefined.
|
|
|
|
//
|
2014-04-25 13:29:35 +08:00
|
|
|
Constant *OperandVal = nullptr;
|
2003-04-25 10:50:03 +08:00
|
|
|
for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal IV = getValueState(PN.getIncomingValue(i));
|
2003-04-25 10:50:03 +08:00
|
|
|
if (IV.isUndefined()) continue; // Doesn't influence PHI node.
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
if (!isEdgeFeasible(PN.getIncomingBlock(i), PN.getParent()))
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
if (IV.isOverdefined()) // PHI node becomes overdefined!
|
|
|
|
return markOverdefined(&PN);
|
2003-06-25 04:29:52 +08:00
|
|
|
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!OperandVal) { // Grab the first value.
|
2009-11-02 11:03:42 +08:00
|
|
|
OperandVal = IV.getConstant();
|
|
|
|
continue;
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
// There is already a reachable operand. If we conflict with it,
|
|
|
|
// then the PHI node becomes overdefined. If we agree with it, we
|
|
|
|
// can continue on.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
// Check to see if there are two different constants merging, if so, the PHI
|
|
|
|
// node is overdefined.
|
|
|
|
if (IV.getConstant() != OperandVal)
|
|
|
|
return markOverdefined(&PN);
|
2002-04-18 23:13:15 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2002-04-18 23:13:15 +08:00
|
|
|
// If we exited the loop, this means that the PHI node only has constant
|
2003-04-25 10:50:03 +08:00
|
|
|
// arguments that agree with each other(and OperandVal is the constant) or
|
|
|
|
// OperandVal is null because there are no defined incoming arguments. If
|
|
|
|
// this is the case, the PHI remains undefined.
|
2002-04-18 23:13:15 +08:00
|
|
|
//
|
2003-04-25 10:50:03 +08:00
|
|
|
if (OperandVal)
|
2008-08-24 07:36:38 +08:00
|
|
|
markConstant(&PN, OperandVal); // Acquire operand value
|
2002-04-18 23:13:15 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
void SCCPSolver::visitReturnInst(ReturnInst &I) {
|
2009-11-02 13:55:40 +08:00
|
|
|
if (I.getNumOperands() == 0) return; // ret void
|
2004-12-10 16:02:06 +08:00
|
|
|
|
|
|
|
Function *F = I.getParent()->getParent();
|
2009-11-04 07:40:48 +08:00
|
|
|
Value *ResultOp = I.getOperand(0);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-03-11 13:46:42 +08:00
|
|
|
// If we are tracking the return value of this function, merge it in.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (!TrackedRetVals.empty() && !ResultOp->getType()->isStructTy()) {
|
2007-02-03 04:38:30 +08:00
|
|
|
DenseMap<Function*, LatticeVal>::iterator TFRVI =
|
2008-03-11 13:46:42 +08:00
|
|
|
TrackedRetVals.find(F);
|
2009-11-03 11:42:51 +08:00
|
|
|
if (TFRVI != TrackedRetVals.end()) {
|
2009-11-04 07:40:48 +08:00
|
|
|
mergeInValue(TFRVI->second, F, getValueState(ResultOp));
|
2008-03-11 13:46:42 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// Handle functions that return multiple values.
|
2009-11-04 07:40:48 +08:00
|
|
|
if (!TrackedMultipleRetVals.empty()) {
|
2011-07-18 12:54:35 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(ResultOp->getType()))
|
2009-11-04 07:40:48 +08:00
|
|
|
if (MRVFunctionsTracked.count(F))
|
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
|
|
|
|
mergeInValue(TrackedMultipleRetVals[std::make_pair(F, i)], F,
|
|
|
|
getStructValueState(ResultOp, i));
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitTerminatorInst(TerminatorInst &TI) {
|
2007-02-03 05:15:06 +08:00
|
|
|
SmallVector<bool, 16> SuccFeasible;
|
2002-05-03 05:44:00 +08:00
|
|
|
getFeasibleSuccessors(TI, SuccFeasible);
|
2002-05-03 05:18:01 +08:00
|
|
|
|
2003-10-09 00:55:34 +08:00
|
|
|
BasicBlock *BB = TI.getParent();
|
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Mark all feasible successors executable.
|
2002-05-03 05:44:00 +08:00
|
|
|
for (unsigned i = 0, e = SuccFeasible.size(); i != e; ++i)
|
2003-10-09 00:55:34 +08:00
|
|
|
if (SuccFeasible[i])
|
|
|
|
markEdgeExecutable(BB, TI.getSuccessor(i));
|
2002-04-18 23:13:15 +08:00
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitCastInst(CastInst &I) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal OpSt = getValueState(I.getOperand(0));
|
|
|
|
if (OpSt.isOverdefined()) // Inherit overdefinedness of operand
|
2002-06-26 00:13:24 +08:00
|
|
|
markOverdefined(&I);
|
2016-01-08 05:36:16 +08:00
|
|
|
else if (OpSt.isConstant()) {
|
|
|
|
Constant *C =
|
|
|
|
ConstantExpr::getCast(I.getOpcode(), OpSt.getConstant(), I.getType());
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
|
|
|
// Propagate constant value
|
|
|
|
markConstant(&I, C);
|
|
|
|
}
|
2001-06-28 07:38:11 +08:00
|
|
|
}
|
|
|
|
|
2008-06-20 09:15:44 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
void SCCPSolver::visitExtractValueInst(ExtractValueInst &EVI) {
|
|
|
|
// If this returns a struct, mark all elements over defined, we don't track
|
|
|
|
// structs in structs.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (EVI.getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
return markAnythingOverdefined(&EVI);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this is extracting from more than one level of struct, we don't know.
|
2009-11-02 11:03:42 +08:00
|
|
|
if (EVI.getNumIndices() != 1)
|
|
|
|
return markOverdefined(&EVI);
|
2009-11-04 07:40:48 +08:00
|
|
|
|
|
|
|
Value *AggVal = EVI.getAggregateOperand();
|
2010-02-16 19:11:14 +08:00
|
|
|
if (AggVal->getType()->isStructTy()) {
|
2009-11-11 06:02:09 +08:00
|
|
|
unsigned i = *EVI.idx_begin();
|
|
|
|
LatticeVal EltVal = getStructValueState(AggVal, i);
|
|
|
|
mergeInValue(getValueState(&EVI), &EVI, EltVal);
|
|
|
|
} else {
|
|
|
|
// Otherwise, must be extracting from an array.
|
|
|
|
return markOverdefined(&EVI);
|
|
|
|
}
|
2008-06-20 09:15:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void SCCPSolver::visitInsertValueInst(InsertValueInst &IVI) {
|
2011-07-18 12:54:35 +08:00
|
|
|
StructType *STy = dyn_cast<StructType>(IVI.getType());
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!STy)
|
2009-11-02 11:03:42 +08:00
|
|
|
return markOverdefined(&IVI);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this has more than one index, we can't handle it, drive all results to
|
|
|
|
// undef.
|
|
|
|
if (IVI.getNumIndices() != 1)
|
|
|
|
return markAnythingOverdefined(&IVI);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
Value *Aggr = IVI.getAggregateOperand();
|
|
|
|
unsigned Idx = *IVI.idx_begin();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// Compute the result based on what we're inserting.
|
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
|
|
|
|
// This passes through all values that aren't the inserted element.
|
|
|
|
if (i != Idx) {
|
|
|
|
LatticeVal EltVal = getStructValueState(Aggr, i);
|
|
|
|
mergeInValue(getStructValueState(&IVI, i), &IVI, EltVal);
|
|
|
|
continue;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
Value *Val = IVI.getInsertedValueOperand();
|
2010-02-16 19:11:14 +08:00
|
|
|
if (Val->getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
// We don't track structs in structs.
|
|
|
|
markOverdefined(getStructValueState(&IVI, i), &IVI);
|
|
|
|
else {
|
|
|
|
LatticeVal InVal = getValueState(Val);
|
|
|
|
mergeInValue(getStructValueState(&IVI, i), &IVI, InVal);
|
|
|
|
}
|
|
|
|
}
|
2008-06-20 09:15:44 +08:00
|
|
|
}
|
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitSelectInst(SelectInst &I) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this select returns a struct, just mark the result overdefined.
|
|
|
|
// TODO: We could do a lot better than this if code actually uses this.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (I.getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
return markAnythingOverdefined(&I);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal CondValue = getValueState(I.getCondition());
|
2006-02-08 10:38:11 +08:00
|
|
|
if (CondValue.isUndefined())
|
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:21:36 +08:00
|
|
|
if (ConstantInt *CondCB = CondValue.getConstantInt()) {
|
2009-11-02 13:55:40 +08:00
|
|
|
Value *OpVal = CondCB->isZero() ? I.getFalseValue() : I.getTrueValue();
|
|
|
|
mergeInValue(&I, getValueState(OpVal));
|
2009-11-02 11:21:36 +08:00
|
|
|
return;
|
2006-02-08 10:38:11 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-02-08 10:38:11 +08:00
|
|
|
// Otherwise, the condition is overdefined or a constant we can't evaluate.
|
|
|
|
// See if we can produce something better than overdefined based on the T/F
|
|
|
|
// value.
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal TVal = getValueState(I.getTrueValue());
|
|
|
|
LatticeVal FVal = getValueState(I.getFalseValue());
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-02-08 10:38:11 +08:00
|
|
|
// select ?, C, C -> C.
|
2012-01-19 05:16:33 +08:00
|
|
|
if (TVal.isConstant() && FVal.isConstant() &&
|
2009-11-02 11:03:42 +08:00
|
|
|
TVal.getConstant() == FVal.getConstant())
|
|
|
|
return markConstant(&I, FVal.getConstant());
|
2006-02-08 10:38:11 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
if (TVal.isUndefined()) // select ?, undef, X -> X.
|
|
|
|
return mergeInValue(&I, FVal);
|
|
|
|
if (FVal.isUndefined()) // select ?, X, undef -> X.
|
|
|
|
return mergeInValue(&I, TVal);
|
|
|
|
markOverdefined(&I);
|
2004-03-12 13:52:44 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// Handle Binary Operators.
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitBinaryOperator(Instruction &I) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal V1State = getValueState(I.getOperand(0));
|
|
|
|
LatticeVal V2State = getValueState(I.getOperand(1));
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-11-15 13:03:30 +08:00
|
|
|
LatticeVal &IV = ValueState[&I];
|
2004-01-12 11:57:30 +08:00
|
|
|
if (IV.isOverdefined()) return;
|
|
|
|
|
2016-01-08 05:36:16 +08:00
|
|
|
if (V1State.isConstant() && V2State.isConstant()) {
|
|
|
|
Constant *C = ConstantExpr::get(I.getOpcode(), V1State.getConstant(),
|
|
|
|
V2State.getConstant());
|
|
|
|
// X op Y -> undef.
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
|
|
|
return markConstant(IV, &I, C);
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// If something is undef, wait for it to resolve.
|
|
|
|
if (!V1State.isOverdefined() && !V2State.isOverdefined())
|
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// Otherwise, one of our operands is overdefined. Try to produce something
|
|
|
|
// better than overdefined with some tricks.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// If this is an AND or OR with 0 or -1, it doesn't matter that the other
|
|
|
|
// operand is overdefined.
|
|
|
|
if (I.getOpcode() == Instruction::And || I.getOpcode() == Instruction::Or) {
|
2014-04-25 13:29:35 +08:00
|
|
|
LatticeVal *NonOverdefVal = nullptr;
|
2009-11-02 13:55:40 +08:00
|
|
|
if (!V1State.isOverdefined())
|
|
|
|
NonOverdefVal = &V1State;
|
|
|
|
else if (!V2State.isOverdefined())
|
|
|
|
NonOverdefVal = &V2State;
|
|
|
|
|
|
|
|
if (NonOverdefVal) {
|
|
|
|
if (NonOverdefVal->isUndefined()) {
|
|
|
|
// Could annihilate value.
|
|
|
|
if (I.getOpcode() == Instruction::And)
|
|
|
|
markConstant(IV, &I, Constant::getNullValue(I.getType()));
|
2011-07-18 12:54:35 +08:00
|
|
|
else if (VectorType *PT = dyn_cast<VectorType>(I.getType()))
|
2009-11-02 13:55:40 +08:00
|
|
|
markConstant(IV, &I, Constant::getAllOnesValue(PT));
|
|
|
|
else
|
|
|
|
markConstant(IV, &I,
|
|
|
|
Constant::getAllOnesValue(I.getType()));
|
|
|
|
return;
|
2004-12-12 07:15:19 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
if (I.getOpcode() == Instruction::And) {
|
|
|
|
// X and 0 = 0
|
|
|
|
if (NonOverdefVal->getConstant()->isNullValue())
|
|
|
|
return markConstant(IV, &I, NonOverdefVal->getConstant());
|
|
|
|
} else {
|
|
|
|
if (ConstantInt *CI = NonOverdefVal->getConstantInt())
|
|
|
|
if (CI->isAllOnesValue()) // X or -1 = -1
|
|
|
|
return markConstant(IV, &I, NonOverdefVal->getConstant());
|
2004-12-12 07:15:19 +08:00
|
|
|
}
|
|
|
|
}
|
2009-11-02 13:55:40 +08:00
|
|
|
}
|
2004-12-12 07:15:19 +08:00
|
|
|
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
markOverdefined(&I);
|
2002-04-18 23:13:15 +08:00
|
|
|
}
|
2002-08-31 07:39:00 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Handle ICmpInst instruction.
|
2006-12-23 14:05:41 +08:00
|
|
|
void SCCPSolver::visitCmpInst(CmpInst &I) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal V1State = getValueState(I.getOperand(0));
|
|
|
|
LatticeVal V2State = getValueState(I.getOperand(1));
|
|
|
|
|
2006-12-23 14:05:41 +08:00
|
|
|
LatticeVal &IV = ValueState[&I];
|
|
|
|
if (IV.isOverdefined()) return;
|
|
|
|
|
2016-01-08 05:36:16 +08:00
|
|
|
if (V1State.isConstant() && V2State.isConstant()) {
|
|
|
|
Constant *C = ConstantExpr::getCompare(
|
|
|
|
I.getPredicate(), V1State.getConstant(), V2State.getConstant());
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
|
|
|
return markConstant(IV, &I, C);
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// If operands are still undefined, wait for it to resolve.
|
|
|
|
if (!V1State.isOverdefined() && !V2State.isOverdefined())
|
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
markOverdefined(&I);
|
2006-12-23 14:05:41 +08:00
|
|
|
}
|
|
|
|
|
2006-01-11 03:05:05 +08:00
|
|
|
void SCCPSolver::visitExtractElementInst(ExtractElementInst &I) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO : SCCP does not handle vectors properly.
|
2009-11-02 11:03:42 +08:00
|
|
|
return markOverdefined(&I);
|
2006-12-05 07:54:59 +08:00
|
|
|
|
|
|
|
#if 0
|
2006-01-11 03:05:05 +08:00
|
|
|
LatticeVal &ValState = getValueState(I.getOperand(0));
|
|
|
|
LatticeVal &IdxState = getValueState(I.getOperand(1));
|
|
|
|
|
|
|
|
if (ValState.isOverdefined() || IdxState.isOverdefined())
|
|
|
|
markOverdefined(&I);
|
|
|
|
else if(ValState.isConstant() && IdxState.isConstant())
|
|
|
|
markConstant(&I, ConstantExpr::getExtractElement(ValState.getConstant(),
|
|
|
|
IdxState.getConstant()));
|
2006-12-05 07:54:59 +08:00
|
|
|
#endif
|
2006-01-11 03:05:05 +08:00
|
|
|
}
|
|
|
|
|
2006-01-18 04:06:55 +08:00
|
|
|
void SCCPSolver::visitInsertElementInst(InsertElementInst &I) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO : SCCP does not handle vectors properly.
|
2009-11-02 11:03:42 +08:00
|
|
|
return markOverdefined(&I);
|
2006-12-05 07:54:59 +08:00
|
|
|
#if 0
|
2006-01-18 04:06:55 +08:00
|
|
|
LatticeVal &ValState = getValueState(I.getOperand(0));
|
|
|
|
LatticeVal &EltState = getValueState(I.getOperand(1));
|
|
|
|
LatticeVal &IdxState = getValueState(I.getOperand(2));
|
|
|
|
|
|
|
|
if (ValState.isOverdefined() || EltState.isOverdefined() ||
|
|
|
|
IdxState.isOverdefined())
|
|
|
|
markOverdefined(&I);
|
|
|
|
else if(ValState.isConstant() && EltState.isConstant() &&
|
|
|
|
IdxState.isConstant())
|
|
|
|
markConstant(&I, ConstantExpr::getInsertElement(ValState.getConstant(),
|
|
|
|
EltState.getConstant(),
|
|
|
|
IdxState.getConstant()));
|
|
|
|
else if (ValState.isUndefined() && EltState.isConstant() &&
|
2012-01-19 05:16:33 +08:00
|
|
|
IdxState.isConstant())
|
2007-04-15 07:32:02 +08:00
|
|
|
markConstant(&I,ConstantExpr::getInsertElement(UndefValue::get(I.getType()),
|
|
|
|
EltState.getConstant(),
|
|
|
|
IdxState.getConstant()));
|
2006-12-05 07:54:59 +08:00
|
|
|
#endif
|
2006-01-18 04:06:55 +08:00
|
|
|
}
|
|
|
|
|
2006-04-08 09:19:12 +08:00
|
|
|
void SCCPSolver::visitShuffleVectorInst(ShuffleVectorInst &I) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO : SCCP does not handle vectors properly.
|
2009-11-02 11:03:42 +08:00
|
|
|
return markOverdefined(&I);
|
2006-12-05 07:54:59 +08:00
|
|
|
#if 0
|
2006-04-08 09:19:12 +08:00
|
|
|
LatticeVal &V1State = getValueState(I.getOperand(0));
|
|
|
|
LatticeVal &V2State = getValueState(I.getOperand(1));
|
|
|
|
LatticeVal &MaskState = getValueState(I.getOperand(2));
|
|
|
|
|
|
|
|
if (MaskState.isUndefined() ||
|
|
|
|
(V1State.isUndefined() && V2State.isUndefined()))
|
|
|
|
return; // Undefined output if mask or both inputs undefined.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-04-08 09:19:12 +08:00
|
|
|
if (V1State.isOverdefined() || V2State.isOverdefined() ||
|
|
|
|
MaskState.isOverdefined()) {
|
|
|
|
markOverdefined(&I);
|
|
|
|
} else {
|
|
|
|
// A mix of constant/undef inputs.
|
2012-01-19 05:16:33 +08:00
|
|
|
Constant *V1 = V1State.isConstant() ?
|
2006-04-08 09:19:12 +08:00
|
|
|
V1State.getConstant() : UndefValue::get(I.getType());
|
2012-01-19 05:16:33 +08:00
|
|
|
Constant *V2 = V2State.isConstant() ?
|
2006-04-08 09:19:12 +08:00
|
|
|
V2State.getConstant() : UndefValue::get(I.getType());
|
2012-01-19 05:16:33 +08:00
|
|
|
Constant *Mask = MaskState.isConstant() ?
|
2006-04-08 09:19:12 +08:00
|
|
|
MaskState.getConstant() : UndefValue::get(I.getOperand(2)->getType());
|
|
|
|
markConstant(&I, ConstantExpr::getShuffleVector(V1, V2, Mask));
|
|
|
|
}
|
2006-12-05 07:54:59 +08:00
|
|
|
#endif
|
2006-04-08 09:19:12 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Handle getelementptr instructions. If all operands are constants then we
|
2002-08-31 07:39:00 +08:00
|
|
|
// can turn this into a getelementptr ConstantExpr.
|
|
|
|
//
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitGetElementPtrInst(GetElementPtrInst &I) {
|
2009-11-03 07:25:39 +08:00
|
|
|
if (ValueState[&I].isOverdefined()) return;
|
2004-01-12 12:29:41 +08:00
|
|
|
|
2007-02-03 04:51:48 +08:00
|
|
|
SmallVector<Constant*, 8> Operands;
|
2002-08-31 07:39:00 +08:00
|
|
|
Operands.reserve(I.getNumOperands());
|
|
|
|
|
|
|
|
for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal State = getValueState(I.getOperand(i));
|
2002-08-31 07:39:00 +08:00
|
|
|
if (State.isUndefined())
|
2009-11-02 10:33:50 +08:00
|
|
|
return; // Operands are not resolved yet.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:03:42 +08:00
|
|
|
if (State.isOverdefined())
|
2009-11-03 07:25:39 +08:00
|
|
|
return markOverdefined(&I);
|
2009-11-02 11:03:42 +08:00
|
|
|
|
2002-08-31 07:39:00 +08:00
|
|
|
assert(State.isConstant() && "Unknown state!");
|
|
|
|
Operands.push_back(State.getConstant());
|
|
|
|
}
|
|
|
|
|
|
|
|
Constant *Ptr = Operands[0];
|
2014-08-27 13:25:25 +08:00
|
|
|
auto Indices = makeArrayRef(Operands.begin() + 1, Operands.end());
|
2016-01-08 05:36:16 +08:00
|
|
|
Constant *C =
|
|
|
|
ConstantExpr::getGetElementPtr(I.getSourceElementType(), Ptr, Indices);
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
|
|
|
markConstant(&I, C);
|
2004-01-12 12:29:41 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
void SCCPSolver::visitStoreInst(StoreInst &SI) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this store is of a struct, ignore it.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (SI.getOperand(0)->getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
if (TrackedGlobals.empty() || !isa<GlobalVariable>(SI.getOperand(1)))
|
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
GlobalVariable *GV = cast<GlobalVariable>(SI.getOperand(1));
|
2007-02-03 04:38:30 +08:00
|
|
|
DenseMap<GlobalVariable*, LatticeVal>::iterator I = TrackedGlobals.find(GV);
|
2004-12-11 13:15:59 +08:00
|
|
|
if (I == TrackedGlobals.end() || I->second.isOverdefined()) return;
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// Get the value we are storing into the global, then merge it.
|
|
|
|
mergeInValue(I->second, GV, getValueState(SI.getOperand(0)));
|
2004-12-11 13:15:59 +08:00
|
|
|
if (I->second.isOverdefined())
|
|
|
|
TrackedGlobals.erase(I); // No need to keep tracking this!
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-01-12 12:29:41 +08:00
|
|
|
// Handle load instructions. If the operand is a constant pointer to a constant
|
|
|
|
// global, we can replace the load with the loaded constant value!
|
2004-11-15 12:44:20 +08:00
|
|
|
void SCCPSolver::visitLoadInst(LoadInst &I) {
|
2009-11-04 07:40:48 +08:00
|
|
|
// If this load is of a struct, just mark the result overdefined.
|
2016-01-08 03:30:13 +08:00
|
|
|
if (I.getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
return markAnythingOverdefined(&I);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal PtrVal = getValueState(I.getOperand(0));
|
2009-11-02 14:06:14 +08:00
|
|
|
if (PtrVal.isUndefined()) return; // The pointer is not resolved yet!
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-11-15 13:03:30 +08:00
|
|
|
LatticeVal &IV = ValueState[&I];
|
2004-01-12 12:29:41 +08:00
|
|
|
if (IV.isOverdefined()) return;
|
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
if (!PtrVal.isConstant() || I.isVolatile())
|
|
|
|
return markOverdefined(IV, &I);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 14:06:14 +08:00
|
|
|
Constant *Ptr = PtrVal.getConstant();
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2016-01-08 03:25:39 +08:00
|
|
|
// load null is undefined.
|
2009-11-02 13:55:40 +08:00
|
|
|
if (isa<ConstantPointerNull>(Ptr) && I.getPointerAddressSpace() == 0)
|
2016-01-08 03:25:39 +08:00
|
|
|
return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// Transform load (constant global) into the value loaded.
|
|
|
|
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {
|
2009-11-02 14:06:14 +08:00
|
|
|
if (!TrackedGlobals.empty()) {
|
2009-11-02 13:55:40 +08:00
|
|
|
// If we are tracking this global, merge in the known value for it.
|
|
|
|
DenseMap<GlobalVariable*, LatticeVal>::iterator It =
|
|
|
|
TrackedGlobals.find(GV);
|
|
|
|
if (It != TrackedGlobals.end()) {
|
|
|
|
mergeInValue(IV, &I, It->second);
|
|
|
|
return;
|
2004-01-12 12:29:41 +08:00
|
|
|
}
|
2004-12-11 13:15:59 +08:00
|
|
|
}
|
2004-01-12 12:29:41 +08:00
|
|
|
}
|
|
|
|
|
2009-11-02 14:06:14 +08:00
|
|
|
// Transform load from a constant into a constant if possible.
|
2016-01-22 09:17:26 +08:00
|
|
|
if (Constant *C = ConstantFoldLoadFromConstPtr(Ptr, I.getType(), DL)) {
|
2016-01-08 05:36:16 +08:00
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
2009-11-02 14:06:14 +08:00
|
|
|
return markConstant(IV, &I, C);
|
2016-01-08 05:36:16 +08:00
|
|
|
}
|
2009-11-02 13:55:40 +08:00
|
|
|
|
2004-01-12 12:29:41 +08:00
|
|
|
// Otherwise we cannot say for certain what value this load will produce.
|
|
|
|
// Bail out.
|
|
|
|
markOverdefined(IV, &I);
|
|
|
|
}
|
2004-04-14 03:43:54 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
void SCCPSolver::visitCallSite(CallSite CS) {
|
|
|
|
Function *F = CS.getCalledFunction();
|
2008-04-23 13:38:20 +08:00
|
|
|
Instruction *I = CS.getInstruction();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// The common case is that we aren't tracking the callee, either because we
|
|
|
|
// are not doing interprocedural analysis or the callee is indirect, or is
|
|
|
|
// external. Handle these cases first.
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!F || F->isDeclaration()) {
|
2008-04-23 13:38:20 +08:00
|
|
|
CallOverdefined:
|
|
|
|
// Void return and not tracking callee, just bail.
|
2009-10-05 13:54:46 +08:00
|
|
|
if (I->getType()->isVoidTy()) return;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// Otherwise, if we have a single return value case, and if the function is
|
|
|
|
// a declaration, maybe we can constant fold it.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (F && F->isDeclaration() && !I->getType()->isStructTy() &&
|
2008-04-23 13:38:20 +08:00
|
|
|
canConstantFoldCallTo(F)) {
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
SmallVector<Constant*, 8> Operands;
|
|
|
|
for (CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end();
|
|
|
|
AI != E; ++AI) {
|
2009-11-02 13:55:40 +08:00
|
|
|
LatticeVal State = getValueState(*AI);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
if (State.isUndefined())
|
|
|
|
return; // Operands are not resolved yet.
|
2009-11-02 11:03:42 +08:00
|
|
|
if (State.isOverdefined())
|
|
|
|
return markOverdefined(I);
|
2008-04-23 13:38:20 +08:00
|
|
|
assert(State.isConstant() && "Unknown state!");
|
|
|
|
Operands.push_back(State.getConstant());
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2014-11-07 16:54:19 +08:00
|
|
|
if (getValueState(I).isOverdefined())
|
|
|
|
return;
|
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// If we can constant fold this, mark the result of the call as a
|
|
|
|
// constant.
|
2016-01-08 05:36:16 +08:00
|
|
|
if (Constant *C = ConstantFoldCall(F, Operands, TLI)) {
|
|
|
|
// call -> undef.
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return;
|
2009-11-02 11:03:42 +08:00
|
|
|
return markConstant(I, C);
|
2016-01-08 05:36:16 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
2004-04-14 03:43:54 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// Otherwise, we don't know anything about this call, mark it overdefined.
|
2009-11-04 07:40:48 +08:00
|
|
|
return markAnythingOverdefined(I);
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2009-11-04 03:24:51 +08:00
|
|
|
// If this is a local function that doesn't have its address taken, mark its
|
|
|
|
// entry block executable and merge in the actual arguments to the call into
|
|
|
|
// the formal arguments of the function.
|
|
|
|
if (!TrackingIncomingArguments.empty() && TrackingIncomingArguments.count(F)){
|
2015-10-14 03:26:58 +08:00
|
|
|
MarkBlockExecutable(&F->front());
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 03:24:51 +08:00
|
|
|
// Propagate information from this call site into the callee.
|
|
|
|
CallSite::arg_iterator CAI = CS.arg_begin();
|
|
|
|
for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end();
|
|
|
|
AI != E; ++AI, ++CAI) {
|
|
|
|
// If this argument is byval, and if the function is not readonly, there
|
|
|
|
// will be an implicit copy formed of the input aggregate.
|
|
|
|
if (AI->hasByValAttr() && !F->onlyReadsMemory()) {
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&*AI);
|
2009-11-04 03:24:51 +08:00
|
|
|
continue;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2011-07-18 12:54:35 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(AI->getType())) {
|
2009-11-05 02:57:42 +08:00
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
|
|
|
|
LatticeVal CallArg = getStructValueState(*CAI, i);
|
2015-10-14 03:26:58 +08:00
|
|
|
mergeInValue(getStructValueState(&*AI, i), &*AI, CallArg);
|
2009-11-05 02:57:42 +08:00
|
|
|
}
|
2009-11-04 07:40:48 +08:00
|
|
|
} else {
|
2015-10-14 03:26:58 +08:00
|
|
|
mergeInValue(&*AI, getValueState(*CAI));
|
2009-11-04 07:40:48 +08:00
|
|
|
}
|
2009-11-04 03:24:51 +08:00
|
|
|
}
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-04-23 13:38:20 +08:00
|
|
|
// If this is a single/zero retval case, see if we're tracking the function.
|
2011-07-18 12:54:35 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(F->getReturnType())) {
|
2009-11-04 07:40:48 +08:00
|
|
|
if (!MRVFunctionsTracked.count(F))
|
|
|
|
goto CallOverdefined; // Not tracking this callee.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// If we are tracking this callee, propagate the result of the function
|
|
|
|
// into this call site.
|
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
|
2012-01-19 05:16:33 +08:00
|
|
|
mergeInValue(getStructValueState(I, i), I,
|
2009-11-04 07:40:48 +08:00
|
|
|
TrackedMultipleRetVals[std::make_pair(F, i)]);
|
2008-06-20 09:15:44 +08:00
|
|
|
} else {
|
2009-11-04 07:40:48 +08:00
|
|
|
DenseMap<Function*, LatticeVal>::iterator TFRVI = TrackedRetVals.find(F);
|
|
|
|
if (TFRVI == TrackedRetVals.end())
|
|
|
|
goto CallOverdefined; // Not tracking this callee.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// If so, propagate the return value of the callee into this call result.
|
|
|
|
mergeInValue(I, TFRVI->second);
|
2004-04-14 03:43:54 +08:00
|
|
|
}
|
|
|
|
}
|
2004-11-15 12:44:20 +08:00
|
|
|
|
|
|
|
void SCCPSolver::Solve() {
|
|
|
|
// Process the work lists until they are empty!
|
2005-04-22 07:48:37 +08:00
|
|
|
while (!BBWorkList.empty() || !InstWorkList.empty() ||
|
2005-04-24 05:38:35 +08:00
|
|
|
!OverdefinedInstWorkList.empty()) {
|
2009-11-02 13:55:40 +08:00
|
|
|
// Process the overdefined instruction's work list first, which drives other
|
|
|
|
// things to overdefined more quickly.
|
2004-11-15 12:44:20 +08:00
|
|
|
while (!OverdefinedInstWorkList.empty()) {
|
2009-11-02 13:55:40 +08:00
|
|
|
Value *I = OverdefinedInstWorkList.pop_back_val();
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "\nPopped off OI-WL: " << *I << '\n');
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
// "I" got into the work list because it either made the transition from
|
2013-02-21 04:15:55 +08:00
|
|
|
// bottom to constant, or to overdefined.
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
|
|
|
// Anything on this worklist that is overdefined need not be visited
|
|
|
|
// since all of its users will have already been marked as overdefined
|
2009-11-02 10:33:50 +08:00
|
|
|
// Update all of the users of this instruction's value.
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
2014-03-09 11:16:01 +08:00
|
|
|
for (User *U : I->users())
|
|
|
|
if (Instruction *UI = dyn_cast<Instruction>(U))
|
|
|
|
OperandChangedState(UI);
|
2004-11-15 12:44:20 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Process the instruction work list.
|
2004-11-15 12:44:20 +08:00
|
|
|
while (!InstWorkList.empty()) {
|
2009-11-02 13:55:40 +08:00
|
|
|
Value *I = InstWorkList.pop_back_val();
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "\nPopped off I-WL: " << *I << '\n');
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2009-11-02 13:55:40 +08:00
|
|
|
// "I" got into the work list because it made the transition from undef to
|
|
|
|
// constant.
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
|
|
|
// Anything on this worklist that is overdefined need not be visited
|
|
|
|
// since all of its users will have already been marked as overdefined.
|
2009-11-02 10:33:50 +08:00
|
|
|
// Update all of the users of this instruction's value.
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
2010-02-16 19:11:14 +08:00
|
|
|
if (I->getType()->isStructTy() || !getValueState(I).isOverdefined())
|
2014-03-09 11:16:01 +08:00
|
|
|
for (User *U : I->users())
|
|
|
|
if (Instruction *UI = dyn_cast<Instruction>(U))
|
|
|
|
OperandChangedState(UI);
|
2004-11-15 12:44:20 +08:00
|
|
|
}
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// Process the basic block work list.
|
2004-11-15 12:44:20 +08:00
|
|
|
while (!BBWorkList.empty()) {
|
|
|
|
BasicBlock *BB = BBWorkList.back();
|
|
|
|
BBWorkList.pop_back();
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "\nPopped off BBWL: " << *BB << '\n');
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
// Notify all instructions in this basic block that they are newly
|
|
|
|
// executable.
|
|
|
|
visit(BB);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
/// ResolvedUndefsIn - While solving the dataflow for a function, we assume
|
2004-12-11 04:41:50 +08:00
|
|
|
/// that branches on undef values cannot reach any of their successors.
|
|
|
|
/// However, this is not a safe assumption. After we solve dataflow, this
|
|
|
|
/// method should be use to handle this. If this returns true, the solver
|
|
|
|
/// should be rerun.
|
2006-10-22 13:59:17 +08:00
|
|
|
///
|
|
|
|
/// This method handles this by finding an unresolved branch and marking it one
|
|
|
|
/// of the edges from the block as being feasible, even though the condition
|
|
|
|
/// doesn't say it would otherwise be. This allows SCCP to find the rest of the
|
|
|
|
/// CFG and only slightly pessimizes the analysis results (by marking one,
|
2006-12-20 14:21:33 +08:00
|
|
|
/// potentially infeasible, edge feasible). This cannot usefully modify the
|
2006-10-22 13:59:17 +08:00
|
|
|
/// constraints on the condition of the branch, as that would impact other users
|
|
|
|
/// of the value.
|
2006-12-20 14:21:33 +08:00
|
|
|
///
|
|
|
|
/// This scan also checks for values that use undefs, whose results are actually
|
|
|
|
/// defined. For example, 'zext i8 undef to i32' should produce all zeros
|
|
|
|
/// conservatively, as "(zext i8 X -> i32) & 0xFF00" must always return zero,
|
|
|
|
/// even if X isn't defined.
|
|
|
|
bool SCCPSolver::ResolvedUndefsIn(Function &F) {
|
2006-10-22 13:59:17 +08:00
|
|
|
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
|
2015-10-14 03:26:58 +08:00
|
|
|
if (!BBExecutable.count(&*BB))
|
2006-10-22 13:59:17 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2015-10-14 03:26:58 +08:00
|
|
|
for (Instruction &I : *BB) {
|
2006-12-20 14:21:33 +08:00
|
|
|
// Look for instructions which produce undef values.
|
2015-10-14 03:26:58 +08:00
|
|
|
if (I.getType()->isVoidTy()) continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2015-10-14 03:26:58 +08:00
|
|
|
if (StructType *STy = dyn_cast<StructType>(I.getType())) {
|
2011-09-21 07:28:51 +08:00
|
|
|
// Only a few things that can be structs matter for undef.
|
|
|
|
|
|
|
|
// Tracked calls must never be marked overdefined in ResolvedUndefsIn.
|
2015-10-14 03:26:58 +08:00
|
|
|
if (CallSite CS = CallSite(&I))
|
2011-09-21 07:28:51 +08:00
|
|
|
if (Function *F = CS.getCalledFunction())
|
|
|
|
if (MRVFunctionsTracked.count(F))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// extractvalue and insertvalue don't need to be marked; they are
|
2012-01-19 05:16:33 +08:00
|
|
|
// tracked as precisely as their operands.
|
2011-09-21 07:28:51 +08:00
|
|
|
if (isa<ExtractValueInst>(I) || isa<InsertValueInst>(I))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// Send the results of everything else to overdefined. We could be
|
|
|
|
// more precise than this but it isn't worth bothering.
|
|
|
|
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
|
2015-10-14 03:26:58 +08:00
|
|
|
LatticeVal &LV = getStructValueState(&I, i);
|
2011-09-21 07:28:51 +08:00
|
|
|
if (LV.isUndefined())
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(LV, &I);
|
2009-11-04 07:40:48 +08:00
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
2011-08-17 06:06:31 +08:00
|
|
|
|
2015-10-14 03:26:58 +08:00
|
|
|
LatticeVal &LV = getValueState(&I);
|
2006-12-20 14:21:33 +08:00
|
|
|
if (!LV.isUndefined()) continue;
|
|
|
|
|
2011-08-18 02:10:43 +08:00
|
|
|
// extractvalue is safe; check here because the argument is a struct.
|
|
|
|
if (isa<ExtractValueInst>(I))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// Compute the operand LatticeVals, for convenience below.
|
|
|
|
// Anything taking a struct is conservatively assumed to require
|
|
|
|
// overdefined markings.
|
2015-10-14 03:26:58 +08:00
|
|
|
if (I.getOperand(0)->getType()->isStructTy()) {
|
|
|
|
markOverdefined(&I);
|
2011-08-18 02:10:43 +08:00
|
|
|
return true;
|
|
|
|
}
|
2015-10-14 03:26:58 +08:00
|
|
|
LatticeVal Op0LV = getValueState(I.getOperand(0));
|
2006-12-20 14:21:33 +08:00
|
|
|
LatticeVal Op1LV;
|
2015-10-14 03:26:58 +08:00
|
|
|
if (I.getNumOperands() == 2) {
|
|
|
|
if (I.getOperand(1)->getType()->isStructTy()) {
|
|
|
|
markOverdefined(&I);
|
2011-08-18 02:10:43 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-10-14 03:26:58 +08:00
|
|
|
Op1LV = getValueState(I.getOperand(1));
|
2011-08-18 02:10:43 +08:00
|
|
|
}
|
2006-12-20 14:21:33 +08:00
|
|
|
// If this is an instructions whose result is defined even if the input is
|
|
|
|
// not fully defined, propagate the information.
|
2015-10-14 03:26:58 +08:00
|
|
|
Type *ITy = I.getType();
|
|
|
|
switch (I.getOpcode()) {
|
2011-08-17 06:06:31 +08:00
|
|
|
case Instruction::Add:
|
|
|
|
case Instruction::Sub:
|
|
|
|
case Instruction::Trunc:
|
|
|
|
case Instruction::FPTrunc:
|
|
|
|
case Instruction::BitCast:
|
|
|
|
break; // Any undef -> undef
|
|
|
|
case Instruction::FSub:
|
|
|
|
case Instruction::FAdd:
|
|
|
|
case Instruction::FMul:
|
|
|
|
case Instruction::FDiv:
|
|
|
|
case Instruction::FRem:
|
|
|
|
// Floating-point binary operation: be conservative.
|
|
|
|
if (Op0LV.isUndefined() && Op1LV.isUndefined())
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2011-08-17 06:06:31 +08:00
|
|
|
else
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&I);
|
2011-08-17 06:06:31 +08:00
|
|
|
return true;
|
2006-12-20 14:21:33 +08:00
|
|
|
case Instruction::ZExt:
|
2011-08-17 06:06:31 +08:00
|
|
|
case Instruction::SExt:
|
|
|
|
case Instruction::FPToUI:
|
|
|
|
case Instruction::FPToSI:
|
|
|
|
case Instruction::FPExt:
|
|
|
|
case Instruction::PtrToInt:
|
|
|
|
case Instruction::IntToPtr:
|
|
|
|
case Instruction::SIToFP:
|
|
|
|
case Instruction::UIToFP:
|
|
|
|
// undef -> 0; some outputs are impossible
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
|
|
|
case Instruction::Mul:
|
|
|
|
case Instruction::And:
|
2011-08-17 06:06:31 +08:00
|
|
|
// Both operands undef -> undef
|
|
|
|
if (Op0LV.isUndefined() && Op1LV.isUndefined())
|
|
|
|
break;
|
2006-12-20 14:21:33 +08:00
|
|
|
// undef * X -> 0. X could be zero.
|
|
|
|
// undef & X -> 0. X could be zero.
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
|
|
|
|
|
|
|
case Instruction::Or:
|
2011-08-17 06:06:31 +08:00
|
|
|
// Both operands undef -> undef
|
|
|
|
if (Op0LV.isUndefined() && Op1LV.isUndefined())
|
|
|
|
break;
|
2006-12-20 14:21:33 +08:00
|
|
|
// undef | X -> -1. X could be -1.
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getAllOnesValue(ITy));
|
2007-01-04 10:12:40 +08:00
|
|
|
return true;
|
2006-12-20 14:21:33 +08:00
|
|
|
|
2011-08-17 06:06:31 +08:00
|
|
|
case Instruction::Xor:
|
|
|
|
// undef ^ undef -> 0; strictly speaking, this is not strictly
|
|
|
|
// necessary, but we try to be nice to people who expect this
|
|
|
|
// behavior in simple cases
|
|
|
|
if (Op0LV.isUndefined() && Op1LV.isUndefined()) {
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2011-08-17 06:06:31 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// undef ^ X -> undef
|
|
|
|
break;
|
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
case Instruction::SDiv:
|
|
|
|
case Instruction::UDiv:
|
|
|
|
case Instruction::SRem:
|
|
|
|
case Instruction::URem:
|
|
|
|
// X / undef -> undef. No change.
|
|
|
|
// X % undef -> undef. No change.
|
|
|
|
if (Op1LV.isUndefined()) break;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2016-01-08 05:36:16 +08:00
|
|
|
// X / 0 -> undef. No change.
|
|
|
|
// X % 0 -> undef. No change.
|
|
|
|
if (Op1LV.isConstant() && Op1LV.getConstant()->isZeroValue())
|
|
|
|
break;
|
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
// undef / X -> 0. X could be maxint.
|
|
|
|
// undef % X -> 0. X could be 1.
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
case Instruction::AShr:
|
2011-08-17 06:06:31 +08:00
|
|
|
// X >>a undef -> undef.
|
|
|
|
if (Op1LV.isUndefined()) break;
|
|
|
|
|
|
|
|
// undef >>a X -> all ones
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getAllOnesValue(ITy));
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
|
|
|
case Instruction::LShr:
|
|
|
|
case Instruction::Shl:
|
2011-08-17 06:06:31 +08:00
|
|
|
// X << undef -> undef.
|
|
|
|
// X >> undef -> undef.
|
|
|
|
if (Op1LV.isUndefined()) break;
|
|
|
|
|
|
|
|
// undef << X -> 0
|
|
|
|
// undef >> X -> 0
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Constant::getNullValue(ITy));
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
|
|
|
case Instruction::Select:
|
2015-10-14 03:26:58 +08:00
|
|
|
Op1LV = getValueState(I.getOperand(1));
|
2006-12-20 14:21:33 +08:00
|
|
|
// undef ? X : Y -> X or Y. There could be commonality between X/Y.
|
|
|
|
if (Op0LV.isUndefined()) {
|
|
|
|
if (!Op1LV.isConstant()) // Pick the constant one if there is any.
|
2015-10-14 03:26:58 +08:00
|
|
|
Op1LV = getValueState(I.getOperand(2));
|
2006-12-20 14:21:33 +08:00
|
|
|
} else if (Op1LV.isUndefined()) {
|
|
|
|
// c ? undef : undef -> undef. No change.
|
2015-10-14 03:26:58 +08:00
|
|
|
Op1LV = getValueState(I.getOperand(2));
|
2006-12-20 14:21:33 +08:00
|
|
|
if (Op1LV.isUndefined())
|
|
|
|
break;
|
|
|
|
// Otherwise, c ? undef : x -> x.
|
|
|
|
} else {
|
|
|
|
// Leave Op1LV as Operand(1)'s LatticeValue.
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-12-20 14:21:33 +08:00
|
|
|
if (Op1LV.isConstant())
|
2015-10-14 03:26:58 +08:00
|
|
|
markForcedConstant(&I, Op1LV.getConstant());
|
2006-12-20 14:21:33 +08:00
|
|
|
else
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&I);
|
2008-05-24 11:59:33 +08:00
|
|
|
return true;
|
2011-08-17 06:06:31 +08:00
|
|
|
case Instruction::Load:
|
|
|
|
// A load here means one of two things: a load of undef from a global,
|
|
|
|
// a load from an unknown pointer. Either way, having it return undef
|
|
|
|
// is okay.
|
|
|
|
break;
|
|
|
|
case Instruction::ICmp:
|
|
|
|
// X == undef -> undef. Other comparisons get more complicated.
|
2015-10-14 03:26:58 +08:00
|
|
|
if (cast<ICmpInst>(&I)->isEquality())
|
2011-08-17 06:06:31 +08:00
|
|
|
break;
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&I);
|
2011-08-17 06:06:31 +08:00
|
|
|
return true;
|
2011-09-21 07:28:51 +08:00
|
|
|
case Instruction::Call:
|
|
|
|
case Instruction::Invoke: {
|
|
|
|
// There are two reasons a call can have an undef result
|
|
|
|
// 1. It could be tracked.
|
|
|
|
// 2. It could be constant-foldable.
|
|
|
|
// Because of the way we solve return values, tracked calls must
|
|
|
|
// never be marked overdefined in ResolvedUndefsIn.
|
2015-10-14 03:26:58 +08:00
|
|
|
if (Function *F = CallSite(&I).getCalledFunction())
|
2011-09-21 07:28:51 +08:00
|
|
|
if (TrackedRetVals.count(F))
|
|
|
|
break;
|
|
|
|
|
|
|
|
// If the call is constant-foldable, we mark it overdefined because
|
|
|
|
// we do not know what return values are valid.
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&I);
|
2011-09-21 07:28:51 +08:00
|
|
|
return true;
|
|
|
|
}
|
2011-08-17 06:06:31 +08:00
|
|
|
default:
|
|
|
|
// If we don't know what should happen here, conservatively mark it
|
2008-05-24 11:59:33 +08:00
|
|
|
// overdefined.
|
2015-10-14 03:26:58 +08:00
|
|
|
markOverdefined(&I);
|
2006-12-20 14:21:33 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-04-06 06:14:48 +08:00
|
|
|
// Check to see if we have a branch or switch on an undefined value. If so
|
|
|
|
// we force the branch to go one way or the other to make the successor
|
|
|
|
// values live. It doesn't really matter which way we force it.
|
2006-10-22 13:59:17 +08:00
|
|
|
TerminatorInst *TI = BB->getTerminator();
|
|
|
|
if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
|
|
|
|
if (!BI->isConditional()) continue;
|
|
|
|
if (!getValueState(BI->getCondition()).isUndefined())
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-04-06 06:14:48 +08:00
|
|
|
// If the input to SCCP is actually branch on undef, fix the undef to
|
|
|
|
// false.
|
|
|
|
if (isa<UndefValue>(BI->getCondition())) {
|
|
|
|
BI->setCondition(ConstantInt::getFalse(BI->getContext()));
|
2015-10-14 03:26:58 +08:00
|
|
|
markEdgeExecutable(&*BB, TI->getSuccessor(1));
|
2010-04-06 06:14:48 +08:00
|
|
|
return true;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-04-06 06:14:48 +08:00
|
|
|
// Otherwise, it is a branch on a symbolic value which is currently
|
|
|
|
// considered to be undef. Handle this by forcing the input value to the
|
|
|
|
// branch to false.
|
|
|
|
markForcedConstant(BI->getCondition(),
|
|
|
|
ConstantInt::getFalse(TI->getContext()));
|
|
|
|
return true;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-04-06 06:14:48 +08:00
|
|
|
if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
|
SwitchInst refactoring.
The purpose of refactoring is to hide operand roles from SwitchInst user (programmer). If you want to play with operands directly, probably you will need lower level methods than SwitchInst ones (TerminatorInst or may be User). After this patch we can reorganize SwitchInst operands and successors as we want.
What was done:
1. Changed semantics of index inside the getCaseValue method:
getCaseValue(0) means "get first case", not a condition. Use getCondition() if you want to resolve the condition. I propose don't mix SwitchInst case indexing with low level indexing (TI successors indexing, User's operands indexing), since it may be dangerous.
2. By the same reason findCaseValue(ConstantInt*) returns actual number of case value. 0 means first case, not default. If there is no case with given value, ErrorIndex will returned.
3. Added getCaseSuccessor method. I propose to avoid usage of TerminatorInst::getSuccessor if you want to resolve case successor BB. Use getCaseSuccessor instead, since internal SwitchInst organization of operands/successors is hidden and may be changed in any moment.
4. Added resolveSuccessorIndex and resolveCaseIndex. The main purpose of these methods is to see how case successors are really mapped in TerminatorInst.
4.1 "resolveSuccessorIndex" was created if you need to level down from SwitchInst to TerminatorInst. It returns TerminatorInst's successor index for given case successor.
4.2 "resolveCaseIndex" converts low level successors index to case index that curresponds to the given successor.
Note: There are also related compatability fix patches for dragonegg, klee, llvm-gcc-4.0, llvm-gcc-4.2, safecode, clang.
llvm-svn: 149481
2012-02-01 15:49:51 +08:00
|
|
|
if (!SI->getNumCases())
|
2008-05-23 09:01:31 +08:00
|
|
|
continue;
|
2006-10-22 13:59:17 +08:00
|
|
|
if (!getValueState(SI->getCondition()).isUndefined())
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2010-04-06 06:14:48 +08:00
|
|
|
// If the input to SCCP is actually switch on undef, fix the undef to
|
|
|
|
// the first constant.
|
|
|
|
if (isa<UndefValue>(SI->getCondition())) {
|
2012-03-11 14:09:17 +08:00
|
|
|
SI->setCondition(SI->case_begin().getCaseValue());
|
2015-10-14 03:26:58 +08:00
|
|
|
markEdgeExecutable(&*BB, SI->case_begin().getCaseSuccessor());
|
2010-04-06 06:14:48 +08:00
|
|
|
return true;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2012-03-11 14:09:17 +08:00
|
|
|
markForcedConstant(SI->getCondition(), SI->case_begin().getCaseValue());
|
2010-04-06 06:14:48 +08:00
|
|
|
return true;
|
2008-01-28 08:32:30 +08:00
|
|
|
}
|
2006-10-22 13:59:17 +08:00
|
|
|
}
|
2004-12-11 14:05:53 +08:00
|
|
|
|
2006-10-22 13:59:17 +08:00
|
|
|
return false;
|
2004-12-11 04:41:50 +08:00
|
|
|
}
|
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
|
|
|
|
namespace {
|
2004-11-15 15:15:04 +08:00
|
|
|
//===--------------------------------------------------------------------===//
|
2004-11-15 12:44:20 +08:00
|
|
|
//
|
2004-11-15 15:15:04 +08:00
|
|
|
/// SCCP Class - This class uses the SCCPSolver to implement a per-function
|
2007-01-01 06:26:06 +08:00
|
|
|
/// Sparse Conditional Constant Propagator.
|
2004-11-15 15:15:04 +08:00
|
|
|
///
|
2009-09-02 14:11:42 +08:00
|
|
|
struct SCCP : public FunctionPass {
|
2014-03-05 17:10:37 +08:00
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
2015-01-15 18:41:28 +08:00
|
|
|
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
2015-09-10 18:22:12 +08:00
|
|
|
AU.addPreserved<GlobalsAAWrapperPass>();
|
2011-12-02 05:29:16 +08:00
|
|
|
}
|
2007-05-06 21:37:16 +08:00
|
|
|
static char ID; // Pass identification, replacement for typeid
|
2010-10-20 01:21:58 +08:00
|
|
|
SCCP() : FunctionPass(ID) {
|
|
|
|
initializeSCCPPass(*PassRegistry::getPassRegistry());
|
|
|
|
}
|
2007-05-02 05:15:47 +08:00
|
|
|
|
2004-11-15 15:15:04 +08:00
|
|
|
// runOnFunction - Run the Sparse Conditional Constant Propagation
|
|
|
|
// algorithm, and return true if the function was modified.
|
|
|
|
//
|
2014-03-05 17:10:37 +08:00
|
|
|
bool runOnFunction(Function &F) override;
|
2004-11-15 15:15:04 +08:00
|
|
|
};
|
2004-11-15 12:44:20 +08:00
|
|
|
} // end anonymous namespace
|
|
|
|
|
2008-05-13 08:00:25 +08:00
|
|
|
char SCCP::ID = 0;
|
2010-07-22 06:09:45 +08:00
|
|
|
INITIALIZE_PASS(SCCP, "sccp",
|
2010-10-08 06:25:06 +08:00
|
|
|
"Sparse Conditional Constant Propagation", false, false)
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// createSCCPPass - This is the public interface to this file.
|
2004-11-15 12:44:20 +08:00
|
|
|
FunctionPass *llvm::createSCCPPass() {
|
|
|
|
return new SCCP();
|
|
|
|
}
|
|
|
|
|
|
|
|
// runOnFunction() - Run the Sparse Conditional Constant Propagation algorithm,
|
|
|
|
// and return true if the function was modified.
|
|
|
|
//
|
|
|
|
bool SCCP::runOnFunction(Function &F) {
|
2016-04-23 06:06:11 +08:00
|
|
|
if (skipFunction(F))
|
2014-02-06 08:07:05 +08:00
|
|
|
return false;
|
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "SCCP on function '" << F.getName() << "'\n");
|
2015-03-05 02:43:29 +08:00
|
|
|
const DataLayout &DL = F.getParent()->getDataLayout();
|
2015-01-15 18:41:28 +08:00
|
|
|
const TargetLibraryInfo *TLI =
|
|
|
|
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
2014-02-21 08:06:31 +08:00
|
|
|
SCCPSolver Solver(DL, TLI);
|
2004-11-15 12:44:20 +08:00
|
|
|
|
|
|
|
// Mark the first block of the function as being executable.
|
2015-10-14 03:26:58 +08:00
|
|
|
Solver.MarkBlockExecutable(&F.front());
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2004-11-15 13:45:33 +08:00
|
|
|
// Mark all arguments to the function as being overdefined.
|
2015-10-14 03:26:58 +08:00
|
|
|
for (Argument &AI : F.args())
|
|
|
|
Solver.markAnythingOverdefined(&AI);
|
2004-11-15 13:45:33 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
// Solve for constants.
|
2006-12-20 14:21:33 +08:00
|
|
|
bool ResolvedUndefs = true;
|
|
|
|
while (ResolvedUndefs) {
|
2004-12-11 04:41:50 +08:00
|
|
|
Solver.Solve();
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "RESOLVING UNDEFs\n");
|
2006-12-20 14:21:33 +08:00
|
|
|
ResolvedUndefs = Solver.ResolvedUndefsIn(F);
|
2004-12-11 04:41:50 +08:00
|
|
|
}
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2004-11-15 13:45:33 +08:00
|
|
|
bool MadeChanges = false;
|
|
|
|
|
|
|
|
// If we decided that there are basic blocks that are dead in this function,
|
|
|
|
// delete their contents now. Note that we cannot actually delete the blocks,
|
|
|
|
// as we cannot modify the CFG of the function.
|
2007-03-04 12:50:21 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
|
2015-10-14 03:26:58 +08:00
|
|
|
if (!Solver.isBlockExecutable(&*BB)) {
|
2016-01-24 14:26:47 +08:00
|
|
|
DEBUG(dbgs() << " BasicBlock Dead:" << *BB);
|
|
|
|
|
|
|
|
++NumDeadBlocks;
|
2016-01-24 14:40:37 +08:00
|
|
|
NumInstRemoved += removeAllNonTerminatorAndEHPadInstructions(&*BB);
|
2016-01-24 14:26:47 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
MadeChanges = true;
|
|
|
|
continue;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Iterate over all of the instructions in a function, replacing them with
|
|
|
|
// constants if we have found them to be of constant values.
|
|
|
|
//
|
|
|
|
for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) {
|
2015-10-14 03:26:58 +08:00
|
|
|
Instruction *Inst = &*BI++;
|
2009-11-02 10:47:51 +08:00
|
|
|
if (Inst->getType()->isVoidTy() || isa<TerminatorInst>(Inst))
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO: Reconstruct structs from their elements.
|
2010-02-16 19:11:14 +08:00
|
|
|
if (Inst->getType()->isStructTy())
|
2009-11-04 07:40:48 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:54:24 +08:00
|
|
|
LatticeVal IV = Solver.getLatticeValueFor(Inst);
|
|
|
|
if (IV.isOverdefined())
|
2009-11-02 10:47:51 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
Constant *Const = IV.isConstant()
|
|
|
|
? IV.getConstant() : UndefValue::get(Inst->getType());
|
2013-06-26 08:30:18 +08:00
|
|
|
DEBUG(dbgs() << " Constant: " << *Const << " = " << *Inst << '\n');
|
2008-04-24 08:16:28 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Replaces all of the uses of a variable with uses of the constant.
|
|
|
|
Inst->replaceAllUsesWith(Const);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Delete the instruction.
|
|
|
|
Inst->eraseFromParent();
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Hey, we just changed something!
|
|
|
|
MadeChanges = true;
|
|
|
|
++NumInstRemoved;
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
2009-11-02 10:47:51 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
|
|
|
|
return MadeChanges;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
/// IPSCCP Class - This class implements interprocedural Sparse Conditional
|
|
|
|
/// Constant Propagation.
|
|
|
|
///
|
2009-09-02 14:11:42 +08:00
|
|
|
struct IPSCCP : public ModulePass {
|
2014-03-05 17:10:37 +08:00
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
2015-01-15 18:41:28 +08:00
|
|
|
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
2011-12-02 05:29:16 +08:00
|
|
|
}
|
2007-05-03 09:11:54 +08:00
|
|
|
static char ID;
|
2010-10-20 01:21:58 +08:00
|
|
|
IPSCCP() : ModulePass(ID) {
|
|
|
|
initializeIPSCCPPass(*PassRegistry::getPassRegistry());
|
|
|
|
}
|
2014-03-05 17:10:37 +08:00
|
|
|
bool runOnModule(Module &M) override;
|
2004-12-10 16:02:06 +08:00
|
|
|
};
|
|
|
|
} // end anonymous namespace
|
|
|
|
|
2008-05-13 08:00:25 +08:00
|
|
|
char IPSCCP::ID = 0;
|
2011-12-02 05:29:16 +08:00
|
|
|
INITIALIZE_PASS_BEGIN(IPSCCP, "ipsccp",
|
|
|
|
"Interprocedural Sparse Conditional Constant Propagation",
|
|
|
|
false, false)
|
2015-01-15 18:41:28 +08:00
|
|
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
2011-12-02 05:29:16 +08:00
|
|
|
INITIALIZE_PASS_END(IPSCCP, "ipsccp",
|
2010-07-22 06:09:45 +08:00
|
|
|
"Interprocedural Sparse Conditional Constant Propagation",
|
2010-10-08 06:25:06 +08:00
|
|
|
false, false)
|
2008-05-13 08:00:25 +08:00
|
|
|
|
2009-11-02 10:33:50 +08:00
|
|
|
// createIPSCCPPass - This is the public interface to this file.
|
2004-12-10 16:02:06 +08:00
|
|
|
ModulePass *llvm::createIPSCCPPass() {
|
|
|
|
return new IPSCCP();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-24 18:29:52 +08:00
|
|
|
static bool AddressIsTaken(const GlobalValue *GV) {
|
2005-04-20 03:16:19 +08:00
|
|
|
// Delete any dead constantexpr klingons.
|
|
|
|
GV->removeDeadConstantUsers();
|
|
|
|
|
2014-03-09 11:16:01 +08:00
|
|
|
for (const Use &U : GV->uses()) {
|
|
|
|
const User *UR = U.getUser();
|
|
|
|
if (const StoreInst *SI = dyn_cast<StoreInst>(UR)) {
|
2004-12-11 13:15:59 +08:00
|
|
|
if (SI->getOperand(0) == GV || SI->isVolatile())
|
|
|
|
return true; // Storing addr of GV.
|
2014-03-09 11:16:01 +08:00
|
|
|
} else if (isa<InvokeInst>(UR) || isa<CallInst>(UR)) {
|
2004-12-10 16:02:06 +08:00
|
|
|
// Make sure we are calling the function, not passing the address.
|
2014-03-09 11:16:01 +08:00
|
|
|
ImmutableCallSite CS(cast<Instruction>(UR));
|
|
|
|
if (!CS.isCallee(&U))
|
2008-11-03 11:49:14 +08:00
|
|
|
return true;
|
2014-03-09 11:16:01 +08:00
|
|
|
} else if (const LoadInst *LI = dyn_cast<LoadInst>(UR)) {
|
2004-12-11 13:15:59 +08:00
|
|
|
if (LI->isVolatile())
|
|
|
|
return true;
|
2014-03-09 11:16:01 +08:00
|
|
|
} else if (isa<BlockAddress>(UR)) {
|
2009-11-01 14:11:53 +08:00
|
|
|
// blockaddress doesn't take the address of the function, it takes addr
|
|
|
|
// of label.
|
2004-12-11 13:15:59 +08:00
|
|
|
} else {
|
2004-12-10 16:02:06 +08:00
|
|
|
return true;
|
|
|
|
}
|
2010-03-24 18:29:52 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IPSCCP::runOnModule(Module &M) {
|
2016-04-23 06:06:11 +08:00
|
|
|
if (skipModule(M))
|
|
|
|
return false;
|
|
|
|
|
2015-03-05 02:43:29 +08:00
|
|
|
const DataLayout &DL = M.getDataLayout();
|
2015-01-15 18:41:28 +08:00
|
|
|
const TargetLibraryInfo *TLI =
|
|
|
|
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
2014-02-21 08:06:31 +08:00
|
|
|
SCCPSolver Solver(DL, TLI);
|
2004-12-10 16:02:06 +08:00
|
|
|
|
2010-08-13 06:25:23 +08:00
|
|
|
// AddressTakenFunctions - This set keeps track of the address-taken functions
|
|
|
|
// that are in the input. As IPSCCP runs through and simplifies code,
|
|
|
|
// functions that were address taken can end up losing their
|
|
|
|
// address-taken-ness. Because of this, we keep track of their addresses from
|
|
|
|
// the first pass so we can use them for the later simplification pass.
|
|
|
|
SmallPtrSet<Function*, 32> AddressTakenFunctions;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
// Loop over all functions, marking arguments to those with their addresses
|
|
|
|
// taken or that are external as overdefined.
|
|
|
|
//
|
2009-11-02 14:34:04 +08:00
|
|
|
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
|
|
|
|
if (F->isDeclaration())
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
Don't IPO over functions that can be de-refined
Summary:
Fixes PR26774.
If you're aware of the issue, feel free to skip the "Motivation"
section and jump directly to "This patch".
Motivation:
I define "refinement" as discarding behaviors from a program that the
optimizer has license to discard. So transforming:
```
void f(unsigned x) {
unsigned t = 5 / x;
(void)t;
}
```
to
```
void f(unsigned x) { }
```
is refinement, since the behavior went from "if x == 0 then undefined
else nothing" to "nothing" (the optimizer has license to discard
undefined behavior).
Refinement is a fundamental aspect of many mid-level optimizations done
by LLVM. For instance, transforming `x == (x + 1)` to `false` also
involves refinement since the expression's value went from "if x is
`undef` then { `true` or `false` } else { `false` }" to "`false`" (by
definition, the optimizer has license to fold `undef` to any non-`undef`
value).
Unfortunately, refinement implies that the optimizer cannot assume
that the implementation of a function it can see has all of the
behavior an unoptimized or a differently optimized version of the same
function can have. This is a problem for functions with comdat
linkage, where a function can be replaced by an unoptimized or a
differently optimized version of the same source level function.
For instance, FunctionAttrs cannot assume a comdat function is
actually `readnone` even if it does not have any loads or stores in
it; since there may have been loads and stores in the "original
function" that were refined out in the currently visible variant, and
at the link step the linker may in fact choose an implementation with
a load or a store. As an example, consider a function that does two
atomic loads from the same memory location, and writes to memory only
if the two values are not equal. The optimizer is allowed to refine
this function by first CSE'ing the two loads, and the folding the
comparision to always report that the two values are equal. Such a
refined variant will look like it is `readonly`. However, the
unoptimized version of the function can still write to memory (since
the two loads //can// result in different values), and selecting the
unoptimized version at link time will retroactively invalidate
transforms we may have done under the assumption that the function
does not write to memory.
Note: this is not just a problem with atomics or with linking
differently optimized object files. See PR26774 for more realistic
examples that involved neither.
This patch:
This change introduces a new set of linkage types, predicated as
`GlobalValue::mayBeDerefined` that returns true if the linkage type
allows a function to be replaced by a differently optimized variant at
link time. It then changes a set of IPO passes to bail out if they see
such a function.
Reviewers: chandlerc, hfinkel, dexonsmith, joker.eph, rnk
Subscribers: mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D18634
llvm-svn: 265762
2016-04-08 08:48:30 +08:00
|
|
|
// If this is an exact definition of this function, then we can propagate
|
|
|
|
// information about its result into callsites of it.
|
|
|
|
if (F->hasExactDefinition())
|
2015-10-14 03:26:58 +08:00
|
|
|
Solver.AddTrackedFunction(&*F);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-03 11:42:51 +08:00
|
|
|
// If this function only has direct calls that we can see, we can track its
|
|
|
|
// arguments and return value aggressively, and can assume it is not called
|
|
|
|
// unless we see evidence to the contrary.
|
2010-08-13 06:25:23 +08:00
|
|
|
if (F->hasLocalLinkage()) {
|
2015-10-14 03:26:58 +08:00
|
|
|
if (AddressIsTaken(&*F))
|
|
|
|
AddressTakenFunctions.insert(&*F);
|
2010-08-13 06:25:23 +08:00
|
|
|
else {
|
2015-10-14 03:26:58 +08:00
|
|
|
Solver.AddArgumentTrackedFunction(&*F);
|
2010-08-13 06:25:23 +08:00
|
|
|
continue;
|
|
|
|
}
|
2009-11-04 03:24:51 +08:00
|
|
|
}
|
2009-11-03 11:42:51 +08:00
|
|
|
|
|
|
|
// Assume the function is called.
|
2015-10-14 03:26:58 +08:00
|
|
|
Solver.MarkBlockExecutable(&F->front());
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-03 11:42:51 +08:00
|
|
|
// Assume nothing about the incoming arguments.
|
2015-10-14 03:26:58 +08:00
|
|
|
for (Argument &AI : F->args())
|
|
|
|
Solver.markAnythingOverdefined(&AI);
|
2009-11-02 14:34:04 +08:00
|
|
|
}
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2004-12-11 13:15:59 +08:00
|
|
|
// Loop over global variables. We inform the solver about any internal global
|
|
|
|
// variables that do not have their 'addresses taken'. If they don't have
|
|
|
|
// their addresses taken, we can propagate constants through them.
|
2015-10-14 03:26:58 +08:00
|
|
|
for (GlobalVariable &G : M.globals())
|
|
|
|
if (!G.isConstant() && G.hasLocalLinkage() && !AddressIsTaken(&G))
|
|
|
|
Solver.TrackValueOfGlobalVariable(&G);
|
2004-12-11 13:15:59 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
// Solve for constants.
|
2006-12-20 14:21:33 +08:00
|
|
|
bool ResolvedUndefs = true;
|
|
|
|
while (ResolvedUndefs) {
|
2004-12-11 04:41:50 +08:00
|
|
|
Solver.Solve();
|
|
|
|
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "RESOLVING UNDEFS\n");
|
2006-12-20 14:21:33 +08:00
|
|
|
ResolvedUndefs = false;
|
2004-12-11 04:41:50 +08:00
|
|
|
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F)
|
2006-12-20 14:21:33 +08:00
|
|
|
ResolvedUndefs |= Solver.ResolvedUndefsIn(*F);
|
2004-12-11 04:41:50 +08:00
|
|
|
}
|
2004-12-10 16:02:06 +08:00
|
|
|
|
|
|
|
bool MadeChanges = false;
|
|
|
|
|
|
|
|
// Iterate over all of the instructions in the module, replacing them with
|
2004-11-15 12:44:20 +08:00
|
|
|
// constants if we have found them to be of constant values.
|
|
|
|
//
|
2008-08-24 07:36:38 +08:00
|
|
|
SmallVector<BasicBlock*, 512> BlocksToErase;
|
2007-02-03 05:15:06 +08:00
|
|
|
|
2004-12-10 16:02:06 +08:00
|
|
|
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) {
|
2015-10-14 03:26:58 +08:00
|
|
|
if (F->isDeclaration())
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (Solver.isBlockExecutable(&F->front())) {
|
2009-11-02 11:25:55 +08:00
|
|
|
for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end();
|
|
|
|
AI != E; ++AI) {
|
2010-02-16 19:11:14 +08:00
|
|
|
if (AI->use_empty() || AI->getType()->isStructTy()) continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO: Could use getStructLatticeValueFor to find out if the entire
|
|
|
|
// result is a constant and replace it entirely if so.
|
|
|
|
|
2015-10-14 03:26:58 +08:00
|
|
|
LatticeVal IV = Solver.getLatticeValueFor(&*AI);
|
2009-11-02 11:25:55 +08:00
|
|
|
if (IV.isOverdefined()) continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:25:55 +08:00
|
|
|
Constant *CST = IV.isConstant() ?
|
|
|
|
IV.getConstant() : UndefValue::get(AI->getType());
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "*** Arg " << *AI << " = " << *CST <<"\n");
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 11:25:55 +08:00
|
|
|
// Replaces all of the uses of a variable with uses of the
|
|
|
|
// constant.
|
|
|
|
AI->replaceAllUsesWith(CST);
|
|
|
|
++IPNumArgsElimed;
|
|
|
|
}
|
2009-11-02 10:54:24 +08:00
|
|
|
}
|
2004-11-15 12:44:20 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
|
2015-10-14 03:26:58 +08:00
|
|
|
if (!Solver.isBlockExecutable(&*BB)) {
|
2016-01-24 14:26:47 +08:00
|
|
|
DEBUG(dbgs() << " BasicBlock Dead:" << *BB);
|
2004-12-11 04:41:50 +08:00
|
|
|
|
2016-01-24 14:26:47 +08:00
|
|
|
++NumDeadBlocks;
|
|
|
|
NumInstRemoved +=
|
2016-01-25 00:46:53 +08:00
|
|
|
changeToUnreachable(BB->getFirstNonPHI(), /*UseLLVMTrap=*/false);
|
2016-01-24 14:26:47 +08:00
|
|
|
|
|
|
|
MadeChanges = true;
|
2004-12-11 06:29:08 +08:00
|
|
|
|
2004-12-11 13:32:19 +08:00
|
|
|
if (&*BB != &F->front())
|
2015-10-14 03:26:58 +08:00
|
|
|
BlocksToErase.push_back(&*BB);
|
2009-11-02 10:47:51 +08:00
|
|
|
continue;
|
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
for (BasicBlock::iterator BI = BB->begin(), E = BB->end(); BI != E; ) {
|
2015-10-14 03:26:58 +08:00
|
|
|
Instruction *Inst = &*BI++;
|
2010-02-16 19:11:14 +08:00
|
|
|
if (Inst->getType()->isVoidTy() || Inst->getType()->isStructTy())
|
2009-11-02 10:47:51 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-04 07:40:48 +08:00
|
|
|
// TODO: Could use getStructLatticeValueFor to find out if the entire
|
|
|
|
// result is a constant and replace it entirely if so.
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:54:24 +08:00
|
|
|
LatticeVal IV = Solver.getLatticeValueFor(Inst);
|
|
|
|
if (IV.isOverdefined())
|
2009-11-02 10:47:51 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
Constant *Const = IV.isConstant()
|
|
|
|
? IV.getConstant() : UndefValue::get(Inst->getType());
|
2013-06-26 08:30:18 +08:00
|
|
|
DEBUG(dbgs() << " Constant: " << *Const << " = " << *Inst << '\n');
|
2004-12-11 13:32:19 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Replaces all of the uses of a variable with uses of the
|
|
|
|
// constant.
|
|
|
|
Inst->replaceAllUsesWith(Const);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Delete the instruction.
|
|
|
|
if (!isa<CallInst>(Inst) && !isa<TerminatorInst>(Inst))
|
|
|
|
Inst->eraseFromParent();
|
2008-04-24 08:21:50 +08:00
|
|
|
|
2009-11-02 10:47:51 +08:00
|
|
|
// Hey, we just changed something!
|
|
|
|
MadeChanges = true;
|
|
|
|
++IPNumInstRemoved;
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
2009-11-02 10:47:51 +08:00
|
|
|
}
|
2004-12-11 06:29:08 +08:00
|
|
|
|
|
|
|
// Now that all instructions in the function are constant folded, erase dead
|
|
|
|
// blocks, because we can now use ConstantFoldTerminator to get rid of
|
|
|
|
// in-edges.
|
|
|
|
for (unsigned i = 0, e = BlocksToErase.size(); i != e; ++i) {
|
|
|
|
// If there are any PHI nodes in this successor, drop entries for BB now.
|
|
|
|
BasicBlock *DeadBB = BlocksToErase[i];
|
2014-03-09 11:16:01 +08:00
|
|
|
for (Value::user_iterator UI = DeadBB->user_begin(),
|
|
|
|
UE = DeadBB->user_end();
|
|
|
|
UI != UE;) {
|
2009-11-24 00:13:39 +08:00
|
|
|
// Grab the user and then increment the iterator early, as the user
|
|
|
|
// will be deleted. Step past all adjacent uses from the same user.
|
|
|
|
Instruction *I = dyn_cast<Instruction>(*UI);
|
|
|
|
do { ++UI; } while (UI != UE && *UI == I);
|
|
|
|
|
2009-11-21 04:19:14 +08:00
|
|
|
// Ignore blockaddress users; BasicBlock's dtor will handle them.
|
|
|
|
if (!I) continue;
|
|
|
|
|
2004-12-11 06:29:08 +08:00
|
|
|
bool Folded = ConstantFoldTerminator(I->getParent());
|
2006-10-24 02:57:02 +08:00
|
|
|
if (!Folded) {
|
For PR1064:
Implement the arbitrary bit-width integer feature. The feature allows
integers of any bitwidth (up to 64) to be defined instead of just 1, 8,
16, 32, and 64 bit integers.
This change does several things:
1. Introduces a new Derived Type, IntegerType, to represent the number of
bits in an integer. The Type classes SubclassData field is used to
store the number of bits. This allows 2^23 bits in an integer type.
2. Removes the five integer Type::TypeID values for the 1, 8, 16, 32 and
64-bit integers. These are replaced with just IntegerType which is not
a primitive any more.
3. Adjust the rest of LLVM to account for this change.
Note that while this incremental change lays the foundation for arbitrary
bit-width integers, LLVM has not yet been converted to actually deal with
them in any significant way. Most optimization passes, for example, will
still only deal with the byte-width integer types. Future increments
will rectify this situation.
llvm-svn: 33113
2007-01-12 15:05:14 +08:00
|
|
|
// The constant folder may not have been able to fold the terminator
|
2006-10-24 02:57:02 +08:00
|
|
|
// if this is a branch or switch on undef. Fold it manually as a
|
|
|
|
// branch to the first successor.
|
2008-11-21 09:52:59 +08:00
|
|
|
#ifndef NDEBUG
|
2006-10-24 02:57:02 +08:00
|
|
|
if (BranchInst *BI = dyn_cast<BranchInst>(I)) {
|
|
|
|
assert(BI->isConditional() && isa<UndefValue>(BI->getCondition()) &&
|
|
|
|
"Branch should be foldable!");
|
|
|
|
} else if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
|
|
|
|
assert(isa<UndefValue>(SI->getCondition()) && "Switch should fold");
|
|
|
|
} else {
|
2009-07-15 00:55:14 +08:00
|
|
|
llvm_unreachable("Didn't fold away reference to block!");
|
2006-10-24 02:57:02 +08:00
|
|
|
}
|
2008-11-21 09:52:59 +08:00
|
|
|
#endif
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-10-24 02:57:02 +08:00
|
|
|
// Make this an uncond branch to the first successor.
|
|
|
|
TerminatorInst *TI = I->getParent()->getTerminator();
|
2008-04-07 04:25:17 +08:00
|
|
|
BranchInst::Create(TI->getSuccessor(0), TI);
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-10-24 02:57:02 +08:00
|
|
|
// Remove entries in successor phi nodes to remove edges.
|
|
|
|
for (unsigned i = 1, e = TI->getNumSuccessors(); i != e; ++i)
|
|
|
|
TI->getSuccessor(i)->removePredecessor(TI->getParent());
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2006-10-24 02:57:02 +08:00
|
|
|
// Remove the old terminator.
|
|
|
|
TI->eraseFromParent();
|
|
|
|
}
|
2004-12-11 06:29:08 +08:00
|
|
|
}
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2004-12-11 06:29:08 +08:00
|
|
|
// Finally, delete the basic block.
|
|
|
|
F->getBasicBlockList().erase(DeadBB);
|
|
|
|
}
|
2007-02-03 05:15:06 +08:00
|
|
|
BlocksToErase.clear();
|
2004-12-10 16:02:06 +08:00
|
|
|
}
|
2004-12-11 10:53:57 +08:00
|
|
|
|
|
|
|
// If we inferred constant or undef return values for a function, we replaced
|
|
|
|
// all call uses with the inferred value. This means we don't need to bother
|
|
|
|
// actually returning anything from the function. Replace all return
|
|
|
|
// instructions with return undef.
|
2010-02-27 08:07:42 +08:00
|
|
|
//
|
|
|
|
// Do this in two stages: first identify the functions we should process, then
|
|
|
|
// actually zap their returns. This is important because we can only do this
|
2010-02-27 15:50:40 +08:00
|
|
|
// if the address of the function isn't taken. In cases where a return is the
|
2010-02-27 08:07:42 +08:00
|
|
|
// last use of a function, the order of processing functions would affect
|
2010-02-27 15:50:40 +08:00
|
|
|
// whether other functions are optimizable.
|
2010-02-27 08:07:42 +08:00
|
|
|
SmallVector<ReturnInst*, 8> ReturnsToZap;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2008-03-12 01:32:05 +08:00
|
|
|
// TODO: Process multiple value ret instructions also.
|
2008-03-11 13:46:42 +08:00
|
|
|
const DenseMap<Function*, LatticeVal> &RV = Solver.getTrackedRetVals();
|
2007-02-03 04:38:30 +08:00
|
|
|
for (DenseMap<Function*, LatticeVal>::const_iterator I = RV.begin(),
|
2009-11-03 11:42:51 +08:00
|
|
|
E = RV.end(); I != E; ++I) {
|
|
|
|
Function *F = I->first;
|
|
|
|
if (I->second.isOverdefined() || F->getReturnType()->isVoidTy())
|
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-03 11:42:51 +08:00
|
|
|
// We can only do this if we know that nothing else can call the function.
|
2010-08-13 06:25:23 +08:00
|
|
|
if (!F->hasLocalLinkage() || AddressTakenFunctions.count(F))
|
2009-11-03 11:42:51 +08:00
|
|
|
continue;
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2009-11-03 11:42:51 +08:00
|
|
|
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
|
|
|
|
if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator()))
|
|
|
|
if (!isa<UndefValue>(RI->getOperand(0)))
|
2010-02-27 08:07:42 +08:00
|
|
|
ReturnsToZap.push_back(RI);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Zap all returns which we've identified as zap to change.
|
|
|
|
for (unsigned i = 0, e = ReturnsToZap.size(); i != e; ++i) {
|
|
|
|
Function *F = ReturnsToZap[i]->getParent()->getParent();
|
|
|
|
ReturnsToZap[i]->setOperand(0, UndefValue::get(F->getReturnType()));
|
2009-11-03 11:42:51 +08:00
|
|
|
}
|
2012-01-19 05:16:33 +08:00
|
|
|
|
2012-03-28 08:35:33 +08:00
|
|
|
// If we inferred constant or undef values for globals variables, we can
|
|
|
|
// delete the global and any stores that remain to it.
|
2007-02-03 04:38:30 +08:00
|
|
|
const DenseMap<GlobalVariable*, LatticeVal> &TG = Solver.getTrackedGlobals();
|
|
|
|
for (DenseMap<GlobalVariable*, LatticeVal>::const_iterator I = TG.begin(),
|
2004-12-11 13:15:59 +08:00
|
|
|
E = TG.end(); I != E; ++I) {
|
|
|
|
GlobalVariable *GV = I->first;
|
|
|
|
assert(!I->second.isOverdefined() &&
|
|
|
|
"Overdefined values should have been taken out of the map!");
|
2010-01-05 09:27:15 +08:00
|
|
|
DEBUG(dbgs() << "Found that GV '" << GV->getName() << "' is constant!\n");
|
2004-12-11 13:15:59 +08:00
|
|
|
while (!GV->use_empty()) {
|
2014-03-09 11:16:01 +08:00
|
|
|
StoreInst *SI = cast<StoreInst>(GV->user_back());
|
2004-12-11 13:15:59 +08:00
|
|
|
SI->eraseFromParent();
|
|
|
|
}
|
|
|
|
M.getGlobalList().erase(GV);
|
2004-12-11 14:05:53 +08:00
|
|
|
++IPNumGlobalConst;
|
2004-12-11 13:15:59 +08:00
|
|
|
}
|
2005-04-22 07:48:37 +08:00
|
|
|
|
2004-11-15 12:44:20 +08:00
|
|
|
return MadeChanges;
|
|
|
|
}
|