https://gcc.gnu.org/g:068aa9a7a9cc163ee5f31bffd746a8cd2ebfef7e
commit r13-9640-g068aa9a7a9cc163ee5f31bffd746a8cd2ebfef7e Author: Richard Biener <rguent...@suse.de> Date: Wed Jul 31 10:07:45 2024 +0200 middle-end/101478 - ICE with degenerate address during gimplification When we gimplify &MEM[0B + 4] we are re-folding the address in case types are not canonical which ends up with a constant address that recompute_tree_invariant_for_addr_expr ICEs on. Properly guard that call. PR middle-end/101478 * gimplify.cc (gimplify_addr_expr): Check we still have an ADDR_EXPR before calling recompute_tree_invariant_for_addr_expr. * gcc.dg/pr101478.c: New testcase. (cherry picked from commit 33ead6400ad59d4b38fa0527a9a7b53a28114ab7) Diff: --- gcc/gimplify.cc | 3 ++- gcc/testsuite/gcc.dg/pr101478.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index 62dad63fdadd..9c22139bd990 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -6586,7 +6586,8 @@ gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) *expr_p = build_fold_addr_expr (op0); /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly. */ - recompute_tree_invariant_for_addr_expr (*expr_p); + if (TREE_CODE (*expr_p) == ADDR_EXPR) + recompute_tree_invariant_for_addr_expr (*expr_p); /* If we re-built the ADDR_EXPR add a conversion to the original type if required. */ diff --git a/gcc/testsuite/gcc.dg/pr101478.c b/gcc/testsuite/gcc.dg/pr101478.c new file mode 100644 index 000000000000..527620ea0f11 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr101478.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +struct obj { + int n; + int l; +}; +int main() +{ + (struct obj *)((char *)(__SIZE_TYPE__)({ 0; }) - (char *)&((struct obj *)0)->l); +}