1 /* PR rtl-optimization/49095 */
2 /* { dg-do compile } */
3 /* { dg-options "-Os -fno-shrink-wrap -masm=att" } */
4 /* { dg-additional-options "-mregparm=2" { target ia32 } } */
5 
6 void foo (void *);
7 
8 int *
f1(int * x)9 f1 (int *x)
10 {
11   if (!--*x)
12     foo (x);
13   return x;
14 }
15 
16 int
g1(int x)17 g1 (int x)
18 {
19   if (!--x)
20     foo ((void *) 0);
21   return x;
22 }
23 
24 #define F(T, OP, OPN) \
25 T *			\
26 f##T##OPN (T *x, T y)	\
27 {			\
28   *x OP y;		\
29   if (!*x)		\
30     foo (x);		\
31   return x;		\
32 }			\
33 			\
34 T			\
35 g##T##OPN (T x, T y)	\
36 {			\
37   x OP y;		\
38   if (!x)		\
39     foo ((void *) 0);	\
40   return x;		\
41 }			\
42 			\
43 T *			\
44 h##T##OPN (T *x)	\
45 {			\
46   *x OP 24;		\
47   if (!*x)		\
48     foo (x);		\
49   return x;		\
50 }			\
51 			\
52 T			\
53 i##T##OPN (T x, T y)	\
54 {			\
55   x OP 24;		\
56   if (!x)		\
57     foo ((void *) 0);	\
58   return x;		\
59 }
60 
61 #define G(T) \
62 F (T, +=, plus)		\
63 F (T, -=, minus)	\
64 F (T, &=, and)		\
65 F (T, |=, or)		\
66 F (T, ^=, xor)
67 
68 G (char)
69 G (short)
70 G (int)
71 G (long)
72 
73 /* { dg-final { scan-assembler-not "test\[lq\]" } } */
74 /* The {f,h}{char,short,int,long}xor functions aren't optimized into
75    a RMW instruction, so need load, modify and store.  FIXME eventually.  */
76 /* { dg-final { scan-assembler-times "\\), %" 8 } } */
77