public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/43700]  New: global register variables defect
@ 2010-04-09  9:31 steffenschmidt dot ext at siemens dot com
  2010-04-09  9:50 ` [Bug target/43700] " rguenth at gcc dot gnu dot org
                   ` (12 more replies)
  0 siblings, 13 replies; 18+ messages in thread
From: steffenschmidt dot ext at siemens dot com @ 2010-04-09  9:31 UTC (permalink / raw)
  To: gcc-bugs

We're making use of global register variables, which work fine in GCC version
4.3.2 and 4.3.3. GCC 4.4.1 and 4.4.3 however produce slightly different code,
which seems to be incorrect.

A brief example is:

//---------------test_register_call.c-------------------
register unsigned long long *g_reg_counter asm("$20");

void register_add (void)
{
  *g_reg_counter++;
}
//---------------test_register_call.c-------------------

Compiled with: 
mips-elf-gcc.exe -save-temps test_register_call.c
This produces the following assembler file using GCC 4.3.2

//---------------test_register_call_4.3.2.s-------------
        .file   1 "test_register_call.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  register_add
        .set    nomips16
        .ent    register_add
register_add:
        .frame  $fp,8,$31               # vars= 0, regs= 1/0, args= 0, gp= 0
        .mask   0x40000000,-4
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        addiu   $sp,$sp,-8
        sw      $fp,4($sp)
        move    $fp,$sp
        move    $2,$20
        addiu   $2,$2,8
        move    $20,$2
        move    $sp,$fp
        lw      $fp,4($sp)
        addiu   $sp,$sp,8
        j       $31
        nop

        .set    macro
        .set    reorder
        .end    register_add
        .size   register_add, .-register_add
        .ident  "GCC: 4.3.2"
//---------------test_register_call_4.3.2.s-------------

GCC 4.4.1 produces different assembly code (lines are marked):

//---------------test_register_call_4.4.1.s-------------
        .file   1 "test_register_call.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  register_add
        .set    nomips16
        .ent    register_add
        .type   register_add, @function
register_add:
        .frame  $fp,8,$31               # vars= 0, regs= 2/0, args= 0, gp= 0
        .mask   0x40100000,-4
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        addiu   $sp,$sp,-8
        sw      $fp,4($sp)
        sw      $20,0($sp)              # <== $20 is stored to stack
        move    $fp,$sp
        move    $2,$20
        addiu   $2,$2,8
        move    $20,$2
        move    $sp,$fp
        lw      $fp,4($sp)
        lw      $20,0($sp)              # <== $20 is restored from stack
        addiu   $sp,$sp,8
        j       $31
        nop

        .set    macro
        .set    reorder
        .end    register_add
        .size   register_add, .-register_add
        .ident  "GCC: 4.4.1"
//---------------test_register_call_4.4.1.s-------------

As can be seen in the example, MIPS register $20 is the global variable
register. The variable is modified in the function and the register should
therefore not be saved and restored. GCC 4.3.2 seems to be correct here. GCC
4.4.1, however, stores and restores the register $20 content.


-- 
           Summary: global register variables defect
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steffenschmidt dot ext at siemens dot com
 GCC build triplet: i686-mingw32
  GCC host triplet: i686-mingw32
GCC target triplet: mips-elf


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43700


^ permalink raw reply	[flat|nested] 18+ messages in thread
[parent not found: <bug-43700-4@http.gcc.gnu.org/bugzilla/>]

end of thread, other threads:[~2011-03-13 21:10 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-09  9:31 [Bug c/43700] New: global register variables defect steffenschmidt dot ext at siemens dot com
2010-04-09  9:50 ` [Bug target/43700] " rguenth at gcc dot gnu dot org
2010-04-09 18:13 ` pinskia at gcc dot gnu dot org
2010-04-09 18:21 ` [Bug target/43700] [4.4/4.5/4.6 Regression] " pinskia at gcc dot gnu dot org
2010-04-09 21:52 ` pinskia at gcc dot gnu dot org
2010-04-12  8:41 ` jakub at gcc dot gnu dot org
2010-04-12  9:03 ` mikpe at it dot uu dot se
2010-04-12 18:18 ` pinskia at gcc dot gnu dot org
2010-04-12 18:20 ` pinskia at gcc dot gnu dot org
2010-04-15 14:06 ` rguenth at gcc dot gnu dot org
2010-04-15 19:55 ` mikpe at it dot uu dot se
2010-04-15 22:30 ` mikpe at it dot uu dot se
2010-04-16 13:05 ` mikpe at it dot uu dot se
2010-04-30  8:57 ` jakub at gcc dot gnu dot org
     [not found] <bug-43700-4@http.gcc.gnu.org/bugzilla/>
2010-10-01 12:13 ` jakub at gcc dot gnu.org
2011-03-07 12:23 ` steffen-schmidt at siemens dot com
2011-03-12 11:08 ` steven at gcc dot gnu.org
2011-03-13 21:10 ` jakub at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).