Index: llvm/lib/Transforms/Scalar/LoopRotation.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -50,10 +50,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); @@ -130,7 +131,7 @@ // disabled. int Threshold = hasVectorizeTransformation(L) == TM_ForcedByUser ? DefaultRotationThreshold - : MaxHeaderSize; + : (F.hasMinSize() ? 0 : MaxHeaderSize); return LoopRotation(L, LI, TTI, AC, &DT, &SE, MSSAU.hasValue() ? MSSAU.getPointer() : nullptr, SQ, Index: llvm/test/Transforms/LoopRotate/minsize-disable.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/LoopRotate/minsize-disable.ll @@ -0,0 +1,33 @@ +; REQUIRES: asserts +; RUN: opt < %s -S -O2 -debug -debug-only=loop-rotate 2>&1 | FileCheck %s +; RUN: opt < %s -S -passes='default' -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 }