diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index da403d9ba008f64ef96c34e147c1c37129cd6a34..f51653b2a79e355365ebaf22a7c3deec0d74bcfc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 0093743c1051b1be48d5c9a2acebef14f6aeac4f..e739a852bce6c0f6c0d1e2a087ef26bcc450d002 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -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;
     }