Fix a bug caused by indiscriminantly asking for the dominators of a predecessor.
authorOwen Anderson <resistor@mac.com>
Mon, 30 Jul 2007 16:57:08 +0000 (16:57 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 30 Jul 2007 16:57:08 +0000 (16:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40595 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/2007-07-30-PredIDom.ll [new file with mode: 0644]

index 119a9e4a841273329f7425d3998a8a02d7e6cdcc..ab6c913605e02a2aad178d07942e02cf43fcdc86 100644 (file)
@@ -723,7 +723,8 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
     return V = GetValueForBlock(IDom->getBlock(), orig, Phis);
   }
   
-  
+  if (std::distance(pred_begin(BB), pred_end(BB)) == 1)
+    return V = GetValueForBlock(IDom->getBlock(), orig, Phis);
   
   // Otherwise, the idom is the loop, so we need to insert a PHI node.  Do so
   // now, then get values to fill in the incoming values for the PHI.
@@ -731,10 +732,10 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
                             BB->begin());
   PN->reserveOperandSpace(std::distance(pred_begin(BB), pred_end(BB)));
   V = PN;
-                                 
+  
   // Fill in the incoming values for the block.
   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
-    PN->addIncoming(GetValueForBlock(DT.getNode(*PI)->getBlock(), orig, Phis), *PI);
+    PN->addIncoming(GetValueForBlock(*PI, orig, Phis), *PI);
   return PN;
 }
 
diff --git a/test/Transforms/GVN/2007-07-30-PredIDom.ll b/test/Transforms/GVN/2007-07-30-PredIDom.ll
new file mode 100644 (file)
index 0000000..1d1aec1
--- /dev/null
@@ -0,0 +1,274 @@
+; RUN: llvm-as < %s | opt -gvn | llvm-dis
+
+       %"struct.Block::$_16" = type { i32 }
+       %struct.Exp = type { %struct.Exp_*, i32, i32, i32, %struct.Exp*, %struct.Exp*, %"struct.Exp::$_10", %"struct.Block::$_16", %"struct.Exp::$_12" }
+       %"struct.Exp::$_10" = type { %struct.Exp* }
+       %"struct.Exp::$_12" = type { %struct.Exp** }
+       %struct.Exp_ = type { i32, i32, i32, i32, %struct.Id* }
+       %struct.Id = type { i8*, i32, i32, i32, %"struct.Id::$_13" }
+       %"struct.Id::$_13" = type { double }
+
+define i8* @_ZN3Exp8toStringEj(%struct.Exp* %this, i32 %nextpc) {
+entry:
+       switch i32 0, label %bb970 [
+                i32 1, label %bb
+                i32 2, label %bb39
+                i32 3, label %bb195
+                i32 4, label %bb270
+                i32 5, label %bb418
+                i32 6, label %bb633
+                i32 7, label %bb810
+                i32 8, label %bb882
+                i32 9, label %bb925
+       ]
+
+bb:            ; preds = %entry
+       store i8* null, i8** null
+       br label %return
+
+bb39:          ; preds = %entry
+       br i1 false, label %cond_true, label %cond_false132
+
+cond_true:             ; preds = %bb39
+       br i1 false, label %cond_true73, label %cond_false
+
+cond_true73:           ; preds = %cond_true
+       br i1 false, label %cond_true108, label %cond_next
+
+cond_true108:          ; preds = %cond_true73
+       br label %cond_next
+
+cond_next:             ; preds = %cond_true108, %cond_true73
+       br label %cond_next131
+
+cond_false:            ; preds = %cond_true
+       br label %cond_next131
+
+cond_next131:          ; preds = %cond_false, %cond_next
+       br label %cond_next141
+
+cond_false132:         ; preds = %bb39
+       br label %cond_next141
+
+cond_next141:          ; preds = %cond_false132, %cond_next131
+       br i1 false, label %cond_true169, label %cond_false175
+
+cond_true169:          ; preds = %cond_next141
+       br label %cond_next181
+
+cond_false175:         ; preds = %cond_next141
+       br label %cond_next181
+
+cond_next181:          ; preds = %cond_false175, %cond_true169
+       br i1 false, label %cond_true189, label %cond_next191
+
+cond_true189:          ; preds = %cond_next181
+       br label %cond_next191
+
+cond_next191:          ; preds = %cond_true189, %cond_next181
+       store i8* null, i8** null
+       br label %return
+
+bb195:         ; preds = %entry
+       br i1 false, label %cond_true248, label %cond_false250
+
+cond_true248:          ; preds = %bb195
+       br label %cond_next252
+
+cond_false250:         ; preds = %bb195
+       br label %cond_next252
+
+cond_next252:          ; preds = %cond_false250, %cond_true248
+       br i1 false, label %cond_true265, label %cond_next267
+
+cond_true265:          ; preds = %cond_next252
+       br label %cond_next267
+
+cond_next267:          ; preds = %cond_true265, %cond_next252
+       store i8* null, i8** null
+       br label %return
+
+bb270:         ; preds = %entry
+       br i1 false, label %cond_true338, label %cond_false340
+
+cond_true338:          ; preds = %bb270
+       br label %cond_next342
+
+cond_false340:         ; preds = %bb270
+       br label %cond_next342
+
+cond_next342:          ; preds = %cond_false340, %cond_true338
+       br i1 false, label %cond_true362, label %cond_false364
+
+cond_true362:          ; preds = %cond_next342
+       br label %cond_next366
+
+cond_false364:         ; preds = %cond_next342
+       br label %cond_next366
+
+cond_next366:          ; preds = %cond_false364, %cond_true362
+       br i1 false, label %cond_true393, label %cond_next395
+
+cond_true393:          ; preds = %cond_next366
+       br label %cond_next395
+
+cond_next395:          ; preds = %cond_true393, %cond_next366
+       br i1 false, label %cond_true406, label %cond_next408
+
+cond_true406:          ; preds = %cond_next395
+       br label %cond_next408
+
+cond_next408:          ; preds = %cond_true406, %cond_next395
+       br i1 false, label %cond_true413, label %cond_next415
+
+cond_true413:          ; preds = %cond_next408
+       br label %cond_next415
+
+cond_next415:          ; preds = %cond_true413, %cond_next408
+       store i8* null, i8** null
+       br label %return
+
+bb418:         ; preds = %entry
+       br i1 false, label %cond_true512, label %cond_false514
+
+cond_true512:          ; preds = %bb418
+       br label %cond_next516
+
+cond_false514:         ; preds = %bb418
+       br label %cond_next516
+
+cond_next516:          ; preds = %cond_false514, %cond_true512
+       br i1 false, label %cond_true536, label %cond_false538
+
+cond_true536:          ; preds = %cond_next516
+       br label %cond_next540
+
+cond_false538:         ; preds = %cond_next516
+       br label %cond_next540
+
+cond_next540:          ; preds = %cond_false538, %cond_true536
+       br i1 false, label %cond_true560, label %cond_false562
+
+cond_true560:          ; preds = %cond_next540
+       br label %cond_next564
+
+cond_false562:         ; preds = %cond_next540
+       br label %cond_next564
+
+cond_next564:          ; preds = %cond_false562, %cond_true560
+       br i1 false, label %cond_true597, label %cond_next599
+
+cond_true597:          ; preds = %cond_next564
+       br label %cond_next599
+
+cond_next599:          ; preds = %cond_true597, %cond_next564
+       br i1 false, label %cond_true614, label %cond_next616
+
+cond_true614:          ; preds = %cond_next599
+       br label %cond_next616
+
+cond_next616:          ; preds = %cond_true614, %cond_next599
+       br i1 false, label %cond_true621, label %cond_next623
+
+cond_true621:          ; preds = %cond_next616
+       br label %cond_next623
+
+cond_next623:          ; preds = %cond_true621, %cond_next616
+       br i1 false, label %cond_true628, label %cond_next630
+
+cond_true628:          ; preds = %cond_next623
+       br label %cond_next630
+
+cond_next630:          ; preds = %cond_true628, %cond_next623
+       store i8* null, i8** null
+       br label %return
+
+bb633:         ; preds = %entry
+       br i1 false, label %cond_true667, label %cond_next669
+
+cond_true667:          ; preds = %bb633
+       br label %cond_next669
+
+cond_next669:          ; preds = %cond_true667, %bb633
+       br i1 false, label %cond_true678, label %cond_next791
+
+cond_true678:          ; preds = %cond_next669
+       br label %bb735
+
+bb679:         ; preds = %bb735
+       br i1 false, label %cond_true729, label %cond_next731
+
+cond_true729:          ; preds = %bb679
+       br label %cond_next731
+
+cond_next731:          ; preds = %cond_true729, %bb679
+       br label %bb735
+
+bb735:         ; preds = %cond_next731, %cond_true678
+       br i1 false, label %bb679, label %bb743
+
+bb743:         ; preds = %bb735
+       br i1 false, label %cond_true788, label %cond_next790
+
+cond_true788:          ; preds = %bb743
+       br label %cond_next790
+
+cond_next790:          ; preds = %cond_true788, %bb743
+       br label %cond_next791
+
+cond_next791:          ; preds = %cond_next790, %cond_next669
+       br i1 false, label %cond_true805, label %cond_next807
+
+cond_true805:          ; preds = %cond_next791
+       br label %cond_next807
+
+cond_next807:          ; preds = %cond_true805, %cond_next791
+       store i8* null, i8** null
+       br label %return
+
+bb810:         ; preds = %entry
+       br i1 false, label %cond_true870, label %cond_next872
+
+cond_true870:          ; preds = %bb810
+       br label %cond_next872
+
+cond_next872:          ; preds = %cond_true870, %bb810
+       br i1 false, label %cond_true877, label %cond_next879
+
+cond_true877:          ; preds = %cond_next872
+       br label %cond_next879
+
+cond_next879:          ; preds = %cond_true877, %cond_next872
+       store i8* null, i8** null
+       br label %return
+
+bb882:         ; preds = %entry
+       br i1 false, label %cond_true920, label %cond_next922
+
+cond_true920:          ; preds = %bb882
+       br label %cond_next922
+
+cond_next922:          ; preds = %cond_true920, %bb882
+       store i8* null, i8** null
+       br label %return
+
+bb925:         ; preds = %entry
+       br i1 false, label %cond_true965, label %cond_next967
+
+cond_true965:          ; preds = %bb925
+       br label %cond_next967
+
+cond_next967:          ; preds = %cond_true965, %bb925
+       store i8* null, i8** null
+       br label %return
+
+bb970:         ; preds = %entry
+       unreachable
+               ; No predecessors!
+       store i8* null, i8** null
+       br label %return
+
+return:                ; preds = %0, %cond_next967, %cond_next922, %cond_next879, %cond_next807, %cond_next630, %cond_next415, %cond_next267, %cond_next191, %bb
+       %retval980 = load i8** null             ; <i8*> [#uses=1]
+       ret i8* %retval980
+}