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

    <tr>
        <th>Summary</th>
        <td>
            pragma clang fp contract(fast) does not emit contract flags on calls compared to -ffp-contract=fast
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:codegen,
            floating-point
      </td>
    </tr>

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

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

<pre>
    Enabling fast contract with the pragma misses setting contract flags in some contexts (at a minimum, seems to not apply to any call). They are set if you use the global command line flag.

```
// clang -fno-math-errno -x c  -O3 -S -emit-llvm
// clang -fno-math-errno -ffp-contract=fast -x c  -O3  -S -emit-llvm
#include <math.h>

float enable_contract_fast_basic_ops(float x, float y, float z){
    #pragma clang fp contract(fast)
    x *= y;
    x += z;
    x /= z;
 return x;
}

// contract missing from sqrtf call with only the pragma
// contract is present when using -ffp-contract=fast
float enable_contract_fast_sqrt_call(float x, float y) {
    #pragma clang fp contract(fast)
    return x / sqrtf(y);

}

float enable_contract_fast_builtin_sqrt_call(float x, float y) {
    #pragma clang fp contract(fast)
    return x / __builtin_sqrtf(y);
}

```
For example in this last function, with only the pragma I see:

```
define dso_local float @enable_contract_fast_builtin_sqrt_call(float noundef %0, float noundef %1) local_unnamed_addr #1 {
  %3 = tail call float @llvm.sqrt.f32(float %1) ; missing contract flag
  %4 = fdiv contract float %0, %3
  ret float %4
}

```
Using -ffp-contract=fast:
```
define dso_local float @enable_contract_fast_builtin_sqrt_call(float noundef %0, float noundef %1) local_unnamed_addr #1 {
  %3 = tail call contract float @llvm.sqrt.f32(float %1) ; contract correctly set on everything
  %4 = fdiv contract float %0, %3
  ret float %4
}

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVkGP4yYU_jX48uTIgcRrH3yYmWyknnpoe46wedhUGFzAs8n--gqcZJLZdHeqSitVihL7Bb73-L6PB9x71RvEhmyfyXaX8TkM1jXceTRj1lpxaj4b3mplepDcB-isCY53Ab6oMEAYECbH-5HDqLxHDx5DiIOv46TmvQdlwNsRUxiPwQOhFQ8Qpxk1ziOhL-ARRw_BgrEB-DTpU3zh5gQd15rQegW_D3gC7jCmASXhZGeYPaY6em1brqGz48iNAK0MpuQrUuxI8XT-LovzZ3mle0L30GluesilsfnIw5Cjc8ZCfoQOIP-VQf4b5DiqkGv9On5kppRTfmGAsF1i7g3uMR5TptOzQCDsJWKtBsI-39YuteUBMMqBhwv6IWIfWu5Vd7CTJ7Rahh0jo8vj6e3xK6E1-fS84AEAEMrO-i0rkdNVuQjFfYgzrsOPQOgTYTs4EfZ8H36O4a_fhPfvwg7D7AwcrxHyaXcn0JnXi32irZL5nB3B_-WCTG5Y7GdN9MjVg48RlIfJoUcT4MuABuaE90iiH9Ic8x8WMz6kuYb_Qu6FmsjaslRCq4j6xtUjxr5ni1npoMzPrPtwl_TbFbxT-3477q0DPPJx0hg7RhiUBx33jpxNF5Q1sepHysMvsXsQ9vQdcIEytgTh7UHbjuvz8smm-JfcGTsbgRII3RZvNN5E15HRlOMwG8NHFAcuhIu8rm-ZJnTLIO6PwJVebH2tKXaGVcy9koxeU1_ACXu-7oy7TnsDvUnQUqjX2yFnlFR4zH-Z4PDm381HxPrjn_cR-x8r8J6rj0hxndNZ57AL-pQOKGsAX9GdwqDMz1EmEw0TNat5hs26rNdVxbZVmQ1NvZZYd20r13X9aYtFXfBiI4TYVBvJqm6dqYYWlBXVmlLG6k25kryuxLosi7YsuWRdVGnkSq8SHdb1mfJ-xqbclFuWad6i9ukWQWnqGoQ9dVZgj4ZQSugLoTStQpk-n6wyIYa3u8w1ETBv595HrpUP_i1FUEFj8-NmBMKiT_eGeKy-v3xYk6T18W4wcYci3iseGTebnW6GECYfLZzOkV6FYW5XnR0J3afjevnJJ2f_xFjDPvHgCd0nKv4OAAD__39H5qo">