projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[C++11] Add range based accessors for the Use-Def chain of a Value.
[oota-llvm.git]
/
lib
/
Transforms
/
IPO
/
IPConstantPropagation.cpp
diff --git
a/lib/Transforms/IPO/IPConstantPropagation.cpp
b/lib/Transforms/IPO/IPConstantPropagation.cpp
index df2456f9f2b7e59c981f3913f60883c9e4470e48..8684796b4e7835b729c89301650ca2af680c7824 100644
(file)
--- a/
lib/Transforms/IPO/IPConstantPropagation.cpp
+++ b/
lib/Transforms/IPO/IPConstantPropagation.cpp
@@
-17,14
+17,14
@@
#define DEBUG_TYPE "ipconstprop"
#include "llvm/Transforms/IPO.h"
#define DEBUG_TYPE "ipconstprop"
#include "llvm/Transforms/IPO.h"
-#include "llvm/Constants.h"
-#include "llvm/Instructions.h"
-#include "llvm/Module.h"
-#include "llvm/Pass.h"
-#include "llvm/Analysis/ValueTracking.h"
-#include "llvm/Support/CallSite.h"
-#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/IR/CallSite.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/Module.h"
+#include "llvm/Pass.h"
using namespace llvm;
STATISTIC(NumArgumentsProped, "Number of args turned into constants");
using namespace llvm;
STATISTIC(NumArgumentsProped, "Number of args turned into constants");
@@
-35,9
+35,11
@@
namespace {
///
struct IPCP : public ModulePass {
static char ID; // Pass identification, replacement for typeid
///
struct IPCP : public ModulePass {
static char ID; // Pass identification, replacement for typeid
- IPCP() : ModulePass(&ID) {}
+ IPCP() : ModulePass(ID) {
+ initializeIPCPPass(*PassRegistry::getPassRegistry());
+ }
- bool runOnModule(Module &M);
+ bool runOnModule(Module &M)
override
;
private:
bool PropagateConstantsIntoArguments(Function &F);
bool PropagateConstantReturn(Function &F);
private:
bool PropagateConstantsIntoArguments(Function &F);
bool PropagateConstantReturn(Function &F);
@@
-45,8
+47,8
@@
namespace {
}
char IPCP::ID = 0;
}
char IPCP::ID = 0;
-static RegisterPass<IPCP>
-X("ipconstprop", "Interprocedural constant propagation");
+INITIALIZE_PASS(IPCP, "ipconstprop",
+ "Interprocedural constant propagation", false, false)
ModulePass *llvm::createIPConstantPropagationPass() { return new IPCP(); }
ModulePass *llvm::createIPConstantPropagationPass() { return new IPCP(); }
@@
-84,17
+86,18
@@
bool IPCP::PropagateConstantsIntoArguments(Function &F) {
ArgumentConstants.resize(F.arg_size());
unsigned NumNonconstant = 0;
ArgumentConstants.resize(F.arg_size());
unsigned NumNonconstant = 0;
- for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) {
+ for (Use &U : F.uses()) {
+ User *UR = U.getUser();
// Ignore blockaddress uses.
// Ignore blockaddress uses.
- if (isa<BlockAddress>(
*UI
)) continue;
+ if (isa<BlockAddress>(
UR
)) continue;
// Used by a non-instruction, or not the callee of a function, do not
// transform.
// Used by a non-instruction, or not the callee of a function, do not
// transform.
- if (!isa<CallInst>(
*UI) && !isa<InvokeInst>(*UI
))
+ if (!isa<CallInst>(
UR) && !isa<InvokeInst>(UR
))
return false;
return false;
- CallSite CS
= CallSite::get(cast<Instruction>(*UI
));
- if (!CS.isCallee(
UI
))
+ CallSite CS
(cast<Instruction>(UR
));
+ if (!CS.isCallee(
&U
))
return false;
// Check out all of the potentially constant arguments. Note that we don't
return false;
// Check out all of the potentially constant arguments. Note that we don't
@@
-132,7
+135,7
@@
bool IPCP::PropagateConstantsIntoArguments(Function &F) {
for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) {
// Do we have a constant argument?
if (ArgumentConstants[i].second || AI->use_empty() ||
for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) {
// Do we have a constant argument?
if (ArgumentConstants[i].second || AI->use_empty() ||
- (AI->hasByValAttr() && !F.onlyReadsMemory()))
+
AI->hasInAllocaAttr() ||
(AI->hasByValAttr() && !F.onlyReadsMemory()))
continue;
Value *V = ArgumentConstants[i].first;
continue;
Value *V = ArgumentConstants[i].first;
@@
-164,7
+167,7
@@
bool IPCP::PropagateConstantReturn(Function &F) {
// Check to see if this function returns a constant.
SmallVector<Value *,4> RetVals;
// Check to see if this function returns a constant.
SmallVector<Value *,4> RetVals;
-
const
StructType *STy = dyn_cast<StructType>(F.getReturnType());
+ StructType *STy = dyn_cast<StructType>(F.getReturnType());
if (STy)
for (unsigned i = 0, e = STy->getNumElements(); i < e; ++i)
RetVals.push_back(UndefValue::get(STy->getElementType(i)));
if (STy)
for (unsigned i = 0, e = STy->getNumElements(); i < e; ++i)
RetVals.push_back(UndefValue::get(STy->getElementType(i)));
@@
-183,7
+186,7
@@
bool IPCP::PropagateConstantReturn(Function &F) {
// Find the returned value
Value *V;
if (!STy)
// Find the returned value
Value *V;
if (!STy)
- V = RI->getOperand(
i
);
+ V = RI->getOperand(
0
);
else
V = FindInsertedValue(RI->getOperand(0), i);
else
V = FindInsertedValue(RI->getOperand(0), i);
@@
-207,7
+210,7
@@
bool IPCP::PropagateConstantReturn(Function &F) {
// Different or no known return value? Don't propagate this return
// value.
RetVals[i] = 0;
// Different or no known return value? Don't propagate this return
// value.
RetVals[i] = 0;
- // All values non
constant? Stop looking.
+ // All values non
-
constant? Stop looking.
if (++NumNonConstant == RetVals.size())
return false;
}
if (++NumNonConstant == RetVals.size())
return false;
}
@@
-217,13
+220,13
@@
bool IPCP::PropagateConstantReturn(Function &F) {
// over all users, replacing any uses of the return value with the returned
// constant.
bool MadeChange = false;
// over all users, replacing any uses of the return value with the returned
// constant.
bool MadeChange = false;
- for (
Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI
) {
- CallSite CS
= CallSite::get(*UI
);
+ for (
Use &U : F.uses()
) {
+ CallSite CS
(U.getUser()
);
Instruction* Call = CS.getInstruction();
// Not a call instruction or a call instruction that's not calling F
// directly?
Instruction* Call = CS.getInstruction();
// Not a call instruction or a call instruction that's not calling F
// directly?
- if (!Call || !CS.isCallee(
UI
))
+ if (!Call || !CS.isCallee(
&U
))
continue;
// Call result not used?
continue;
// Call result not used?
@@
-241,9
+244,8
@@
bool IPCP::PropagateConstantReturn(Function &F) {
Call->replaceAllUsesWith(New);
continue;
}
Call->replaceAllUsesWith(New);
continue;
}
-
- for (Value::use_iterator I = Call->use_begin(), E = Call->use_end();
- I != E;) {
+
+ for (auto I = Call->user_begin(), E = Call->user_end(); I != E;) {
Instruction *Ins = cast<Instruction>(*I);
// Increment now, so we can remove the use
Instruction *Ins = cast<Instruction>(*I);
// Increment now, so we can remove the use