+/// performPRE - Perform a purely local form of PRE that looks for diamond
+/// control flow patterns and attempts to perform simple PRE at the join point.
+bool GVN::performPRE(Function& F) {
+ bool changed = false;
+ for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
+ DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
+ BasicBlock* CurrentBlock = *DI;
+
+ // Nothing to PRE in the entry block.
+ if (CurrentBlock == &F.getEntryBlock()) continue;
+
+ for (BasicBlock::iterator BI = CurrentBlock->begin(),
+ BE = CurrentBlock->end(); BI != BE; ) {
+ if (isa<AllocaInst>(BI) || isa<TerminatorInst>(BI) ||
+ isa<LoadInst>(BI) || isa<StoreInst>(BI) ||
+ isa<CallInst>(BI) || isa<PHINode>(BI)) {
+ BI++;
+ continue;
+ }
+
+ uint32_t valno = VN.lookup(BI);
+
+ // Look for the predecessors for PRE opportunities. We're
+ // only trying to solve the basic diamond case, where
+ // a value is computed in the successor and one predecessor,
+ // but not the other. We also explicitly disallow cases
+ // where the successor is its own predecessor, because they're
+ // more complicated to get right.
+ unsigned numWith = 0;
+ unsigned numWithout = 0;
+ BasicBlock* PREPred = 0;
+ for (pred_iterator PI = pred_begin(CurrentBlock),
+ PE = pred_end(CurrentBlock); PI != PE; ++PI) {
+ // We're not interested in PRE where the block is its
+ // own predecessor.
+ if (*PI == CurrentBlock)
+ numWithout = 2;
+
+ if (!localAvail[*PI].count(valno)) {
+ PREPred = *PI;
+ numWithout++;
+ } else if (localAvail[*PI][valno] == BI) {
+ numWithout = 2;
+ } else {
+ numWith++;
+ }
+ }
+
+ // Don't do PRE when it might increase code size, i.e. when
+ // we would need to insert instructions in more than one pred.
+ if (numWithout != 1 || numWith == 0) {
+ BI++;
+ continue;
+ }
+
+ // Instantiate the expression the in predecessor that lacked it.
+ // Because we are going top-down through the block, all value numbers
+ // will be available in the predecessor by the time we need them. Any
+ // that weren't original present will have been instantiated earlier
+ // in this loop.
+ Instruction* PREInstr = BI->clone();
+ bool success = true;
+ for (unsigned i = 0; i < BI->getNumOperands(); ++i) {
+ Value* op = BI->getOperand(i);
+ if (isa<Argument>(op) || isa<Constant>(op) || isa<GlobalValue>(op))
+ PREInstr->setOperand(i, op);
+ else if (!localAvail[PREPred].count(VN.lookup(op))) {
+ success = false;
+ break;
+ } else
+ PREInstr->setOperand(i, localAvail[PREPred][VN.lookup(op)]);
+ }
+
+ // Fail out if we encounter an operand that is not available in
+ // the PRE predecessor. This is typically because of loads which
+ // are not value numbered precisely.
+ if (!success) {
+ delete PREInstr;
+ BI++;
+ continue;
+ }
+
+ PREInstr->insertBefore(PREPred->getTerminator());
+ PREInstr->setName(BI->getName() + ".pre");
+ VN.add(PREInstr, valno);
+ NumGVNPRE++;
+
+ // Update the availability map to include the new instruction.
+ localAvail[PREPred].insert(std::make_pair(valno, PREInstr));
+
+ // Create a PHI to make the value available in this block.
+ PHINode* Phi = PHINode::Create(BI->getType(),
+ BI->getName() + ".pre-phi",
+ CurrentBlock->begin());
+ for (pred_iterator PI = pred_begin(CurrentBlock),
+ PE = pred_end(CurrentBlock); PI != PE; ++PI)
+ Phi->addIncoming(localAvail[*PI][valno], *PI);
+
+ VN.add(Phi, valno);
+
+ // The newly created PHI completely replaces the old instruction,
+ // so we need to update the maps to reflect this.
+ for (DenseMap<BasicBlock*, DenseMap<uint32_t, Value*> >::iterator
+ UI = localAvail.begin(), UE = localAvail.end(); UI != UE; ++UI)
+ for (DenseMap<uint32_t, Value*>::iterator UUI = UI->second.begin(),
+ UUE = UI->second.end(); UUI != UUE; ++UUI)
+ if (UUI->second == BI)
+ UUI->second = Phi;
+
+ BI->replaceAllUsesWith(Phi);
+
+ Instruction* erase = BI;
+ BI++;
+ erase->eraseFromParent();
+
+ changed = true;
+ }
+ }
+
+ return changed;
+}
+