On Thu, Nov 23, 2023 at 12:55 PM Jakub Jelinek <ja...@redhat.com> wrote: > > On Thu, Nov 23, 2023 at 11:56:33AM +0100, Jakub Jelinek wrote: > > Now, regarding m_init_gsi, I think I'll need to play around, maybe > > I should have in the end insert after and update behavior rather than > > insert after, and that could be achieved by adding > > m_init_gsi = m_gsi; > > gsi_prev (&m_init_gsi); > > before the > > m_gsi = save_gsi; > > restore in all the 3 places and then no other updates of m_init_gsi would be > > needed. Except gsi_prev likely won't like the gsi_end_p (m_gsi) case, > > so maybe > > m_init_gsi = m_gsi; > > if (gsi_end_p (m_init_gsi)) > > m_init_gsi = gsi_last_bb (gsi_bb (m_init_gsi)); > > else > > gsi_prev (&m_init_gsi); > > m_gsi = save_gsi; > > That seems to work and I think it is the right thing to do. > > Here is an updated patch to do that. Passed > make check-gcc -j32 -k GCC_TEST_RUN_EXPENSIVE=1 > RUNTESTFLAGS='GCC_TEST_RUN_EXPENSIVE=1 dg.exp=*bitint* > dg-torture.exp=*bitint*' > so far.
Looks a bit better. As for constructing a gsi_end_p () iterator for a basic-block I'd simply add a new gsi_end_{bb,seq} ({basic_block,gimple_seq}). Richard. > 2023-11-23 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/112668 > * gimple-lower-bitint.cc (bitint_large_huge::handle_cast): After > temporarily adding statements after m_init_gsi, update m_init_gsi > such that later additions after it will be after the added statements. > (bitint_large_huge::handle_load): Likewise. When splitting > gsi_bb (m_init_gsi) basic block, update m_preheader_bb if needed > and update saved m_gsi as well if needed. > > * gcc.dg/bitint-40.c: New test. > > --- gcc/gimple-lower-bitint.cc.jj 2023-11-22 22:55:14.260164718 +0100 > +++ gcc/gimple-lower-bitint.cc 2023-11-23 12:39:35.030364243 +0100 > @@ -1294,6 +1294,11 @@ bitint_large_huge::handle_cast (tree lhs > g = gimple_build_assign (n, RSHIFT_EXPR, t, lpm1); > insert_before (g); > m_data[save_data_cnt + 1] = add_cast (m_limb_type, n); > + m_init_gsi = m_gsi; > + if (gsi_end_p (m_init_gsi)) > + m_init_gsi = gsi_last_bb (gsi_bb (m_init_gsi)); > + else > + gsi_prev (&m_init_gsi); > m_gsi = save_gsi; > } > else if (m_upwards_2limb * limb_prec < TYPE_PRECISION (rhs_type)) > @@ -1523,6 +1528,11 @@ bitint_large_huge::handle_cast (tree lhs > insert_before (g); > rext = add_cast (m_limb_type, gimple_assign_lhs (g)); > } > + m_init_gsi = m_gsi; > + if (gsi_end_p (m_init_gsi)) > + m_init_gsi = gsi_last_bb (gsi_bb (m_init_gsi)); > + else > + gsi_prev (&m_init_gsi); > m_gsi = save_gsi; > } > tree t; > @@ -1687,9 +1697,27 @@ bitint_large_huge::handle_load (gimple * > edge e = split_block (gsi_bb (m_gsi), g); > make_edge (e->src, eh_edge->dest, EDGE_EH)->probability > = profile_probability::very_unlikely (); > - m_init_gsi.bb = e->dest; > + m_gsi = gsi_after_labels (e->dest); > + if (gsi_bb (save_gsi) == e->src) > + { > + if (gsi_end_p (save_gsi)) > + { > + save_gsi = gsi_last_bb (e->dest); > + if (!gsi_end_p (save_gsi)) > + gsi_next (&save_gsi); > + } > + else > + save_gsi = gsi_for_stmt (gsi_stmt (save_gsi)); > + } > + if (m_preheader_bb == e->src) > + m_preheader_bb = e->dest; > } > } > + m_init_gsi = m_gsi; > + if (gsi_end_p (m_init_gsi)) > + m_init_gsi = gsi_last_bb (gsi_bb (m_init_gsi)); > + else > + gsi_prev (&m_init_gsi); > m_gsi = save_gsi; > tree out; > prepare_data_in_out (iv, idx, &out); > --- gcc/testsuite/gcc.dg/bitint-40.c.jj 2023-11-22 13:47:12.380580107 +0100 > +++ gcc/testsuite/gcc.dg/bitint-40.c 2023-11-22 14:35:50.225842768 +0100 > @@ -0,0 +1,29 @@ > +/* PR middle-end/112668 */ > +/* { dg-do compile { target bitint } } */ > +/* { dg-options "-std=c23 -fnon-call-exceptions" } */ > + > +#if __BITINT_MAXWIDTH__ >= 156 > +struct T156 { _BitInt(156) a : 2; unsigned _BitInt(156) b : 135; > _BitInt(156) c : 2; }; > +extern void foo156 (struct T156 *); > + > +unsigned _BitInt(156) > +bar156 (int i) > +{ > + struct T156 r156[12]; > + foo156 (&r156[0]); > + return r156[i].b; > +} > +#endif > + > +#if __BITINT_MAXWIDTH__ >= 495 > +struct T495 { _BitInt(495) a : 2; unsigned _BitInt(495) b : 471; > _BitInt(495) c : 2; }; > +extern void foo495 (struct T495 *r495); > + > +unsigned _BitInt(495) > +bar495 (int i) > +{ > + struct T495 r495[12]; > + foo495 (r495); > + return r495[i].b; > +} > +#endif > > > Jakub >