From 456e10f28b36aa417e0db145556831c4f979fbd7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 20 Mar 2024 10:55:07 +0100 Subject: [PATCH] bitint: Fix handling of conditional bitfield loads [PR114365] For the m_var_msb (aka left shift) case of large/huge _BitInt bitfield loads handle_load adds a PHI node, but I forgot to actually update the temporary the code later on uses, so the PHI result was unused and the code incorrectly used something that wasn't valid SSA form. In particular, we emitted if (_29 != 2) goto ; [80.00%] else goto ; [20.00%] [local count: 1073741824]: _33 = VIEW_CONVERT_EXPR(s.D.2771)[_31]; [local count: 1073741824]: # _34 = PHI <_33(4), 0(3)> _35 = _32 >> 31; _36 = _33 << 33; _37 = _36 | _35; _38 = _37 << _19; where instead of _33 the _36 def stmt should be using _34. Fixed thusly. 2024-03-20 Jakub Jelinek PR tree-optimization/114365 * gimple-lower-bitint.cc (bitint_large_huge::handle_load): When adding a PHI node, set iv2 to its result afterwards. * gcc.dg/bitint-102.c: New test. --- gcc/gimple-lower-bitint.cc | 1 + gcc/testsuite/gcc.dg/bitint-102.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/bitint-102.c diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc index 40d814e5c38f..1ce13ca25799 100644 --- a/gcc/gimple-lower-bitint.cc +++ b/gcc/gimple-lower-bitint.cc @@ -2026,6 +2026,7 @@ bitint_large_huge::handle_load (gimple *stmt, tree idx) add_phi_arg (phi, build_zero_cst (m_limb_type), edge_false, UNKNOWN_LOCATION); m_gsi = gsi_after_labels (edge_true->dest); + iv2 = iv3; } } g = gimple_build_assign (make_ssa_name (m_limb_type), RSHIFT_EXPR, diff --git a/gcc/testsuite/gcc.dg/bitint-102.c b/gcc/testsuite/gcc.dg/bitint-102.c new file mode 100644 index 000000000000..9f9861ee2be5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-102.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/114365 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=c23 -O2" } */ + +struct S { + int : 31; +#if __BITINT_MAXWIDTH__ >= 129 + _BitInt(129) b : 129; +#else + _BitInt(63) b : 63; +#endif +} s; + +void +foo (int a) +{ + s.b <<= a; +} -- 2.47.2