blob: 4e364972033f40b5c36cb0aa56f798c02a37bc31 [file] [log] [blame]
/* Check that eliminable compare-instructions are eliminated. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler-not "\tcmp|\ttest" } } */
/* { dg-final { scan-assembler "\tneg" } } */
void foo(void);
#ifndef op
#define op(x) -(x)
#endif
#define f(k, T, T2) \
void f ## k (T *a, T2 *b) \
{ \
T2 d = op(*a); \
*b = d; \
if (d != 0) \
foo(); \
}
#define ff(x, y) f(x, y, y)
/* For NEG, gcc prefers to test the source (before the operation), but
will settle for the destination. For SImode, the destination is
allocated to a different register than the source. Not that
important; just skip the "int" variant for now. */
#ifndef do_1
#define do_1 0
#endif
#ifndef do_2
#define do_2 1
#endif
#ifndef do_3
#define do_3 1
#endif
#if do_1
ff(1, int)
#endif
#if do_2
ff(2, short int)
#endif
#if do_3
ff(3, signed char)
#endif