typedef unsigned long my_uintptr_t; int check_a(my_uintptr_t tagged_ptr); int __attribute__((noinline)) try_a(my_uintptr_t x) { my_uintptr_t heap[2]; my_uintptr_t *hp = heap; hp[0] = x; hp[1] = 0; return check_a((my_uintptr_t)(void*)((char*)hp + 1)); } <bb 2>: # heap_10 = VDEF <heap_9(D)> heap[0] = x_2(D); # heap_11 = VDEF <heap_10> heap[1] = 0; D.1562_4 = &heap + 1; D.1563_5 = (long unsigned int) D.1562_4; # heap_12 = VDEF <heap_11> D.1561_6 = check_a (D.1563_5); return D.1561_6; The points-to solution for D.1562_4 is D.1562_4 = { heap }, but we drop that to D.1562_4, its value escapes, points-to anything because the pointer is never dereferenced. This causes all addressable variables to escape at the call to check_a, which pessimizes code and causes useless VOPs.
I have a fix (fixing PR36346 fixes this as well).
Fixed.
Subject: Bug 36347 Author: rguenth Date: Thu May 29 10:31:58 2008 New Revision: 136152 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=136152 Log: 2008-05-29 Richard Guenther <rguenther@suse.de> PR tree-optimization/36343 PR tree-optimization/36346 PR tree-optimization/36347 * tree-flow.h (clobber_what_p_points_to): Declare. * tree-ssa-structalias.c (set_uids_in_ptset): Whether the pointed-to variable is dereferenced is irrelevant to whether the pointer can access the pointed-to variable. (clobber_what_p_points_to): New function. * tree-ssa-alias.c (set_initial_properties): Use it. * tree-ssa.c (verify_flow_sensitive_alias_info): Adjust call clobber check for NMTs. * gcc.c-torture/execute/pr36343.c: New testcase. Added: trunk/gcc/testsuite/gcc.c-torture/execute/pr36343.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-flow.h trunk/gcc/tree-ssa-alias.c trunk/gcc/tree-ssa-structalias.c trunk/gcc/tree-ssa.c