https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70013
--- Comment #10 from alalaw01 at gcc dot gnu.org --- Hmmm, so this fixes the ICE, generating: SR.5_12 = MEM[(struct S0[2] *)&*.LC0].f0; MEM[(struct S0[2] *)&*.LC0].f0 = SR.5_12; d = *.LC0; d$3$f0_14 = MEM[(struct S0[2] *)&*.LC0 + 3B].f0; d$0$f0_7 = SR.5_12; e$f0_9 = d$3$f0_14; _3 = (int) d$0$f0_7; c = _3; _5 = (int) e$f0_9; __builtin_printf ("%x\n", _5); d ={v} {CLOBBER}; return 0; which in -fdump-tree-optimized (at -O1) looks like: SR.5_12 = MEM[(struct S0[2] *)&*.LC0].f0; d$3$f0_14 = MEM[(struct S0[2] *)&*.LC0 + 3B].f0; _3 = (int) SR.5_12; c = _3; _5 = (int) d$3$f0_14; __builtin_printf ("%x\n", _5); return 0; which is much saner. But I don't really understand why the PARM_DECL case that I'm adding to here is that way (since r147980 "New implementation of SRA" in 2009, https://gcc.gnu.org/ml/gcc-patches/2009-04/msg02218.html)... Bootstrapped+regtest on AArch64 (c,c++) and ARM (c,c++,ada), no regressions. (Constants don't get pushed into the pool on x86.) ---- diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 72157edd02e3235e57b786bbf460c94b0c52b2c5..24eac6ae7c4dcd41358b1a020047076afe1a8106 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2427,7 +2427,8 @@ analyze_access_subtree (struct access *root, struct access *parent, if (!hole || root->grp_total_scalarization) root->grp_covered = 1; - else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL) + else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL + || constant_decl_p (root->base)) root->grp_unscalarized_data = 1; /* not covered and written to */ return sth_created; }