1 /* { dg-do compile } */
2 /* { dg-options "-O1 -g" } */
11 static __inline__
unsigned char
12 hard_reg_set_subset_p (const unsigned long x
[4], const unsigned long y
[4])
14 return ((x
[0] & ~y
[0]) == 0
15 && (x
[1] & ~y
[1]) == 0
16 && (x
[2] & ~y
[2]) == 0
17 && (x
[3] & ~y
[3]) == 0);
20 static __inline__
unsigned char
21 hard_reg_set_equal_p (const unsigned long x
[4], const unsigned long y
[4])
29 extern unsigned long reg_class_contents
[(int) LIM_REG_CLASSES
][4];
30 extern int ira_important_classes_num
;
31 extern enum reg_class ira_important_classes
[(int) LIM_REG_CLASSES
];
32 extern enum reg_class ira_reg_class_intersect
[(int) LIM_REG_CLASSES
][(int)
34 extern unsigned char ira_reg_classes_intersect_p
[(int) LIM_REG_CLASSES
][(int)
36 extern enum reg_class ira_reg_class_super_classes
[(int) LIM_REG_CLASSES
][(int)
38 static unsigned long temp_hard_regset
[4];
41 setup_reg_class_relations (void)
44 unsigned long temp_set2
[4];
45 for (cl1
= 0; cl1
< (int) LIM_REG_CLASSES
; cl1
++)
47 ira_reg_class_super_classes
[cl1
][0] = LIM_REG_CLASSES
;
48 for (cl2
= 0; cl2
< (int) LIM_REG_CLASSES
; cl2
++)
50 ira_reg_classes_intersect_p
[cl1
][cl2
] = 0;
52 unsigned long *scan_tp_
= (temp_set2
), *scan_fp_
=
53 (reg_class_contents
[cl2
]);
54 scan_tp_
[1] = scan_fp_
[1];
55 scan_tp_
[2] = scan_fp_
[2];
56 scan_tp_
[3] = scan_fp_
[3];
58 for (i
= 0; i
< ira_important_classes_num
; i
++)
60 cl3
= ira_important_classes
[i
];
62 unsigned long *scan_tp_
= (temp_hard_regset
), *scan_fp_
=
63 (reg_class_contents
[cl3
]);
64 scan_tp_
[0] = scan_fp_
[0];
65 scan_tp_
[1] = scan_fp_
[1];
66 scan_tp_
[3] = scan_fp_
[3];
68 if (!hard_reg_set_subset_p (temp_hard_regset
, temp_set2
)
69 || (hard_reg_set_equal_p (temp_hard_regset
, temp_set2
)
70 && hard_reg_set_subset_p (reg_class_contents
[cl3
],
71 reg_class_contents
[(int)
72 ira_reg_class_intersect
75 ira_reg_class_intersect
[cl1
][cl2
] = (enum reg_class
) cl3
;
82 find_reg_class_closure (void)
84 setup_reg_class_relations ();
90 find_reg_class_closure ();