https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95663
--- Comment #22 from rguenther at suse dot de <rguenther at suse dot de> --- On Mon, 13 Dec 2021, hubicka at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95663 > > --- Comment #20 from Jan Hubicka <hubicka at gcc dot gnu.org> --- > I really think with -fdelete-null-pointer-checks we should optimize away the > pointer adjustment relying on the fact that program will segfault. > > I was wondering, -fdelete-null-pointer-checks currently requires pointer to be > precisely 0. We are already iffy here since the access is at non-0 offset, > but > since infer_nonnull_range_by_dereference uses check_loadstore: > > static bool > check_loadstore (gimple *, tree op, tree, void *data) > { > if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF) > { > /* Some address spaces may legitimately dereference zero. */ > addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op)); > if (targetm.addr_space.zero_address_valid (as)) > return false; > > return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0); > } > return false; > } > > which completely ignores MEM_REF_OFFSET we actually turn into trap accesses > that are arbitrarily far from NULL. We also ignore handled components so we I think MEM_REF[(void *)0 + 4] is non-canonical (IIRC we "simplify" that to MEM_REF[(void *)4])