Hello,
I came across an issue regarding BLKmode and returning structure in register.  
For following code,  I try to return the structure in register instead of 
memory. 
 
extern void abort();
typedef struct {
  short x;
  short y;
} COMPLEX;
 
COMPLEX foo (void) __attribute__ ((noinline));
COMPLEX foo (void)
{
  COMPLEX  x;  
 
  x.x = -7;
  x.y = -7;
 
  return x;
}
 

int main(){
  COMPLEX x = foo();
  if(x.y != -7)
    abort();
}

 
In foo function, compute_record_mode function will set the mode for struct 
COMPLEX as BLKmode partly because STRICT_ALIGNMENT is 1 on my target. In 
TARGET_RETURN_IN_MEMORY hook, I return 1 for BLKmode type and 0 otherwise for 
small size (<8) (like MIPS). Thus, this structure is still returned through 
memory, which is not very efficient. More importantly, ABI is NOT FIXED under 
such situation. If an assembly code programmer writes a function returning a 
structure. How does he know the structure will be treated as BLKmode or 
otherwise? So he doesn't know whether to pass result through memory or 
register. Do I understand correctly?

On the other hand, if I return 0 only according to struct type's size 
regardless BLKmode or not, GCC will produces very inefficient code. For 
example, stack setup code in foo is still generated even it is totally 
unnecessary.

Only when I set STRICT_ALIGNMENT to 0, the structure can be passed through 
register in an efficient way. Unfortunately, our machine is strictly aligned 
and I cannot really do that. 

Any suggestion? 

Thanks,
Bingfeng Mei
Broadcom UK 

Reply via email to