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