13 #include "llvm/IR/IntrinsicsAMDGPU.h"
17 using namespace MIPatternMatch;
21 switch (
MI.getOpcode()) {
27 case AMDGPU::G_FMINNUM:
28 case AMDGPU::G_FMAXNUM:
29 case AMDGPU::G_FMINNUM_IEEE:
30 case AMDGPU::G_FMAXNUM_IEEE:
33 case AMDGPU::G_INTRINSIC_TRUNC:
34 case AMDGPU::G_FPTRUNC:
36 case AMDGPU::G_FNEARBYINT:
37 case AMDGPU::G_INTRINSIC_ROUND:
38 case AMDGPU::G_INTRINSIC_ROUNDEVEN:
39 case AMDGPU::G_FCANONICALIZE:
40 case AMDGPU::G_AMDGPU_RCP_IFLAG:
41 case AMDGPU::G_AMDGPU_FMIN_LEGACY:
42 case AMDGPU::G_AMDGPU_FMAX_LEGACY:
44 case AMDGPU::G_INTRINSIC: {
45 unsigned IntrinsicID =
MI.getIntrinsicID();
46 switch (IntrinsicID) {
47 case Intrinsic::amdgcn_rcp:
48 case Intrinsic::amdgcn_rcp_legacy:
49 case Intrinsic::amdgcn_sin:
50 case Intrinsic::amdgcn_fmul_legacy:
51 case Intrinsic::amdgcn_fmed3:
52 case Intrinsic::amdgcn_fma_legacy:
69 return MI.getNumOperands() >
70 (
MI.getOpcode() == AMDGPU::G_INTRINSIC ? 4u : 3u) ||
77 if (!
MI.memoperands().empty())
80 switch (
MI.getOpcode()) {
82 case AMDGPU::G_SELECT:
87 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS:
88 case AMDGPU::G_BITCAST:
89 case AMDGPU::G_ANYEXT:
90 case AMDGPU::G_BUILD_VECTOR:
91 case AMDGPU::G_BUILD_VECTOR_TRUNC:
94 case AMDGPU::G_INTRINSIC: {
95 unsigned IntrinsicID =
MI.getIntrinsicID();
96 switch (IntrinsicID) {
97 case Intrinsic::amdgcn_interp_p1:
98 case Intrinsic::amdgcn_interp_p2:
99 case Intrinsic::amdgcn_interp_mov:
100 case Intrinsic::amdgcn_interp_p1_f16:
101 case Intrinsic::amdgcn_interp_p2_f16:
102 case Intrinsic::amdgcn_div_scale:
120 unsigned NumMayIncreaseSize = 0;
136 return Options.NoSignedZerosFPMath ||
MI.getFlag(MachineInstr::MIFlag::FmNsz);
143 APInt(64, 0x3fc45f306dc9c882));
167 case AMDGPU::G_FMAXNUM:
168 return AMDGPU::G_FMINNUM;
169 case AMDGPU::G_FMINNUM:
170 return AMDGPU::G_FMAXNUM;
171 case AMDGPU::G_FMAXNUM_IEEE:
172 return AMDGPU::G_FMINNUM_IEEE;
173 case AMDGPU::G_FMINNUM_IEEE:
174 return AMDGPU::G_FMAXNUM_IEEE;
175 case AMDGPU::G_AMDGPU_FMAX_LEGACY:
176 return AMDGPU::G_AMDGPU_FMIN_LEGACY;
177 case AMDGPU::G_AMDGPU_FMIN_LEGACY:
178 return AMDGPU::G_AMDGPU_FMAX_LEGACY;
204 case AMDGPU::G_FMINNUM:
205 case AMDGPU::G_FMAXNUM:
206 case AMDGPU::G_FMINNUM_IEEE:
207 case AMDGPU::G_FMAXNUM_IEEE:
208 case AMDGPU::G_AMDGPU_FMIN_LEGACY:
209 case AMDGPU::G_AMDGPU_FMAX_LEGACY:
219 case AMDGPU::G_FPEXT:
220 case AMDGPU::G_INTRINSIC_TRUNC:
221 case AMDGPU::G_FPTRUNC:
222 case AMDGPU::G_FRINT:
223 case AMDGPU::G_FNEARBYINT:
224 case AMDGPU::G_INTRINSIC_ROUND:
225 case AMDGPU::G_INTRINSIC_ROUNDEVEN:
227 case AMDGPU::G_FCANONICALIZE:
228 case AMDGPU::G_AMDGPU_RCP_IFLAG:
230 case AMDGPU::G_INTRINSIC: {
232 switch (IntrinsicID) {
233 case Intrinsic::amdgcn_rcp:
234 case Intrinsic::amdgcn_rcp_legacy:
235 case Intrinsic::amdgcn_sin:
236 case Intrinsic::amdgcn_fmul_legacy:
237 case Intrinsic::amdgcn_fmed3:
239 case Intrinsic::amdgcn_fma_legacy:
278 replaceRegOpWith(
MRI,
X, XReg);
280 replaceRegOpWith(
MRI,
Y, YReg);
283 replaceRegOpWith(
MRI,
Y, YReg);
287 Builder.setInstrAndDebugLoc(*MatchInfo);
300 case AMDGPU::G_FMINNUM:
301 case AMDGPU::G_FMAXNUM:
302 case AMDGPU::G_FMINNUM_IEEE:
303 case AMDGPU::G_FMAXNUM_IEEE:
304 case AMDGPU::G_AMDGPU_FMIN_LEGACY:
305 case AMDGPU::G_AMDGPU_FMAX_LEGACY: {
309 replaceOpcodeWith(*MatchInfo, Opposite);
317 case AMDGPU::G_FPEXT:
318 case AMDGPU::G_INTRINSIC_TRUNC:
319 case AMDGPU::G_FRINT:
320 case AMDGPU::G_FNEARBYINT:
321 case AMDGPU::G_INTRINSIC_ROUND:
322 case AMDGPU::G_INTRINSIC_ROUNDEVEN:
324 case AMDGPU::G_FCANONICALIZE:
325 case AMDGPU::G_AMDGPU_RCP_IFLAG:
326 case AMDGPU::G_FPTRUNC:
329 case AMDGPU::G_INTRINSIC: {
331 switch (IntrinsicID) {
332 case Intrinsic::amdgcn_rcp:
333 case Intrinsic::amdgcn_rcp_legacy:
334 case Intrinsic::amdgcn_sin:
337 case Intrinsic::amdgcn_fmul_legacy:
340 case Intrinsic::amdgcn_fmed3:
345 case Intrinsic::amdgcn_fma_legacy:
363 replaceRegWith(
MRI, Dst, MatchInfoDst);
370 replaceRegOpWith(
MRI, MatchInfo->
getOperand(0), NegatedMatchInfo);
373 replaceRegWith(
MRI, Dst, NegatedMatchInfo);
377 Builder.setInstrAndDebugLoc(*NextInst);
378 Builder.buildFNeg(MatchInfoDst, NegatedMatchInfo,
MI.getFlags());
381 MI.eraseFromParent();