Lines Matching refs:info

93 static bool set_dest_equiv_p (rtx x, rtx y, struct equiv_info *info);
94 static bool set_dest_addr_equiv_p (rtx x, rtx y, struct equiv_info *info);
95 static void find_dying_inputs (struct equiv_info *info);
96 static bool resolve_input_conflict (struct equiv_info *info);
237 struct equiv_info *info)
239 *p = info->cur;
250 struct equiv_info *info)
253 if (reg_mentioned_p (cc0_rtx, info->cur.x_start)
254 && !sets_cc0_p (info->cur.x_start))
257 if (info->cur.input_count >= IMPOSSIBLE_MOVE_FACTOR)
259 if (info->input_cost >= 0
260 ? (COSTS_N_INSNS(info->cur.ninsns - p->ninsns)
261 > info->input_cost * (info->cur.input_count - p->input_count))
262 : info->cur.ninsns > p->ninsns && !info->cur.input_count)
264 if (info->check_input_conflict && ! resolve_input_conflict (info))
269 if (info->mode & STRUCT_EQUIV_FINAL)
273 struct_equiv_make_checkpoint (p, info);
281 struct equiv_info *info)
283 info->cur.ninsns = p->ninsns;
284 info->cur.x_start = p->x_start;
285 info->cur.y_start = p->y_start;
286 info->cur.input_count = p->input_count;
287 info->cur.input_valid = p->input_valid;
288 while (info->cur.local_count > p->local_count)
290 info->cur.local_count--;
291 info->cur.version--;
292 if (REGNO_REG_SET_P (info->x_local_live,
293 REGNO (info->x_local[info->cur.local_count])))
295 assign_reg_reg_set (info->x_local_live,
296 info->x_local[info->cur.local_count], 0);
297 assign_reg_reg_set (info->y_local_live,
298 info->y_local[info->cur.local_count], 0);
299 info->cur.version--;
302 if (info->cur.version != p->version)
303 info->need_rerun = true;
312 note_local_live (struct equiv_info *info, rtx x, rtx y, int rvalue)
320 int x_change = assign_reg_reg_set (info->x_local_live, x, rvalue);
321 int y_change = assign_reg_reg_set (info->y_local_live, y, rvalue);
342 info->cur.input_count += y_change;
343 info->cur.version++;
359 rtx_equiv_p (rtx *xp, rtx y, int rvalue, struct equiv_info *info)
390 gcc_assert (!info->live_update);
396 if (info->mode & CLEANUP_POST_REGSTACK
405 if (REGNO_REG_SET_P (info->x_local_live, x_regno))
407 if (!REGNO_REG_SET_P (info->y_local_live, y_regno))
410 else if (REGNO_REG_SET_P (info->y_local_live, y_regno))
414 if (!rvalue && info->cur.input_valid
415 && (reg_overlap_mentioned_p (x, info->x_input)
416 || reg_overlap_mentioned_p (x, info->y_input)))
420 if (info->live_update
421 && assign_reg_reg_set (info->common_live, x, rvalue))
422 info->cur.version++;
427 x_common_live = REGNO_REG_SET_P (info->common_live, x_regno);
428 y_common_live = REGNO_REG_SET_P (info->common_live, y_regno);
433 if (! rvalue || info->input_cost < 0 || no_new_pseudos)
435 /* If info->live_update is not set, we are processing notes.
438 if (info->live_update && !info->cur.input_valid)
440 info->cur.input_valid = true;
441 info->x_input = x;
442 info->y_input = y;
443 info->cur.input_count += optimize_size ? 2 : 1;
444 if (info->input_reg
445 && GET_MODE (info->input_reg) != GET_MODE (info->x_input))
446 info->input_reg = NULL_RTX;
447 if (!info->input_reg)
448 info->input_reg = gen_reg_rtx (GET_MODE (info->x_input));
450 else if ((info->live_update
451 ? ! info->cur.input_valid : ! info->x_input)
452 || ! rtx_equal_p (x, info->x_input)
453 || ! rtx_equal_p (y, info->y_input))
455 validate_change (info->cur.x_start, xp, info->input_reg, 1);
467 int local_count = info->cur.local_count;
473 x_regno_i = REGNO (info->x_local[i]);
476 y_regno_i = REGNO (info->y_local[i]);
479 size_i = GET_MODE_SIZE (GET_MODE (info->x_local[i]));
488 if (info->live_update
489 && (x_mode != GET_MODE (info->x_local[i])
503 info->cur.local_count = --local_count;
504 info->x_local[i] = info->x_local[local_count];
505 info->y_local[i] = info->y_local[local_count];
535 if (!info->live_update
536 || info->cur.local_count >= STRUCT_EQUIV_MAX_LOCAL)
538 info->x_local[info->cur.local_count] = x;
539 info->y_local[info->cur.local_count] = y;
540 info->cur.local_count++;
541 info->cur.version++;
543 note_local_live (info, x, y, rvalue);
553 if(!set_dest_addr_equiv_p (SET_DEST (x), SET_DEST (y), info))
556 return rtx_equiv_p (&SET_SRC (x), SET_SRC (y), 1, info);
559 if (!rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 0, info))
562 return rtx_equiv_p (&XEXP (x, 1), XEXP (y, 1), 1, info);
570 if (!rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 0, info))
576 if (!rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 1, info))
580 return rtx_equiv_p (&XEXP (x, 1), XEXP (y, 1), 1, info);
624 if (! rtx_equiv_p (&XEXP (x, 0), y_inner, rvalue, info))
628 change = assign_reg_reg_set (info->common_live, x_inner, 1);
629 info->cur.version++;
632 change = note_local_live (info, x_inner, y_inner, 1);
640 return !rvalue || rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), rvalue, info);
642 return (rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 0, info)
643 && rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 1, info));
652 if (XEXP (y, 0) == info->y_label)
653 return (XEXP (x, 0) == info->x_label);
676 return ((rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), rvalue, info)
677 && rtx_equiv_p (&XEXP (x, 1), XEXP (y, 1), rvalue, info))
678 || (rtx_equiv_p (&XEXP (x, 0), XEXP (y, 1), rvalue, info)
679 && rtx_equiv_p (&XEXP (x, 1), XEXP (y, 0), rvalue, info)));
708 rvalue, info))
714 if (! rtx_equiv_p (&XEXP (x, i), XEXP (y, i), rvalue, info))
744 set_dest_equiv_p (rtx x, rtx y, struct equiv_info *info)
751 return rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 0, info);
766 && ! rtx_equiv_p (&XEXP (xe, 0), XEXP (ye, 0), 0, info))
780 set_dest_addr_equiv_p (rtx x, rtx y, struct equiv_info *info)
790 return rtx_equiv_p (&XEXP (x, 0), XEXP (y, 0), 1, info);
810 XVECEXP (y, i, j), info))
816 if (! set_dest_addr_equiv_p (XEXP (x, i), XEXP (y, i), info))
832 struct equiv_info *info ATTRIBUTE_UNUSED)
838 if ((info->mode & CLEANUP_POST_REGSTACK) && stack_regs_mentioned (i1))
860 for (i = info->cur.local_count - 1; i >= 0; i--)
861 if (regno == REGNO (info->y_local[i]))
863 regno = REGNO (info->x_local[i]);
883 insns_match_p (rtx i1, rtx i2, struct equiv_info *info)
892 info->cur.x_start = i1;
893 info->cur.y_start = i2;
908 || ! set_dest_equiv_p (PATTERN (i1), PATTERN (i2), info)
910 CALL_INSN_FUNCTION_USAGE (i2), info)
912 CALL_INSN_FUNCTION_USAGE (i2), -1, info))
920 if (! set_dest_equiv_p (PATTERN (i1), PATTERN (i2), info))
927 struct_equiv_make_checkpoint (&before_rvalue_change, info);
931 || (!bitmap_bit_p (info->equiv_used, info->cur.ninsns)
932 && rtx_equiv_p (&PATTERN (i1), PATTERN (i2), -1, info)
933 && death_notes_match_p (i1, i2, info)
947 struct_equiv_restore_checkpoint (&before_rvalue_change, info);
970 if (rtx_equiv_p (&PATTERN (i1), PATTERN (i2), -1, info)
971 && death_notes_match_p (i1, i2, info)
976 bitmap_set_bit (info->equiv_used, info->cur.ninsns);
989 struct_equiv_init (int mode, struct equiv_info *info)
991 if ((info->x_block->flags | info->y_block->flags) & BB_DIRTY)
996 if (!REG_SET_EQUAL_P (info->x_block->il.rtl->global_live_at_end,
997 info->y_block->il.rtl->global_live_at_end))
1004 /* After reg-stack. Remove bogus live info about stack regs. N.B.
1010 CLEAR_REGNO_REG_SET (info->x_block->il.rtl->global_live_at_end, rn);
1011 CLEAR_REGNO_REG_SET (info->y_block->il.rtl->global_live_at_end, rn);
1013 if (!REG_SET_EQUAL_P (info->x_block->il.rtl->global_live_at_end,
1014 info->y_block->il.rtl->global_live_at_end))
1018 info->mode = mode;
1021 info->x_input = info->y_input = info->input_reg = NULL_RTX;
1022 info->equiv_used = ALLOC_REG_SET (&reg_obstack);
1023 info->check_input_conflict = false;
1025 info->had_input_conflict = false;
1026 info->cur.ninsns = info->cur.version = 0;
1027 info->cur.local_count = info->cur.input_count = 0;
1028 info->cur.x_start = info->cur.y_start = NULL_RTX;
1029 info->x_label = info->y_label = NULL_RTX;
1030 info->need_rerun = false;
1031 info->live_update = true;
1032 info->cur.input_valid = false;
1033 info->common_live = ALLOC_REG_SET (&reg_obstack);
1034 info->x_local_live = ALLOC_REG_SET (&reg_obstack);
1035 info->y_local_live = ALLOC_REG_SET (&reg_obstack);
1036 COPY_REG_SET (info->common_live, info->x_block->il.rtl->global_live_at_end);
1037 struct_equiv_make_checkpoint (&info->best_match, info);
1044 struct_equiv_merge (rtx xi, rtx yi, struct equiv_info *info)
1052 info->live_update = false;
1061 1, info))
1066 info->live_update = true;
1073 another instruction that doesn't match, we destroy information in info
1082 struct_equiv_block_eq (int mode, struct equiv_info *info)
1090 x_stop = BB_HEAD (info->x_block);
1091 y_stop = BB_HEAD (info->y_block);
1097 x_stop = info->cur.x_start;
1098 y_stop = info->cur.y_start;
1100 if (!struct_equiv_init (mode, info))
1106 xi = BB_END (info->x_block);
1110 info->cur.x_start = xi;
1114 yi = BB_END (info->y_block);
1118 info->cur.y_start = yi;
1122 if (!simplejump_p (yi) && !returnjump_p (yi) && info->cur.x_start)
1123 info->cur.ninsns++;
1131 gcc_assert (!info->cur.x_start == !info->cur.y_start);
1132 if (info->cur.x_start)
1134 if (any_condjump_p (info->cur.x_start)
1135 ? !condjump_equiv_p (info, false)
1136 : !insns_match_p (info->cur.x_start, info->cur.y_start, info))
1141 info->cur.x_start = xi;
1142 info->cur.y_start = yi;
1145 info->cur.ninsns++;
1146 if (!condjump_equiv_p (info, false))
1149 if (info->cur.x_start && info->mode & STRUCT_EQUIV_FINAL)
1150 struct_equiv_merge (info->cur.x_start, info->cur.y_start, info);
1153 struct_equiv_improve_checkpoint (&info->best_match, info);
1154 info->x_end = xi;
1155 info->y_end = yi;
1156 if (info->cur.x_start != x_stop)
1166 if (!insns_match_p (xi, yi, info))
1170 if (info->mode & STRUCT_EQUIV_FINAL)
1171 struct_equiv_merge (xi, yi, info);
1172 info->cur.ninsns++;
1173 struct_equiv_improve_checkpoint (&info->best_match, info);
1181 if (info->best_match.x_start != info->cur.x_start
1182 && (xi == BB_HEAD (info->x_block)
1183 || yi == BB_HEAD (info->y_block)))
1185 info->cur.ninsns++;
1186 struct_equiv_improve_checkpoint (&info->best_match, info);
1187 info->cur.ninsns--;
1188 if (info->best_match.ninsns > info->cur.ninsns)
1189 info->best_match.ninsns = info->cur.ninsns;
1202 struct_equiv_restore_checkpoint (&info->best_match, info);
1207 if (info->cur.ninsns)
1209 xi = info->cur.x_start;
1210 yi = info->cur.y_start;
1217 info->cur.x_start = xi;
1218 info->cur.y_start = yi;
1221 if (!info->cur.input_valid)
1222 info->x_input = info->y_input = info->input_reg = NULL_RTX;
1223 if (!info->need_rerun)
1225 find_dying_inputs (info);
1226 if (info->mode & STRUCT_EQUIV_FINAL)
1228 if (info->check_input_conflict && ! resolve_input_conflict (info))
1233 bool input_conflict = info->had_input_conflict;
1236 && info->dying_inputs > 1
1237 && bitmap_intersect_p (info->x_local_live, info->y_local_live))
1242 for (i = 0; i < info->cur.local_count; i++)
1244 if (assign_reg_reg_set (&clobbered_regs, info->y_local[i], 0))
1249 assign_reg_reg_set (&clobbered_regs, info->x_local[i], 1);
1253 if (input_conflict && !info->check_input_conflict)
1254 info->need_rerun = true;
1255 info->check_input_conflict = input_conflict;
1259 if (info->mode & STRUCT_EQUIV_NEED_FULL_BLOCK
1260 && (info->cur.x_start != x_stop || info->cur.y_start != y_stop))
1262 return info->cur.ninsns;
1265 /* For each local register, set info->local_rvalue to true iff the register
1266 is a dying input. Store the total number of these in info->dying_inputs. */
1268 find_dying_inputs (struct equiv_info *info)
1272 info->dying_inputs = 0;
1273 for (i = info->cur.local_count-1; i >=0; i--)
1275 rtx x = info->x_local[i];
1280 for (info->local_rvalue[i] = false; nregs > 0; regno++, --nregs)
1281 if (REGNO_REG_SET_P (info->x_local_live, regno))
1283 info->dying_inputs++;
1284 info->local_rvalue[i] = true;
1295 resolve_input_conflict (struct equiv_info *info)
1302 find_dying_inputs (info);
1303 if (info->dying_inputs <= 1)
1305 memcpy (save_x_local, info->x_local, sizeof save_x_local);
1306 memcpy (save_y_local, info->y_local, sizeof save_y_local);
1307 end = info->cur.local_count - 1;
1316 if (!info->local_rvalue[i])
1323 if (!info->local_rvalue[j])
1325 if (!reg_overlap_mentioned_p (info->x_local[i], info->y_local[j]))
1329 memcpy (info->x_local, save_x_local, sizeof save_x_local);
1330 memcpy (info->y_local, save_y_local, sizeof save_y_local);
1334 tmp = info->x_local[i];
1335 info->x_local[i] = info->x_local[j];
1336 info->x_local[j] = tmp;
1337 tmp = info->y_local[i];
1338 info->y_local[i] = info->y_local[j];
1339 info->y_local[j] = tmp;
1343 info->had_input_conflict = true;