OSDN Git Service

2009-04-16 Eric Botcazou <ebotcazou@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Apr 2009 08:43:32 +0000 (08:43 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Apr 2009 08:43:32 +0000 (08:43 +0000)
* exp_ch5.adb (Expand_Assign_Array): For the GCC back-end, do not
generate an assignment loop in case of overlap.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146150 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/exp_ch5.adb

index 14e369d..a7e730b 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_ch5.adb (Expand_Assign_Array): For the GCC back-end, do not
+       generate an assignment loop in case of overlap.
+
 2009-04-16  Olivier Hainque  <hainque@adacore.com>
 
        * gnat_ugn.texi (gnatmem description): Make it explicit that
index 99870dc..b51e8d2 100644 (file)
@@ -634,16 +634,21 @@ package body Exp_Ch5 is
             end if;
          end if;
 
-         --  If after that analysis, Forwards_OK is still True, and
-         --  Loop_Required is False, meaning that we have not discovered some
-         --  non-overlap reason for requiring a loop, then we can still let
-         --  gigi handle it.
+         --  If after that analysis Loop_Required is False, meaning that we
+         --  have not discovered some non-overlap reason for requiring a loop,
+         --  then the outcome depends on the capabilities of the back end.
 
          if not Loop_Required then
 
-            --  Assume gigi can handle it if Forwards_OK is set
+            --  The GCC back end can deal with all cases of overlap by falling
+            --  back to memmove if it cannot use a more efficient approach.
 
-            if Forwards_OK (N) then
+            if VM_Target = No_VM and not AAMP_On_Target then
+               return;
+
+            --  Assume other back ends can handle it if Forwards_OK is set
+
+            elsif Forwards_OK (N) then
                return;
 
             --  If Forwards_OK is not set, the back end will need something