1*5ffd83dbSDimitry Andric//=- AMDGPUCombine.td - Define AMDGPU Combine Rules ----------*- tablegen -*-=// 2*5ffd83dbSDimitry Andric// 3*5ffd83dbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5ffd83dbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*5ffd83dbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5ffd83dbSDimitry Andric// 7*5ffd83dbSDimitry Andric//===----------------------------------------------------------------------===// 8*5ffd83dbSDimitry Andric 9*5ffd83dbSDimitry Andricinclude "llvm/Target/GlobalISel/Combine.td" 10*5ffd83dbSDimitry Andric 11*5ffd83dbSDimitry Andric// TODO: This really belongs after legalization after scalarization. 12*5ffd83dbSDimitry Andric// TODO: GICombineRules should accept subtarget predicates 13*5ffd83dbSDimitry Andric 14*5ffd83dbSDimitry Andricdef fmin_fmax_legacy_matchdata : GIDefMatchData<"FMinFMaxLegacyInfo">; 15*5ffd83dbSDimitry Andric 16*5ffd83dbSDimitry Andricdef fcmp_select_to_fmin_fmax_legacy : GICombineRule< 17*5ffd83dbSDimitry Andric (defs root:$select, fmin_fmax_legacy_matchdata:$matchinfo), 18*5ffd83dbSDimitry Andric (match (wip_match_opcode G_SELECT):$select, 19*5ffd83dbSDimitry Andric [{ return matchFMinFMaxLegacy(*${select}, MRI, *MF, ${matchinfo}); }]), 20*5ffd83dbSDimitry Andric (apply [{ applySelectFCmpToFMinToFMaxLegacy(*${select}, ${matchinfo}); }])>; 21*5ffd83dbSDimitry Andric 22*5ffd83dbSDimitry Andric 23*5ffd83dbSDimitry Andricdef uchar_to_float : GICombineRule< 24*5ffd83dbSDimitry Andric (defs root:$itofp), 25*5ffd83dbSDimitry Andric (match (wip_match_opcode G_UITOFP, G_SITOFP):$itofp, 26*5ffd83dbSDimitry Andric [{ return matchUCharToFloat(*${itofp}, MRI, *MF, Helper); }]), 27*5ffd83dbSDimitry Andric (apply [{ applyUCharToFloat(*${itofp}); }])>; 28*5ffd83dbSDimitry Andric 29*5ffd83dbSDimitry Andricdef cvt_f32_ubyteN_matchdata : GIDefMatchData<"CvtF32UByteMatchInfo">; 30*5ffd83dbSDimitry Andric 31*5ffd83dbSDimitry Andricdef cvt_f32_ubyteN : GICombineRule< 32*5ffd83dbSDimitry Andric (defs root:$cvt_f32_ubyteN, cvt_f32_ubyteN_matchdata:$matchinfo), 33*5ffd83dbSDimitry Andric (match (wip_match_opcode G_AMDGPU_CVT_F32_UBYTE0, 34*5ffd83dbSDimitry Andric G_AMDGPU_CVT_F32_UBYTE1, 35*5ffd83dbSDimitry Andric G_AMDGPU_CVT_F32_UBYTE2, 36*5ffd83dbSDimitry Andric G_AMDGPU_CVT_F32_UBYTE3):$cvt_f32_ubyteN, 37*5ffd83dbSDimitry Andric [{ return matchCvtF32UByteN(*${cvt_f32_ubyteN}, MRI, *MF, ${matchinfo}); }]), 38*5ffd83dbSDimitry Andric (apply [{ applyCvtF32UByteN(*${cvt_f32_ubyteN}, ${matchinfo}); }])>; 39*5ffd83dbSDimitry Andric 40*5ffd83dbSDimitry Andric// Combines which should only apply on SI/VI 41*5ffd83dbSDimitry Andricdef gfx6gfx7_combines : GICombineGroup<[fcmp_select_to_fmin_fmax_legacy]>; 42*5ffd83dbSDimitry Andric 43*5ffd83dbSDimitry Andric 44*5ffd83dbSDimitry Andricdef AMDGPUPreLegalizerCombinerHelper: GICombinerHelper< 45*5ffd83dbSDimitry Andric "AMDGPUGenPreLegalizerCombinerHelper", [all_combines, 46*5ffd83dbSDimitry Andric elide_br_by_inverting_cond]> { 47*5ffd83dbSDimitry Andric let DisableRuleOption = "amdgpuprelegalizercombiner-disable-rule"; 48*5ffd83dbSDimitry Andric} 49*5ffd83dbSDimitry Andric 50*5ffd83dbSDimitry Andric 51*5ffd83dbSDimitry Andric// FIXME: combines_for_extload can introduce illegal extloads which 52*5ffd83dbSDimitry Andric// aren't re-legalized. 53*5ffd83dbSDimitry Andric// FIXME: Is there a way to remove a single item from all_combines? 54*5ffd83dbSDimitry Andricdef all_combines_minus_extload : GICombineGroup<[trivial_combines, 55*5ffd83dbSDimitry Andric ptr_add_immed_chain, combine_indexed_load_store, undef_combines, 56*5ffd83dbSDimitry Andric identity_combines] 57*5ffd83dbSDimitry Andric>; 58*5ffd83dbSDimitry Andric 59*5ffd83dbSDimitry Andricdef AMDGPUPostLegalizerCombinerHelper: GICombinerHelper< 60*5ffd83dbSDimitry Andric "AMDGPUGenPostLegalizerCombinerHelper", 61*5ffd83dbSDimitry Andric [all_combines_minus_extload, gfx6gfx7_combines, 62*5ffd83dbSDimitry Andric uchar_to_float, cvt_f32_ubyteN]> { 63*5ffd83dbSDimitry Andric let DisableRuleOption = "amdgpupostlegalizercombiner-disable-rule"; 64*5ffd83dbSDimitry Andric} 65*5ffd83dbSDimitry Andric 66*5ffd83dbSDimitry Andricdef AMDGPURegBankCombinerHelper : GICombinerHelper< 67*5ffd83dbSDimitry Andric "AMDGPUGenRegBankCombinerHelper", []> { 68*5ffd83dbSDimitry Andric let DisableRuleOption = "amdgpuregbankcombiner-disable-rule"; 69*5ffd83dbSDimitry Andric} 70