From: Atmn Patel Date: Thu, 5 Nov 2020 03:30:58 +0000 (-0500) Subject: [LangRef] Adds llvm.loop.mustprogress loop metadata X-Git-Tag: llvmorg-13-init~7024 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cea0599aa75ba528d077453602945e6d0440f8c3;p=platform%2Fupstream%2Fllvm.git [LangRef] Adds llvm.loop.mustprogress loop metadata This patch adds the llvm.loop.mustprogress loop metadata. This is to be added to loops where the frontend language requires that the loop makes observable interactions with the environment. This is the loop-level equivalent to the function attribute `mustprogress` defined in D86233. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D88464 --- diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index ff89e0d..c9248b4 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -6326,6 +6326,15 @@ It is also possible to have nested parallel loops: !3 = distinct !{} ; access group for instructions in the inner loop (which are implicitly contained in outer loop as well) !4 = distinct !{} ; access group for instructions in the outer, but not the inner loop +'``llvm.loop.mustprogress``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``llvm.loop.mustprogress`` metadata indicates that this loop is required to +terminate, unwind, or interact with the environment in an observable way e.g. +via a volatile memory access, I/O, or other synchronization. If such a loop is +not found to interact with the environment in an observable way, the loop may +be removed. This corresponds to the ``mustprogress`` function attribute. + '``irr_loop``' Metadata ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/llvm/include/llvm/Analysis/LoopInfo.h b/llvm/include/llvm/Analysis/LoopInfo.h index 8d6a405..cf59e41 100644 --- a/llvm/include/llvm/Analysis/LoopInfo.h +++ b/llvm/include/llvm/Analysis/LoopInfo.h @@ -840,6 +840,9 @@ public: /// unrolling pass is run more than once (which it generally is). void setLoopAlreadyUnrolled(); + /// Add llvm.loop.mustprogress to this loop's loop id metadata. + void setLoopMustProgress(); + void dump() const; void dumpVerbose() const; diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp index 5f741dc..1a6cb50 100644 --- a/llvm/lib/Analysis/LoopInfo.cpp +++ b/llvm/lib/Analysis/LoopInfo.cpp @@ -539,6 +539,22 @@ void Loop::setLoopAlreadyUnrolled() { setLoopID(NewLoopID); } +void Loop::setLoopMustProgress() { + LLVMContext &Context = getHeader()->getContext(); + + MDNode *MustProgress = findOptionMDForLoop(this, "llvm.loop.mustprogress"); + + if (MustProgress) + return; + + MDNode *MustProgressMD = + MDNode::get(Context, MDString::get(Context, "llvm.loop.mustprogress")); + MDNode *LoopID = getLoopID(); + MDNode *NewLoopID = + makePostTransformationMetadata(Context, LoopID, {}, {MustProgressMD}); + setLoopID(NewLoopID); +} + bool Loop::isAnnotatedParallel() const { MDNode *DesiredLoopIdMetadata = getLoopID();