[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