[PATCH] D119342: [LoopRotate] Don't rotate loops when the minsize attribute is present
Ayke via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 6 12:39:37 PST 2023
aykevl updated this revision to Diff 486964.
aykevl added a comment.
Herald added a subscriber: pcwang-thead.
Rebased the patch and updated the test case.
> IIUC this should make LTO loop rotate behavior match the behavior when using -Oz in non-LTO, so this seems fine.
That's the intention.
> Also, it would be good to upload the diff with full context.
Fixed. I sometimes forget it.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D119342/new/
https://reviews.llvm.org/D119342
Files:
llvm/lib/Transforms/Scalar/LoopRotation.cpp
llvm/test/Transforms/LoopRotate/minsize-disable.ll
Index: llvm/test/Transforms/LoopRotate/minsize-disable.ll
===================================================================
--- /dev/null
+++ 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
+
+ at 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 }
Index: llvm/lib/Transforms/Scalar/LoopRotation.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LoopRotation.cpp
+++ 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,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119342.486964.patch
Type: text/x-patch
Size: 2362 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230106/3dd7d047/attachment.bin>
More information about the llvm-commits
mailing list