aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYang Yujie <yangyujie@loongson.cn>2025-08-06 12:02:44 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2025-08-06 12:02:44 +0200
commit88f638e276c25e216b3d01c0d7aa25a0d17921d9 (patch)
treef33bc5271ed4b88f5f6567ec17cd49d73c9c006e /gcc
parenta76a032354ee48c0dcc5ff4842a9b319c3123685 (diff)
downloadgcc-88f638e276c25e216b3d01c0d7aa25a0d17921d9.zip
gcc-88f638e276c25e216b3d01c0d7aa25a0d17921d9.tar.gz
gcc-88f638e276c25e216b3d01c0d7aa25a0d17921d9.tar.bz2
bitint: Make sure BEXTC checks extension when optimized
In BEXTC, whether a _BitInt object is properly extended is examined by a value comparison against a copied object in a wider _BitInt type that utilizes all of the partial limb. Since the (implicit) conversion to the wider type may be optimized away now and cause the result of the comparison to always be true, we need to cast the copied object down to the original type to force a extension, so that it can serve as our reference. * gcc.dg/bitintext.h (BEXTC1): Define. Convert the copied object back to the original type before comparison. (BEXTC): Use BEXTC1 for both the signed and the unsigned case.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/bitintext.h28
1 files changed, 13 insertions, 15 deletions
diff --git a/gcc/testsuite/gcc.dg/bitintext.h b/gcc/testsuite/gcc.dg/bitintext.h
index d5f2689d..f61cf9a 100644
--- a/gcc/testsuite/gcc.dg/bitintext.h
+++ b/gcc/testsuite/gcc.dg/bitintext.h
@@ -25,22 +25,20 @@ do_copy (void *p, const void *q, __SIZE_TYPE__ r)
/* Macro to test whether (on targets where psABI requires it) _BitInt
with padding bits have those filled with sign or zero extension. */
#if defined(__s390x__) || defined(__arm__) || defined(__loongarch__)
+#define BEXTC1(x, uns) \
+ do { \
+ uns _BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__) __x; \
+ do_copy (&__x, &(x), sizeof (__x)); \
+ if (__x != (typeof (x)) __x) \
+ __builtin_abort (); \
+ } while (0)
+
#define BEXTC(x) \
- do { \
- if ((typeof (x)) -1 < 0) \
- { \
- _BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__) __x; \
- do_copy (&__x, &(x), sizeof (__x)); \
- if (__x != (x)) \
- __builtin_abort (); \
- } \
- else \
- { \
- unsigned _BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__) __x; \
- do_copy (&__x, &(x), sizeof (__x)); \
- if (__x != (x)) \
- __builtin_abort (); \
- } \
+ do { \
+ if ((typeof (x)) -1 < 0) \
+ BEXTC1 ((x), signed); \
+ else \
+ BEXTC1 ((x), unsigned); \
} while (0)
#else
#define BEXTC(x) do { (void) (x); } while (0)