OSDN Git Service

Avoid deferencing use_begin() if value does not have a use.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 22 Apr 2009 22:45:37 +0000 (22:45 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 22 Apr 2009 22:45:37 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69836 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/IndVarSimplify.cpp
test/Transforms/IndVarSimplify/2009-04-22-IndvarCrash.ll [new file with mode: 0644]

index 3e944d3..b1cde41 100644 (file)
@@ -806,6 +806,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
         // (RHS doesn't have to be constant.  There should be a better approach
         // than bottom-up pattern matching for this...)
         if (UInst && UInst->getOpcode()==Instruction::And &&
+            !UInst->use_empty() &&
             allUsesAreSameTyped(Instruction::ZExt, UInst) &&
             isa<ConstantInt>(UInst->getOperand(1))) {
           uint64_t newBitSize = LargestType->getPrimitiveSizeInBits();
diff --git a/test/Transforms/IndVarSimplify/2009-04-22-IndvarCrash.ll b/test/Transforms/IndVarSimplify/2009-04-22-IndvarCrash.ll
new file mode 100644 (file)
index 0000000..e42f3b3
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: llvm-as < %s | opt -indvars
+
+define i32 @t() nounwind ssp {
+entry:
+       br label %bb32
+
+bb32:          ; preds = %bb32, %entry
+       %mbPartIdx.0.reg2mem.0 = phi i8 [ %2, %bb32 ], [ 0, %entry ]            ; <i8> [#uses=3]
+       %0 = and i8 %mbPartIdx.0.reg2mem.0, 1           ; <i8> [#uses=0]
+       %1 = zext i8 %mbPartIdx.0.reg2mem.0 to i64              ; <i64> [#uses=0]
+       %2 = add i8 %mbPartIdx.0.reg2mem.0, 1           ; <i8> [#uses=2]
+       %3 = icmp ugt i8 %2, 3          ; <i1> [#uses=1]
+       br i1 %3, label %bb41, label %bb32
+
+bb41:          ; preds = %bb32
+       ret i32 0
+}