Hi,

this patch is a fix for pr27127.  It avoids splitting the DI registers
into SI ones if it is not allowed, which breaks the introduced loop.
I haven't added a testcase as the bug is already exhibited by several
regressions (like g++.dg/ext/attribute-test-2.C or g++.dg/eh/simd-1.C)
but I can add one if you think it is needed.  Cross built and
regtested on trunk and gcc-5 branch and the regression mentioned in
https://gcc.gnu.org/ml/gcc-patches/2015-07/msg00216.html is not
observed.

Is it ok for trunk and branch ?

Thanks,
Yvan

gcc/

        PR target/67127
        * config/arm/arm.md (movdi): Avoid forbidden modes changed.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index be51c77..d89e853 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -5482,7 +5482,8 @@
        operands[1] = force_reg (DImode, operands[1]);
     }
   if (REG_P (operands[0]) && REGNO (operands[0]) < FIRST_VIRTUAL_REGISTER
-      && !HARD_REGNO_MODE_OK (REGNO (operands[0]), DImode))
+      && !HARD_REGNO_MODE_OK (REGNO (operands[0]), DImode)
+      && !REG_CANNOT_CHANGE_MODE_P (REGNO (operands[0]), DImode, SImode))
     {
       /* Avoid LDRD's into an odd-numbered register pair in ARM state
         when expanding function calls.  */
@@ -5501,7 +5502,8 @@
       DONE;
     }
   else if (REG_P (operands[1]) && REGNO (operands[1]) < FIRST_VIRTUAL_REGISTER
-          && !HARD_REGNO_MODE_OK (REGNO (operands[1]), DImode))
+          && !HARD_REGNO_MODE_OK (REGNO (operands[1]), DImode)
+           && !REG_CANNOT_CHANGE_MODE_P (REGNO (operands[1]), DImode, SImode))
     {
       /* Avoid STRD's from an odd-numbered register pair in ARM state
         when expanding function prologue.  */

Reply via email to