[compiler-rt] 56255e0 - [builtins] Fix signed shift overflows in absvti2.c and negvti2.c

Karl-Johan Karlsson via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 27 21:47:02 PDT 2023


Author: Karl-Johan Karlsson
Date: 2023-08-28T06:39:47+02:00
New Revision: 56255e04211fd1e358cd02cafcb0fe38b97cd257

URL: https://github.com/llvm/llvm-project/commit/56255e04211fd1e358cd02cafcb0fe38b97cd257
DIFF: https://github.com/llvm/llvm-project/commit/56255e04211fd1e358cd02cafcb0fe38b97cd257.diff

LOG: [builtins] Fix signed shift overflows in absvti2.c and negvti2.c

When compiling the builtins with the undefined behavior sanitizer and running testcases you end up with the following warning:

UBSan: negvti2.c:22:32: left shift of 1 by 127 places cannot be represented in type 'ti_int' (aka '__int128')
UBSan: absvti2.c:23:23: left shift of 1 by 127 places cannot be represented in type 'ti_int' (aka '__int128')

This can be avoided by doing the shift in a matching unsigned variant of the type.

This is the same kind of fixes that already was done in commit
854686f0794b9d0695d5a0a85ea1e7e71ba8edfd

This was found in an out of tree target.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D158816

Added: 
    

Modified: 
    compiler-rt/lib/builtins/absvti2.c
    compiler-rt/lib/builtins/negvti2.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/builtins/absvti2.c b/compiler-rt/lib/builtins/absvti2.c
index 491d99d7ce0f23..bc6933bd2a1cf1 100644
--- a/compiler-rt/lib/builtins/absvti2.c
+++ b/compiler-rt/lib/builtins/absvti2.c
@@ -20,7 +20,7 @@
 
 COMPILER_RT_ABI ti_int __absvti2(ti_int a) {
   const int N = (int)(sizeof(ti_int) * CHAR_BIT);
-  if (a == ((ti_int)1 << (N - 1)))
+  if (a == (ti_int)((tu_int)1 << (N - 1)))
     compilerrt_abort();
   const ti_int s = a >> (N - 1);
   return (a ^ s) - s;

diff  --git a/compiler-rt/lib/builtins/negvti2.c b/compiler-rt/lib/builtins/negvti2.c
index 8f92e1046d0cfe..fc1484015a8b76 100644
--- a/compiler-rt/lib/builtins/negvti2.c
+++ b/compiler-rt/lib/builtins/negvti2.c
@@ -19,7 +19,7 @@
 // Effects: aborts if -a overflows
 
 COMPILER_RT_ABI ti_int __negvti2(ti_int a) {
-  const ti_int MIN = (ti_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT) - 1);
+  const ti_int MIN = (tu_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT) - 1);
   if (a == MIN)
     compilerrt_abort();
   return -a;


        


More information about the llvm-commits mailing list