[llvm-dev] predicate optimization and NaN
Heiko via llvm-dev
llvm-dev at lists.llvm.org
Fri Dec 10 14:44:44 PST 2021
Hello all,
for the AFL++ fuzzer project i wrote an llvm pass for transforming
floating point
comparisons to equivalent integer comparisons which can be splitted into
chains
of byte comparisons. This is a sort of deoptimizing for the purpose of
getting
feedback during fuzzing.
While extending the pass for special values like NaN, I came about a strange
behaviour, that might be a bug in the compiler. I am using clang/llvm
version 12.0.0.
My test case was like this:
double a,b;
a = NAN;
b = NAN;
assert(!(a <= b));
I expected my pass to encounter a FCMP::OLE instruction during
instrumentation.
But with optimization -O3 i got a FCMP::OGT as if i had written
assert((a > b));
Sadly this optimization is not correct for NaN values, which don't
compare to anything.
Without optimization (-O0) everything worked as expected with my pass.
Without my pass everything workedalso (with any optimization level), but
I don't know why.
So my question is, what needs to be done to use optimization with my pass
and have the right (original) predicate delivered?
Thanks very much,
Heiko Eißfeldt
More information about the llvm-dev
mailing list