At 2013-05-24 15:19:36,Chung-Ju Wu jasonw...@gmail.com wrote:
2013/5/24 Xinyu Qi x...@marvell.com:
Hi,
For this simple case, compiled with option -march=iwmmxt -O, #define
N 64 signed int b[N]; signed long long j[N], d[N]; void foo (void) {
int i;
for (i = 0; i N; i++)
j[i] = d[i] b[i];
}
An internal compiler error occurs,
error: insn does not satisfy its constraints:
(insn 112 74 75 3 (set (reg:SI 96 wcgr0)
(mem/c:SI (plus:SI (reg:SI 3 r3 [orig:174 ivtmp.19 ] [174])
(reg/f:SI 0 r0 [183])) [0 MEM[symbol: b, index:
ivtmp.19_14, offset: 0B]+0 S4 A32])) {*iwmmxt_movsi_insn}
(nil))
The load address of wmmx wcgr register cannot accept the register offset
mode and the reload pass fails to fix it, so that such error happens.
This issue could be solved by adding check code for IWMMXT_GR_REGS class
in the SECONDARY_RELOAD MACRO if TARGET_IWMMXT. Current code only
check the IWMMXT_REGS group.
Patch attached with a new test.
Pass full dejagnu test. No regression.
Is this fix proper?
OK for trunk?
I cannot approve it. But here are some comments and hope it helps.
Hi Chung-Ju,
Thanks for your comments:)
I fixed the typo you mentioned and regenerated the patch attached.
ChangeLog
gcc/
2013-05-24 Xinyu Qi x...@marvell.com
* config/arm/arm.h (SECONDARY_OUTPUT_RELOAD_CLASS): Check
IWMMXT_GR_REGS register class.
(SECONDARY_INPUT_RELOAD_CLASS): Likewise.
testsuite/
2013-05-24 Xinyu Qi x...@marvell.com
* gcc.target/arm/mmx-3.c: New test.
Thanks,
Xinyu
ChangeLog
gcc/
2013-05-24 Xinyu Qi x...@marvell.com
* config/arm/arm.h (SECONDARY_OUTPUT_RELOAD_CLASS):
Check IWMMXT_GR_REGS.
This line just ends at 81 column.
How about this one?
2013-05-24 Xinyu Qi x...@marvell.com
* config/arm/arm.h (SECONDARY_OUTPUT_RELOAD_CLASS): Check
IWMMXT_GR_REGS register class.
(SECONDARY_INPUT_RELOAD_CLASS): Likewise.
testsuite/
2013-05-24 Xinyu Qi x...@marvell.com
* gcc.target/arm/mmx-3.c: New test.
Index: gcc/config/arm/arm.h
===
--- gcc/config/arm/arm.h(revision 199090)
+++ gcc/config/arm/arm.h(working copy)
@@ -1280,7 +1280,8 @@
((TARGET_VFP TARGET_HARD_FLOAT\
IS_VFP_CLASS (CLASS))\
? coproc_secondary_reload_class (MODE, X, FALSE)\
- : (TARGET_IWMMXT (CLASS) == IWMMXT_REGS)\
+ : (TARGET_IWMMXT ((CLASS) == IWMMXT_REGS)\
+|| (CLASS) == IWMMXT_GR_REGS)\
I think it should be
+ : (TARGET_IWMMXT ((CLASS) == IWMMXT_REGS\
+|| (CLASS) == IWMMXT_GR_REGS))\
? coproc_secondary_reload_class (MODE, X, TRUE)\
: TARGET_32BIT\
? (((MODE) == HImode ! arm_arch4 true_regnum (X) == -1) \
@@
-1293,7 +1294,8 @@
((TARGET_VFP TARGET_HARD_FLOAT\
IS_VFP_CLASS (CLASS))\
? coproc_secondary_reload_class (MODE, X, FALSE) :\
-(TARGET_IWMMXT (CLASS) == IWMMXT_REGS) ?\
+(TARGET_IWMMXT ((CLASS) == IWMMXT_REGS\
+ || (CLASS) == IWMMXT_GR_REGS)) ?\
coproc_secondary_reload_class (MODE, X, TRUE) :\
(TARGET_32BIT ?\
(((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS)\
It seems that you didn't CC arm maintainer.
Let me do this for you. :)
Best regards,
jasonwucj
GR_secondary_reload.diff
Description: GR_secondary_reload.diff