fix a globalopt crash on two Adobe-C++ testcases that the recent
authorChris Lattner <sabre@nondot.org>
Sat, 1 Jan 2011 22:31:46 +0000 (22:31 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 1 Jan 2011 22:31:46 +0000 (22:31 +0000)
loop idiom pass exposed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122674 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalOpt.cpp
test/Transforms/GlobalOpt/crash.ll

index f8064352fb1c50ccf7a076604769aa500c541f0c..c55ee563baf9be40049e6f4dd9ceadbe3a5c4b6e 100644 (file)
@@ -167,6 +167,11 @@ static bool AnalyzeGlobal(const Value *V, GlobalStatus &GS,
     const User *U = *UI;
     if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
       GS.HasNonInstructionUser = true;
+      
+      // If the result of the constantexpr isn't pointer type, then we won't
+      // know to expect it in various places.  Just reject early.
+      if (!isa<PointerType>(CE->getType())) return true;
+      
       if (AnalyzeGlobal(CE, GS, PHIUsers)) return true;
     } else if (const Instruction *I = dyn_cast<Instruction>(U)) {
       if (!GS.HasMultipleAccessingFunctions) {
index bb1fc84f46f93944eb5ffeeedb4b89342ae1dbe3..9da5a5e3c935f90d370cd393fbb157037bad4882 100644 (file)
@@ -55,3 +55,12 @@ entry:
   ret void
 }
 
+
+
+
+@data8 = internal global [8000 x i8] zeroinitializer, align 16
+define void @memset_with_strange_user() ssp {
+  call void @llvm.memset.p0i8.i64(i8* getelementptr inbounds ([8000 x i8]* @data8, i64 0, i64 0), i8 undef, i64 ptrtoint (i8* getelementptr ([8000 x i8]* @data8, i64 1, i64 sub (i64 0, i64 ptrtoint ([8000 x i8]* @data8 to i64))) to i64), i32 16, i1 false)
+  ret void
+}
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind