Find bugs sooner rather than later. In this case, don't allow the creation
authorChris Lattner <sabre@nondot.org>
Tue, 6 Jul 2004 17:44:17 +0000 (17:44 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 6 Jul 2004 17:44:17 +0000 (17:44 +0000)
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

lib/VMCore/BasicBlock.cpp
lib/VMCore/Value.cpp

index 587abf60aa37045ba4517a25dce387378e355987..d3df1d1d71dbd1265a6d2ca420132d5126d50ab4 100644 (file)
@@ -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;
index 01c7b3f4620193b819ec22eb6e1bfd1e88bdb192..9022e914c92d1df70fb951be7ce244663fbb5f56 100644 (file)
@@ -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() {