[PATCH] D4583: don't transform splats of vector FP (PR20358)
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 22 09:37:38 PST 2015
spatel added a comment.
I just connected the dots between this case and other recent speculative execution bugs/patches:
https://llvm.org/bugs/show_bug.cgi?id=24343
https://llvm.org/bugs/show_bug.cgi?id=24818
https://llvm.org/bugs/show_bug.cgi?id=25572
http://reviews.llvm.org/D12882
http://reviews.llvm.org/D13297
http://reviews.llvm.org/D14630
This splat is just a special (and probably extremely rare) case of the general problem:
#define DENORM ((float)(1.0e-39))
float foo(float x, float y) {
if (x > DENORM) return x * y;
else return y;
}
$ ./clang -O2 denorm.c -S -o - -emit-llvm
define float @foo(float %x, float %y) #0 {
%cmp = fcmp ogt float %x, 0x37D5C73000000000
%mul = fmul float %x, %y <--- crazy expensive op that we wanted to avoid just got executed
%retval.0 = select i1 %cmp, float %mul, float %y
ret float %retval.0
}
Unless there is objection, I'll abandon this patch. If we really want to solve this, we'd have to add some global flag (-fno-speculative-fp-math?) or instruction-level annotation to include FP ops under !isSafeToSpeculativelyExecute().
http://reviews.llvm.org/D4583
More information about the llvm-commits
mailing list