https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48885
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2015-09-23 Ever confirmed|0 |1 --- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> --- It's just a matter of implementing the missing ??? /* Mark "other" loads and stores as belonging to CLIQUE and with base zero. */ static bool visit_loadstore (gimple *, tree base, tree ref, void *clique_) { unsigned short clique = (uintptr_t)clique_; if (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF) { tree ptr = TREE_OPERAND (base, 0); if (TREE_CODE (ptr) == SSA_NAME) { /* ??? We need to make sure 'ptr' doesn't include any of the restrict tags in its points-to set. */ return false; (well, we could handle default-defs without adding that). Thus for the particular testcase: @@ -6952,7 +7047,8 @@ visit_loadstore (gimple *, tree base, tr || TREE_CODE (base) == TARGET_MEM_REF) { tree ptr = TREE_OPERAND (base, 0); - if (TREE_CODE (ptr) == SSA_NAME) + if (TREE_CODE (ptr) == SSA_NAME + && ! SSA_NAME_IS_DEFAULT_DEF (ptr)) { /* ??? We need to make sure 'ptr' doesn't include any of the restrict tags in its points-to set. */ but we can of course do better. Remember all 'restrict_var' we added bases for and above lookup the points-to solution for 'ptr' and intersect it with the restrict_var set. If that's empty - fine - if not, we have to continue failing. I'm testing the above simple fix and amend the comment.