From: Karl-Johan Karlsson Date: Fri, 17 Mar 2023 06:28:38 +0000 (+0100) Subject: [compiler-rt] Avoid signed overflow in floatdidf.c and floatdisf.c X-Git-Tag: upstream/17.0.6~14502 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bb0548a6edf0027eca8d92e021c45afd51b29c9e;p=platform%2Fupstream%2Fllvm.git [compiler-rt] Avoid signed overflow in floatdidf.c and floatdisf.c When compiling compiler-rt with -fsanitize=undefined and running testcases you end up with the following warning: UBSan: floatdisf.c:27:15: signed integer overflow: 9223372036854775807 - -1 cannot be represented in type 'di_int' (aka 'long long') This can be avoided by doing the subtraction in a matching unsigned variant of the type, given that the overflow is the expected result of the subtraction. The same kind of pattern exists in floatdidf.c This was found in an out of tree target. Reviewed By: phosek Differential Revision: https://reviews.llvm.org/D146135 --- diff --git a/compiler-rt/lib/builtins/floatdidf.c b/compiler-rt/lib/builtins/floatdidf.c index d37c43b1..c994aad 100644 --- a/compiler-rt/lib/builtins/floatdidf.c +++ b/compiler-rt/lib/builtins/floatdidf.c @@ -50,7 +50,7 @@ COMPILER_RT_ABI double __floatdidf(di_int a) { return 0.0; const unsigned N = sizeof(di_int) * CHAR_BIT; const di_int s = a >> (N - 1); - a = (a ^ s) - s; + a = (du_int)(a ^ s) - s; int sd = N - __builtin_clzll(a); // number of significant digits int e = sd - 1; // exponent if (sd > DBL_MANT_DIG) { diff --git a/compiler-rt/lib/builtins/floatdisf.c b/compiler-rt/lib/builtins/floatdisf.c index 5c63164..0b62ed8 100644 --- a/compiler-rt/lib/builtins/floatdisf.c +++ b/compiler-rt/lib/builtins/floatdisf.c @@ -24,7 +24,7 @@ COMPILER_RT_ABI float __floatdisf(di_int a) { return 0.0F; const unsigned N = sizeof(di_int) * CHAR_BIT; const di_int s = a >> (N - 1); - a = (a ^ s) - s; + a = (du_int)(a ^ s) - s; int sd = N - __builtin_clzll(a); // number of significant digits si_int e = sd - 1; // exponent if (sd > FLT_MANT_DIG) {