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

    <tr>
        <th>Summary</th>
        <td>
            __builtin_powf seems buggy on FreeBSD
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Not sure if this is a clang bug or FreeBSD bug, but consider:

```c++
#include <cmath>
#include <iostream>

int main()
{
  if (std::pow(10.0f, 11.0f) == __builtin_powf(10.0f, 11.0f))
 std::cout << "Equals __builtin_powf\n";
  else
    std::cout << "Unequal to __builtin_powf\n";

  if (std::pow(10.0f, 11.0f) == __builtin_powif(10.0f, 11))
    std::cout << "Equals __builtin_powif\n";
  else
    std::cout << "Unequal to __builtin_powif\n";

  std::cout << "32-bit float difference: " << (std::pow(10.0f, 11.0f) - 1e11f) << std::endl;
  std::cout << "64-bit double difference: " << (std::pow(10.0f, 11.0f) - 1e11) << std::endl;
}
```

On my x86_64 FreeBSD VM, this gives:

```console
builder@ganesha:~ $ uname -a
FreeBSD ganesha 14.2-RELEASE-p1 FreeBSD 14.2-RELEASE-p1 GENERIC amd64

builder@ganesha:~ $ clang++ --version
FreeBSD clang version 18.1.6 (https://github.com/llvm/llvm-project.git llvmorg-18.1.6-0-g1118c2e05e67)
Target: x86_64-unknown-freebsd14.2
Thread model: posix
InstalledDir: /usr/bin

builder@ganesha:~ $ clang++ test.cxx

builder@ganesha:~ $ ./a.out
Equals __builtin_powf
Unequal to __builtin_powif
32-bit float difference: 8192
64-bit double difference: 6144
```

Whereas on macOS and OpenBSD (on the same hardware) it gives:

```console
Equals __builtin_powf
Equals __builtin_powif
32-bit float difference: 0
64-bit double difference: -2048
```

Same result on x86_64 with clang 19.1 on godbolt:

https://godbolt.org/z/sceY9da3b

Only the FreeBSD case is different from everyone else.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zYQ_TX0ZSCBpCRHOuigxHaxQLsBNv1ATwEljSS2FOmSVJz00N9eUHKcbRI7WHQBApY55ON7w3kjCedkrxFLkl2TbLMSkx-MLR0KPa5q0z6Vn40HN1kE2YEfpAPpQECjhO6hnnowFnYW8fpuE_4SfgP15KEx2skWLUkqQuexpstoCL8Og1aEJ1I3amoRSHLTjMIPJNm-CUjjvEUxHmO0ktrDKKQmPCe8CHNXAQ4CQ8Jz59twalLtzYHwnNGYdoEWY_NDASTZkGQD9_f1JJWX-n5vDt17Kxd0OAE2ZvKBEUlugHC-_WsSyr3GyW404ZwkCyVUDucHOAvzi8YABN5cgvq_AuUrhS_yLlB7T6H8jhLlOxrPYSQ8qqWHThnhoZVdhxZ1gySpQvRl4cfpiYAhY8dMzbtOW1C36lnXOSLrdCbSmqlW-D2YXCZCrjZf22dJ062G8Qke8_X9Oj3Z79efAvjs0V4-oHvHe0Y7o8JthUsI9kxpLzS6QZCk-gcIT2HSYkSIBKHVM_BxCbA05tGX7Y_b6m4b7dnp4NfzP2w_b798ugExtut0oXD-vLmTLD0BougBrZNGf3X40mmO88DymMXrkNzB-_0ske8I3_XSD1MdN2YkfKfUw_NPtLfmD2x83EsPYcLYPlpAIhr1jLG84UgzXF8tdvhZ2B59uMslu9Gk_9TmoKPOItauDVrDssGiaGE0LaqweG-cfCS0-qSdF0phu5F2KYjd5Czhu1rqb8mER-fj5vHxoz0x4TsRm8kTWr3fj2h1wX20umCrnBVB6qV6X7M0fVudvw1oUTgwGkbR3N6B0C3c7lGH-yQ8Nxr8gOBCoQ3CtgdhMZhA-o8L95zIM63qokD6gbqI0zR_K-8u8LboJuWDxKMLD9IPx2JlRcxCpDdtbZQ_yXlVsks0NrYnfPc34TvX4O9FK5L62eTqaU7UyQrCYXj9PrP00FkzAj6gfTIa504cr9oyaYukECss2VVSFHnBE7YaSt4xRhvades2RdG1XUu7JMvaouvyTIh0JUtOeUY5K1jOacLiIk_zYp3lRZOLbJ1xklIchVRxMFLgvZLOTVgyfpWnbKVEjcrNXxKcazzAHA3dPdusbDnbsZ56R1KqpPPuBcZLr7D8752CQxxd-Kbon0Iyj0lYTVaV3-Z9wnczE0f47kj1oeT_BgAA___l0q3l">