diff options
author | Jakub Jelinek <jakub@redhat.com> | 2023-12-22 12:27:05 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2023-12-22 12:27:05 +0100 |
commit | d3defa435e9d04d6ab6585ac184989941c7ad51e (patch) | |
tree | ca165ad683f884757877abadd10e07ad52bb135c /gcc | |
parent | 05d353b79441a708f43768383e2358c878ab727b (diff) | |
download | gcc-d3defa435e9d04d6ab6585ac184989941c7ad51e.zip gcc-d3defa435e9d04d6ab6585ac184989941c7ad51e.tar.gz gcc-d3defa435e9d04d6ab6585ac184989941c7ad51e.tar.bz2 |
lower-bitint: Fix handle_cast ICE [PR113102]
My recent change to use m_data[save_data_cnt] instead of
m_data[save_data_cnt + 1] when inside of a loop (m_bb is non-NULL)
broke the following testcase. When we create a PHI node on the loop
using prepare_data_in_out, both m_data[save_data_cnt{, + 1}] are
computed and the fix was right, but there are also cases when we in
a loop (m_bb non-NULL) emit a nested cast with too few limbs and
then just use constant indexes for all accesses - in that case
only m_data[save_data_cnt + 1] is initialized and m_data[save_data_cnt]
is NULL. In those cases, we want to use the former.
2023-12-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/113102
* gimple-lower-bitint.cc (bitint_large_huge::handle_cast): Only
use m_data[save_data_cnt] if it is non-NULL.
* gcc.dg/bitint-58.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-lower-bitint.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/bitint-58.c | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index 045836e..8809389 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -1491,7 +1491,7 @@ bitint_large_huge::handle_cast (tree lhs_type, tree rhs1, tree idx) m_data_cnt = tree_to_uhwi (m_data[save_data_cnt + 2]); if (TYPE_UNSIGNED (rhs_type)) t = build_zero_cst (m_limb_type); - else if (m_bb) + else if (m_bb && m_data[save_data_cnt]) t = m_data[save_data_cnt]; else t = m_data[save_data_cnt + 1]; diff --git a/gcc/testsuite/gcc.dg/bitint-58.c b/gcc/testsuite/gcc.dg/bitint-58.c new file mode 100644 index 0000000..4368788 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-58.c @@ -0,0 +1,31 @@ +/* PR tree-optimization/113102 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=c23 -O2" } */ + +_BitInt(3) a; +#if __BITINT_MAXWIDTH__ >= 4097 +_BitInt(8) b; +_BitInt(495) c; +_BitInt(513) d; +_BitInt(1085) e; +_BitInt(4096) f; + +void +foo (void) +{ + a -= (_BitInt(4097)) d >> b; +} + +void +bar (void) +{ + __builtin_sub_overflow ((_BitInt(767)) c >> e, 0, &a); +} + +void +baz (void) +{ + _BitInt(768) x = (_BitInt(257))f; + b /= x >> 0 / 0; /* { dg-warning "division by zero" } */ +} +#endif |