diff --git a/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/llvm/lib/Transforms/Scalar/LoopRotation.cpp --- a/llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -49,10 +49,11 @@ // Vectorization requires loop-rotation. Use default threshold for loops the // user explicitly marked for vectorization, even when header duplication is // disabled. - int Threshold = EnableHeaderDuplication || - hasVectorizeTransformation(&L) == TM_ForcedByUser - ? DefaultRotationThreshold - : 0; + int Threshold = + (EnableHeaderDuplication && !L.getHeader()->getParent()->hasMinSize()) || + hasVectorizeTransformation(&L) == TM_ForcedByUser + ? DefaultRotationThreshold + : 0; const DataLayout &DL = L.getHeader()->getModule()->getDataLayout(); const SimplifyQuery SQ = getBestSimplifyQuery(AR, DL); @@ -128,7 +129,7 @@ // disabled. int Threshold = hasVectorizeTransformation(L) == TM_ForcedByUser ? DefaultRotationThreshold - : MaxHeaderSize; + : (F.hasMinSize() ? 0 : MaxHeaderSize); return LoopRotation(L, LI, TTI, AC, &DT, &SE, MSSAU ? &*MSSAU : nullptr, SQ, false, Threshold, false, diff --git a/llvm/test/Transforms/LoopRotate/minsize-disable.ll b/llvm/test/Transforms/LoopRotate/minsize-disable.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopRotate/minsize-disable.ll @@ -0,0 +1,32 @@ +; REQUIRES: asserts +; RUN: opt < %s -S -passes=loop-rotate -debug -debug-only=loop-rotate 2>&1 | FileCheck %s + +; Loop should not be rotated for functions with the minsize attribute. +; This is mostly useful for LTO which doesn't (yet) understand -Oz. +; CHECK: LoopRotation: NOT rotating - contains 2 instructions, which is more + +@e = global i32 10 + +declare void @use(i32) + +; Function attrs: minsize optsize +define void @test() #0 { +entry: + %end = load i32, i32* @e + br label %loop + +loop: + %n.phi = phi i32 [ %n, %loop.fin ], [ 0, %entry ] + %cond = icmp eq i32 %n.phi, %end + br i1 %cond, label %exit, label %loop.fin + +loop.fin: + %n = add i32 %n.phi, 1 + call void @use(i32 %n) + br label %loop + +exit: + ret void +} + +attributes #0 = { minsize optsize }