//===- SuspendCrossingInfo.cpp - Utility for suspend crossing values ------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // The SuspendCrossingInfo maintains data that allows to answer a question // whether given two BasicBlocks A and B there is a path from A to B that // passes through a suspend point. Note, SuspendCrossingInfo is invalidated // by changes to the CFG including adding/removing BBs due to its use of BB // ptrs in the BlockToIndexMapping. //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_COROUTINES_SUSPENDCROSSINGINFO_H #define LLVM_TRANSFORMS_COROUTINES_SUSPENDCROSSINGINFO_H #include "llvm/ADT/BitVector.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/SmallVector.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instruction.h" #include "llvm/Transforms/Coroutines/CoroInstr.h" namespace llvm { // Provides two way mapping between the blocks and numbers. class BlockToIndexMapping { … }; // The SuspendCrossingInfo maintains data that allows to answer a question // whether given two BasicBlocks A and B there is a path from A to B that // passes through a suspend point. // // For every basic block 'i' it maintains a BlockData that consists of: // Consumes: a bit vector which contains a set of indices of blocks that can // reach block 'i'. A block can trivially reach itself. // Kills: a bit vector which contains a set of indices of blocks that can // reach block 'i' but there is a path crossing a suspend point // not repeating 'i' (path to 'i' without cycles containing 'i'). // Suspend: a boolean indicating whether block 'i' contains a suspend point. // End: a boolean indicating whether block 'i' contains a coro.end intrinsic. // KillLoop: There is a path from 'i' to 'i' not otherwise repeating 'i' that // crosses a suspend point. // class SuspendCrossingInfo { … }; } // namespace llvm #endif // LLVM_TRANSFORMS_COROUTINES_SUSPENDCROSSINGINFO_H