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 foo(long data,long v)23long 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-*-* } } } } } */ 46