On Tue, Feb 27, 2024 at 1:50 PM Eric Botcazou <botca...@adacore.com> wrote: > > Hi, > > this is a regression present on the mainline, 13 and 12 branches. For the > attached Ada case, it's a tree checking failure on the mainline at -O: > > +===========================GNAT BUG DETECTED==============================+ > | 14.0.1 20240226 (experimental) [master r14-9171-g4972f97a265] GCC error:| > | tree check: expected tree that contains 'decl common' structure, | > | have 'component_ref' in tree_could_trap_p, at tree-eh.cc:2733 | > | Error detected around /home/eric/cvs/gcc/gcc/testsuite/gnat.dg/opt104.adb: > > Time is a 10-byte record and Packed_Rec.T is placed at bit-offset 65 because > of the packing. so tree-ssa-dse.cc:setup_live_bytes_from_ref has computed a > const_size of 88 from ref->offset of 65 and ref->max_size of 80. > > Then in tree-ssa-dse.cc:compute_trims: > > 411 int last_live = bitmap_last_set_bit (live); > (gdb) next > 412 if (ref->size.is_constant (&const_size)) > (gdb) > 414 int last_orig = (const_size / BITS_PER_UNIT) - 1; > (gdb) > 418 *trim_tail = last_orig - last_live; > > (gdb) call debug_bitmap (live) > n_bits = 256, set = {0 1 2 3 4 5 6 7 8 9 10 } > (gdb) p last_live > $33 = 10 > (gdb) p const_size > $34 = 80 > (gdb) p last_orig > $35 = 9 > (gdb) p *trim_tail > $36 = -1 > > In other words, compute_trims is overlooking the alignment adjustments applied > earlier by setup_live_bytes_from_ref. Moveover it reads: > > /* We use sbitmaps biased such that ref->offset is bit zero and the bitmap > extends through ref->size. So we know that in the original bitmap > bits 0..ref->size were true. We don't actually need the bitmap, just > the REF to compute the trims. */ > > But setup_live_bytes_from_ref used ref->max_size instead of ref->size. > > It appears that all the callers of compute_trims assume that ref->offset is > byte aligned and that the trimmed bytes are relative to ref->size, so the > patch simply adds an early return if either condition is not fulfilled > > Tested on x86-64/Linux, OK for all the affected branches?
OK. Thanks, Richard. > > 2024-02-27 Eric Botcazou <ebotca...@adacore.com> > > * tree-ssa-dse.cc (compute_trims): Fix description. Return early > if ref->offset is not byte aligned or ref->size is not known to be > equal to ref->max_size. > (maybe_trim_complex_store): Fix description. > (maybe_trim_constructor_store): Likewise. > (maybe_trim_partially_dead_store): Likewise. > > > 2024-02-27 Eric Botcazou <ebotca...@adacore.com> > > * gnat.dg/opt104.ads, gnat.dg/opt104.adb! New test. > > -- > Eric Botcazou