[PATCH] D148504: [LoopInfo] SFINAE mechanism for hoist into check
Christian Ulmann via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 19 07:26:56 PDT 2023
Dinistro updated this revision to Diff 514950.
Dinistro marked an inline comment as done.
Dinistro added a comment.
address review comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D148504/new/
https://reviews.llvm.org/D148504
Files:
llvm/include/llvm/Support/GenericLoopInfoImpl.h
mlir/include/mlir/IR/Block.h
Index: mlir/include/mlir/IR/Block.h
===================================================================
--- mlir/include/mlir/IR/Block.h
+++ mlir/include/mlir/IR/Block.h
@@ -351,10 +351,6 @@
void printAsOperand(raw_ostream &os, bool printType = true);
void printAsOperand(raw_ostream &os, AsmState &state);
- /// NOTE: Do not call this function, it is only used to be compatible with the
- /// LLVM loop analysis machinery.
- bool isLegalToHoistInto() const { return false; };
-
private:
/// Pair of the parent object that owns this block and a bit that signifies if
/// the operations within this block have a valid ordering.
Index: llvm/include/llvm/Support/GenericLoopInfoImpl.h
===================================================================
--- llvm/include/llvm/Support/GenericLoopInfoImpl.h
+++ llvm/include/llvm/Support/GenericLoopInfoImpl.h
@@ -171,6 +171,22 @@
ExitEdges.emplace_back(BB, Succ);
}
+namespace detail {
+template <class BlockT>
+using has_hoist_check = decltype(&BlockT::isLegalToHoistInto);
+
+template <class BlockT>
+using detect_has_hoist_check = llvm::is_detected<has_hoist_check, BlockT>;
+
+/// SFINAE functions that dispatch to the isLegalToHoistInto member function or
+/// return false, if it doesn't exist.
+template <class BlockT> bool isLegalToHoistInto(BlockT *Block) {
+ if constexpr (detect_has_hoist_check<BlockT>::value)
+ return Block->isLegalToHoistInto();
+ return false;
+}
+} // namespace detail
+
/// getLoopPreheader - If there is a preheader for this loop, return it. A
/// loop has a preheader if there is only one edge to the header of the loop
/// from outside of the loop and it is legal to hoist instructions into the
@@ -188,7 +204,7 @@
return nullptr;
// Make sure we are allowed to hoist instructions into the predecessor.
- if (!Out->isLegalToHoistInto())
+ if (!detail::isLegalToHoistInto(Out))
return nullptr;
// Make sure there is only one exit out of the preheader.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148504.514950.patch
Type: text/x-patch
Size: 1994 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230419/2722fec1/attachment.bin>
More information about the llvm-commits
mailing list