[llvm] [InstCombine] Add folds for `(fp_binop ({s|u}itofp x), ({s|u}itofp y))` (PR #82555)

via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 14 11:31:38 PDT 2024


goldsteinn wrote:

> This commit `946ea4e3ca4c908bfa7c196b982795f5c390b923` caused the following program to produce inconsistent results:
> 
> ```c
> #include <stdio.h>
> static int g_12 = 0xD010L;
> static float g_842 = 1.0;
> static volatile int g_2345 = 1;
> 
> static float(safe_mul_func_float_f_f)(float sf1, float sf2) {
>   return (((0x1.0p-100f * sf1) * (0x1.0p-28f * sf2)) >
>           (0x1.0p-100f * (0x1.0p-28f * 3.40282347e+38F)))
>              ? (sf1)
>              : (sf1 * sf2);
> }
> 
> static void func_10(int p_11) {
>   g_842 = safe_mul_func_float_f_f(0.0, (short)p_11);
>   g_12 = 65529UL;
>   g_2345 = p_11;
> }
> 
> int main(int argc, char *argv[]) {
>   func_10(g_12);
>   printf("%f\n", g_842);
>   return 0;
> }
> ```
> 
> Before: `-0.000000` After: `0.000000`
> 
> This is my compilation option:
> 
> ```
> build/bin/clang --target=riscv64-unknown-elf -march=rv64gcv -mabi=lp64d src/foo-main.c --gcc-toolchain=${GCC_TOOLCHAIN} --sysroot=${GCC_TOOLCHAIN}/riscv64-unknown-elf -O3
> qemu-riscv64 a.out
> ```
> 
> `safe_mul_func_float_f_f` I removed the call to `fabsf` in order to eliminate the dependency on `math.h`.

Reproduce, I think the issue is we don't check constants are positive for `sitofp` + `fmul`.
If thats the issue, ill have patch up shortly. Otherwise Ill revert.
(A bit reluctant to revert as there are 3 patches that have to go with it, but if can't find fix
shortly will do so).

https://github.com/llvm/llvm-project/pull/82555


More information about the llvm-commits mailing list