sra: Avoid SRAing if there is an aout-of-bounds access (PR 96820)
authorMartin Jambor <mjambor@suse.cz>
Thu, 3 Sep 2020 20:43:49 +0000 (22:43 +0200)
committerMartin Jambor <mjambor@suse.cz>
Thu, 3 Sep 2020 20:43:49 +0000 (22:43 +0200)
commit8ad3fc6ca46c603d9c3efe8e6d4a8f2ff1a893a4
treee98cc27d06a6779873ad9b689b774f28378975d6
parentd8f3474ff81b07fd2e758337957711db17eb801e
sra: Avoid SRAing if there is an aout-of-bounds access (PR 96820)

The testcase causes and ICE in the SRA verifier on x86_64 when
compiling with -m32 because build_user_friendly_ref_for_offset looks
at an out-of-bounds array_ref within an array_ref which accesses an
offset which does not fit into a signed 32bit integer and turns it
into an array-ref with a negative index.

The best thing is probably to bail out early when encountering an out
of bounds access to a local stack-allocated aggregate (and let the DSE
just delete such statements) which is what the patch does.

I also glanced over to the initial candidate vetting routine to make
sure the size would fit into HWI and noticed that it uses unsigned
variants whereas the rest of SRA operates on signed offsets and
sizes (because get_ref_and_extent does) and so changed that for the
sake of consistency.  These ancient checks operate on sizes of types
as opposed to DECLs but I hope that any issues potentially arising
from that are basically hypothetical.

gcc/ChangeLog:

2020-08-28  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/96820
* tree-sra.c (create_access): Disqualify candidates with accesses
beyond the end of the original aggregate.
(maybe_add_sra_candidate): Check that candidate type size fits
signed uhwi for the sake of consistency.

gcc/testsuite/ChangeLog:

2020-08-28  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/96820
* gcc.dg/tree-ssa/pr96820.c: New test.
gcc/testsuite/gcc.dg/tree-ssa/pr96820.c [new file with mode: 0644]
gcc/tree-sra.c