From d450e5b88662557f2965331f06277d60266a9eec Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 5 Feb 2010 23:21:31 +0000 Subject: [PATCH] Don't unroll loops containing function calls. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95454 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnrollPass.cpp | 10 ++++++++-- test/CodeGen/X86/nancvt.ll | 14 ++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index ee8cb4f9a73..a355ec3a7e6 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -76,11 +76,12 @@ static RegisterPass X("loop-unroll", "Unroll loops"); Pass *llvm::createLoopUnrollPass() { return new LoopUnroll(); } /// ApproximateLoopSize - Approximate the size of the loop. -static unsigned ApproximateLoopSize(const Loop *L) { +static unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls) { CodeMetrics Metrics; for (Loop::block_iterator I = L->block_begin(), E = L->block_end(); I != E; ++I) Metrics.analyzeBasicBlock(*I); + NumCalls = Metrics.NumCalls; return Metrics.NumInsts; } @@ -110,8 +111,13 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { // Enforce the threshold. if (UnrollThreshold != NoThreshold) { - unsigned LoopSize = ApproximateLoopSize(L); + unsigned NumCalls; + unsigned LoopSize = ApproximateLoopSize(L, NumCalls); DEBUG(dbgs() << " Loop Size = " << LoopSize << "\n"); + if (NumCalls != 0) { + DEBUG(dbgs() << " Not unrolling loop with function calls.\n"); + return false; + } uint64_t Size = (uint64_t)LoopSize*Count; if (TripCount != 1 && Size > UnrollThreshold) { DEBUG(dbgs() << " Too large to fully unroll with count: " << Count diff --git a/test/CodeGen/X86/nancvt.ll b/test/CodeGen/X86/nancvt.ll index 0b56644f125..82b73319ad1 100644 --- a/test/CodeGen/X86/nancvt.ll +++ b/test/CodeGen/X86/nancvt.ll @@ -16,6 +16,8 @@ target triple = "i686-apple-darwin8" @.str = internal constant [10 x i8] c"%08x%08x\0A\00" ; <[10 x i8]*> [#uses=2] @.str1 = internal constant [6 x i8] c"%08x\0A\00" ; <[6 x i8]*> [#uses=2] +@var = external global i32 + define i32 @main() { entry: %retval = alloca i32, align 4 ; [#uses=1] @@ -50,7 +52,8 @@ bb: ; preds = %bb23 %tmp17 = ashr i64 %tmp16, %.cast ; [#uses=1] %tmp1718 = trunc i64 %tmp17 to i32 ; [#uses=1] %tmp19 = getelementptr [10 x i8]* @.str, i32 0, i32 0 ; [#uses=1] - %tmp20 = call i32 (i8*, ...)* @printf( i8* %tmp19, i32 %tmp1718, i32 %tmp13 ) ; [#uses=0] + volatile store i32 %tmp1718, i32* @var + volatile store i32 %tmp13, i32* @var %tmp21 = load i32* %i, align 4 ; [#uses=1] %tmp22 = add i32 %tmp21, 1 ; [#uses=1] store i32 %tmp22, i32* %i, align 4 @@ -83,7 +86,7 @@ bb28: ; preds = %bb46 %tmp3940 = bitcast float* %tmp39 to i32* ; [#uses=1] %tmp41 = load i32* %tmp3940, align 4 ; [#uses=1] %tmp42 = getelementptr [6 x i8]* @.str1, i32 0, i32 0 ; [#uses=1] - %tmp43 = call i32 (i8*, ...)* @printf( i8* %tmp42, i32 %tmp41 ) ; [#uses=0] + volatile store i32 %tmp41, i32* @var %tmp44 = load i32* %i, align 4 ; [#uses=1] %tmp45 = add i32 %tmp44, 1 ; [#uses=1] store i32 %tmp45, i32* %i, align 4 @@ -124,7 +127,8 @@ bb52: ; preds = %bb78 %tmp72 = ashr i64 %tmp70, %.cast71 ; [#uses=1] %tmp7273 = trunc i64 %tmp72 to i32 ; [#uses=1] %tmp74 = getelementptr [10 x i8]* @.str, i32 0, i32 0 ; [#uses=1] - %tmp75 = call i32 (i8*, ...)* @printf( i8* %tmp74, i32 %tmp7273, i32 %tmp66 ) ; [#uses=0] + volatile store i32 %tmp7273, i32* @var + volatile store i32 %tmp66, i32* @var %tmp76 = load i32* %i, align 4 ; [#uses=1] %tmp77 = add i32 %tmp76, 1 ; [#uses=1] store i32 %tmp77, i32* %i, align 4 @@ -157,7 +161,7 @@ bb84: ; preds = %bb101 %tmp9495 = bitcast float* %tmp94 to i32* ; [#uses=1] %tmp96 = load i32* %tmp9495, align 4 ; [#uses=1] %tmp97 = getelementptr [6 x i8]* @.str1, i32 0, i32 0 ; [#uses=1] - %tmp98 = call i32 (i8*, ...)* @printf( i8* %tmp97, i32 %tmp96 ) ; [#uses=0] + volatile store i32 %tmp96, i32* @var %tmp99 = load i32* %i, align 4 ; [#uses=1] %tmp100 = add i32 %tmp99, 1 ; [#uses=1] store i32 %tmp100, i32* %i, align 4 @@ -177,5 +181,3 @@ return: ; preds = %bb106 %retval107 = load i32* %retval ; [#uses=1] ret i32 %retval107 } - -declare i32 @printf(i8*, ...) -- 2.34.1