PR14904: Segmentation fault running pass 'Recognize loop idioms'
authorShuxin Yang <shuxin.llvm@gmail.com>
Thu, 10 Jan 2013 23:32:01 +0000 (23:32 +0000)
committerShuxin Yang <shuxin.llvm@gmail.com>
Thu, 10 Jan 2013 23:32:01 +0000 (23:32 +0000)
The root cause is mistakenly taking for granted that
    "dyn_cast<Instruction>(a-Value)"
return a non-NULL instruction.

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

lib/Transforms/Scalar/LoopIdiomRecognize.cpp
test/Transforms/LoopIdiom/X86/popcnt.ll

index c4f90125ac5a05e1d4f7cda2d05d511c05615ccd..8258719a0200b3d090b4057250b714e01ac59b41 100644 (file)
@@ -407,7 +407,7 @@ bool NclPopcountRecognize::detectIdiom(Instruction *&CntInst,
 
   // step 2: detect instructions corresponding to "x2 = x1 & (x1 - 1)"
   {
-    if (DefX2->getOpcode() != Instruction::And)
+    if (!DefX2 || DefX2->getOpcode() != Instruction::And)
       return false;
 
     BinaryOperator *SubOneOp;
index 2f458fb2f1980242e43921f79eb92d050eef94b9..25df93d3a0821f736d38976ee6aa82d36c790499 100644 (file)
@@ -118,3 +118,23 @@ while.end:                                        ; preds = %while.body, %entry
   %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]
   ret i32 %c.0.lcssa
 }
+
+define i32 @PopCntCrash3(i64 %a, i32 %x) {
+entry:
+  %tobool3 = icmp eq i64 %a, 0
+  %cmp = icmp eq i32 %x, 0
+  br i1 %tobool3, label %while.end, label %while.body
+
+while.body:                                       ; preds = %entry, %while.body
+  %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]
+  %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ]
+  %inc = add nsw i32 %c.05, 1
+  %sub = add i64 %a.addr.04, -1
+  %and = and i64 %sub, %a.addr.04
+  %tobool = icmp eq i64 %and, 0
+  br i1 %cmp, label %while.end, label %while.body
+
+while.end:                                        ; preds = %while.body, %entry
+  %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]
+  ret i32 %c.0.lcssa
+}