1-
21// ===-- SPIRVPreLegalizerCombiner.cpp - combine legalization ----*- C++ -*-===//
32//
43// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1312// ===----------------------------------------------------------------------===//
1413
1514#include " SPIRV.h"
16- #include " SPIRVTargetMachine .h"
15+ #include " SPIRVCombinerHelper .h"
1716#include " llvm/CodeGen/GlobalISel/CSEInfo.h"
1817#include " llvm/CodeGen/GlobalISel/Combiner.h"
19- #include " llvm/CodeGen/GlobalISel/CombinerHelper.h"
2018#include " llvm/CodeGen/GlobalISel/CombinerInfo.h"
2119#include " llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
2220#include " llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
2321#include " llvm/CodeGen/GlobalISel/GISelValueTracking.h"
24- #include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
2522#include " llvm/CodeGen/GlobalISel/MIPatternMatch.h"
26- #include " llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
27- #include " llvm/CodeGen/GlobalISel/Utils.h"
2823#include " llvm/CodeGen/MachineDominators.h"
2924#include " llvm/CodeGen/MachineFunctionPass.h"
30- #include " llvm/CodeGen/MachineRegisterInfo.h"
31- #include " llvm/CodeGen/TargetOpcodes.h"
3225#include " llvm/CodeGen/TargetPassConfig.h"
33- #include " llvm/IR/IntrinsicsSPIRV.h"
3426
3527#define GET_GICOMBINER_DEPS
3628#include " SPIRVGenPreLegalizeGICombiner.inc"
@@ -47,72 +39,9 @@ namespace {
4739#include " SPIRVGenPreLegalizeGICombiner.inc"
4840#undef GET_GICOMBINER_TYPES
4941
50- // / This match is part of a combine that
51- // / rewrites length(X - Y) to distance(X, Y)
52- // / (f32 (g_intrinsic length
53- // / (g_fsub (vXf32 X) (vXf32 Y))))
54- // / ->
55- // / (f32 (g_intrinsic distance
56- // / (vXf32 X) (vXf32 Y)))
57- // /
58- bool matchLengthToDistance (MachineInstr &MI, MachineRegisterInfo &MRI) {
59- if (MI.getOpcode () != TargetOpcode::G_INTRINSIC ||
60- cast<GIntrinsic>(MI).getIntrinsicID () != Intrinsic::spv_length)
61- return false ;
62-
63- // First operand of MI is `G_INTRINSIC` so start at operand 2.
64- Register SubReg = MI.getOperand (2 ).getReg ();
65- MachineInstr *SubInstr = MRI.getVRegDef (SubReg);
66- if (!SubInstr || SubInstr->getOpcode () != TargetOpcode::G_FSUB)
67- return false ;
68-
69- return true ;
70- }
71- void applySPIRVDistance (MachineInstr &MI, MachineRegisterInfo &MRI,
72- MachineIRBuilder &B) {
73-
74- // Extract the operands for X and Y from the match criteria.
75- Register SubDestReg = MI.getOperand (2 ).getReg ();
76- MachineInstr *SubInstr = MRI.getVRegDef (SubDestReg);
77- Register SubOperand1 = SubInstr->getOperand (1 ).getReg ();
78- Register SubOperand2 = SubInstr->getOperand (2 ).getReg ();
79-
80- // Remove the original `spv_length` instruction.
81-
82- Register ResultReg = MI.getOperand (0 ).getReg ();
83- DebugLoc DL = MI.getDebugLoc ();
84- MachineBasicBlock &MBB = *MI.getParent ();
85- MachineBasicBlock::iterator InsertPt = MI.getIterator ();
86-
87- // Build the `spv_distance` intrinsic.
88- MachineInstrBuilder NewInstr =
89- BuildMI (MBB, InsertPt, DL, B.getTII ().get (TargetOpcode::G_INTRINSIC));
90- NewInstr
91- .addDef (ResultReg) // Result register
92- .addIntrinsicID (Intrinsic::spv_distance) // Intrinsic ID
93- .addUse (SubOperand1) // Operand X
94- .addUse (SubOperand2); // Operand Y
95-
96- SPIRVGlobalRegistry *GR =
97- MI.getMF ()->getSubtarget <SPIRVSubtarget>().getSPIRVGlobalRegistry ();
98- auto RemoveAllUses = [&](Register Reg) {
99- SmallVector<MachineInstr *, 4 > UsesToErase (
100- llvm::make_pointer_range (MRI.use_instructions (Reg)));
101-
102- // calling eraseFromParent to early invalidates the iterator.
103- for (auto *MIToErase : UsesToErase) {
104- GR->invalidateMachineInstr (MIToErase);
105- MIToErase->eraseFromParent ();
106- }
107- };
108- RemoveAllUses (SubDestReg); // remove all uses of FSUB Result
109- GR->invalidateMachineInstr (SubInstr);
110- SubInstr->eraseFromParent (); // remove FSUB instruction
111- }
112-
11342class SPIRVPreLegalizerCombinerImpl : public Combiner {
11443protected:
115- const CombinerHelper Helper;
44+ const SPIRVCombinerHelper Helper;
11645 const SPIRVPreLegalizerCombinerImplRuleConfig &RuleConfig;
11746 const SPIRVSubtarget &STI;
11847
@@ -147,7 +76,7 @@ SPIRVPreLegalizerCombinerImpl::SPIRVPreLegalizerCombinerImpl(
14776 const SPIRVSubtarget &STI, MachineDominatorTree *MDT,
14877 const LegalizerInfo *LI)
14978 : Combiner(MF, CInfo, TPC, &VT, CSEInfo),
150- Helper (Observer, B, /* IsPreLegalize*/ true , &VT, MDT, LI),
79+ Helper (Observer, B, /* IsPreLegalize*/ true , &VT, MDT, LI, STI ),
15180 RuleConfig(RuleConfig), STI(STI),
15281#define GET_GICOMBINER_CONSTRUCTOR_INITS
15382#include " SPIRVGenPreLegalizeGICombiner.inc"
0 commit comments