diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/pr14167.ll | 44 | 
2 files changed, 49 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 3e062988823..148912b766b 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3979,8 +3979,11 @@ getSmallConstantTripMultiple(Loop *L, BasicBlock *ExitingBlock) {    ConstantInt *Result = MulC->getValue(); -  // Guard against huge trip counts. -  if (!Result || Result->getValue().getActiveBits() > 32) +  // Guard against huge trip counts (this requires checking +  // for zero to handle the case where the trip count == -1 and the +  // addition wraps). +  if (!Result || Result->getValue().getActiveBits() > 32 || +      Result->getValue().getActiveBits() == 0)      return 1;    return (unsigned)Result->getZExtValue(); diff --git a/llvm/test/Transforms/LoopUnroll/pr14167.ll b/llvm/test/Transforms/LoopUnroll/pr14167.ll new file mode 100644 index 00000000000..205ae44b72e --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/pr14167.ll @@ -0,0 +1,44 @@ +; RUN: opt < %s -S -loop-unroll -unroll-runtime | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" +target triple = "powerpc64-bgq-linux" + +define void @test1() nounwind { +; Ensure that we don't crash when the trip count == -1. +; CHECK: @test1 +entry: +  br label %for.cond2.preheader + +for.cond2.preheader:                              ; preds = %for.end, %entry +  br i1 false, label %middle.block, label %vector.ph + +vector.ph:                                        ; preds = %for.cond2.preheader +  br label %vector.body + +vector.body:                                      ; preds = %vector.body, %vector.ph +  br i1 undef, label %middle.block.loopexit, label %vector.body + +middle.block.loopexit:                            ; preds = %vector.body +  br label %middle.block + +middle.block:                                     ; preds = %middle.block.loopexit, %for.cond2.preheader +  br i1 true, label %for.end, label %scalar.preheader + +scalar.preheader:                                 ; preds = %middle.block +  br label %for.body4 + +for.body4:                                        ; preds = %for.body4, %scalar.preheader +  %indvars.iv = phi i64 [ 16000, %scalar.preheader ], [ %indvars.iv.next, %for.body4 ] +  %indvars.iv.next = add i64 %indvars.iv, 1 +  %lftr.wideiv = trunc i64 %indvars.iv.next to i32 +  %exitcond = icmp ne i32 %lftr.wideiv, 16000 +  br i1 %exitcond, label %for.body4, label %for.end.loopexit + +for.end.loopexit:                                 ; preds = %for.body4 +  br label %for.end + +for.end:                                          ; preds = %for.end.loopexit, %middle.block +  br i1 undef, label %for.cond2.preheader, label %for.end15 + +for.end15:                                        ; preds = %for.end +  ret void +}  | 

