aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-07-31 10:07:45 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-07-31 11:05:34 +0200
commit33ead6400ad59d4b38fa0527a9a7b53a28114ab7 (patch)
tree9b4b59250343e54a0cd527622e013b540f082f21 /gcc
parenta59c4e496fa916cb9a484a649aa1b4cebd6550f2 (diff)
downloadgcc-33ead6400ad59d4b38fa0527a9a7b53a28114ab7.zip
gcc-33ead6400ad59d4b38fa0527a9a7b53a28114ab7.tar.gz
gcc-33ead6400ad59d4b38fa0527a9a7b53a28114ab7.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimplify.cc3
-rw-r--r--gcc/testsuite/gcc.dg/pr101478.c11
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index ab323d7..c77a53bd 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -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
index 0000000..527620e
--- /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);
+}