[PATCH] D108112: [LoopIdiom] Let LIR fold memset pointer / stride SCEV regarding loop guards
Yueh-Ting Chen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 9 06:59:27 PST 2021
eopXD updated this revision to Diff 393150.
eopXD added a comment.
Rebase to latest main.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D108112/new/
https://reviews.llvm.org/D108112
Files:
llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
llvm/test/Transforms/LoopIdiom/memset-runtime-debug.ll
Index: llvm/test/Transforms/LoopIdiom/memset-runtime-debug.ll
===================================================================
--- llvm/test/Transforms/LoopIdiom/memset-runtime-debug.ll
+++ llvm/test/Transforms/LoopIdiom/memset-runtime-debug.ll
@@ -19,6 +19,9 @@
; CHECK-NEXT: memset size is non-constant
; CHECK-NEXT: MemsetSizeSCEV: (4 * (sext i32 %m to i64))<nsw>
; CHECK-NEXT: PositiveStrideSCEV: (4 + (4 * (sext i32 %m to i64))<nsw>)<nsw>
+; CHECK-NEXT: Try to fold SCEV based on loop guard
+; CHECK-NEXT: FoldedMemsetSize: (4 * (sext i32 %m to i64))<nsw>
+; CHECK-NEXT: FoldedPositiveStride: (4 + (4 * (sext i32 %m to i64))<nsw>)<nsw>
; CHECK-NEXT: SCEV don't match, abort
; CHECK: loop-idiom Scanning: F[NonZeroAddressSpace] Countable Loop %for.cond1.preheader
; CHECK-NEXT: memset size is non-constant
Index: llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
+++ llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
@@ -307,6 +307,24 @@
}
};
+// The Folder will fold expressions that are guarded by the loop entry.
+class SCEVFolder : public SCEVRewriteVisitor<SCEVFolder> {
+public:
+ ScalarEvolution &SE;
+ const Loop *CurLoop;
+ SCEVFolder(ScalarEvolution &SE, const Loop *CurLoop)
+ : SCEVRewriteVisitor(SE), SE(SE), CurLoop(CurLoop) {}
+
+ const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {
+ // If expression is guarded by CurLoop to be greater or equal to zero
+ // then convert sext to zext. Otherwise return the original expression.
+ if (SE.isLoopEntryGuardedByCond(CurLoop, ICmpInst::ICMP_SGE, Expr,
+ SE.getZero(Expr->getType())))
+ return SE.getZeroExtendExpr(visit(Expr->getOperand()), Expr->getType());
+ return Expr;
+ }
+};
+
} // end anonymous namespace
char LoopIdiomRecognizeLegacyPass::ID = 0;
@@ -967,12 +985,22 @@
<< "\n");
if (PositiveStrideSCEV != MemsetSizeSCEV) {
- // TODO: folding can be done to the SCEVs
- // The folding is to fold expressions that is covered by the loop guard
- // at loop entry. After the folding, compare again and proceed
- // optimization if equal.
- LLVM_DEBUG(dbgs() << " SCEV don't match, abort\n");
- return false;
+ // The folding is to fold an expression that is covered by the loop guard
+ // at loop entry. After the folding, compare again and proceed with
+ // optimization, if equal.
+ SCEVFolder Folder(*SE, CurLoop);
+ const SCEV *FoldedPositiveStride = Folder.visit(PositiveStrideSCEV);
+ const SCEV *FoldedMemsetSize = Folder.visit(MemsetSizeSCEV);
+
+ LLVM_DEBUG(dbgs() << " Try to fold SCEV based on loop guard\n"
+ << " FoldedMemsetSize: " << *FoldedMemsetSize << "\n"
+ << " FoldedPositiveStride: " << *FoldedPositiveStride
+ << "\n");
+
+ if (FoldedPositiveStride != FoldedMemsetSize) {
+ LLVM_DEBUG(dbgs() << " SCEV don't match, abort\n");
+ return false;
+ }
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108112.393150.patch
Type: text/x-patch
Size: 3167 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211209/5c9b268f/attachment.bin>
More information about the llvm-commits
mailing list