[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
Wed Feb 9 07:26:12 PST 2022
aykevl created this revision.
aykevl added reviewers: mehdi_amini, mtrofin, steven_wu, ychen, fhahn.
Herald added a subscriber: hiraditya.
aykevl requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
The main use for this patch is LTO. It is not (yet?) possible to set the size level (-Os, -Oz) in the linker, which means loops are still rotated even if -Oz is specified on the command line. Therefore, also look at the function attributes to determine whether to rotate loops for a given function.
For related discussion, see D72404 <https://reviews.llvm.org/D72404>.
Open questions:
- Is this the correct way to go, or do we still need a patch like D72404 <https://reviews.llvm.org/D72404> or D81223 <https://reviews.llvm.org/D81223>?
- Should we do this when the `optsize` function attribute is set, not just when the `minsize` function attribute is set?
Repository:
rG LLVM Github Monorepo
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,33 @@
+; REQUIRES: asserts
+; RUN: opt < %s -S -O2 -debug -debug-only=loop-rotate 2>&1 | FileCheck %s
+; RUN: opt < %s -S -passes='default<O2>' -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
@@ -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,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119342.407156.patch
Type: text/x-patch
Size: 2436 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220209/1bac787e/attachment.bin>
More information about the llvm-commits
mailing list