https://gcc.gnu.org/g:a57c877f8899ac9171eaeafa7641ac79cce96f89

commit r14-11505-ga57c877f8899ac9171eaeafa7641ac79cce96f89
Author: Richard Biener <[email protected]>
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 a4972d3f471e..b85c6ffbe9b8 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -6936,7 +6936,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);
+}

Reply via email to