aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorHarald van Dijk <harald.vandijk@codeplay.com>2025-06-25 16:37:06 +0100
committerGitHub <noreply@github.com>2025-06-25 16:37:06 +0100
commit46ee7f1908f467d8feb5617e097c88be1401296c (patch)
tree0e1e81027e3376a24edb90b11a3105f6a1d4d721 /flang/lib/Frontend/CompilerInvocation.cpp
parent8202c94cec415400ee49ab287628261809542fed (diff)
downloadllvm-46ee7f1908f467d8feb5617e097c88be1401296c.zip
llvm-46ee7f1908f467d8feb5617e097c88be1401296c.tar.gz
llvm-46ee7f1908f467d8feb5617e097c88be1401296c.tar.bz2
[libclc] Avoid out-of-range float-to-int. (#145698)
For a kernel such as kernel void foo(__global double3 *z) { double3 x = {0.6631661088,0.6612268107,0.1513627528}; int3 y = {-1980459213,-660855407,615708204}; *z = pown(x, y); } we were not storing anything to z, because the implementation of pown relied on an floating-point-to-integer conversion where the floating-point value was outside of the integer's range. Although in LLVM IR we permit that operation so long as we end up ignoring its result -- that is the general rule for poison -- one thing we are not permitted to do is have conditional branches that depend on it, and through the call to __clc_ldexp, we did have that. To fix this, rather than changing expv at the end to INFINITY/0, we can change v at the start to values that we know will produce INFINITY/0 without performing such out-of-range conversions. Tested with clang --target=nvptx64 -S -O3 -o - test.cl \ -Xclang -mlink-builtin-bitcode \ -Xclang runtimes/runtimes-bins/libclc/nvptx64--.bc A grep showed that this exact same code existed in three more places, so I changed it there too, though I did not do a broader search for other similar code that potentially has the same problem.
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions