From 4e69f48a0a6ef9b36c8f17d6ad4e3b6998c81078 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Fri, 2 Mar 2007 23:31:34 +0000 Subject: [PATCH] Guard against huge loop trip counts in an APInt safe way. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34858 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnroll.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Scalar/LoopUnroll.cpp b/lib/Transforms/Scalar/LoopUnroll.cpp index d1770da8fce..b0db806a495 100644 --- a/lib/Transforms/Scalar/LoopUnroll.cpp +++ b/lib/Transforms/Scalar/LoopUnroll.cpp @@ -190,10 +190,15 @@ bool LoopUnroll::visitLoop(Loop *L) { ConstantInt *TripCountC = dyn_cast_or_null(L->getTripCount()); if (!TripCountC) return Changed; // Must have constant trip count! - uint64_t TripCountFull = TripCountC->getZExtValue(); - if (TripCountFull != TripCountC->getZExtValue() || TripCountFull == 0) + // Guard against huge trip counts. This also guards against assertions in + // APInt from the use of getZExtValue, below. + if (TripCountC->getValue().getActiveBits() > 32) return Changed; // More than 2^32 iterations??? + uint64_t TripCountFull = TripCountC->getZExtValue(); + if (TripCountFull == 0) + return Changed; // Zero iteraitons? + unsigned LoopSize = ApproximateLoopSize(L); DOUT << "Loop Unroll: F[" << Header->getParent()->getName() << "] Loop %" << Header->getName() << " Loop Size = " -- 2.34.1