LLVM 22.0.0git
SPIRVCombinerHelper.cpp
Go to the documentation of this file.
1//===-- SPIRVCombinerHelper.cpp -------------------------------------------===//
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
12#include "llvm/IR/IntrinsicsSPIRV.h"
14
15using namespace llvm;
16using namespace MIPatternMatch;
17
23
24/// This match is part of a combine that
25/// rewrites length(X - Y) to distance(X, Y)
26/// (f32 (g_intrinsic length
27/// (g_fsub (vXf32 X) (vXf32 Y))))
28/// ->
29/// (f32 (g_intrinsic distance
30/// (vXf32 X) (vXf32 Y)))
31///
33 if (MI.getOpcode() != TargetOpcode::G_INTRINSIC ||
34 cast<GIntrinsic>(MI).getIntrinsicID() != Intrinsic::spv_length)
35 return false;
36
37 // First operand of MI is `G_INTRINSIC` so start at operand 2.
38 Register SubReg = MI.getOperand(2).getReg();
39 MachineInstr *SubInstr = MRI.getVRegDef(SubReg);
40 if (SubInstr->getOpcode() != TargetOpcode::G_FSUB)
41 return false;
42
43 return true;
44}
45
47 // Extract the operands for X and Y from the match criteria.
48 Register SubDestReg = MI.getOperand(2).getReg();
49 MachineInstr *SubInstr = MRI.getVRegDef(SubDestReg);
50 Register SubOperand1 = SubInstr->getOperand(1).getReg();
51 Register SubOperand2 = SubInstr->getOperand(2).getReg();
52 Register ResultReg = MI.getOperand(0).getReg();
53
54 Builder.setInstrAndDebugLoc(MI);
55 Builder.buildIntrinsic(Intrinsic::spv_distance, ResultReg)
56 .addUse(SubOperand1)
57 .addUse(SubOperand2);
58
59 MI.eraseFromParent();
60}
unsigned SubReg
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Declares convenience wrapper classes for interpreting MachineInstr instances as specific generic oper...
IRTranslator LLVM IR MI
Contains matchers for matching SSA Machine Instructions.
MachineRegisterInfo & MRI
const LegalizerInfo * LI
MachineDominatorTree * MDT
GISelValueTracking * VT
GISelChangeObserver & Observer
MachineIRBuilder & Builder
Abstract class that contains various methods for clients to notify about changes.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
Helper class to build MachineInstr.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
Register getReg() const
getReg - Returns the register number.
Wrapper class representing virtual and physical registers.
Definition Register.h:19
CombinerHelper(GISelChangeObserver &Observer, MachineIRBuilder &B, bool IsPreLegalize, GISelValueTracking *VT=nullptr, MachineDominatorTree *MDT=nullptr, const LegalizerInfo *LI=nullptr)
SPIRVCombinerHelper(GISelChangeObserver &Observer, MachineIRBuilder &B, bool IsPreLegalize, GISelValueTracking *VT, MachineDominatorTree *MDT, const LegalizerInfo *LI, const SPIRVSubtarget &STI)
const SPIRVSubtarget & STI
void applySPIRVDistance(MachineInstr &MI) const
bool matchLengthToDistance(MachineInstr &MI) const
This match is part of a combine that rewrites length(X - Y) to distance(X, Y) (f32 (g_intrinsic lengt...
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:560