
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
30 lines
872 B
C
30 lines
872 B
C
//===-- absvti2.c - Implement __absvdi2 -----------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements __absvti2 for the compiler_rt library.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "int_lib.h"
|
|
|
|
#ifdef CRT_HAS_128BIT
|
|
|
|
// Returns: absolute value
|
|
|
|
// Effects: aborts if abs(x) < 0
|
|
|
|
COMPILER_RT_ABI ti_int __absvti2(ti_int a) {
|
|
const int N = (int)(sizeof(ti_int) * CHAR_BIT);
|
|
if (a == (ti_int)((tu_int)1 << (N - 1)))
|
|
compilerrt_abort();
|
|
const ti_int s = a >> (N - 1);
|
|
return (a ^ s) - s;
|
|
}
|
|
|
|
#endif // CRT_HAS_128BIT
|