diff options
author | Daniel Stone <daniels@collabora.com> | 2021-08-19 22:24:19 -0700 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2021-08-19 22:24:19 -0700 |
commit | 59510c421208e178de63b3640787d02ad56deb37 (patch) | |
tree | d157599d60961e84a69560d562dac1f24ab1dfdb /libclc | |
parent | 9b0f292e8270f0200311a819a028e0c7b4417635 (diff) | |
download | llvm-59510c421208e178de63b3640787d02ad56deb37.zip llvm-59510c421208e178de63b3640787d02ad56deb37.tar.gz llvm-59510c421208e178de63b3640787d02ad56deb37.tar.bz2 |
libclc: Fix rounding during type conversion
The rounding during type conversion uses multiple conversions, selecting
between them to try to discover if rounding occurred. This appears to
not have been tested, since it would generate code of the form:
float convert_float_rtp(char x)
{
float r = convert_float(x);
char y = convert_char(y);
[...]
}
which will access uninitialised data. The idea appears to have been to
have done a char -> float -> char roundtrip in order to discover the
rounding, so do this.
Discovered by inspection.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed By: jvesely
Differential Revision: https://reviews.llvm.org/D81999
Diffstat (limited to 'libclc')
-rw-r--r-- | libclc/generic/lib/gen_convert.py | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/libclc/generic/lib/gen_convert.py b/libclc/generic/lib/gen_convert.py index 7e649fa..4692440 100644 --- a/libclc/generic/lib/gen_convert.py +++ b/libclc/generic/lib/gen_convert.py @@ -355,7 +355,7 @@ def generate_float_conversion(src, dst, size, mode, sat): print(" return convert_{DST}{N}(x);".format(DST=dst, N=size)) else: print(" {DST}{N} r = convert_{DST}{N}(x);".format(DST=dst, N=size)) - print(" {SRC}{N} y = convert_{SRC}{N}(y);".format(SRC=src, N=size)) + print(" {SRC}{N} y = convert_{SRC}{N}(r);".format(SRC=src, N=size)) if mode == '_rtz': if src in int_types: print(" {USRC}{N} abs_x = abs(x);".format(USRC=unsigned_type[src], N=size)) |