1//===- Transform/Utils/CodeMoverUtils.h - CodeMover Utils -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This family of functions determine movements are safe on basic blocks, and
10// instructions contained within a function.
11//
12// Please note that this is work in progress, and the functionality is not
13// ready for broader production use.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
18#define LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
19
20namespace llvm {
21
22class BasicBlock;
23class DependenceInfo;
24class DominatorTree;
25class Instruction;
26class PostDominatorTree;
27
28/// Return true if \p I0 and \p I1 are control flow equivalent.
29/// Two instructions are control flow equivalent if their basic blocks are
30/// control flow equivalent.
31bool isControlFlowEquivalent(const Instruction &I0, const Instruction &I1,
32 const DominatorTree &DT,
33 const PostDominatorTree &PDT);
34
35/// Return true if \p BB0 and \p BB1 are control flow equivalent.
36/// Two basic blocks are control flow equivalent if when one executes, the other
37/// is guaranteed to execute.
38bool isControlFlowEquivalent(const BasicBlock &BB0, const BasicBlock &BB1,
39 const DominatorTree &DT,
40 const PostDominatorTree &PDT);
41
42/// Return true if \p I can be safely moved before \p InsertPoint.
43bool isSafeToMoveBefore(Instruction &I, Instruction &InsertPoint,
44 DominatorTree &DT,
45 const PostDominatorTree *PDT = nullptr,
46 DependenceInfo *DI = nullptr,
47 bool CheckForEntireBlock = false);
48
49/// Return true if all instructions (except the terminator) in \p BB can be
50/// safely moved before \p InsertPoint.
51bool isSafeToMoveBefore(BasicBlock &BB, Instruction &InsertPoint,
52 DominatorTree &DT,
53 const PostDominatorTree *PDT = nullptr,
54 DependenceInfo *DI = nullptr);
55
56/// Move instructions, in an order-preserving manner, from \p FromBB to the
57/// beginning of \p ToBB when proven safe.
58void moveInstructionsToTheBeginning(BasicBlock &FromBB, BasicBlock &ToBB,
59 DominatorTree &DT,
60 const PostDominatorTree &PDT,
61 DependenceInfo &DI);
62
63/// Move instructions, in an order-preserving manner, from \p FromBB to the end
64/// of \p ToBB when proven safe.
65void moveInstructionsToTheEnd(BasicBlock &FromBB, BasicBlock &ToBB,
66 DominatorTree &DT, const PostDominatorTree &PDT,
67 DependenceInfo &DI);
68
69/// In case that two BBs \p ThisBlock and \p OtherBlock are control flow
70/// equivalent but they do not strictly dominate and post-dominate each
71/// other, we determine if \p ThisBlock is reached after \p OtherBlock
72/// in the control flow.
73bool nonStrictlyPostDominate(const BasicBlock *ThisBlock,
74 const BasicBlock *OtherBlock,
75 const DominatorTree *DT,
76 const PostDominatorTree *PDT);
77
78// Check if I0 is reached before I1 in the control flow.
79bool isReachedBefore(const Instruction *I0, const Instruction *I1,
80 const DominatorTree *DT, const PostDominatorTree *PDT);
81
82} // end namespace llvm
83
84#endif // LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
85

source code of llvm/include/llvm/Transforms/Utils/CodeMoverUtils.h