On Thu, 2013-05-02 at 13:29 +0200, Richard Biener wrote:
> On Mon, 29 Apr 2013, Bill Schmidt wrote:
>
> > Half-hearted ping for
> > http://gcc.gnu.org/ml/gcc-patches/2013-03/msg01291.html ...
> >
> > I promise this is the last major code dump for SLSR. ;)
>
>
>
> + if (!operand_equal_p (arg_cand->stride, integer_one_node, 0))
> + return;
>
> !integer_onep (arg_cand->stride);
>
> + arg_stmt = SSA_NAME_DEF_STMT (arg);
> +
> + if (arg_stmt
> + && gimple_code (arg_stmt) != GIMPLE_NOP)
> + arg_bb = gimple_bb (arg_stmt);
> + else
> + arg_bb = ENTRY_BLOCK_PTR->next_bb;
>
> if (SSA_NAME_IS_DEFAULT_DEF (arg))
> arg_bb = single_succ (ENTRY_BLOCK_PTR);
> else
> arg_bb = gimple_bb (SSA_NAME_DEF_STMT (arg));
>
> don't use ->next_bb - the ordering of BBs is arbitrary. No idea
> why you needed to look for !arg_stmt.
>
> + /* If the basis name and the candidate's LHS have incompatible
> + types, introduce a cast. */
> + if (!types_compatible_p (target_type,
> + TREE_TYPE (basis_name)))
> + basis_name = introduce_cast_before_cand (c, target_type,
> + basis_name, var);
>
> use !useless_type_conversion_p (target_type, TREE_TYPE (basis_name))
> if you are looking whether the op can be used where target_type is
> requested (as opposed to where it can be assigned _from_ a target_type
> thing).
>
> + tree rhs1 = gimple_assign_rhs1 (c->cand_stmt);
> + tree rhs2 = gimple_assign_rhs2 (c->cand_stmt);
> + if (cand_code != NEGATE_EXPR
>
> are you sure you are not accessing out-of-bounds for the
> single-operand NEGATE_EXPR case?
>
> +/* Return the index in the increment vector of the given INCREMENT. */
> +
> +static inline unsigned
> +incr_vec_index (double_int increment)
> +{
> + unsigned i;
> +
> + for (i = 0; i < incr_vec_len && increment != incr_vec[i].incr; i++)
> + ;
>
> I smell quadratic complexity here. Is the incr_vec maybe better
> sorted by 'incr'?
Good point. We already have the potential for a problem here (in
record_increment, a linear search is used to update the count for the
increment). I was presuming here that the number of increments for a
candidate group would be a small finite number, which is generally true,
though I suspect a pathological case could be built. Realistic?
Doubtful, but we should plan for the worst.
I can fix this, but I think I should do it as a separate patch prior to
committing this one, then replace this code with a binary search when
the size of incr_vec is larger than a small constant.
I agree with all your other comments. Thanks for the review!
Bill
>
> + basis_type = TREE_TYPE (basis_name);
> + lazy_create_slsr_reg (var, basis_type);
> + lhs = make_ssa_name (*var, NULL);
>
> btw, lazy_create_slsr_reg should go away now as we have
> the notion of "anonymous" SSA names (SSA names without underlying
> VAR_DECLs). Just do
>
> lhs = make_ssa_name (basis_type, NULL);
>
> here. You can followup with a patch to remove lazy_create_slsr_reg.
> Another possibility is to use make_temp_ssa_name which has an
> additional char *name argument:
>
> lhs = make_temp_ssa_name (basis_type, NULL, "slsr");
>
> which then makes the SSA names show as slsr_N in dumps.
>
> + int cost = 0;
> + slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi));
>
> - gcc_assert (i < incr_vec_len);
> - return i;
> + for (i = 0; i < gimple_phi_num_args (phi); i++)
> + {
> + tree arg = gimple_phi_arg_def (phi, i);
> +
> + if (!operand_equal_p (arg, phi_cand->base_expr, 0))
>
> generally SSA names can be compared with == / != directly.
> PHI results are always SSA names so no need to dispatch
> to operand_equal_p here.
>
> Otherwise the patch looks ok.
>
> Thanks,
> Richard.
>