https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79619
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2017-02-20 CC| |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. GIMPLE DSE removes the store # PT = null _2 = MEM[(char * <address-space-1> *)0B]; *_2 = 1; but not here: # PT = null _2 = MEM[(char * <address-space-1> *)0B]; *_2 = 1; # PT = nonlocal escaped null _4 = MEM[(char * <address-space-1> *)8B]; *_4 = 1; because it thinks the value is eventually used by the following load from 8B. 'PT = null' addresses are thought to be not global memory. -f[no-]delete-null-pointer-checks controls this globally for all address spaces. The following fixes the testcase, but it looks to me like all flag_delete_null_pointer_checks tests in the middle end should be replaced by this (or some wrapper so eventually the target can specify which address-spaces may have objects at address zero): Index: gcc/tree-ssa-structalias.c =================================================================== --- gcc/tree-ssa-structalias.c (revision 245594) +++ gcc/tree-ssa-structalias.c (working copy) @@ -3407,7 +3407,10 @@ get_constraint_for_1 (tree t, vec<ce_s> || (TREE_CODE (t) == CONSTRUCTOR && CONSTRUCTOR_NELTS (t) == 0)) { - if (flag_delete_null_pointer_checks) + if (flag_delete_null_pointer_checks + && (! POINTER_TYPE_P (TREE_TYPE (t)) + || (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (t))) + == ADDR_SPACE_GENERIC))) temp.var = nothing_id; else temp.var = nonlocal_id; accordingly the documentation of -fdelete-null-pointer-checks should be adjusted to say it only affects the generic address space.