From 0e99b22aa666f107c4035d32bfb5ab11534a9d2f Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 29 Oct 2024 09:42:12 +0100 Subject: [PATCH] tree-optimization/117333 - ICE with NULL access size DR dr_may_alias_p ICEs when TYPE_SIZE of DR->ref is NULL but this is valid IL when the access size of an aggregate copy can be infered from the RHS. PR tree-optimization/117333 * tree-data-ref.cc (dr_may_alias_p): Guard against NULL access size. * gcc.dg/torture/pr117333.c: New testcase. --- gcc/testsuite/gcc.dg/torture/pr117333.c | 29 +++++++++++++++++++++++++ gcc/tree-data-ref.cc | 2 ++ 2 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr117333.c diff --git a/gcc/testsuite/gcc.dg/torture/pr117333.c b/gcc/testsuite/gcc.dg/torture/pr117333.c new file mode 100644 index 00000000000..38c1b5493a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr117333.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +struct s +{ + unsigned long ul; + int i; + char ac[]; +}; + +const struct s gs = { 3, -4, "abcdef" }; + +void copy_s(struct s*d, const struct s*s) +{ + *d = *s; +} + +unsigned test(struct s*ps, _Bool direct) +{ + if(direct) + *ps = gs; + else + copy_s(ps, &gs); + return sizeof(*ps); +} + +unsigned size(void) +{ + return sizeof(gs); +} diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc index de234c65e94..1fdfef282c7 100644 --- a/gcc/tree-data-ref.cc +++ b/gcc/tree-data-ref.cc @@ -3004,6 +3004,8 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b, && DR_BASE_ADDRESS (b) && operand_equal_p (DR_BASE_ADDRESS (a), DR_BASE_ADDRESS (b)) && operand_equal_p (DR_OFFSET (a), DR_OFFSET (b)) + && tree_size_a + && tree_size_b && poly_int_tree_p (tree_size_a) && poly_int_tree_p (tree_size_b) && !ranges_maybe_overlap_p (wi::to_poly_widest (DR_INIT (a)),