1/* { dg-do compile } */ 2/* { dg-options "-O1 -g" } */ 3 4enum reg_class 5{ 6 BASE_REGS, 7 GENERAL_REGS, 8 LIM_REG_CLASSES 9}; 10 11static __inline__ unsigned char 12hard_reg_set_subset_p (const unsigned long x[4], const unsigned long y[4]) 13{ 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); 18} 19 20static __inline__ unsigned char 21hard_reg_set_equal_p (const unsigned long x[4], const unsigned long y[4]) 22{ 23 return x[0] == y[0] 24 && x[1] == y[1] 25 && x[2] == y[2] 26 && x[3] == y[3]; 27} 28 29extern unsigned long reg_class_contents[(int) LIM_REG_CLASSES][4]; 30extern int ira_important_classes_num; 31extern enum reg_class ira_important_classes[(int) LIM_REG_CLASSES]; 32extern enum reg_class ira_reg_class_intersect[(int) LIM_REG_CLASSES][(int) 33 LIM_REG_CLASSES]; 34extern unsigned char ira_reg_classes_intersect_p[(int) LIM_REG_CLASSES][(int) 35 LIM_REG_CLASSES]; 36extern enum reg_class ira_reg_class_super_classes[(int) LIM_REG_CLASSES][(int) 37 LIM_REG_CLASSES]; 38static unsigned long temp_hard_regset[4]; 39 40static void 41setup_reg_class_relations (void) 42{ 43 int i, cl1, cl2, cl3; 44 unsigned long temp_set2[4]; 45 for (cl1 = 0; cl1 < (int) LIM_REG_CLASSES; cl1++) 46 { 47 ira_reg_class_super_classes[cl1][0] = LIM_REG_CLASSES; 48 for (cl2 = 0; cl2 < (int) LIM_REG_CLASSES; cl2++) 49 { 50 ira_reg_classes_intersect_p[cl1][cl2] = 0; 51 { 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]; 57 } 58 for (i = 0; i < ira_important_classes_num; i++) 59 { 60 cl3 = ira_important_classes[i]; 61 { 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]; 67 } 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 73 [cl1] 74 [cl2]]))) 75 ira_reg_class_intersect[cl1][cl2] = (enum reg_class) cl3; 76 } 77 } 78 } 79} 80 81static void 82find_reg_class_closure (void) 83{ 84 setup_reg_class_relations (); 85} 86 87void 88ira_init (void) 89{ 90 find_reg_class_closure (); 91} 92