forked from OSchip/llvm-project
Fix bug: Mem2reg/2003-04-18-DeadBlockProblem.ll
llvm-svn: 5810
This commit is contained in:
parent
71156c10b8
commit
5f5d985583
|
@ -24,6 +24,7 @@
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/Constant.h"
|
#include "llvm/Constant.h"
|
||||||
#include "llvm/Type.h"
|
#include "llvm/Type.h"
|
||||||
|
#include "llvm/Support/CFG.h"
|
||||||
#include "Support/StringExtras.h"
|
#include "Support/StringExtras.h"
|
||||||
|
|
||||||
/// isAllocaPromotable - Return true if this alloca is legal for promotion.
|
/// isAllocaPromotable - Return true if this alloca is legal for promotion.
|
||||||
|
@ -187,11 +188,20 @@ bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo) {
|
||||||
if (BBPNs[AllocaNo]) return false;
|
if (BBPNs[AllocaNo]) return false;
|
||||||
|
|
||||||
// Create a PhiNode using the dereferenced type... and add the phi-node to the
|
// Create a PhiNode using the dereferenced type... and add the phi-node to the
|
||||||
// BasicBlock
|
// BasicBlock.
|
||||||
PHINode *PN = new PHINode(Allocas[AllocaNo]->getAllocatedType(),
|
PHINode *PN = new PHINode(Allocas[AllocaNo]->getAllocatedType(),
|
||||||
Allocas[AllocaNo]->getName() + "." +
|
Allocas[AllocaNo]->getName() + "." +
|
||||||
utostr(VersionNumbers[AllocaNo]++),
|
utostr(VersionNumbers[AllocaNo]++),
|
||||||
BB->begin());
|
BB->begin());
|
||||||
|
|
||||||
|
// Add null incoming values for all predecessors. This ensures that if one of
|
||||||
|
// the predecessors is not found in the depth-first traversal of the CFG (ie,
|
||||||
|
// because it is an unreachable predecessor), that all PHI nodes will have the
|
||||||
|
// correct number of entries for their predecessors.
|
||||||
|
Value *NullVal = Constant::getNullValue(PN->getType());
|
||||||
|
for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI)
|
||||||
|
PN->addIncoming(NullVal, *PI);
|
||||||
|
|
||||||
BBPNs[AllocaNo] = PN;
|
BBPNs[AllocaNo] = PN;
|
||||||
PhiNodes[AllocaNo].push_back(BB);
|
PhiNodes[AllocaNo].push_back(BB);
|
||||||
return true;
|
return true;
|
||||||
|
@ -205,9 +215,12 @@ void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred,
|
||||||
std::vector<PHINode *> &BBPNs = NewPhiNodes[BB];
|
std::vector<PHINode *> &BBPNs = NewPhiNodes[BB];
|
||||||
for (unsigned k = 0; k != BBPNs.size(); ++k)
|
for (unsigned k = 0; k != BBPNs.size(); ++k)
|
||||||
if (PHINode *PN = BBPNs[k]) {
|
if (PHINode *PN = BBPNs[k]) {
|
||||||
// at this point we can assume that the array has phi nodes.. let's add
|
int BBI = PN->getBasicBlockIndex(Pred);
|
||||||
// the incoming data
|
assert(BBI >= 0 && "Predecessor not in basic block yet!");
|
||||||
PN->addIncoming(IncomingVals[k], Pred);
|
|
||||||
|
// At this point we can assume that the array has phi nodes.. let's update
|
||||||
|
// the incoming data.
|
||||||
|
PN->setIncomingValue(BBI, IncomingVals[k]);
|
||||||
|
|
||||||
// also note that the active variable IS designated by the phi node
|
// also note that the active variable IS designated by the phi node
|
||||||
IncomingVals[k] = PN;
|
IncomingVals[k] = PN;
|
||||||
|
|
Loading…
Reference in New Issue