mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-01 01:15:55 +00:00
Find bugs sooner rather than later. In this case, don't allow the creation
of instructions that don't have a first-class or void type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14646 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ebeebecad2
commit
a9e7781b3b
@ -130,17 +130,11 @@ void BasicBlock::dropAllReferences() {
|
||||
void BasicBlock::removePredecessor(BasicBlock *Pred) {
|
||||
assert(find(pred_begin(this), pred_end(this), Pred) != pred_end(this) &&
|
||||
"removePredecessor: BB is not a predecessor!");
|
||||
if (!isa<PHINode>(front())) return; // Quick exit.
|
||||
|
||||
pred_iterator PI(pred_begin(this)), EI(pred_end(this));
|
||||
unsigned max_idx;
|
||||
|
||||
// Loop over the rest of the predecessors until we run out, or until we find
|
||||
// out that there are more than 2 predecessors.
|
||||
for (max_idx = 0; PI != EI && max_idx < 3; ++PI, ++max_idx) /*empty*/;
|
||||
PHINode *APN = dyn_cast<PHINode>(&front());
|
||||
if (!APN) return; // Quick exit.
|
||||
|
||||
// If there are exactly two predecessors, then we want to nuke the PHI nodes
|
||||
// altogether. We cannot do this, however if this in this case however:
|
||||
// altogether. However, we cannot do this, if this in this case:
|
||||
//
|
||||
// Loop:
|
||||
// %x = phi [X, Loop]
|
||||
@ -151,10 +145,10 @@ void BasicBlock::removePredecessor(BasicBlock *Pred) {
|
||||
// basic block. The only case this can happen is with a self loop, so we
|
||||
// check for this case explicitly now.
|
||||
//
|
||||
unsigned max_idx = APN->getNumIncomingValues();
|
||||
assert(max_idx != 0 && "PHI Node in block with 0 predecessors!?!?!");
|
||||
if (max_idx == 2) {
|
||||
PI = pred_begin(this);
|
||||
BasicBlock *Other = *PI == Pred ? *++PI : *PI;
|
||||
BasicBlock *Other = APN->getIncomingBlock(APN->getIncomingBlock(0) == Pred);
|
||||
|
||||
// Disable PHI elimination!
|
||||
if (this == Other) max_idx = 3;
|
||||
|
@ -31,6 +31,9 @@ static inline const Type *checkType(const Type *Ty) {
|
||||
|
||||
Value::Value(const Type *ty, unsigned scid, const std::string &name)
|
||||
: SubclassID(scid), Ty(checkType(ty)), Name(name) {
|
||||
if (!isa<Constant>(this) && !isa<BasicBlock>(this))
|
||||
assert((Ty->isFirstClassType() || Ty == Type::VoidTy) &&
|
||||
"Cannot create non-first-class values except for constants!");
|
||||
}
|
||||
|
||||
Value::~Value() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user