10b57cec5SDimitry Andric //== llvm/CodeGen/GlobalISel/Legalizer.h ---------------- -*- C++ -*-==//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file A pass to convert the target-illegal operations created by IR -> MIR
100b57cec5SDimitry Andric /// translation into ones the target expects to be able to select. This may
110b57cec5SDimitry Andric /// occur in multiple phases, for example G_ADD <2 x i8> -> G_ADD <2 x i16> ->
120b57cec5SDimitry Andric /// G_ADD <4 x i16>.
130b57cec5SDimitry Andric ///
140b57cec5SDimitry Andric /// The LegalizeHelper class is where most of the work happens, and is designed
150b57cec5SDimitry Andric /// to be callable from other passes that find themselves with an illegal
160b57cec5SDimitry Andric /// instruction.
170b57cec5SDimitry Andric //
180b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
190b57cec5SDimitry Andric 
20fe6060f1SDimitry Andric #ifndef LLVM_CODEGEN_GLOBALISEL_LEGALIZER_H
21fe6060f1SDimitry Andric #define LLVM_CODEGEN_GLOBALISEL_LEGALIZER_H
220b57cec5SDimitry Andric 
2381ad6265SDimitry Andric #include "llvm/ADT/ArrayRef.h"
2481ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
2581ad6265SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
260b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h"
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric namespace llvm {
290b57cec5SDimitry Andric 
3081ad6265SDimitry Andric class LegalizerInfo;
3181ad6265SDimitry Andric class MachineIRBuilder;
3281ad6265SDimitry Andric class MachineInstr;
3381ad6265SDimitry Andric class GISelChangeObserver;
345ffd83dbSDimitry Andric class LostDebugLocObserver;
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric class Legalizer : public MachineFunctionPass {
370b57cec5SDimitry Andric public:
380b57cec5SDimitry Andric   static char ID;
390b57cec5SDimitry Andric 
40480093f4SDimitry Andric   struct MFResult {
41480093f4SDimitry Andric     bool Changed;
42480093f4SDimitry Andric     const MachineInstr *FailedOn;
43480093f4SDimitry Andric   };
440b57cec5SDimitry Andric 
45480093f4SDimitry Andric private:
460b57cec5SDimitry Andric   /// Initialize the field members using \p MF.
470b57cec5SDimitry Andric   void init(MachineFunction &MF);
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric public:
500b57cec5SDimitry Andric   // Ctor, nothing fancy.
510b57cec5SDimitry Andric   Legalizer();
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric   StringRef getPassName() const override { return "Legalizer"; }
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override;
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   MachineFunctionProperties getRequiredProperties() const override {
580b57cec5SDimitry Andric     return MachineFunctionProperties().set(
590b57cec5SDimitry Andric         MachineFunctionProperties::Property::IsSSA);
600b57cec5SDimitry Andric   }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric   MachineFunctionProperties getSetProperties() const override {
630b57cec5SDimitry Andric     return MachineFunctionProperties().set(
640b57cec5SDimitry Andric         MachineFunctionProperties::Property::Legalized);
650b57cec5SDimitry Andric   }
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric   MachineFunctionProperties getClearedProperties() const override {
68480093f4SDimitry Andric     return MachineFunctionProperties().set(
69480093f4SDimitry Andric         MachineFunctionProperties::Property::NoPHIs);
700b57cec5SDimitry Andric   }
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override;
73480093f4SDimitry Andric 
74480093f4SDimitry Andric   static MFResult
75480093f4SDimitry Andric   legalizeMachineFunction(MachineFunction &MF, const LegalizerInfo &LI,
76480093f4SDimitry Andric                           ArrayRef<GISelChangeObserver *> AuxObservers,
775ffd83dbSDimitry Andric                           LostDebugLocObserver &LocObserver,
78480093f4SDimitry Andric                           MachineIRBuilder &MIRBuilder);
790b57cec5SDimitry Andric };
800b57cec5SDimitry Andric } // End namespace llvm.
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric #endif
83