1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -fdump-tree-optimized" } */
       3  
       4  #define REGISTER register
       5  
       6  #if defined __arm__
       7  # define REG1 asm("r4")
       8  #elif defined __i386__
       9  # define REG1 asm("ebx")
      10  #elif defined __mips__
      11  # define REG1 asm("s0")
      12  #elif defined __x86_64__
      13  # define REG1 asm("rbp")
      14  #else
      15  # undef REGISTER
      16  # define REGISTER
      17  # define REG1
      18  #endif
      19  
      20  REGISTER long data_0 REG1;
      21  long data_3; 
      22  
      23  long foo(long data, long v)
      24  {
      25  	long i;
      26  	long t, u;
      27  
      28  	if (data)
      29  		i = data_0 + data_3;
      30  	else {
      31  		v = 2;
      32  		i = 5;
      33  	}
      34  	t = data_0 + data_3;
      35  	u = i;
      36  	return v * t * u;
      37  }
      38  
      39  /* We should not eliminate global register variable when it is the RHS of
      40     a single assignment.  So the number of loads from data_0 has to match
      41     that of the number of adds (we hoist data_0 + data_3 above the
      42     if (data) and eliminate the useless copy).  */
      43  
      44  /* { dg-final { scan-tree-dump-times "= data_0;" 1 "optimized" { target { arm*-*-* i?86-*-* mips*-*-* x86_64-*-* } } } } */
      45  /* { dg-final { scan-tree-dump-times " \\+ " 1 "optimized" { target { ! { arm*-*-* i?86-*-* mips*-*-* x86_64-*-* } } } } } */