linux-mips
[Top] [All Lists]

Error in gcc version 2.96 20000731

To: linux-mips@oss.sgi.com
Subject: Error in gcc version 2.96 20000731
From: Kjeld Borch Egevang <kjelde@mips.com>
Date: Thu, 13 Sep 2001 16:15:10 +0200
Sender: owner-linux-mips@oss.sgi.com
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1
Hi all.

I discovered an optimization error in the current gcc for MIPS.

When I compile the code below with -O2 it clears the code-field just after setting it. The instructions are mixed up. It works fine with -O1 and -O0.

If the "//" is removed in front of the first printf, it works too.


/Kjeld

--------------- cut here -----------------
#include <stdio.h>


typedef struct rtx_def
{
short code;
int dummy;
} rtx;


void put_code (rtx *rt, short code)
{
register int length;

length = 1;
for (; length >= 0; length--)
  ((int *) rt)[length] = 0;

// printf("put_code before\n");
rt->code = code;
printf("put_code after, code=%d %d\n", code, rt->code);
}


int main()
{
rtx rt;

put_code(&rt, 5);
printf("gen_rtx, code=%d\n", rt.code);
}
--------------- cut here -----------------


The assembler looks like:

      .rdata
      .align  2
$LC0:
      .ascii  "put_code after, code=%d %d\n\000"
      .text
      .align  2
      .globl  put_code
      .ent    put_code
      .type    put_code,@function
put_code:
.frame $sp,32,$31 # vars= 0, regs= 2/0, args= 16, extra= 8
      .mask   0x90000000,-4
      .fmask  0x00000000,0
      .set    noreorder
      .cpload $25
      .set    reorder
      subu    $sp,$sp,32
      .cprestore 16
      move    $2,$5
      sll     $2,$2,16
      sra     $2,$2,16
      move    $5,$2
      la      $3,$LC0
      sw      $31,28($sp)
      sw      $28,24($sp)
      move    $6,$5
      sh      $2,0($4)     <----- sets code field
      sw      $0,4($4)     <----- clears structure
      sw      $0,0($4)     <----- clears structure
      move    $4,$3
      la      $25,printf
      jal     $31,$25
      lw      $31,28($sp)
      #nop
      .set    noreorder
      .set    nomacro
      j       $31
      addu    $sp,$sp,32
      .set    macro
      .set    reorder

      .end    put_code







<Prev in Thread] Current Thread [Next in Thread>