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