[llvm] [AMDGPU] Adopt new lowering sequence for `fdiv16` (PR #109295)

Shilei Tian via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 23 14:14:42 PDT 2024


================
@@ -4900,16 +4900,40 @@ bool AMDGPULegalizerInfo::legalizeFDIV16(MachineInstr &MI,
   LLT S16 = LLT::scalar(16);
   LLT S32 = LLT::scalar(32);
 
+  // a32.u = opx(V_CVT_F32_F16, a.u); // CVT to F32
+  // b32.u = opx(V_CVT_F32_F16, b.u); // CVT to F32
+  // r32.u = opx(V_RCP_F32, b32.u); // rcp = 1 / d
+  // q32.u = opx(V_MUL_F32, a32.u, r32.u); // q = n * rcp
+  // e32.u = opx(V_MAD_F32, (b32.u^_neg32), q32.u, a32.u); // err = -d * q + n
+  // q32.u = opx(V_MAD_F32, e32.u, r32.u, q32.u); // q = n * rcp
+  // e32.u = opx(V_MAD_F32, (b32.u^_neg32), q32.u, a32.u); // err = -d * q + n
+  // tmp.u = opx(V_MUL_F32, e32.u, r32.u);
+  // tmp.u = opx(V_AND_B32, tmp.u, 0xff800000)
+  // q32.u = opx(V_ADD_F32, tmp.u, q32.u);
+  // q16.u = opx(V_CVT_F16_F32, q32.u);
+  // q16.u = opx(V_DIV_FIXUP_F16, q16.u, b.u, a.u); // q = touchup(q, d, n)
+
   auto LHSExt = B.buildFPExt(S32, LHS, Flags);
   auto RHSExt = B.buildFPExt(S32, RHS, Flags);
-
-  auto RCP = B.buildIntrinsic(Intrinsic::amdgcn_rcp, {S32})
+  auto NegRHSExt = B.buildFNeg(S32, RHSExt);
+  auto Rcp = B.buildIntrinsic(Intrinsic::amdgcn_rcp, {S32})
                  .addUse(RHSExt.getReg(0))
                  .setMIFlags(Flags);
-
-  auto QUOT = B.buildFMul(S32, LHSExt, RCP, Flags);
-  auto RDst = B.buildFPTrunc(S16, QUOT, Flags);
-
+  auto Quot = B.buildFMul(S32, LHSExt, Rcp);
+  MachineInstrBuilder Err;
+  if (ST.hasMadMacF32Insts()) {
----------------
shiltian wrote:

@arsenm Is this check what you meant? It looks like this somehow triggers an issue in instruction selection (globalisel).

```
*** Bad machine code: VOP* instruction violates constant bus restriction ***
- function:    s_fdiv_v2f16
- basic block: %bb.1  (0x5ab94f243140)
- instruction: %19:vgpr_32 = V_MAD_MIX_F32 13, %1:sreg_32, 0, %18:vgpr_32, 12, %0:sreg_32, 0, 0, 0, implicit $mode, implicit $exec

*** Bad machine code: VOP* instruction violates constant bus restriction ***
- function:    s_fdiv_v2f16
- basic block: %bb.1  (0x5ab94f243140)
- instruction: %21:vgpr_32 = V_MAD_MIX_F32 13, %1:sreg_32, 0, %20:vgpr_32, 12, %0:sreg_32, 0, 0, 0, implicit $mode, implicit $exec
```

https://github.com/llvm/llvm-project/pull/109295


More information about the llvm-commits mailing list