]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end/101478 - ICE with degenerate address during gimplification
authorRichard Biener <rguenther@suse.de>
Wed, 31 Jul 2024 08:07:45 +0000 (10:07 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 31 Jul 2024 09:05:34 +0000 (11:05 +0200)
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.

gcc/gimplify.cc
gcc/testsuite/gcc.dg/pr101478.c [new file with mode: 0644]

index ab323d764e8cdf8ae4907338166978217d792710..c77a53bdfcee4919b2d880f1bc39776a6d1f5b08 100644 (file)
@@ -6980,7 +6980,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 (file)
index 0000000..527620e
--- /dev/null
@@ -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);
+}