namespace llvm {
template <> struct DenseMapKeyInfo<Expression> {
- static inline Expression getEmptyKey() { return Expression(Expression::EMPTY); }
- static inline Expression getTombstoneKey() { return Expression(Expression::TOMBSTONE); }
+ static inline Expression getEmptyKey() {
+ return Expression(Expression::EMPTY);
+ }
+
+ static inline Expression getTombstoneKey() {
+ return Expression(Expression::TOMBSTONE);
+ }
static unsigned getHashValue(const Expression e) {
unsigned hash = e.opcode;
(unsigned)((uintptr_t)e.type >> 9) +
hash * 37;
- for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(), E = e.varargs.end();
- I != E; ++I)
+ for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
+ E = e.varargs.end(); I != E; ++I)
hash = *I + hash * 37;
return hash;
e.secondVN = 0;
e.thirdVN = 0;
e.type = G->getType();
- e.opcode = Expression::SELECT;
+ e.opcode = Expression::GEP;
for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
I != E; ++I)
FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
static RegisterPass<GVNPRE> X("gvnpre",
- "Global Value Numbering/Partial Redundancy Elimination");
+ "Global Value Numbering/Partial Redundancy Elimination");
STATISTIC(NumInsertedVals, "Number of values inserted");
/// val_replace - Insert a value into a set, replacing any values already in
/// the set that have the same value number
void GVNPRE::val_replace(ValueNumberedSet& s, Value* v) {
+ if (s.count(v)) return;
+
uint32_t num = VN.lookup(v);
Value* leader = find_leader(s, num);
if (leader != 0)
isa<ExtractElementInst>(BI) || isa<SelectInst>(BI) ||
isa<CastInst>(BI) || isa<GetElementPtrInst>(BI)) {
- if (availableOut[BB].test(VN.lookup(BI)) && !availableOut[BB].count(BI)) {
+ if (availableOut[BB].test(VN.lookup(BI)) &&
+ !availableOut[BB].count(BI)) {
Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
if (Instruction* Instr = dyn_cast<Instruction>(leader))
if (Instr->getParent() != 0 && Instr != BI) {
changed_function = true;
}
- for (SmallVector<Instruction*, 8>::iterator I = erase.begin(), E = erase.end();
- I != E; ++I)
+ for (SmallVector<Instruction*, 8>::iterator I = erase.begin(),
+ E = erase.end(); I != E; ++I)
(*I)->eraseFromParent();
return changed_function;