<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">