1a174f0daSMatt Arsenault //=== lib/CodeGen/GlobalISel/AMDGPUPreLegalizerCombiner.cpp ---------------===//
2a174f0daSMatt Arsenault //
3a174f0daSMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a174f0daSMatt Arsenault // See https://llvm.org/LICENSE.txt for license information.
5a174f0daSMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a174f0daSMatt Arsenault //
7a174f0daSMatt Arsenault //===----------------------------------------------------------------------===//
8a174f0daSMatt Arsenault //
9a174f0daSMatt Arsenault // This pass does combining of machine instructions at the generic MI level,
10a174f0daSMatt Arsenault // before the legalizer.
11a174f0daSMatt Arsenault //
12a174f0daSMatt Arsenault //===----------------------------------------------------------------------===//
13a174f0daSMatt Arsenault 
146a87e9b0Sdfukalov #include "AMDGPU.h"
15db6bc2abSMirko Brkusanin #include "AMDGPUCombinerHelper.h"
16f89f6d1eSThomas Symalla #include "AMDGPULegalizerInfo.h"
17f89f6d1eSThomas Symalla #include "GCNSubtarget.h"
18f89f6d1eSThomas Symalla #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
19ed98c1b3Sserge-sans-paille #include "llvm/CodeGen/GlobalISel/CSEInfo.h"
20a174f0daSMatt Arsenault #include "llvm/CodeGen/GlobalISel/Combiner.h"
21a174f0daSMatt Arsenault #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
22a174f0daSMatt Arsenault #include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
23a174f0daSMatt Arsenault #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
24a174f0daSMatt Arsenault #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
25a174f0daSMatt Arsenault #include "llvm/CodeGen/MachineDominators.h"
26a174f0daSMatt Arsenault #include "llvm/CodeGen/TargetPassConfig.h"
276a87e9b0Sdfukalov #include "llvm/Target/TargetMachine.h"
28a174f0daSMatt Arsenault 
29a174f0daSMatt Arsenault #define DEBUG_TYPE "amdgpu-prelegalizer-combiner"
30a174f0daSMatt Arsenault 
31a174f0daSMatt Arsenault using namespace llvm;
32a174f0daSMatt Arsenault using namespace MIPatternMatch;
33a174f0daSMatt Arsenault 
34f89f6d1eSThomas Symalla class AMDGPUPreLegalizerCombinerHelper {
35f89f6d1eSThomas Symalla protected:
36f89f6d1eSThomas Symalla   MachineIRBuilder &B;
37f89f6d1eSThomas Symalla   MachineFunction &MF;
38f89f6d1eSThomas Symalla   MachineRegisterInfo &MRI;
39db6bc2abSMirko Brkusanin   AMDGPUCombinerHelper &Helper;
40f89f6d1eSThomas Symalla 
41f89f6d1eSThomas Symalla public:
AMDGPUPreLegalizerCombinerHelper(MachineIRBuilder & B,AMDGPUCombinerHelper & Helper)42db6bc2abSMirko Brkusanin   AMDGPUPreLegalizerCombinerHelper(MachineIRBuilder &B,
43db6bc2abSMirko Brkusanin                                    AMDGPUCombinerHelper &Helper)
44f89f6d1eSThomas Symalla       : B(B), MF(B.getMF()), MRI(*B.getMRI()), Helper(Helper){};
45f89f6d1eSThomas Symalla 
46f89f6d1eSThomas Symalla   struct ClampI64ToI16MatchInfo {
47f89f6d1eSThomas Symalla     int64_t Cmp1 = 0;
48f89f6d1eSThomas Symalla     int64_t Cmp2 = 0;
49f89f6d1eSThomas Symalla     Register Origin;
50f89f6d1eSThomas Symalla   };
51f89f6d1eSThomas Symalla 
52f89f6d1eSThomas Symalla   bool matchClampI64ToI16(MachineInstr &MI, MachineRegisterInfo &MRI,
53f89f6d1eSThomas Symalla                           MachineFunction &MF,
54f89f6d1eSThomas Symalla                           ClampI64ToI16MatchInfo &MatchInfo);
55f89f6d1eSThomas Symalla 
56f89f6d1eSThomas Symalla   void applyClampI64ToI16(MachineInstr &MI,
57f89f6d1eSThomas Symalla                           const ClampI64ToI16MatchInfo &MatchInfo);
58f89f6d1eSThomas Symalla };
59f89f6d1eSThomas Symalla 
matchClampI64ToI16(MachineInstr & MI,MachineRegisterInfo & MRI,MachineFunction & MF,ClampI64ToI16MatchInfo & MatchInfo)60f89f6d1eSThomas Symalla bool AMDGPUPreLegalizerCombinerHelper::matchClampI64ToI16(
61f89f6d1eSThomas Symalla     MachineInstr &MI, MachineRegisterInfo &MRI, MachineFunction &MF,
62f89f6d1eSThomas Symalla     ClampI64ToI16MatchInfo &MatchInfo) {
63f89f6d1eSThomas Symalla   assert(MI.getOpcode() == TargetOpcode::G_TRUNC && "Invalid instruction!");
64f89f6d1eSThomas Symalla 
65f89f6d1eSThomas Symalla   // Try to find a pattern where an i64 value should get clamped to short.
66f89f6d1eSThomas Symalla   const LLT SrcType = MRI.getType(MI.getOperand(1).getReg());
67f89f6d1eSThomas Symalla   if (SrcType != LLT::scalar(64))
68f89f6d1eSThomas Symalla     return false;
69f89f6d1eSThomas Symalla 
70f89f6d1eSThomas Symalla   const LLT DstType = MRI.getType(MI.getOperand(0).getReg());
71f89f6d1eSThomas Symalla   if (DstType != LLT::scalar(16))
72f89f6d1eSThomas Symalla     return false;
73f89f6d1eSThomas Symalla 
74f89f6d1eSThomas Symalla   Register Base;
75f89f6d1eSThomas Symalla 
76f89f6d1eSThomas Symalla   auto IsApplicableForCombine = [&MatchInfo]() -> bool {
77f89f6d1eSThomas Symalla     const auto Cmp1 = MatchInfo.Cmp1;
78f89f6d1eSThomas Symalla     const auto Cmp2 = MatchInfo.Cmp2;
79f89f6d1eSThomas Symalla     const auto Diff = std::abs(Cmp2 - Cmp1);
80f89f6d1eSThomas Symalla 
81f89f6d1eSThomas Symalla     // If the difference between both comparison values is 0 or 1, there is no
82f89f6d1eSThomas Symalla     // need to clamp.
83f89f6d1eSThomas Symalla     if (Diff == 0 || Diff == 1)
84f89f6d1eSThomas Symalla       return false;
85f89f6d1eSThomas Symalla 
86f89f6d1eSThomas Symalla     const int64_t Min = std::numeric_limits<int16_t>::min();
87f89f6d1eSThomas Symalla     const int64_t Max = std::numeric_limits<int16_t>::max();
88f89f6d1eSThomas Symalla 
89f89f6d1eSThomas Symalla     // Check if the comparison values are between SHORT_MIN and SHORT_MAX.
90f89f6d1eSThomas Symalla     return ((Cmp2 >= Cmp1 && Cmp1 >= Min && Cmp2 <= Max) ||
91f89f6d1eSThomas Symalla             (Cmp1 >= Cmp2 && Cmp1 <= Max && Cmp2 >= Min));
92f89f6d1eSThomas Symalla   };
93f89f6d1eSThomas Symalla 
94f89f6d1eSThomas Symalla   // Try to match a combination of min / max MIR opcodes.
95f89f6d1eSThomas Symalla   if (mi_match(MI.getOperand(1).getReg(), MRI,
96f89f6d1eSThomas Symalla                m_GSMin(m_Reg(Base), m_ICst(MatchInfo.Cmp1)))) {
97f89f6d1eSThomas Symalla     if (mi_match(Base, MRI,
98f89f6d1eSThomas Symalla                  m_GSMax(m_Reg(MatchInfo.Origin), m_ICst(MatchInfo.Cmp2)))) {
99f89f6d1eSThomas Symalla       return IsApplicableForCombine();
100f89f6d1eSThomas Symalla     }
101f89f6d1eSThomas Symalla   }
102f89f6d1eSThomas Symalla 
103f89f6d1eSThomas Symalla   if (mi_match(MI.getOperand(1).getReg(), MRI,
104f89f6d1eSThomas Symalla                m_GSMax(m_Reg(Base), m_ICst(MatchInfo.Cmp1)))) {
105f89f6d1eSThomas Symalla     if (mi_match(Base, MRI,
106f89f6d1eSThomas Symalla                  m_GSMin(m_Reg(MatchInfo.Origin), m_ICst(MatchInfo.Cmp2)))) {
107f89f6d1eSThomas Symalla       return IsApplicableForCombine();
108f89f6d1eSThomas Symalla     }
109f89f6d1eSThomas Symalla   }
110f89f6d1eSThomas Symalla 
111f89f6d1eSThomas Symalla   return false;
112f89f6d1eSThomas Symalla }
113f89f6d1eSThomas Symalla 
114f89f6d1eSThomas Symalla // We want to find a combination of instructions that
115f89f6d1eSThomas Symalla // gets generated when an i64 gets clamped to i16.
116f89f6d1eSThomas Symalla // The corresponding pattern is:
117f89f6d1eSThomas Symalla // G_MAX / G_MAX for i16 <= G_TRUNC i64.
118f89f6d1eSThomas Symalla // This can be efficiently written as following:
119f89f6d1eSThomas Symalla // v_cvt_pk_i16_i32 v0, v0, v1
120f89f6d1eSThomas Symalla // v_med3_i32 v0, Clamp_Min, v0, Clamp_Max
applyClampI64ToI16(MachineInstr & MI,const ClampI64ToI16MatchInfo & MatchInfo)121f89f6d1eSThomas Symalla void AMDGPUPreLegalizerCombinerHelper::applyClampI64ToI16(
122f89f6d1eSThomas Symalla     MachineInstr &MI, const ClampI64ToI16MatchInfo &MatchInfo) {
123f89f6d1eSThomas Symalla 
124f89f6d1eSThomas Symalla   Register Src = MatchInfo.Origin;
125f89f6d1eSThomas Symalla   assert(MI.getParent()->getParent()->getRegInfo().getType(Src) ==
126f89f6d1eSThomas Symalla          LLT::scalar(64));
127f89f6d1eSThomas Symalla   const LLT S32 = LLT::scalar(32);
128f89f6d1eSThomas Symalla 
129f89f6d1eSThomas Symalla   B.setInstrAndDebugLoc(MI);
130f89f6d1eSThomas Symalla 
131f89f6d1eSThomas Symalla   auto Unmerge = B.buildUnmerge(S32, Src);
132f89f6d1eSThomas Symalla 
133f89f6d1eSThomas Symalla   assert(MI.getOpcode() != AMDGPU::G_AMDGPU_CVT_PK_I16_I32);
134f89f6d1eSThomas Symalla 
135d5e14ba8SSander de Smalen   const LLT V2S16 = LLT::fixed_vector(2, 16);
136f89f6d1eSThomas Symalla   auto CvtPk =
137f89f6d1eSThomas Symalla       B.buildInstr(AMDGPU::G_AMDGPU_CVT_PK_I16_I32, {V2S16},
138f89f6d1eSThomas Symalla                    {Unmerge.getReg(0), Unmerge.getReg(1)}, MI.getFlags());
139f89f6d1eSThomas Symalla 
140f89f6d1eSThomas Symalla   auto MinBoundary = std::min(MatchInfo.Cmp1, MatchInfo.Cmp2);
141f89f6d1eSThomas Symalla   auto MaxBoundary = std::max(MatchInfo.Cmp1, MatchInfo.Cmp2);
142f89f6d1eSThomas Symalla   auto MinBoundaryDst = B.buildConstant(S32, MinBoundary);
143f89f6d1eSThomas Symalla   auto MaxBoundaryDst = B.buildConstant(S32, MaxBoundary);
144f89f6d1eSThomas Symalla 
145f89f6d1eSThomas Symalla   auto Bitcast = B.buildBitcast({S32}, CvtPk);
146f89f6d1eSThomas Symalla 
147f89f6d1eSThomas Symalla   auto Med3 = B.buildInstr(
1484a9bc598SPetar Avramovic       AMDGPU::G_AMDGPU_SMED3, {S32},
149f89f6d1eSThomas Symalla       {MinBoundaryDst.getReg(0), Bitcast.getReg(0), MaxBoundaryDst.getReg(0)},
150f89f6d1eSThomas Symalla       MI.getFlags());
151f89f6d1eSThomas Symalla 
152f89f6d1eSThomas Symalla   B.buildTrunc(MI.getOperand(0).getReg(), Med3);
153f89f6d1eSThomas Symalla 
154f89f6d1eSThomas Symalla   MI.eraseFromParent();
155f89f6d1eSThomas Symalla }
156f89f6d1eSThomas Symalla 
157f89f6d1eSThomas Symalla class AMDGPUPreLegalizerCombinerHelperState {
158f89f6d1eSThomas Symalla protected:
159db6bc2abSMirko Brkusanin   AMDGPUCombinerHelper &Helper;
160f89f6d1eSThomas Symalla   AMDGPUPreLegalizerCombinerHelper &PreLegalizerHelper;
161f89f6d1eSThomas Symalla 
162f89f6d1eSThomas Symalla public:
AMDGPUPreLegalizerCombinerHelperState(AMDGPUCombinerHelper & Helper,AMDGPUPreLegalizerCombinerHelper & PreLegalizerHelper)163f89f6d1eSThomas Symalla   AMDGPUPreLegalizerCombinerHelperState(
164db6bc2abSMirko Brkusanin       AMDGPUCombinerHelper &Helper,
165f89f6d1eSThomas Symalla       AMDGPUPreLegalizerCombinerHelper &PreLegalizerHelper)
166f89f6d1eSThomas Symalla       : Helper(Helper), PreLegalizerHelper(PreLegalizerHelper) {}
167f89f6d1eSThomas Symalla };
168f89f6d1eSThomas Symalla 
169a174f0daSMatt Arsenault #define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
170fee41517SMatt Arsenault #include "AMDGPUGenPreLegalizeGICombiner.inc"
171a174f0daSMatt Arsenault #undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
172a174f0daSMatt Arsenault 
173a174f0daSMatt Arsenault namespace {
174a174f0daSMatt Arsenault #define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
175fee41517SMatt Arsenault #include "AMDGPUGenPreLegalizeGICombiner.inc"
176a174f0daSMatt Arsenault #undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
177a174f0daSMatt Arsenault 
17816bcd545SMatt Arsenault class AMDGPUPreLegalizerCombinerInfo final : public CombinerInfo {
179a174f0daSMatt Arsenault   GISelKnownBits *KB;
180a174f0daSMatt Arsenault   MachineDominatorTree *MDT;
181a174f0daSMatt Arsenault 
182a174f0daSMatt Arsenault public:
183e35ba099SDaniel Sanders   AMDGPUGenPreLegalizerCombinerHelperRuleConfig GeneratedRuleCfg;
184a174f0daSMatt Arsenault 
AMDGPUPreLegalizerCombinerInfo(bool EnableOpt,bool OptSize,bool MinSize,GISelKnownBits * KB,MachineDominatorTree * MDT)185a174f0daSMatt Arsenault   AMDGPUPreLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize,
186a174f0daSMatt Arsenault                                   GISelKnownBits *KB, MachineDominatorTree *MDT)
187a174f0daSMatt Arsenault       : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
1886604d81eSThomas Symalla                      /*LegalizerInfo*/ nullptr, EnableOpt, OptSize, MinSize),
189a174f0daSMatt Arsenault         KB(KB), MDT(MDT) {
190e35ba099SDaniel Sanders     if (!GeneratedRuleCfg.parseCommandLineOption())
191a174f0daSMatt Arsenault       report_fatal_error("Invalid rule identifier");
192a174f0daSMatt Arsenault   }
193a174f0daSMatt Arsenault 
194*b5188591SKazu Hirata   bool combine(GISelChangeObserver &Observer, MachineInstr &MI,
195a174f0daSMatt Arsenault                MachineIRBuilder &B) const override;
196a174f0daSMatt Arsenault };
197a174f0daSMatt Arsenault 
combine(GISelChangeObserver & Observer,MachineInstr & MI,MachineIRBuilder & B) const198a174f0daSMatt Arsenault bool AMDGPUPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
199a174f0daSMatt Arsenault                                               MachineInstr &MI,
200a174f0daSMatt Arsenault                                               MachineIRBuilder &B) const {
201db6bc2abSMirko Brkusanin   AMDGPUCombinerHelper Helper(Observer, B, KB, MDT);
202f89f6d1eSThomas Symalla   AMDGPUPreLegalizerCombinerHelper PreLegalizerHelper(B, Helper);
203f89f6d1eSThomas Symalla   AMDGPUGenPreLegalizerCombinerHelper Generated(GeneratedRuleCfg, Helper,
204f89f6d1eSThomas Symalla                                                 PreLegalizerHelper);
205a174f0daSMatt Arsenault 
206db6bc2abSMirko Brkusanin   if (Generated.tryCombineAll(Observer, MI, B))
207a174f0daSMatt Arsenault     return true;
208a174f0daSMatt Arsenault 
209a174f0daSMatt Arsenault   switch (MI.getOpcode()) {
210a174f0daSMatt Arsenault   case TargetOpcode::G_CONCAT_VECTORS:
211a174f0daSMatt Arsenault     return Helper.tryCombineConcatVectors(MI);
212a174f0daSMatt Arsenault   case TargetOpcode::G_SHUFFLE_VECTOR:
213a174f0daSMatt Arsenault     return Helper.tryCombineShuffleVector(MI);
214a174f0daSMatt Arsenault   }
215a174f0daSMatt Arsenault 
216a174f0daSMatt Arsenault   return false;
217a174f0daSMatt Arsenault }
218a174f0daSMatt Arsenault 
219a174f0daSMatt Arsenault #define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
220fee41517SMatt Arsenault #include "AMDGPUGenPreLegalizeGICombiner.inc"
221a174f0daSMatt Arsenault #undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
222a174f0daSMatt Arsenault 
223a174f0daSMatt Arsenault // Pass boilerplate
224a174f0daSMatt Arsenault // ================
225a174f0daSMatt Arsenault 
226a174f0daSMatt Arsenault class AMDGPUPreLegalizerCombiner : public MachineFunctionPass {
227a174f0daSMatt Arsenault public:
228a174f0daSMatt Arsenault   static char ID;
229a174f0daSMatt Arsenault 
230a174f0daSMatt Arsenault   AMDGPUPreLegalizerCombiner(bool IsOptNone = false);
231a174f0daSMatt Arsenault 
getPassName() const232fee41517SMatt Arsenault   StringRef getPassName() const override {
233fee41517SMatt Arsenault     return "AMDGPUPreLegalizerCombiner";
234fee41517SMatt Arsenault   }
235a174f0daSMatt Arsenault 
236a174f0daSMatt Arsenault   bool runOnMachineFunction(MachineFunction &MF) override;
237a174f0daSMatt Arsenault 
238a174f0daSMatt Arsenault   void getAnalysisUsage(AnalysisUsage &AU) const override;
239a174f0daSMatt Arsenault private:
240a174f0daSMatt Arsenault   bool IsOptNone;
241a174f0daSMatt Arsenault };
242a174f0daSMatt Arsenault } // end anonymous namespace
243a174f0daSMatt Arsenault 
getAnalysisUsage(AnalysisUsage & AU) const244a174f0daSMatt Arsenault void AMDGPUPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
245a174f0daSMatt Arsenault   AU.addRequired<TargetPassConfig>();
246a174f0daSMatt Arsenault   AU.setPreservesCFG();
247a174f0daSMatt Arsenault   getSelectionDAGFallbackAnalysisUsage(AU);
248a174f0daSMatt Arsenault   AU.addRequired<GISelKnownBitsAnalysis>();
249a174f0daSMatt Arsenault   AU.addPreserved<GISelKnownBitsAnalysis>();
250a174f0daSMatt Arsenault   if (!IsOptNone) {
251a174f0daSMatt Arsenault     AU.addRequired<MachineDominatorTree>();
252a174f0daSMatt Arsenault     AU.addPreserved<MachineDominatorTree>();
253a174f0daSMatt Arsenault   }
2546314a727SMatt Arsenault 
2556314a727SMatt Arsenault   AU.addRequired<GISelCSEAnalysisWrapperPass>();
2566314a727SMatt Arsenault   AU.addPreserved<GISelCSEAnalysisWrapperPass>();
257a174f0daSMatt Arsenault   MachineFunctionPass::getAnalysisUsage(AU);
258a174f0daSMatt Arsenault }
259a174f0daSMatt Arsenault 
AMDGPUPreLegalizerCombiner(bool IsOptNone)260a174f0daSMatt Arsenault AMDGPUPreLegalizerCombiner::AMDGPUPreLegalizerCombiner(bool IsOptNone)
261a174f0daSMatt Arsenault   : MachineFunctionPass(ID), IsOptNone(IsOptNone) {
262a174f0daSMatt Arsenault   initializeAMDGPUPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
263a174f0daSMatt Arsenault }
264a174f0daSMatt Arsenault 
runOnMachineFunction(MachineFunction & MF)265a174f0daSMatt Arsenault bool AMDGPUPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
266a174f0daSMatt Arsenault   if (MF.getProperties().hasProperty(
267a174f0daSMatt Arsenault           MachineFunctionProperties::Property::FailedISel))
268a174f0daSMatt Arsenault     return false;
269a174f0daSMatt Arsenault   auto *TPC = &getAnalysis<TargetPassConfig>();
270a174f0daSMatt Arsenault   const Function &F = MF.getFunction();
271a174f0daSMatt Arsenault   bool EnableOpt =
272a174f0daSMatt Arsenault       MF.getTarget().getOptLevel() != CodeGenOpt::None && !skipFunction(F);
273a174f0daSMatt Arsenault   GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF);
274a174f0daSMatt Arsenault   MachineDominatorTree *MDT =
275a174f0daSMatt Arsenault       IsOptNone ? nullptr : &getAnalysis<MachineDominatorTree>();
276a174f0daSMatt Arsenault   AMDGPUPreLegalizerCombinerInfo PCInfo(EnableOpt, F.hasOptSize(),
2776604d81eSThomas Symalla                                         F.hasMinSize(), KB, MDT);
2786314a727SMatt Arsenault   // Enable CSE.
2796314a727SMatt Arsenault   GISelCSEAnalysisWrapper &Wrapper =
2806314a727SMatt Arsenault       getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
2816314a727SMatt Arsenault   auto *CSEInfo = &Wrapper.get(TPC->getCSEConfig());
2826314a727SMatt Arsenault 
283a174f0daSMatt Arsenault   Combiner C(PCInfo, TPC);
2846314a727SMatt Arsenault   return C.combineMachineInstrs(MF, CSEInfo);
285a174f0daSMatt Arsenault }
286a174f0daSMatt Arsenault 
287a174f0daSMatt Arsenault char AMDGPUPreLegalizerCombiner::ID = 0;
288a174f0daSMatt Arsenault INITIALIZE_PASS_BEGIN(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
289a174f0daSMatt Arsenault                       "Combine AMDGPU machine instrs before legalization",
290a174f0daSMatt Arsenault                       false, false)
291a174f0daSMatt Arsenault INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
292a174f0daSMatt Arsenault INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
293a174f0daSMatt Arsenault INITIALIZE_PASS_END(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
294a174f0daSMatt Arsenault                     "Combine AMDGPU machine instrs before legalization", false,
295a174f0daSMatt Arsenault                     false)
296a174f0daSMatt Arsenault 
297a174f0daSMatt Arsenault namespace llvm {
createAMDGPUPreLegalizeCombiner(bool IsOptNone)298a174f0daSMatt Arsenault FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone) {
299a174f0daSMatt Arsenault   return new AMDGPUPreLegalizerCombiner(IsOptNone);
300a174f0daSMatt Arsenault }
301a174f0daSMatt Arsenault } // end namespace llvm
302