loop-iv.c (determine_max_iter): Moved in front of its sole user.
* loop-iv.c (determine_max_iter): Moved in front of its sole user. From-SVN: r122264
This commit is contained in:
parent
74a5d8b9fe
commit
c67dc1a321
@ -3,6 +3,8 @@
|
||||
* config/bfin/bfin.md (doloop_end): Fail for loops that can iterate
|
||||
2^32-1 or more times unless flag_unsafe_loop_optimizations.
|
||||
|
||||
* loop-iv.c (determine_max_iter): Moved in front of its sole user.
|
||||
|
||||
2007-02-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* builtins.c (fold_builtin_logb, fold_builtin_significand): New.
|
||||
|
130
gcc/loop-iv.c
130
gcc/loop-iv.c
@ -1261,71 +1261,6 @@ inverse (unsigned HOST_WIDEST_INT x, int mod)
|
||||
return rslt;
|
||||
}
|
||||
|
||||
/* Tries to estimate the maximum number of iterations. */
|
||||
|
||||
static unsigned HOST_WIDEST_INT
|
||||
determine_max_iter (struct niter_desc *desc)
|
||||
{
|
||||
rtx niter = desc->niter_expr;
|
||||
rtx mmin, mmax, left, right;
|
||||
unsigned HOST_WIDEST_INT nmax, inc;
|
||||
|
||||
if (GET_CODE (niter) == AND
|
||||
&& GET_CODE (XEXP (niter, 0)) == CONST_INT)
|
||||
{
|
||||
nmax = INTVAL (XEXP (niter, 0));
|
||||
if (!(nmax & (nmax + 1)))
|
||||
{
|
||||
desc->niter_max = nmax;
|
||||
return nmax;
|
||||
}
|
||||
}
|
||||
|
||||
get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
|
||||
nmax = INTVAL (mmax) - INTVAL (mmin);
|
||||
|
||||
if (GET_CODE (niter) == UDIV)
|
||||
{
|
||||
if (GET_CODE (XEXP (niter, 1)) != CONST_INT)
|
||||
{
|
||||
desc->niter_max = nmax;
|
||||
return nmax;
|
||||
}
|
||||
inc = INTVAL (XEXP (niter, 1));
|
||||
niter = XEXP (niter, 0);
|
||||
}
|
||||
else
|
||||
inc = 1;
|
||||
|
||||
if (GET_CODE (niter) == PLUS)
|
||||
{
|
||||
left = XEXP (niter, 0);
|
||||
right = XEXP (niter, 0);
|
||||
|
||||
if (GET_CODE (right) == CONST_INT)
|
||||
right = GEN_INT (-INTVAL (right));
|
||||
}
|
||||
else if (GET_CODE (niter) == MINUS)
|
||||
{
|
||||
left = XEXP (niter, 0);
|
||||
right = XEXP (niter, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
left = niter;
|
||||
right = mmin;
|
||||
}
|
||||
|
||||
if (GET_CODE (left) == CONST_INT)
|
||||
mmax = left;
|
||||
if (GET_CODE (right) == CONST_INT)
|
||||
mmin = right;
|
||||
nmax = INTVAL (mmax) - INTVAL (mmin);
|
||||
|
||||
desc->niter_max = nmax / inc;
|
||||
return nmax / inc;
|
||||
}
|
||||
|
||||
/* Checks whether register *REG is in set ALT. Callback for for_each_rtx. */
|
||||
|
||||
static int
|
||||
@ -1981,6 +1916,71 @@ canonicalize_iv_subregs (struct rtx_iv *iv0, struct rtx_iv *iv1,
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Tries to estimate the maximum number of iterations. */
|
||||
|
||||
static unsigned HOST_WIDEST_INT
|
||||
determine_max_iter (struct niter_desc *desc)
|
||||
{
|
||||
rtx niter = desc->niter_expr;
|
||||
rtx mmin, mmax, left, right;
|
||||
unsigned HOST_WIDEST_INT nmax, inc;
|
||||
|
||||
if (GET_CODE (niter) == AND
|
||||
&& GET_CODE (XEXP (niter, 0)) == CONST_INT)
|
||||
{
|
||||
nmax = INTVAL (XEXP (niter, 0));
|
||||
if (!(nmax & (nmax + 1)))
|
||||
{
|
||||
desc->niter_max = nmax;
|
||||
return nmax;
|
||||
}
|
||||
}
|
||||
|
||||
get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
|
||||
nmax = INTVAL (mmax) - INTVAL (mmin);
|
||||
|
||||
if (GET_CODE (niter) == UDIV)
|
||||
{
|
||||
if (GET_CODE (XEXP (niter, 1)) != CONST_INT)
|
||||
{
|
||||
desc->niter_max = nmax;
|
||||
return nmax;
|
||||
}
|
||||
inc = INTVAL (XEXP (niter, 1));
|
||||
niter = XEXP (niter, 0);
|
||||
}
|
||||
else
|
||||
inc = 1;
|
||||
|
||||
if (GET_CODE (niter) == PLUS)
|
||||
{
|
||||
left = XEXP (niter, 0);
|
||||
right = XEXP (niter, 0);
|
||||
|
||||
if (GET_CODE (right) == CONST_INT)
|
||||
right = GEN_INT (-INTVAL (right));
|
||||
}
|
||||
else if (GET_CODE (niter) == MINUS)
|
||||
{
|
||||
left = XEXP (niter, 0);
|
||||
right = XEXP (niter, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
left = niter;
|
||||
right = mmin;
|
||||
}
|
||||
|
||||
if (GET_CODE (left) == CONST_INT)
|
||||
mmax = left;
|
||||
if (GET_CODE (right) == CONST_INT)
|
||||
mmin = right;
|
||||
nmax = INTVAL (mmax) - INTVAL (mmin);
|
||||
|
||||
desc->niter_max = nmax / inc;
|
||||
return nmax / inc;
|
||||
}
|
||||
|
||||
/* Computes number of iterations of the CONDITION in INSN in LOOP and stores
|
||||
the result into DESC. Very similar to determine_number_of_iterations
|
||||
(basically its rtl version), complicated by things like subregs. */
|
||||
|
Loading…
Reference in New Issue
Block a user