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

Karl-Johan Karlsson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 23:03:13 PDT 2023


Ka-Ka created this revision.
Ka-Ka added reviewers: MaskRay, phosek.
Herald added a subscriber: Enna1.
Herald added a project: All.
Ka-Ka requested review of this revision.
Herald added a project: Sanitizers.
Herald added a subscriber: Sanitizers.

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 <https://reviews.llvm.org/rG854686f0794b9d0695d5a0a85ea1e7e71ba8edfd>

This was found in an out of tree target.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D158816

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


Index: compiler-rt/lib/builtins/negvti2.c
===================================================================
--- compiler-rt/lib/builtins/negvti2.c
+++ 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;
Index: compiler-rt/lib/builtins/absvti2.c
===================================================================
--- compiler-rt/lib/builtins/absvti2.c
+++ 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158816.553370.patch
Type: text/x-patch
Size: 963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230825/78c978ad/attachment.bin>


More information about the llvm-commits mailing list