Index: dse.c
===================================================================
--- dse.c	(revision 163446)
+++ dse.c	(working copy)
@@ -473,8 +473,9 @@
      hard_frame_pointer.  */
   bool frame_related;
 
-  /* A mem wrapped around the base pointer for the group in order to
-     do read dependency.  */
+  /* A mem wrapped around the base pointer for the group in order to do
+     read dependency.  It must be given BLKmode in order to encompass all
+     the possible offsets from the base.  */
   rtx base_mem;
 
   /* Canonized version of base_mem's address.  */
@@ -705,7 +706,7 @@
       *slot = gi = (group_info_t) pool_alloc (rtx_group_info_pool);
       gi->rtx_base = base;
       gi->id = rtx_group_next_id++;
-      gi->base_mem = gen_rtx_MEM (QImode, base);
+      gi->base_mem = gen_rtx_MEM (BLKmode, base);
       gi->canon_base_addr = canon_rtx (base);
       gi->store1_n = BITMAP_ALLOC (NULL);
       gi->store1_p = BITMAP_ALLOC (NULL);
@@ -3118,7 +3119,7 @@
 		     base.  */
 		  if ((read_info->group_id < 0)
 		      && canon_true_dependence (group->base_mem,
-						QImode,
+						GET_MODE (group->base_mem),
 						group->canon_base_addr,
 						read_info->mem, NULL_RTX,
 						rtx_varies_p))
Index: testsuite/gnat.dg/test_dse_step.adb
===================================================================
--- testsuite/gnat.dg/test_dse_step.adb	(revision 0)
+++ testsuite/gnat.dg/test_dse_step.adb	(revision 0)
@@ -0,0 +1,14 @@
+-- { dg-do compile }
+-- { dg-options "-O1 -gnatp -gnatn" }
+
+with Dse_Step; use Dse_Step;
+
+procedure Test_Dse_Step is
+   Start : My_Counter := (Value => 0, Step => 1);
+   Steps : Natural := Nsteps;
+begin
+   Step_From (Start);
+   if Mv /= Steps then
+      raise Program_Error;
+   end if;
+end;
Index: testsuite/gnat.dg/dse_step.adb
===================================================================
--- testsuite/gnat.dg/dse_step.adb	(revision 0)
+++ testsuite/gnat.dg/dse_step.adb	(revision 0)
@@ -0,0 +1,18 @@
+package body Dse_Step is
+
+   procedure Do_Step (This : in out Counter) is
+   begin
+      This.Value := This.Value + This.Step;
+   end;
+
+   procedure Step_From (Start : in My_Counter) is
+      Lc : My_Counter := Start;
+   begin
+      while Nsteps > 0 loop
+         Do_Step (Lc);
+         Nsteps := Nsteps - 1;
+      end loop;
+      Mv := Lc.Value;
+   end;
+
+end;
Index: testsuite/gnat.dg/dse_step.ads
===================================================================
--- testsuite/gnat.dg/dse_step.ads	(revision 0)
+++ testsuite/gnat.dg/dse_step.ads	(revision 0)
@@ -0,0 +1,19 @@
+package Dse_Step is
+
+   type Counter is record
+      Value : Natural;
+      Step  : Natural;
+   end record;
+   pragma Suppress_Initialization (Counter);
+
+   procedure Do_Step (This : in out Counter);
+   pragma Inline (Do_Step);
+
+   type My_Counter is new Counter;
+   pragma Suppress_Initialization (My_Counter);
+
+   procedure Step_From (Start : in My_Counter);
+
+   Nsteps : Natural := 12;
+   Mv : Natural;
+end;
