1 /* Check that eliminable compare-instructions are eliminated. */
2 /* { dg-do compile } */
3 /* { dg-options "-O2" } */
4 /* { dg-final { scan-assembler-not "\tcmp|\ttest" } } */
5 /* { dg-final { scan-assembler "\tneg" } } */
6
7 void foo(void);
8
9 #ifndef op
10 #define op(x) -(x)
11 #endif
12
13 #define f(k, T, T2) \
14 void f ## k (T *a, T2 *b) \
15 { \
16 T2 d = op(*a); \
17 *b = d; \
18 if (d != 0) \
19 foo(); \
20 }
21
22 #define ff(x, y) f(x, y, y)
23
24 /* For NEG, gcc prefers to test the source (before the operation), but
25 will settle for the destination. For SImode, the destination is
26 allocated to a different register than the source. Not that
27 important; just skip the "int" variant for now. */
28 #ifndef do_1
29 #define do_1 0
30 #endif
31
32 #ifndef do_2
33 #define do_2 1
34 #endif
35 #ifndef do_3
36 #define do_3 1
37 #endif
38
39 #if do_1
40 ff(1, int)
41 #endif
42
43 #if do_2
44 ff(2, short int)
45 #endif
46
47 #if do_3
48 ff(3, signed char)
49 #endif