1//== llvm/CodeGen/GlobalISel/Legalizer.h ---------------- -*- 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 A pass to convert the target-illegal operations created by IR -> MIR 10/// translation into ones the target expects to be able to select. This may 11/// occur in multiple phases, for example G_ADD <2 x i8> -> G_ADD <2 x i16> -> 12/// G_ADD <4 x i16>. 13/// 14/// The LegalizeHelper class is where most of the work happens, and is designed 15/// to be callable from other passes that find themselves with an illegal 16/// instruction. 17// 18//===----------------------------------------------------------------------===// 19 20#ifndef LLVM_CODEGEN_GLOBALISEL_LEGALIZEMACHINEIRPASS_H 21#define LLVM_CODEGEN_GLOBALISEL_LEGALIZEMACHINEIRPASS_H 22 23#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 24#include "llvm/CodeGen/MachineFunctionPass.h" 25 26namespace llvm { 27 28class MachineRegisterInfo; 29class LostDebugLocObserver; 30 31class Legalizer : public MachineFunctionPass { 32public: 33 static char ID; 34 35 struct MFResult { 36 bool Changed; 37 const MachineInstr *FailedOn; 38 }; 39 40private: 41 /// Initialize the field members using \p MF. 42 void init(MachineFunction &MF); 43 44public: 45 // Ctor, nothing fancy. 46 Legalizer(); 47 48 StringRef getPassName() const override { return "Legalizer"; } 49 50 void getAnalysisUsage(AnalysisUsage &AU) const override; 51 52 MachineFunctionProperties getRequiredProperties() const override { 53 return MachineFunctionProperties().set( 54 MachineFunctionProperties::Property::IsSSA); 55 } 56 57 MachineFunctionProperties getSetProperties() const override { 58 return MachineFunctionProperties().set( 59 MachineFunctionProperties::Property::Legalized); 60 } 61 62 MachineFunctionProperties getClearedProperties() const override { 63 return MachineFunctionProperties().set( 64 MachineFunctionProperties::Property::NoPHIs); 65 } 66 67 bool combineExtracts(MachineInstr &MI, MachineRegisterInfo &MRI, 68 const TargetInstrInfo &TII); 69 70 bool runOnMachineFunction(MachineFunction &MF) override; 71 72 static MFResult 73 legalizeMachineFunction(MachineFunction &MF, const LegalizerInfo &LI, 74 ArrayRef<GISelChangeObserver *> AuxObservers, 75 LostDebugLocObserver &LocObserver, 76 MachineIRBuilder &MIRBuilder); 77}; 78} // End namespace llvm. 79 80#endif 81