https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77768
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- Interesting. This means vnresult is NULL. I see we can arrive here through tree vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind, vn_reference_t *vnresult, bool tbaa_p) { vec<vn_reference_op_s> operands; struct vn_reference_s vr1; tree cst; bool valuezied_anything; if (vnresult) *vnresult = NULL; vr1.vuse = vuse_ssa_val (vuse); vr1.operands = operands = valueize_shared_reference_ops_from_ref (op, &valuezied_anything); vr1.type = TREE_TYPE (op); vr1.set = tbaa_p ? get_alias_set (op) : 0; vr1.hashcode = vn_reference_compute_hash (&vr1); if ((cst = fully_constant_vn_reference_p (&vr1))) return cst; but somehow this means that we have sth like static const int i[5] = { 1, 2, 3, }; i[1] = 2; which should prevent the initializer from being constant ... A really odd case I'd like to see a testcase for (trying to reproduce on x86_64 right now). A simple "fix" is to guard the code for the vnresult == NULL, erring on the safe side. Can you dump me the stmt and maybe also the stored decl (with debug_tree)?