static void most_expensive_mult_to_index (tree type, struct mem_address *parts, aff_tree *addr, bool speed) { addr_space_t as = TYPE_ADDR_SPACE (type); enum machine_mode address_mode = targetm.addr_space.address_mode (as); HOST_WIDE_INT coef; double_int best_mult, amult, amult_neg; unsigned best_mult_cost = 0, acost; tree mult_elt = NULL_TREE, elt; unsigned i, j; enum tree_code op_code; best_mult = double_int_zero; for (i = 0; i < addr->n; i++) { if (!double_int_fits_in_shwi_p (addr->elts[i].coef)) continue; coef = double_int_to_shwi (addr->elts[i].coef); if (coef == 1 || !multiplier_allowed_in_address_p (coef, TYPE_MODE (type), as)) continue; acost = multiply_by_cost (coef, address_mode, speed); if (acost > best_mult_cost) { best_mult_cost = acost; best_mult = addr->elts[i].coef; } } if (!best_mult_cost) return; /* Collect elements multiplied by best_mult. */ for (i = j = 0; i < addr->n; i++) { amult = addr->elts[i].coef; amult_neg = double_int_ext_for_comb (double_int_neg (amult), addr); if (double_int_equal_p (amult, best_mult)) op_code = PLUS_EXPR; else if (double_int_equal_p (amult_neg, best_mult)) op_code = MINUS_EXPR; else { addr->elts[j] = addr->elts[i]; j++; continue; } elt = fold_convert (sizetype, addr->elts[i].val); if (mult_elt) mult_elt = fold_build2 (op_code, sizetype, mult_elt, elt); else if (op_code == PLUS_EXPR) mult_elt = elt; else mult_elt = fold_build1 (NEGATE_EXPR, sizetype, elt); } addr->n = j; parts->index = mult_elt; parts->step = double_int_to_tree (sizetype, best_mult); }
static void most_expensive_mult_to_index (tree type, struct mem_address *parts, aff_tree *addr, bool speed) { addr_space_t as = TYPE_ADDR_SPACE (type); machine_mode address_mode = targetm.addr_space.address_mode (as); HOST_WIDE_INT coef; unsigned best_mult_cost = 0, acost; tree mult_elt = NULL_TREE, elt; unsigned i, j; enum tree_code op_code; offset_int best_mult = 0; for (i = 0; i < addr->n; i++) { if (!wi::fits_shwi_p (addr->elts[i].coef)) continue; coef = addr->elts[i].coef.to_shwi (); if (coef == 1 || !multiplier_allowed_in_address_p (coef, TYPE_MODE (type), as)) continue; acost = mult_by_coeff_cost (coef, address_mode, speed); if (acost > best_mult_cost) { best_mult_cost = acost; best_mult = offset_int::from (addr->elts[i].coef, SIGNED); } } if (!best_mult_cost) return; /* Collect elements multiplied by best_mult. */ for (i = j = 0; i < addr->n; i++) { offset_int amult = offset_int::from (addr->elts[i].coef, SIGNED); offset_int amult_neg = -wi::sext (amult, TYPE_PRECISION (addr->type)); if (amult == best_mult) op_code = PLUS_EXPR; else if (amult_neg == best_mult) op_code = MINUS_EXPR; else { addr->elts[j] = addr->elts[i]; j++; continue; } elt = fold_convert (sizetype, addr->elts[i].val); if (mult_elt) mult_elt = fold_build2 (op_code, sizetype, mult_elt, elt); else if (op_code == PLUS_EXPR) mult_elt = elt; else mult_elt = fold_build1 (NEGATE_EXPR, sizetype, elt); } addr->n = j; parts->index = mult_elt; parts->step = wide_int_to_tree (sizetype, best_mult); }