1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-tree-optimized" } */
3 
4 extern const unsigned char mode_ibit[];
5 extern const unsigned char mode_fbit[];
6 extern const signed char smode_ibit[];
7 extern const signed char smode_fbit[];
8 
9 /* We use bit-and rather than modulo to ensure we're actually
10    testing the desired match.pd pattern.  */
11 unsigned char
muufubar(int indx)12 muufubar (int indx)
13 {
14   int ret = (mode_fbit [indx] - mode_ibit [indx]) & 3;
15   return ret;
16 }
17 
18 signed char
msufubar(int indx)19 msufubar (int indx)
20 {
21   int ret = (mode_fbit [indx] - mode_ibit [indx]) & 3;
22   return ret;
23 }
24 
25 unsigned char
musfubar(int indx)26 musfubar (int indx)
27 {
28   int ret = (smode_fbit [indx] - smode_ibit [indx]) & 3;
29   return ret;
30 }
31 
32 signed char
mssfubar(int indx)33 mssfubar (int indx)
34 {
35   int ret = (smode_fbit [indx] - smode_ibit [indx]) & 3;
36   return ret;
37 }
38 
39 
40 unsigned char
puufubar(int indx)41 puufubar (int indx)
42 {
43   int ret = (mode_fbit [indx] + mode_ibit [indx]) & 3;
44   return ret;
45 }
46 
47 signed char
psufubar(int indx)48 psufubar (int indx)
49 {
50   int ret = (mode_fbit [indx] + mode_ibit [indx]) & 3;
51   return ret;
52 }
53 
54 unsigned char
pusfubar(int indx)55 pusfubar (int indx)
56 {
57   int ret = (smode_fbit [indx] + smode_ibit [indx]) & 3;
58   return ret;
59 }
60 
61 signed char
pssfubar(int indx)62 pssfubar (int indx)
63 {
64   int ret = (smode_fbit [indx] + smode_ibit [indx]) & 3;
65   return ret;
66 }
67 
68 /* The shortening patterns in match.pd should arrange to do the
69    arithmetic in char modes and thus any casts to ints should
70    have been removed.  */
71 /* { dg-final {scan-tree-dump-not "\\(int\\)" "optimized"} } */
72 
73 /* We should have casted 4 operands from signed to unsigned char types.  */
74 /* { dg-final {scan-tree-dump-times "\\(unsigned char\\)" 8 "optimized" } } */
75 
76 /* And two return values should have been casted from unsigned char to
77    a normal char.  */
78 /* { dg-final {scan-tree-dump-times "\\(signed char\\)" 4 "optimized" } } */
79