1//===- MacroFusion.h - Macro Fusion -----------------------------*- 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/// \file This file contains the definition of the DAG scheduling mutation to 10/// pair instructions back to back. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_CODEGEN_MACROFUSION_H 15#define LLVM_CODEGEN_MACROFUSION_H 16 17#include <functional> 18#include <memory> 19 20namespace llvm { 21 22class MachineInstr; 23class ScheduleDAGMutation; 24class TargetInstrInfo; 25class TargetSubtargetInfo; 26 27/// Check if the instr pair, FirstMI and SecondMI, should be fused 28/// together. Given SecondMI, when FirstMI is unspecified, then check if 29/// SecondMI may be part of a fused pair at all. 30using ShouldSchedulePredTy = std::function<bool(const TargetInstrInfo &TII, 31 const TargetSubtargetInfo &TSI, 32 const MachineInstr *FirstMI, 33 const MachineInstr &SecondMI)>; 34 35/// Create a DAG scheduling mutation to pair instructions back to back 36/// for instructions that benefit according to the target-specific 37/// shouldScheduleAdjacent predicate function. 38std::unique_ptr<ScheduleDAGMutation> 39createMacroFusionDAGMutation(ShouldSchedulePredTy shouldScheduleAdjacent); 40 41/// Create a DAG scheduling mutation to pair branch instructions with one 42/// of their predecessors back to back for instructions that benefit according 43/// to the target-specific shouldScheduleAdjacent predicate function. 44std::unique_ptr<ScheduleDAGMutation> 45createBranchMacroFusionDAGMutation(ShouldSchedulePredTy shouldScheduleAdjacent); 46 47} // end namespace llvm 48 49#endif // LLVM_CODEGEN_MACROFUSION_H 50