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. */