This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] for PR23509



On Aug 27, 2005, at 8:16 AM, Zdenek Dvorak wrote:


Hello,

the patch

http://gcc.gnu.org/ml/gcc-patches/2005-08/msg00283.html

removed the check that prevents propagation of pointers
when phi nodes are removed during basic block merging.
This PR occurs in situation like

p = phi(q);
# VUSE (something)
use (*p);

when q is not dereferenced anywhere.  The pointers that are
not dereferenced at all have neither name_mem_tag nor type_mem_tag
set.  Therefore, when the code is replaced with

use(*q);

we lose the VUSE, which could in worst case lead to misscompilations.
In this particular case it only confuses ivopts that expect name_mem_tag
or type_mem_tag to be set for every dereferenced pointer, and leads to
ICE.

Then how does copy prop works? This is exactly what copy prop does and I don't see we losing VUSE there. This looks more like a bug in IV-OPTs not recording the aliasing info right when it transforms the loop.

I tried the following examples (I disabled forwpropand ccp so we don't
prop &a into *d):

int f(int a)
{
  int *c = &a;
  int *b = c;
  int *d = c;
  return *d;
}

int f1(int *a)
{
  int *c = a;
  int *b = c;
  int *d = c;
  return *d;
}

Thanks,
Andrew Pinski


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]