mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-01-31 01:35:20 +01:00
Summary: This patch makes code motion checks optional which are dependent on specific analysis example, dominator tree, post dominator tree and dependence info. The aim is to make the adoption of CodeMoverUtils easier for clients that don't use analysis which were strictly required by CodeMoverUtils. This will also help in diversifying code motion checks using other analysis example MSSA. Authored By: RithikSharma Reviewer: Whitney, bmahjour, etiotto Reviewed By: Whitney Subscribers: Prazek, hiraditya, george.burgess.iv, asbirlea, llvm-commits Tag: LLVM Differential Revision: https://reviews.llvm.org/D82566
68 lines
2.9 KiB
C++
68 lines
2.9 KiB
C++
//===- Transform/Utils/CodeMoverUtils.h - CodeMover Utils -------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This family of functions determine movements are safe on basic blocks, and
|
|
// instructions contained within a function.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
|
|
#define LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
|
|
|
|
namespace llvm {
|
|
|
|
class BasicBlock;
|
|
class DependenceInfo;
|
|
class DominatorTree;
|
|
class Instruction;
|
|
class PostDominatorTree;
|
|
|
|
/// Return true if \p I0 and \p I1 are control flow equivalent.
|
|
/// Two instructions are control flow equivalent if their basic blocks are
|
|
/// control flow equivalent.
|
|
bool isControlFlowEquivalent(const Instruction &I0, const Instruction &I1,
|
|
const DominatorTree &DT,
|
|
const PostDominatorTree &PDT);
|
|
|
|
/// Return true if \p BB0 and \p BB1 are control flow equivalent.
|
|
/// Two basic blocks are control flow equivalent if when one executes, the other
|
|
/// is guaranteed to execute.
|
|
bool isControlFlowEquivalent(const BasicBlock &BB0, const BasicBlock &BB1,
|
|
const DominatorTree &DT,
|
|
const PostDominatorTree &PDT);
|
|
|
|
/// Return true if \p I can be safely moved before \p InsertPoint.
|
|
bool isSafeToMoveBefore(Instruction &I, Instruction &InsertPoint,
|
|
DominatorTree &DT,
|
|
const PostDominatorTree *PDT = nullptr,
|
|
DependenceInfo *DI = nullptr);
|
|
|
|
/// Return true if all instructions (except the terminator) in \p BB can be
|
|
/// safely moved before \p InsertPoint.
|
|
bool isSafeToMoveBefore(BasicBlock &BB, Instruction &InsertPoint,
|
|
DominatorTree &DT,
|
|
const PostDominatorTree *PDT = nullptr,
|
|
DependenceInfo *DI = nullptr);
|
|
|
|
/// Move instructions, in an order-preserving manner, from \p FromBB to the
|
|
/// beginning of \p ToBB when proven safe.
|
|
void moveInstructionsToTheBeginning(BasicBlock &FromBB, BasicBlock &ToBB,
|
|
DominatorTree &DT,
|
|
const PostDominatorTree &PDT,
|
|
DependenceInfo &DI);
|
|
|
|
/// Move instructions, in an order-preserving manner, from \p FromBB to the end
|
|
/// of \p ToBB when proven safe.
|
|
void moveInstructionsToTheEnd(BasicBlock &FromBB, BasicBlock &ToBB,
|
|
DominatorTree &DT, const PostDominatorTree &PDT,
|
|
DependenceInfo &DI);
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_TRANSFORMS_UTILS_CODEMOVERUTILS_H
|