<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/101098>101098</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [HLSL] consolidate SPIRV and DirectX `rsqrt` intrinsics into one intrinsic
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:DirectX,
            HLSL,
            backend:SPIR-V
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          farzonl
      </td>
    </tr>
</table>

<pre>
    `rsqrt` was one of the intrinsics we determined should be avaialble across all backends. https://discourse.llvm.org/t/rfc-all-the-math-intrinsics/78294

changes needed:
- clang/include/clang/Basic/Builtins.td convert `__builtin_hlsl_elementwise_rsqrt` to `__builtin_elementwise_rsqrt`
- update `clang/lib/Headers/hlsl/hlsl_intrinsics.h` to use `__builtin_elementwise_rsqrt`
-  update `clang/lib/Sema/SemaChecking.cpp` to use `__builtin_elementwise_rsqrt`
-  update `clang/test/SemaHLSL/BuiltIns/rsqrt-errors.hlsl` to use `__builtin_elementwise_rsqrt`
- `clang/lib/CodeGen/CGBuiltin.cpp`: 
move Rsqrt emit from `EmitHLSLBuiltinExpr` to `EmitBuiltinExpr` Preferably close to where sqrt is today look for `case Builtin::BI__builtin_elementwise_sqrt:`
change  from:
```cpp
return Builder.CreateIntrinsic(
         /*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getRsqrtIntrinsic(),
        ArrayRef<Value *>{Op0}, nullptr, "hlsl.rsqrt");
```
to:
```cpp
return Builder.CreateIntrinsic(
         /*ReturnType=*/Op0->getType(), Intrinsic::rsqrt,
        ArrayRef<Value *>{Op0}, nullptr, "elt.rsqrt");
```
Its possible we will have to support `constrained` intrinsics and thus need an `experimental_constrained_rsqrt`
-  remove rsqrt from `clang/lib/CodeGen/CGHLSLRuntime.h`
-  update tests `clang/test/CodeGenHLSL/builtins/rsqrt.hlsl` should see line count go down since  no intrinsic diff between DirectX and SPIRV.
-  remove `int_spv_rsqrt` from `llvm/include/llvm/IR/IntrinsicsSPIRV.td`
- remove `int_dx_rsqrt from `llvm/include/llvm/IR/IntrinsicsDirectX.td`
-  update `llvm/lib/Target/DirectX/DXIL.td`  to replace `int_dx_rsqrt` with `int_rsqrt`
-  update `llvm/test/CodeGen/DirectX/rsqrt.ll` so that `llvm.dx.rsqrt` becomes `llvm.rsqrt`.
-  update `llvm/test/CodeGen/DirectX/rsqrt_error.ll` so that  `llvm.dx.rsqrt` becomes `llvm.rsqrt`.
-  remove ` SPIRVInstructionSelector::selectRsqrt` `llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp` and replace with:
```cpp
  case TargetOpcode::G_FRSQRT:
    return selectExtInst(ResVReg, ResType, I, CL::rsqrt, GL::InverseSqrt);
```
in `SPIRVInstructionSelector::spvSelect`
- update `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll `so that  `llvm.spv.rsqrt` becomes `llvm.rsqrt`.
- In ` SPIRVInstructionSelector::selectIntrinsic` remove
```cpp
 case Intrinsic::spv_rsqrt:
    return selectRsqrt(ResVReg, ResType, I);
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEV11v4jgX_jXm5ogoOC2UCy4olA5SX828dFTNHXLsA_GOsbO2A-3--pWdD6Ats93uSltVJDn2OY_Ph59jM-fkViNOyPUtuZ73WOULYycbZv8wWvVyI14mZJha97v1ZJjCgTkwGsFswBcIUnsrtZPcwQFBoEe7kxoFuMJUSkCOwPZMMpUrBMatcQ6YUpAz_hO1cAkU3peOZFNCF4QuhHTcVNZhotR-lxi7JXThCV3YDe8zpfq-wP6O-aJ_RCZ0Mbqh4yuSzkk6rX95wfQWHWhEgSKYj-I-cMV0sCk1V5VAQhet5JY5ycOzkspL7RIvgBu9R-uBDNP1Oq8H1oVyao0Kd6j9QTpcd8Hx5nzme5PahVSlYB7D_HYBSuaELr4gE2iDUwGneayP3iZFg1Q5_DjaRbhH3LHmMSuQ_5R6m_Cy_JcwPDrfWP_y8PjQRnepg39Rv4_WGuuS6OwnQN84NDMC71GHt_smlY1DJJtCrbYze4RVsAS4kx421uyCpbud9GGdjd7dc2mPaQ2Drwa-WdygZbl6Aa6MwzDzUKBFiLalA28EewFlzE_YGBtXyxxCYyfUZTa9Xb7vavQ0m3bO1jUNcbVdRYfR-B98jBKLvrI6Qgi0ycwi87hs64fQm3oatH9x401XUev7S4kkmxMatuPXMu2T7G6LPorpDaFjQmcwu_9fssUYqFWlvdw1Y0EYg3oGFnXOIafWspcVbkg2e2KqQgh42R0Z3X4tUzKaBxBdKVV6G14JpaE6kjr1lAaT2e0r9-tPb_7LwBxtxbw26_3HzqPyH_F96R2UxjkZqPaAcJBKQcH2sSpdVZamJjJutPOWBZYONXzC4EwL8EVVsyYwHWbjc4lWhppkan2i-nb3W4zbKsq7HXV5b56UT6S01ywSqMO9wyWNjYZOmn3T0UnHI03_cYigpEbgptIetgaEOWhwUnME0OboPgi52UCO_oCoYS4tcv8jhuTx23L1lLz2kwxTqf3alfsj_7deh9511mMawXIVfrqA14a9OPH-3Lh4Xp-H84OGm9Wfmz6h50arTsp3ZrcYIttohbcfy4daGULxWCwV429WFY8D0het_Bf9oAE8T-EZZJ09VefOgC-YbxUT8Zx0gDlys0PXjbUDyedR17EFvcL-JPgxf3XZLMOGqbiXRj-iQu6NrcnBxa9Va_liUqKV9vmOtbZZh0Jt8xSS8gseBIg9qIb4WnIjsF7T_Xqxevz_6nunG_iqYc16vXfPoXd7Qm9W6J5WuA0UtUJX8-AMlrE_PJzzH9w3gmU4TDl8jOKLPCYj7_xF9Mp9LXj3QHUp720sA0ecnx_b6gvabyrAlfu_UQJL_eHsH_vFMG0q52LOYspeNZgj91xMWF1gv0jXO2noiUkmxtmY9XAyGFFKx1k2pL1iwvloI_hgOB5lmObXw2HKN2yQcX6Dg814OOrJCU3pVTqiY0qvxpQmOKLXI5FdbQZ5xobpgFyluGNSdaf7nnSuwskgHaTjm55iOSoXryKUNlcEkk27_UpDN6W05v7m4zgthLz_FAau5z07CRD9vNo6cpUq6bw7gnrpVbzxREvX83DOd0bJWEAxc3E_tU3g9P5z0i6l9ibehTpZr7Jqcn6h2UpfVHnCze7I1nFlpTW_hQKmixiCUIVNFPYT-mcAAAD__0FcVAQ">