http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52804
Bug #: 52804 Summary: IRA/RELOAD allocate wrong register on ARM for cortex-m0 Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: amker.ch...@gmail.com For following code code: void foo(unsigned char ** i, char *** o, unsigned int row, int num); extern signed long tab[]; extern unsigned int w; void foo(unsigned char ** i, char *** o, unsigned int row, int num) { register int r, g, b; register signed long * t = tab; register char * pi; register char * o0; register char * o1; register unsigned int c; unsigned int n = w; while (--num >= 0) { pi = *i++; o0 = o[0][row]; o1 = o[1][row]; row++; for (c = 0; c < n; c++) { r = ((int) (pi[0])); g = ((int) (pi[1])); b = ((int) (pi[2])); pi += 3; o0[c] = (unsigned char) ((t[r] + t[g] + t[b])); o1[c] = (unsigned char) ((t[r] + t[g] + t[b])); } } } Compile it with following command: $ arm-none-eabi-gcc -S -mthumb -mcpu=cortex-m0 -O2 -o foo.S foo.c comparing ira/reload dump as following: /* dump of ira: (insn 82 81 83 3 (set (reg/f:SI 281 [ *o_15(D) ]) (mem/f:SI (reg/v/f:SI 315 [orig:275 o ] [275]) [2 *o_15(D)+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (expr_list:REG_EQUIV (mem/f:SI (reg/v/f:SI 315 [orig:275 o ] [275]) [2 *o_15(D)+0 S4 A32]) (nil))) (insn 83 82 84 3 (set (reg/v/f:SI 198 [ o0 ]) (mem/f:SI (plus:SI (reg/f:SI 281 [ *o_15(D) ]) (reg:SI 273 [ D.4183 ])) [2 *D.4088_18+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (expr_list:REG_DEAD (reg/f:SI 281 [ *o_15(D) ]) (nil))) (insn 84 83 85 3 (set (reg/f:SI 282 [ MEM[(char * * *)o_15(D) + 4B] ]) (mem/f:SI (plus:SI (reg/v/f:SI 315 [orig:275 o ] [275]) (const_int 4 [0x4])) [2 MEM[(char * * *)o_15(D) + 4B]+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:19 186 {*thumb1_movsi_insn} (expr_list:REG_EQUIV (mem/f:SI (plus:SI (reg/v/f:SI 315 [orig:275 o ] [275]) (const_int 4 [0x4])) [2 MEM[(char * * *)o_15(D) + 4B]+0 S4 A32]) (nil))) (insn 85 84 171 3 (set (reg/v/f:SI 201 [ o1 ]) (mem/f:SI (plus:SI (reg/f:SI 282 [ MEM[(char * * *)o_15(D) + 4B] ]) (reg:SI 273 [ D.4183 ])) [2 *D.4091_23+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:19 186 {*thumb1_movsi_insn} (expr_list:REG_DEAD (reg/f:SI 282 [ MEM[(char * * *)o_15(D) + 4B] ]) (expr_list:REG_DEAD (reg:SI 273 [ D.4183 ]) (nil)))) dump of reload: (note 82 81 207 3 NOTE_INSN_DELETED) (insn 207 82 208 3 (set (reg:SI 6 r6) (reg/v/f:SI 9 r9 [orig:275 o ] [275])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (nil)) (insn 208 207 209 3 (set (reg:SI 6 r6) (mem/f:SI (reg:SI 6 r6) [2 *o_15(D)+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (nil)) (insn 209 208 210 3 (set (reg:SI 7 r7) (mem/f:SI (plus:SI (reg:SI 6 r6) (reg:SI 3 r3 [orig:273 D.4183 ] [273])) [2 *D.4088_18+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (nil)) (insn 210 209 84 3 (set (reg/v/f:SI 12 ip [orig:198 o0 ] [198]) (reg:SI 7 r7)) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:18 186 {*thumb1_movsi_insn} (nil)) (note 84 210 211 3 NOTE_INSN_DELETED) (insn 211 84 85 3 (set (reg:SI 0 r0) (mem/f:SI (plus:SI (reg:SI 6 r6) (const_int 4 [0x4])) [2 MEM[(char * * *)o_15(D) + 4B]+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:19 186 {*thumb1_movsi_insn} (nil)) (insn 85 211 171 3 (set (reg/v/f:SI 7 r7 [orig:201 o1 ] [201]) (mem/f:SI (plus:SI (reg:SI 0 r0) (reg:SI 3 r3 [orig:273 D.4183 ] [273])) [2 *D.4091_23+0 S4 A32])) ./gccmpsm0/obj_lite/cjpeg/jccolor-case.E:19 186 {*thumb1_movsi_insn} (nil)) */ Obviously, r6 is corrupted in insn 208, while it is used in insn 211. piece of generated assembly codes as following: foo: push {r4, r5, r6, r7, lr} mov r5, r9 mov r7, fp mov r6, sl mov r4, r8 push {r4, r5, r6, r7} mov sl, r3 lsl r2, r2, #2 ldr r3, .L11 sub r2, r2, r0 sub sp, sp, #20 mov r9, r1 *****step1 sub r2, r2, #4 ldr r1, [r3] ldr r5, .L11+4 mov fp, r0 str r2, [sp, #12] .L8: mov r6, sl sub r6, r6, #1 mov sl, r6 bmi .L10 .L7: mov r0, fp ldr r4, [sp, #12] add r0, r0, #4 mov r6, r9 *****step2 mov fp, r0 ldr r6, [r6] *****step3, r6 corrupted mov r3, r4 add r3, r3, fp sub r0, r0, #4 ldr r7, [r6, r3] ldmia r0!, {r2} ldr r0, [r6, #4] *****step4, r6 is wrong here mov ip, r7 ldr r7, [r0, r3] mov r3, #0 cmp r1, #0 beq .L8 mov r4, ip str r1, [sp, #4] str r4, [sp, #8] mov ip, r7 .L6: