fix PR8067, an over-aggressive assertion in LICM.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113146 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp
index 4cab33b..0db7ba7 100644
--- a/lib/Transforms/Scalar/LICM.cpp
+++ b/lib/Transforms/Scalar/LICM.cpp
@@ -681,10 +681,10 @@
       // it.
       if (isa<LoadInst>(Use))
         assert(!cast<LoadInst>(Use)->isVolatile() && "AST broken");
-      else if (isa<StoreInst>(Use))
-        assert(!cast<StoreInst>(Use)->isVolatile() && 
-               Use->getOperand(0) != ASIV && "AST broken");
-      else
+      else if (isa<StoreInst>(Use)) {
+        assert(!cast<StoreInst>(Use)->isVolatile() && "AST broken");
+        if (Use->getOperand(0) == ASIV) return;
+      } else
         return; // Not a load or store.
       
       if (!GuaranteedToExecute)
diff --git a/test/Transforms/LICM/crash.ll b/test/Transforms/LICM/crash.ll
index 325f250..d0b6d78 100644
--- a/test/Transforms/LICM/crash.ll
+++ b/test/Transforms/LICM/crash.ll
@@ -25,3 +25,17 @@
 for.end10:                                        ; preds = %for.cond.for.end10_crit_edge, %entry
   ret void
 }
+
+; PR8067
+@g_8 = external global i32, align 4
+
+define void @test2() noreturn nounwind ssp {
+entry:
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %tmp7 = load i32* @g_8, align 4
+  store i32* @g_8, i32** undef, align 16
+  store i32 undef, i32* @g_8, align 4
+  br label %for.body
+}