Fix PR9324 / <rdar://problem/9052489> by handling the case where a PHI has no uses.
authorCameron Zwarich <zwarich@apple.com>
Sun, 27 Feb 2011 08:06:01 +0000 (08:06 +0000)
committerCameron Zwarich <zwarich@apple.com>
Sun, 27 Feb 2011 08:06:01 +0000 (08:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126567 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/FunctionLoweringInfo.h
test/CodeGen/X86/phi-bit-propagation.ll

index b41f30d8251d98822a22a8a02726e0846c99d702..7f41222d9b8e1e7004abef278a3798d9e9f3a970 100644 (file)
@@ -187,7 +187,12 @@ public:
   /// InvalidatePHILiveOutRegInfo - Invalidates a PHI's LiveOutInfo, to be
   /// called when a block is visited before all of its predecessors.
   void InvalidatePHILiveOutRegInfo(const PHINode *PN) {
-    unsigned Reg = ValueMap[PN];
+    // PHIs with no uses have no ValueMap entry.
+    DenseMap<const Value*, unsigned>::const_iterator It = ValueMap.find(PN);
+    if (It == ValueMap.end())
+      return;
+
+    unsigned Reg = It->second;
     LiveOutRegInfo.grow(Reg);
     LiveOutRegInfo[Reg].IsValid = false;
   }
index da9652f7340437bbcd771b6bd3c2b614ae58b408..94c97229b092d3e520601c69d24f71e6d89fe346 100644 (file)
@@ -33,3 +33,23 @@ return:                                           ; preds = %for.body, %for.cond
   %retval.0 = phi i1 [ true, %for.body ], [ false, %for.cond ]
   ret i1 %retval.0
 }
+
+; This test case caused an assertion failure; see PR9324.
+define void @func_37() noreturn nounwind ssp {
+entry:
+  br i1 undef, label %lbl_919, label %entry.for.inc_crit_edge
+
+entry.for.inc_crit_edge:                          ; preds = %entry
+  br label %for.inc
+
+lbl_919:                                          ; preds = %for.cond7.preheader, %entry
+  br label %for.cond7.preheader
+
+for.cond7.preheader:                              ; preds = %for.inc, %lbl_919
+  %storemerge.ph = phi i8 [ 0, %lbl_919 ], [ %add, %for.inc ]
+  br i1 undef, label %for.inc, label %lbl_919
+
+for.inc:                                          ; preds = %for.cond7.preheader, %entry.for.inc_crit_edge
+  %add = add i8 undef, 1
+  br label %for.cond7.preheader
+}