From 2280cb880d2fb5f9ff57c06ebd3b4dae14405267 Mon Sep 17 00:00:00 2001 From: Geoffrey Martin-Noble Date: Fri, 8 May 2020 22:34:13 +0000 Subject: [PATCH] Add Operation::moveAfter This revision introduces an Operation::moveAfter mirroring Operation::moveBefore to move an operation after another existing operation or an iterator in a specified block. Resolves https://bugs.llvm.org/show_bug.cgi?id=45799 Differential Revision: https://reviews.llvm.org/D79640 --- mlir/include/mlir/IR/Operation.h | 9 +++++++++ mlir/lib/IR/Operation.cpp | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/mlir/include/mlir/IR/Operation.h b/mlir/include/mlir/IR/Operation.h index 946b5c0b02ee..329eb7a5974f 100644 --- a/mlir/include/mlir/IR/Operation.h +++ b/mlir/include/mlir/IR/Operation.h @@ -185,6 +185,15 @@ public: /// `iterator` in the specified block. void moveBefore(Block *block, llvm::iplist::iterator iterator); + /// Unlink this operation from its current block and insert it right after + /// `existingOp` which may be in the same or another block in the same + /// function. + void moveAfter(Operation *existingOp); + + /// Unlink this operation from its current block and insert it right after + /// `iterator` in the specified block. + void moveAfter(Block *block, llvm::iplist::iterator iterator); + /// Given an operation 'other' that is within the same parent block, return /// whether the current operation is before 'other' in the operation list /// of the parent block. diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp index 3489ee74a422..9539a8e31c3e 100644 --- a/mlir/lib/IR/Operation.cpp +++ b/mlir/lib/IR/Operation.cpp @@ -492,6 +492,20 @@ void Operation::moveBefore(Block *block, getIterator()); } +/// Unlink this operation from its current block and insert it right after +/// `existingOp` which may be in the same or another block in the same function. +void Operation::moveAfter(Operation *existingOp) { + moveAfter(existingOp->getBlock(), existingOp->getIterator()); +} + +/// Unlink this operation from its current block and insert it right after +/// `iterator` in the specified block. +void Operation::moveAfter(Block *block, + llvm::iplist::iterator iterator) { + assert(iterator != block->end() && "cannot move after end of block"); + moveBefore(&*std::next(iterator)); +} + /// This drops all operand uses from this operation, which is an essential /// step in breaking cyclic dependences between references when they are to /// be deleted.