Bug 36347 - points-to sets should be always kept for call-clobbering
Summary: points-to sets should be always kept for call-clobbering
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.4.0
: P3 enhancement
Target Milestone: 4.4.0
Assignee: Richard Biener
URL:
Keywords: alias, missed-optimization
Depends on: 36346
Blocks:
  Show dependency treegraph
 
Reported: 2008-05-27 13:41 UTC by Richard Biener
Modified: 2008-05-30 19:52 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2008-05-28 08:58:13


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2008-05-27 13:41:49 UTC
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.
Comment 1 Richard Biener 2008-05-28 08:58:13 UTC
I have a fix (fixing PR36346 fixes this as well).
Comment 2 Richard Biener 2008-05-29 10:32:35 UTC
Fixed.
Comment 3 Richard Biener 2008-05-29 10:32:49 UTC
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

Comment 4 Richard Biener 2008-05-30 19:52:24 UTC
Fixed.