[llvm] AMDGPU/GlobalISel: RegBankLegalize rules for BVH intersect ray (PR #192583)
Petar Avramovic via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 17 00:45:12 PDT 2026
================
@@ -703,6 +722,120 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
.Any({{DivBRC, BRC, B64, DivS32},
{{VgprBRC}, {VgprBRC, VgprB64, Vgpr32}, InsVecEltToSel}});
+ addRulesForGOpcs({G_AMDGPU_BVH_INTERSECT_RAY})
+ // GFX11+, f32 ray, i64 (3x V3S32)
+ .Any({{UniV4S32, _, S64, S32, V3S32, V3S32, V3S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr64, Vgpr32, VgprV3S32, VgprV3S32, VgprV3S32,
+ SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S64, S32, V3S32, V3S32, V3S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr64, Vgpr32, VgprV3S32, VgprV3S32, VgprV3S32,
+ SgprV4S32_WF}}})
+ // GFX11+, f32 ray, i32 (3x V3S32)
+ .Any({{UniV4S32, _, S32, S32, V3S32, V3S32, V3S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, VgprV3S32, VgprV3S32, VgprV3S32,
+ SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, V3S32, V3S32, V3S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, VgprV3S32, VgprV3S32, VgprV3S32,
+ SgprV4S32_WF}}})
+ // GFX11+, f16 ray, i64 (2x V3S32)
+ .Any({{UniV4S32, _, S64, S32, V3S32, V3S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr64, Vgpr32, VgprV3S32, VgprV3S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S64, S32, V3S32, V3S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr64, Vgpr32, VgprV3S32, VgprV3S32, SgprV4S32_WF}}})
+ // GFX11+, f16 ray, i32 (2x V3S32)
+ .Any({{UniV4S32, _, S32, S32, V3S32, V3S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, VgprV3S32, VgprV3S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, V3S32, V3S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, VgprV3S32, VgprV3S32, SgprV4S32_WF}}})
+ // GFX10 scalarized, f32 ray, i64 (12 S32)
+ .Any({{UniV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32,
+ S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32,
+ S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ // GFX10 scalarized, f32 ray, i32 (11 S32)
+ .Any({{UniV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32,
+ V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32, S32,
+ V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ // GFX10 scalarized, f16 ray, i64 (9 S32)
+ .Any({{UniV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, Vgpr32, SgprV4S32_WF}}})
+ // GFX10 scalarized, f16 ray, i32 (8 S32)
+ .Any({{UniV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, V4S32},
+ {{UniInVgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, S32, S32, S32, S32, S32, S32, S32, S32, V4S32},
+ {{VgprV4S32},
+ {Imm, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32, Vgpr32,
+ Vgpr32, SgprV4S32_WF}}})
+ // GFX10 merged, f32 ray, i64 (V12S32)
+ .Any({{UniV4S32, _, V12S32, V4S32},
+ {{UniInVgprV4S32}, {Imm, VgprV12S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, V12S32, V4S32},
+ {{VgprV4S32}, {Imm, VgprV12S32, SgprV4S32_WF}}})
+ // GFX10 merged, f32 ray, i32 (V11S32)
+ .Any({{UniV4S32, _, V11S32, V4S32},
+ {{UniInVgprV4S32}, {Imm, VgprV11S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, V11S32, V4S32},
+ {{VgprV4S32}, {Imm, VgprV11S32, SgprV4S32_WF}}})
+ // GFX10 merged, f16 ray, i64 (V9S32)
+ .Any({{UniV4S32, _, V9S32, V4S32},
+ {{UniInVgprV4S32}, {Imm, VgprV9S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, V9S32, V4S32},
+ {{VgprV4S32}, {Imm, VgprV9S32, SgprV4S32_WF}}})
+ // GFX10 merged, f16 ray, i32 (V8S32)
+ .Any({{UniV4S32, _, V8S32, V4S32},
+ {{UniInVgprV4S32}, {Imm, VgprV8S32, SgprV4S32_WF}}})
+ .Any({{DivV4S32, _, V8S32, V4S32},
+ {{VgprV4S32}, {Imm, VgprV8S32, SgprV4S32_WF}}});
+
+ addRulesForGOpcs({G_AMDGPU_BVH_DUAL_INTERSECT_RAY})
+ .Any({{UniV10S32, V3S32, V3S32},
+ {{UniInVgprV10S32, UniInVgprV3S32, UniInVgprV3S32},
+ {Imm, Vgpr64, VgprV2S32, VgprV3S32, VgprV3S32, VgprV2S32,
+ SgprV4S32_WF}}})
+ .Any({{DivV10S32, V3S32, V3S32},
+ {{VgprV10S32, VgprV3S32, VgprV3S32},
+ {Imm, Vgpr64, VgprV2S32, VgprV3S32, VgprV3S32, VgprV2S32,
+ SgprV4S32_WF}}});
+
+ addRulesForGOpcs({G_AMDGPU_BVH8_INTERSECT_RAY})
----------------
petar-avramovic wrote:
These have too many operands, think it would be better to write something similar to ApplyINTRIN_IMAGE (probably can share some code) and explain in comment what we are doing
https://github.com/llvm/llvm-project/pull/192583
More information about the llvm-commits
mailing list