loop-iv.c (iv_analyze, [...]): Support for identifying shifts of induction variable.

2004-06-24  Revital Eres  <eres@il.ibm.com>

	* loop-iv.c (iv_analyze, simple_set_p): Support for identifying
	shifts of induction variable.
	(iv_shift): New function.

From-SVN: r83599
This commit is contained in:
Revital Eres 2004-06-24 16:50:35 +00:00 committed by Roger Sayle
parent be1ba3d170
commit abe0d774cf
2 changed files with 49 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2004-06-24 Revital Eres <eres@il.ibm.com>
* loop-iv.c (iv_analyze, simple_set_p): Support for identifying
shifts of induction variable.
(iv_shift): New function.
2004-06-24 Richard Henderson <rth@redhat.com>
* gimplify.c (gimplify_body): Watch for body vanishing.

View File

@ -222,6 +222,7 @@ simple_set_p (rtx lhs, rtx rhs)
case PLUS:
case MINUS:
case MULT:
case ASHIFT:
op0 = XEXP (rhs, 0);
op1 = XEXP (rhs, 1);
@ -238,6 +239,10 @@ simple_set_p (rtx lhs, rtx rhs)
&& !CONSTANT_P (op1))
return false;
if (GET_CODE (rhs) == ASHIFT
&& CONSTANT_P (op0))
return false;
return true;
default:
@ -589,6 +594,31 @@ iv_mult (struct rtx_iv *iv, rtx mby)
return true;
}
/* Evaluates shift of IV by constant CST. */
static bool
iv_shift (struct rtx_iv *iv, rtx mby)
{
enum machine_mode mode = iv->extend_mode;
if (GET_MODE (mby) != VOIDmode
&& GET_MODE (mby) != mode)
return false;
if (iv->extend == NIL)
{
iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby);
iv->step = simplify_gen_binary (ASHIFT, mode, iv->step, mby);
}
else
{
iv->delta = simplify_gen_binary (ASHIFT, mode, iv->delta, mby);
iv->mult = simplify_gen_binary (ASHIFT, mode, iv->mult, mby);
}
return true;
}
/* The recursive part of get_biv_step. Gets the value of the single value
defined in INSN wrto initial value of REG inside loop, in shape described
at get_biv_step. */
@ -1032,7 +1062,14 @@ iv_analyze (rtx insn, rtx def, struct rtx_iv *iv)
mby = tmp;
}
break;
case ASHIFT:
if (CONSTANT_P (XEXP (rhs, 0)))
abort ();
op0 = XEXP (rhs, 0);
mby = XEXP (rhs, 1);
break;
default:
abort ();
}
@ -1088,6 +1125,11 @@ iv_analyze (rtx insn, rtx def, struct rtx_iv *iv)
goto end;
break;
case ASHIFT:
if (!iv_shift (&iv0, mby))
goto end;
break;
default:
break;
}