This is the mail archive of the gcc@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]

IVopts bug?


Hi all

 I found IVopts rewrite a memory access with a weird iv candidate,
which make it lost its original memory attribute.
 a non-local memory access' base pointer was rewrite into a local one,
and  it was deleted in pass_cd_dce since
it was recognized as a local memory access.

here is the case i simplified from a decoder source

foo1(unsigned char* pSrcLeft,
     unsigned char* pSrcAbove,
     unsigned char* pSrcAboveLeft,
     unsigned char* pDst,
     int dstStep,
     int leftStep)
{
  signed int x, y, s;
  unsigned char  p1[5], p2[5],  p3;

  p1[0] = *pSrcAboveLeft;
  p2[0] = p1[0];
  p2[1] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[2] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[3] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[4] = pSrcLeft[0];

  p1[1] = pSrcAbove[0];
  p1[2] = pSrcAbove[1];
  p1[3] = pSrcAbove[2];
  p1[4] = pSrcAbove[3];

  p3 = (unsigned char)(((signed int)p1[1] + (signed int)p2[1] +
(signed int)p1[0]
		+(signed int)p1[0] + 2 ) >> 2 );

  for( y=0; y<4; y++, pDst += dstStep ) {
    for( x=y+1; x<4; x++ ) {
                    s = ( p1[x-y-1] + p1[x-y] + p1[x-y] + p1[x-y+1] + 2 ) >> 2;
                    pDst[x] = (unsigned char)s;
    }

    pDst[y] = p3; -----------------This memory access
  }
}

before IVopts

  D.6508_65 = pDst_88 + y.6_64;
  *D.6508_65 = p3_37;

after IVopts
it was rewrite to
MEM[symbol: p1, index: ivtmp.161_200, offset: 0B] = p3_37 ,

by
candidate 15
  depends on 3
  var_before ivtmp.161
  var_after ivtmp.161
  incremented before exit test
  type unsigned int
  base (unsigned int) pDst_39(D) - (unsigned int) &p1
  step (unsigned int) (pretmp.28_118 + 1)

so it still is &p1+ pDst - &p1 + step = pDst + step,
and in pass_cd_dce, is_hidden_global_store () return false for this memory
since it think this stmt only access local array p1.



gcc version r180694

Configured with: /home/croseadu/android/_src/src/gcc-src/configure
--host=i486-linux-gnu --build=i486-linux-gnu
--target=arm-none-linux-gnueabi
--prefix=/home/croseadu/android/_src/install/arm-none-linux-gnueabi
--enable-threads --disable-libmudflap --disable-libssp
--disable-libstdcxx-pch --with-gnu-as --with-gnu-ld
--enable-languages=c,c++ --enable-shared --enable-symvers=gnu
--enable-__cxa_atexit
--with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}'
--disable-nls --enable-lto
--with-sysroot=/home/croseadu/android/_src/install/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc
--with-build-sysroot=/home/croseadu/android/_src/install/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc
--with-gmp=/home/croseadu/android/_src/objs/arm-none-linux-gnueabi/obj/host-libs-/usr
--with-mpfr=/home/croseadu/android/_src/objs/arm-none-linux-gnueabi/obj/host-libs-/usr
--with-ppl=/home/croseadu/android/_src/objs/arm-none-linux-gnueabi/obj/host-libs-/usr
--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic
-lm' --with-cloog=/home/croseadu/android/_src/objs/arm-none-linux-gnueabi/obj/host-libs-/usr
--enable-cloog-backend=isl
--with-mpc=/home/croseadu/android/_src/objs/arm-none-linux-gnueabi/obj/host-libs-/usr
--enable-poison-system-directories --disable-libquadmath --enable-lto
--enable-libgomp
--with-build-time-tools=/home/croseadu/android/_src/install/arm-none-linux-gnueabi/arm-none-linux-gnueabi/bin
--with-cpu=cortex-a8 --with-float=soft

compile flags:
-O3 -mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-double

need file a bug?


Yuehai Du
#include <stdarg.h>

#define N 10

__attribute__ ((noinline)) void 
foo1(unsigned char* pSrcLeft,
     unsigned char* pSrcAbove,
     unsigned char* pSrcAboveLeft,
     unsigned char* pDst,
     int dstStep,
     int leftStep)
{
  signed int x, y, s;
  unsigned char  p1[5], p2[5],  p3;

  p1[0] = *pSrcAboveLeft;
  p2[0] = p1[0];
  p2[1] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[2] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[3] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[4] = pSrcLeft[0];

  p1[1] = pSrcAbove[0];
  p1[2] = pSrcAbove[1];
  p1[3] = pSrcAbove[2];
  p1[4] = pSrcAbove[3];

  p3 = (unsigned char)(((signed int)p1[1] + (signed int)p2[1] + (signed int)p1[0]
		+(signed int)p1[0] + 2 ) >> 2 );

  for( y=0; y<4; y++, pDst += dstStep ) {
    for( x=y+1; x<4; x++ ) {
                    s = ( p1[x-y-1] + p1[x-y] + p1[x-y] + p1[x-y+1] + 2 ) >> 2;
                    pDst[x] = (unsigned char)s;
    }
       
    pDst[y] = p3;
  }
}

__attribute__ ((noinline)) void 
foo2(unsigned char* pSrcLeft,
     unsigned char* pSrcAbove,
     unsigned char* pSrcAboveLeft,
     unsigned char* pDst,
     int dstStep,
     int leftStep)
{
  signed int x, y, s;
  unsigned char  p1[5], p2[5], p3;

  p1[0] = *pSrcAboveLeft;
  p2[0] = p1[0];
  p2[1] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[2] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[3] = pSrcLeft[0];
  pSrcLeft += leftStep;
  p2[4] = pSrcLeft[0];

  p1[1] = pSrcAbove[0];
  p1[2] = pSrcAbove[1];
  p1[3] = pSrcAbove[2];
  p1[4] = pSrcAbove[3];

  p3 = (unsigned char)(((signed int)p1[1] + (signed int)p2[1] + (signed int)p1[0]
		+(signed int)p1[0] + 2 ) >> 2 );

  for( y=0; y<4; y++, pDst += dstStep ) {
    for( x=y+1; x<4; x++ ) {
                    s = ( p1[x-y-1] + p1[x-y] + p1[x-y] + p1[x-y+1] + 2 ) >> 2;
                    pDst[x] = (unsigned char)s;
		    __asm__ volatile ("");    
    }
       
    pDst[y] = p3;
  }
}


unsigned char pSrcLeft[N];
unsigned char pSrcAbove[N];
unsigned char pSrcAboveLeft[N];
unsigned char pDst1[N];
unsigned char pDst2[N];

int main()
{

	int i;

	for (i=0; i<N; i++)
	{
		pSrcLeft[i] = i*2;
		pSrcAbove[i] = 200-i;
		pSrcAboveLeft[i] = 20+2*i-1;
		pDst1[i] = 255;
		pDst2[i] = 255;
	}

	
	foo1(pSrcLeft, pSrcAbove, pSrcAboveLeft, pDst1, 1,1);
	foo2(pSrcLeft, pSrcAbove, pSrcAboveLeft, pDst2, 1,1);

	for (i=0; i<N; i++)
	  {
	    if (pDst1[i] != pDst2[i])
	      abort();
	  }

	return 0;
}

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