This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

some seemingly redundant register uses in nios gcc compiled assembly code


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]