[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc-bugs
Subject: [Bug target/52804] New: IRA/RELOAD allocate wrong register on ARM for cortex-m0
From: "amker.cheng at gmail dot com" <gcc-bugzilla () gcc ! gnu ! org>
Date: 2012-03-31 10:39:39
Message-ID: bug-52804-4 () http ! gcc ! gnu ! org/bugzilla/
[Download RAW message or body]
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: unassigned@gcc.gnu.org
ReportedBy: amker.cheng@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:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic