mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 20:01:31 -05:00
tree-optimization/111807 - ICE in verify_sra_access_forest
The following addresses build_reconstructed_reference failing to build references with a different offset than the models and thus the caller conditional being off. This manifests when attempting to build a ref with offset 160 from the model BIT_FIELD_REF <l_4827[9], 8, 0> onto the same base l_4827 but the models offset being 288. This cannot work for any kind of ref I can think of, not just with BIT_FIELD_REFs. PR tree-optimization/111807 * tree-sra.cc (build_ref_for_model): Only call build_reconstructed_reference when the offsets are the same. * gcc.dg/torture/pr111807.c: New testcase.
This commit is contained in:
12
gcc/testsuite/gcc.dg/torture/pr111807.c
Normal file
12
gcc/testsuite/gcc.dg/torture/pr111807.c
Normal file
@@ -0,0 +1,12 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
static struct A {
|
||||
int x : 4;
|
||||
} a;
|
||||
static int b;
|
||||
int main()
|
||||
{
|
||||
struct A t[2];
|
||||
t[0] = b ? t[1] : a;
|
||||
return (b ? t[1].x : 0) && 1;
|
||||
}
|
||||
@@ -1751,7 +1751,7 @@ build_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset,
|
||||
&& !TREE_THIS_VOLATILE (base)
|
||||
&& (TYPE_ADDR_SPACE (TREE_TYPE (base))
|
||||
== TYPE_ADDR_SPACE (TREE_TYPE (model->expr)))
|
||||
&& offset <= model->offset
|
||||
&& offset == model->offset
|
||||
/* build_reconstructed_reference can still fail if we have already
|
||||
massaged BASE because of another type incompatibility. */
|
||||
&& (res = build_reconstructed_reference (loc, base, model)))
|
||||
|
||||
Reference in New Issue
Block a user