Global Operator new returns a memory disjoint from previous allocated memory
from operator new -- this is the requirement even for user provided version.
See standard 3.7.3.1 for details. 

This is not taken advantage of by gcc -- there might be a duplicate for this --
since this looks like a major problem -- open it for reference.

Compile the following program with -DNEW and -DMALLOC, gcc is able to hoist
v1[i] for the latter, but not the new case.

Example:

#include <stdlib.h>
#include <vector>
using namespace std;
int main ()
{
   int i,j;
#ifdef NEW
  int* v1 = new int(100);
  int* v2 = new int(100);
  for (i = 0; i < 100; i++)
  { v1[i] = 0; v2[i] = 0; }
#elif defined(MALLOC)
  int* v1 = (int*) malloc(400);
  int* v2 =  (int*) malloc(400);
  for (i = 0; i < 100; i++)
  { v1[i] = 0; v2[i] = 0; }
#endif
   for ( i = 0; i < 100; i++)
      v1[i] = i;

   for (i = 0; i < 100; i++)
   {
      for (j = 0; j < 100; j++)
      {
           v2[j] += v1[i];
      }
   }

   return v2[1];
}


-- 
           Summary: aliasing property of global operator new is not taken
                    advantage of
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: xinliangli at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35559

Reply via email to