Hi,
> diff -u gcc/tree-ssa-loop-ivopts.c gcc/tree-ssa-loop-ivopts.c
> --- gcc/tree-ssa-loop-ivopts.c (working copy)
> +++ gcc/tree-ssa-loop-ivopts.c (working copy)
> @@ -1194,6 +1300,7 @@ record_use (struct ivopts_data *data, tr
> gimple stmt, enum use_type use_type)
> {
> struct iv_use *use = XCNEW (struct iv_use);
> + tree tmp;
>
> use->id = n_iv_uses (data);
> use->type = use_type;
> @@ -1204,11 +1311,14 @@ record_use (struct ivopts_data *data, tr
>
> /* To avoid showing ssa name in the dumps, if it was not reset by the
> caller. */
> + tmp = iv->ssa_name;
> iv->ssa_name = NULL_TREE;
>
> if (dump_file && (dump_flags & TDF_DETAILS))
> dump_use (dump_file, use);
>
> + iv->ssa_name = tmp;
> +
> VEC_safe_push (iv_use_p, heap, data->iv_uses, use);
>
> return use;
this is not ok. You can get the ssa name from extract_cond_operands.
> + /* Determine if the exit test is formulated in terms of the phi or the
> + increment of the use iv. */
> + use_uses_inced_iv
> + = gimple_code (SSA_NAME_DEF_STMT (use->iv->ssa_name)) != GIMPLE_PHI;
> +
> + /* Determine if the exit test is before or after the increment of the
> + cand. */
> + use_after_cand_inc
> + = stmt_after_increment (data->current_loop, cand, use->stmt);
> +
> + /* For now, we only handle these cases. */
> + if (use_after_cand_inc != use_uses_inced_iv)
> + return false;
what is this trying to achieve? USE_USES_INCED_IV is pretty much meaningless --
the value of USE does not depend in any way on whether it comes directly from
a PHI node or from some other calculation.
> + /* Calculate bound. */
> + bound = fold_build_plus (PLUS_EXPR, base_ptr,
> + fold_convert (sizetype, use_lt_bound));
> + if (bound == NULL_TREE)
> + return false;
How could the result be NULL_TREE?
Zdenek