From fb463778a7a4b85a5af287c40b957ffd7fcda53e Mon Sep 17 00:00:00 2001 From: Karl-Johan Karlsson Date: Mon, 28 Aug 2023 06:14:45 +0200 Subject: [PATCH] [builtins] Fix undefined behavior in negdi2.c and negti2.c When compiling the builtins with the undefined behavior sanitizer and running testcases you end up with the following warning: UBSan: negdi2.c:20:10: negation of -9223372036854775808 cannot be represented in type 'di_int' (aka 'long long'); cast to an unsigned type to negate this value to itself This can be avoided by doing negation in a matching unsigned variant of the type. The same kind of pattern is found in negti2.c This was found in an out of tree target. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D158818 --- compiler-rt/lib/builtins/negdi2.c | 2 +- compiler-rt/lib/builtins/negti2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler-rt/lib/builtins/negdi2.c b/compiler-rt/lib/builtins/negdi2.c index 5a525d4b0e55..714ac8ca66d3 100644 --- a/compiler-rt/lib/builtins/negdi2.c +++ b/compiler-rt/lib/builtins/negdi2.c @@ -17,5 +17,5 @@ COMPILER_RT_ABI di_int __negdi2(di_int a) { // Note: this routine is here for API compatibility; any sane compiler // should expand it inline. - return -a; + return -(du_int)a; } diff --git a/compiler-rt/lib/builtins/negti2.c b/compiler-rt/lib/builtins/negti2.c index d52ba4e13a46..ab6e09ded819 100644 --- a/compiler-rt/lib/builtins/negti2.c +++ b/compiler-rt/lib/builtins/negti2.c @@ -19,7 +19,7 @@ COMPILER_RT_ABI ti_int __negti2(ti_int a) { // Note: this routine is here for API compatibility; any sane compiler // should expand it inline. - return -a; + return -(tu_int)a; } #endif // CRT_HAS_128BIT