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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization for `fdiv` followed by `fmul`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm
      </td>
    </tr>

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

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

<pre>
    I wonder whether rewriting `@src` to `@trg` would be a valid optimization?
```ll
define float @src(float %0) {
  %2 = fdiv float %0, 6.000000e+00
  %3 = fmul float %2, 3.000000e+00
  ret float %3
}

define float @trg(float %0) {
  %2 = fdiv float %0, 2.000000e+00
  ret float %2
}
```
since $\frac{x}{6.0} * 3.0 = \frac{x}{2.0}$.

I've tried to verify this via `alive-tv`, but it times out due to the floating point numbers. I've tried locally with `--smt-to=3600000` (1 hour timeout).

Intuitively, I would say that the optimization is valid because it should make the results **more** accurate.

For example, the result for 7664.71 is more accurate via `f2` (with the suggested optimization) than `f1` (without the suggested optimization) in Julia:

```julia
julia> f1(x) = x / 6.0 * 3.0;

julia> f1(0.2)
0.1

julia> f2(x) = x / 2.0;

julia> f2(0.2)
0.1

julia> @code_llvm dump_module=false debuginfo=:none f1(0.2)
define double @julia_f1_1438(double %0) #0 {
top:
  %1 = fdiv double %0, 6.000000e+00
  %2 = fmul double %1, 3.000000e+00
  ret double %2
}

julia> @code_llvm dump_module=false debuginfo=:none f2(0.2)
define double @julia_f2_1440(double %0) #0 {
top:
  %1 = fmul double %0, 5.000000e-01
  ret double %1
}

julia> f1(7664.71) * 2
7664.709999999999

julia> f2(7664.71) * 2
7664.71
```

So would an optimization for $\frac{x}{a} * b$ be valid for certain `a` and `b`?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVttu4zYQ_Rr6hbBBDXXzgx7sdQ1sgT71AwJKGlnMUqLBi53s1xek5NhOvG6xqBAkJDVneOZweBRhrTyMiBXJtiTbLYR3vTaVkT96L19_olnUun2vvtOzHls09Nyj69FQg2cjnRwPlOSMpMyahuSMOj3PnTmE-Vl71dIaqaAnoWRL9dHJQf4UTuqR8D1hO8I2ARJ_lJoWWuzkiLRTWjg6Z4dynkLGCKwpKbZTMA1LQAnf0a6VJ3ob9o3mKxYfJLBl7AbBJ8Tg1RUBAcEfIgy6axyfeRe7efCQddDgN1nDv3OAzxwuIk5TK8cGKYGUZN86IxpSbN9CbLHNV4wUO0pgE0qNDL7EQIwhkK5uC_xOoDghdUZiG476hEZ279T10tKTFOHohZInXLpT4AHfaO0dlY46OaCl2jvaegxI1886hQ46ajk6OvqhRmNX9G4XpRuh1Ds9S9eH_MulHdzSacJ3PI8ShTYjUCa0197EnbR3BNb3zEfnpZMnVO-B1ve5Ma0I7IWLfG5bk4aKYsPW2AhvMVRh-wgaxA-MAIPWK2eDkgQ2gzY4jahoGm-EwzsKe20ovonhqDBQuCagnTa0yPN0VSRh35DoI8VF1w7mOqMQAWz94YDW4ac7BetQ0RgxyQ0miP8cJkf6p1dSEL655f3RV6_xZVybhvwP2iUEyrfY2HxH3yiBfbhxl-YifHub6h7GVkBgPb1hq-RxIHzND0_ywn_MS1LW6BZflDoNtPXD8WXQrVdI-K4TyiJtsfYHOXah0QjfjDpc7M-s5wvfal8rDDlj_pcueUlSXhIoL28ulx84uzqA08cPqaMbJFc3uAM-MTG4mtgVkjx3sWvgFwv5P0T6fAS_EglekjRlvyvSfcVRpOxS8ZIlj-tNntcbz3e-iBOTDZ0lmlbZ-uP5dfs9S5A8tOrp9996NiUx3ltRsIdHPi4uLl4TSMM3djKsEN6gcUJGExDBA8TYhnEdtuT7RVvxds3XYoFVUjBepmmZFou-KjDHAtdpiTxtIYe0LnlWtCJLMyhZCwtZAQOeAKwTlqSsWGFe1wXHsqjzssxYR1KGg5BqFXpmpc1hIa31WBV5lq0XStSobPxXA2CQ1mK7vHeh8AEmAAEdJtluYaowWdb-YEnKlLTOXpM76RRWf8VMD0TLWbhMQYBOK6XP2NL6PS4PXpGcLbxRVe_c0YYegz2B_UG63terRg8E9hON-Gd5NPoVG0dgHyuyBPaxqH8CAAD__0iinb0">