some seemingly redundant register uses in nios gcc compiled assembly code

Liu Haibin liu.haibin@gmail.com
Wed Sep 7 04:37:00 GMT 2005


Hi,

I compiled the following code using nios gcc -da -O3 (gcc version 3.3.3)

#include <math.h>
#define PI         (4*atan(1))

double rad2deg(double rad)
{
      return (180.0 * rad / (PI));
}

In .s file, it has some codes like this

........
	mov	r4, zero
	movhi	r5, %hiadj(1072693248)
	addi	r5, r5, %lo(1072693248)
	mov	r16, r2
	mov	r17, r3
	call	atan
	mov	r5, r3
	mov	r4, r2
	mov	r6, zero
	movhi	r7, %hiadj(1074790400)
	addi	r7, r7, %lo(1074790400)
	call	__muldf3
	mov	r10, r2
	mov	r5, r17
	mov	r6, r10
	mov	r7, r3
	mov	r4, r16
............

In .c.26.flow2 file, 

(call_insn 23 19 28 0 0x0 (parallel [
            (set (reg:DF 2 r2)
                (call (mem:QI (symbol_ref:SI ("atan")) [0 S1 A8])
                    (const_int 0 [0x0])))
            (clobber (reg:SI 31 ra))
        ]) 44 {*call_value} (insn_list 21 (nil))
    (expr_list:REG_DEAD (reg:DF 4 r4)
        (expr_list:REG_UNUSED (reg:SI 31 ra)
            (nil)))
    (expr_list (use (reg:DF 4 r4))
        (nil)))

.....

(call_insn/u 31 30 36 0 0x0 (parallel [
            (set (reg:DF 2 r2)
                (call (mem:QI (symbol_ref:SI ("__muldf3")) [0 S1 A8])
                    (const_int 0 [0x0])))
            (clobber (reg:SI 31 ra))
        ]) 44 {*call_value} (insn_list 27 (insn_list 29 (nil)))
    (expr_list:REG_DEAD (reg:DF 4 r4)
        (expr_list:REG_DEAD (reg:DF 6 r6)
            (expr_list:REG_UNUSED (reg:SI 31 ra)
                (expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
                    (nil)))))
    (expr_list (use (reg:DF 6 r6))
        (expr_list (use (reg:DF 4 r4))
            (nil))))

>From the RTL we can see that these two calls don't use r5, but why
here both assembly codes and rtl have some codes with r5, like

	movhi	r5, %hiadj(1072693248)
	addi	r5, r5, %lo(1072693248)        (move 32-bit constant into register)
and 
        mov	r5, r3

In nios2, r2 and r3 are for return value. r4, r5, r6, r7 are for
registre auruments

Does the following rtl implicitly indicate that r5 is used?

(expr_list (use (reg:DF 6 r6))
        (expr_list (use (reg:DF 4 r4))

Thanks.


Regards,
Haibin



More information about the Gcc mailing list