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_LEGALIZER_H 21 #define LLVM_CODEGEN_GLOBALISEL_LEGALIZER_H 22 23 #include "llvm/ADT/ArrayRef.h" 24 #include "llvm/ADT/StringRef.h" 25 #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 26 #include "llvm/CodeGen/MachineFunction.h" 27 #include "llvm/CodeGen/MachineFunctionPass.h" 28 29 namespace llvm { 30 31 class LegalizerInfo; 32 class MachineIRBuilder; 33 class MachineInstr; 34 class GISelChangeObserver; 35 class LostDebugLocObserver; 36 37 class Legalizer : public MachineFunctionPass { 38 public: 39 static char ID; 40 41 struct MFResult { 42 bool Changed; 43 const MachineInstr *FailedOn; 44 }; 45 46 private: 47 /// Initialize the field members using \p MF. 48 void init(MachineFunction &MF); 49 50 public: 51 // Ctor, nothing fancy. 52 Legalizer(); 53 54 StringRef getPassName() const override { return "Legalizer"; } 55 56 void getAnalysisUsage(AnalysisUsage &AU) const override; 57 58 MachineFunctionProperties getRequiredProperties() const override { 59 return MachineFunctionProperties().set( 60 MachineFunctionProperties::Property::IsSSA); 61 } 62 63 MachineFunctionProperties getSetProperties() const override { 64 return MachineFunctionProperties().set( 65 MachineFunctionProperties::Property::Legalized); 66 } 67 68 MachineFunctionProperties getClearedProperties() const override { 69 return MachineFunctionProperties() 70 .set(MachineFunctionProperties::Property::NoPHIs) 71 .set(MachineFunctionProperties::Property::NoVRegs); 72 } 73 74 bool runOnMachineFunction(MachineFunction &MF) override; 75 76 static MFResult 77 legalizeMachineFunction(MachineFunction &MF, const LegalizerInfo &LI, 78 ArrayRef<GISelChangeObserver *> AuxObservers, 79 LostDebugLocObserver &LocObserver, 80 MachineIRBuilder &MIRBuilder, GISelKnownBits *KB); 81 }; 82 } // End namespace llvm. 83 84 #endif 85