On Tue, 20 Dec 2005, Maxime Bizon wrote: > 272c: 8c43000c lw v1,12(v0) > 2730: 0060f809 jalr v1 > 2734: 00000000 nop > 2738: 3c020000 lui v0,0x0 > 273c: 2442277c addiu v0,v0,10108 <---------- > 2740: 00400408 jr.hb v0 > 2744: 00000000 nop > 2748: 8fbf0028 lw ra,40(sp) > 274c: 8fb30024 lw s3,36(sp) > 2750: 8fb20020 lw s2,32(sp) > 2754: 8fb1001c lw s1,28(sp) > 2758: 8fb00018 lw s0,24(sp) > 275c: 03e00008 jr ra > 2760: 27bd0030 addiu sp,sp,48 > 2764: 3c020000 lui v0,0x0 > 2768: 8c430018 lw v1,24(v0) > 276c: 0060f809 jalr v1 > 2770: 00000000 nop > 2774: 0800099c j 2670 <r4k_flush_icache_range+0x4c> > 2778: 3c030000 lui v1,0x0 > > 0000277c <r4k_dma_cache_inv>: > [...] > > At offset 0x26ac and 0x273c, we can see that instruction_hazard() got > duplicated due to inlining, and that the jr.hb is going to send us to > 10108 (0x277C), outside the function... FYI, GCC 3.4.4 produces the following code which is clearly wrong: .align 2 .align 3 .ent r4k_flush_icache_range .type r4k_flush_icache_range, @function r4k_flush_icache_range: .set nomips16 .frame $sp,56,$31 # vars= 16, regs= 5/0, args= 16, gp= 0 .mask 0x800f0000,-8 .fmask 0x00000000,0 [...] lui $2,%hi($L506) # 239 movsi_internal/2 [length = 4] addiu $2,$2,%lo($L506) # 240 *lowsi [length = 4] #APP jr.hb $2 #NO_APP lw $31,48($sp) # 304 movsi_internal/4 [length = 4] lw $19,44($sp) # 305 movsi_internal/4 [length = 4] lw $18,40($sp) # 306 movsi_internal/4 [length = 4] lw $17,36($sp) # 307 movsi_internal/4 [length = 4] lw $16,32($sp) # 308 movsi_internal/4 [length = 4] .set noreorder .set nomacro j $31 # 310 return_internal [length = 4] addiu $sp,$sp,56 # 309 addsi3_internal/2 [length = 4] .set macro .set reorder $L510: lui $2,%hi(r4k_blast_icache) # 181 movsi_internal/2 [length = 4] lw $3,%lo(r4k_blast_icache)($2) # 182 movsi_internal/4 [length = 4] jal $3 # 183 call_internal/1 [length = 8] lui $2,%hi($L506) # 313 movsi_internal/2 [length = 4] addiu $2,$2,%lo($L506) # 314 *lowsi [length = 4] #APP jr.hb $2 #NO_APP lw $31,48($sp) # 316 movsi_internal/4 [length = 4] lw $19,44($sp) # 317 movsi_internal/4 [length = 4] lw $18,40($sp) # 318 movsi_internal/4 [length = 4] lw $17,36($sp) # 319 movsi_internal/4 [length = 4] lw $16,32($sp) # 320 movsi_internal/4 [length = 4] .set noreorder .set nomacro j $31 # 322 return_internal [length = 4] addiu $sp,$sp,56 # 321 addsi3_internal/2 [length = 4] .set macro .set reorder $L508: lui $2,%hi(r4k_blast_dcache) # 67 movsi_internal/2 [length = 4] lw $3,%lo(r4k_blast_dcache)($2) # 68 movsi_internal/4 [length = 4] jal $3 # 69 call_internal/1 [length = 8] .set noreorder .set nomacro b $L512 # 334 jump [length = 4] lui $3,%hi(icache_size) # 170 movsi_internal/2 [length = 4] .set macro .set reorder $L506: .end r4k_flush_icache_range Please file a bug report at: "http://gcc.gnu.org/bugzilla/". Maciej