[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#766840: [armhf] Illegal assembler code generated with -O2

Package: gcc
Version: 4:4.9.1-5


If trying to compile the attached file on armhf with

gcc -O2 -c reg.c

one gets 

/tmp/ccuv9e3N.s: Assembler messages:
/tmp/ccuv9e3N.s:106: Error: registers may not be the same -- `str r2,[r2],#4'

A workaround is to use either -fno-expensive-optimizations or -fno-schedule-insns.

gcc -O1 -fexpensive-optimizations -fschedule-insns -c reg.c

shows the same error.

The file is a shortened version from one of my packages (starlink-ast) which always compiled nicely on armhf, started to fail with gcc-4.9.1 [1]. With gcc-4.8.4, the compilation succeeded [2]:

gcc -DHAVE_CONFIG_H -I. -D_FORTIFY_SOURCE=2 -I/usr/include/star -DTHREAD_SAFE -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -c region.c  -fPIC -DPIC -o .libs/libstarlink_ast_la-region.o
/tmp/ccJsRMs3.s: Assembler messages:
/tmp/ccJsRMs3.s:21403: Warning: base register written back, and overlaps one of transfer registers
/tmp/ccJsRMs3.s:28133: Error: registers may not be the same -- `str r3,[r3],#4'
/tmp/ccJsRMs3.s:28971: Warning: base register written back, and overlaps one of transfer registers

The warnings are on similar places as above, just with the floats replaced by doubles or long doubles.

Best regards


[1] https://buildd.debian.org/status/fetch.php?pkg=starlink-ast&arch=armhf&ver=8.0.2%2Bdfsg-1&stamp=1414223014
[2] https://buildd.debian.org/status/fetch.php?pkg=starlink-ast&arch=armhf&ver=8.0.0%2Bdfsg-2&stamp=1400237749

#include <stdlib.h>

void *astFree();
void *astMalloc();
int astOK = 1;

int MaskF( int inside, int ndim, 
	   const int lbnd[], const int ubnd[], 
	   float in[], float val) { 

   void *used_region;
   float *c, *d, *tmp_out;
   double *lbndgd, *ubndgd;
   int *lbndg, *ubndg, idim, ipix, nax, nin, nout, npix, npixg, result = 0; 
   if ( !astOK ) return result; 
   lbndg = astMalloc( sizeof( int )*(size_t) ndim ); 
   ubndg = astMalloc( sizeof( int )*(size_t) ndim ); 
   lbndgd = astMalloc( sizeof( double )*(size_t) ndim ); 
   ubndgd = astMalloc( sizeof( double )*(size_t) ndim ); 
   npix = 1; 
   npixg = 1; 
   for ( idim = 0; idim < ndim; idim++ ) { 
     npix *= ubnd[ idim ] - lbnd[ idim ]; 
     npixg *= ubndg[ idim ] - lbndg[ idim ]; 
   if( npixg <= 0 ){ 
     if( astGetNegated( used_region )) { 
       c = in; 
       for( ipix = 0; ipix < npix; ipix++ ) *(c++) = val; 
   } else if( npixg > 0) { 
     if(astGetNegated( used_region )) { 
       tmp_out = astMalloc( sizeof( float )*(size_t) npix ); 
       if( tmp_out ) { 
	 c = tmp_out; 
     result += astResampleF( used_region, lbnd, ubnd, 
			     ubnd, lbndg, ubndg); 
   return result; 

Reply to: