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]

Re: PR 6394


> 
>  In message <200204302038.QAA24876@makai.watson.ibm.com>, David Edelsohn 
> writes:
>  > 	It depends how the pseudo is being used throughout its entire
>  > lifetime.  While a GPR is cheaper for the address case producing the bad
>  > code, the pseudo may be used in an FP situation (possibly multiple times)
>  > for which GPR is significantly more expensive.
> Correct.  

I've appended the rtl output from the end of the lreg pass below.  The
problem is the register allocation for DI 714.  From that, we somehow get:

;; Start of basic block 258, registers live: 27 [%r27] 30 [%r30]
(note 3479 2994 2996 [bb 258] NOTE_INSN_BASIC_BLOCK)

(insn 2996 3479 2998 (set (reg:DI 1 %r1 [715])
        (plus:DI (reg:DI 27 %r27)
	    (high:DI (symbol_ref:DI ("PL_sv_yes"))))) 80 {*pa.md:2328} (nil)
    (nil))

(insn 2998 2996 3000 (set (reg:DI 50 %fr22 [714])
	(mem/u:DI (lo_sum:DI (reg:DI 1 %r1 [715])
		(unspec:DI[ 
			(symbol_ref:DI ("PL_sv_yes"))
		    ]  0)) [0 S8 A64])) 119 {*pa.md:3106} (insn_list 2996 (nil))
    (nil))

(jump_insn 3000 2998 3001 (set (pc)
	(label_ref 3008)) 269 {jump} (nil)
    (nil))
;; End of basic block 258, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 714
                                 ^^^^^
[...]

One thing that I see is that there is no register live info for 714.

Output from lreg:

;; Start of basic block 257, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 634
(code_label 2990 2972 3478 954 "" "" [29 uses])

(note 3478 2990 2994 [bb 257] NOTE_INSN_BASIC_BLOCK)

(jump_insn 2994 3478 3479 (set (pc)
        (if_then_else (eq (subreg/s:SI (reg/v:DI 634) 4)
                (const_int 0 [0x0]))
            (label_ref 3002)
            (pc))) 44 {*pa.md:1497} (nil)
    (expr_list:REG_DEAD (reg/v:DI 634)
        (expr_list:REG_BR_PROB (const_int 5000 [0x1388])
            (nil))))
;; End of basic block 257, registers live:
 3 [%r3] 27 [%r27] 30 [%r30]

;; Start of basic block 258, registers live: 3 [%r3] 27 [%r27] 30 [%r30]
(note 3479 2994 2996 [bb 258] NOTE_INSN_BASIC_BLOCK)

(insn 2996 3479 2998 (set (reg:DI 715)
        (plus:DI (reg:DI 27 %r27)
            (high:DI (symbol_ref:DI ("PL_sv_yes"))))) 80 {*pa.md:2328} (nil)
    (nil))

(insn 2998 2996 3000 (set (reg:DI 714)
        (mem/u:DI (lo_sum:DI (reg:DI 715)
                (unspec:DI[ 
                        (symbol_ref:DI ("PL_sv_yes"))
                    ]  0)) [0 S8 A64])) 119 {*pa.md:3106} (insn_list 2996 (nil))
    (expr_list:REG_DEAD (reg:DI 715)
        (nil)))

(jump_insn 3000 2998 3001 (set (pc)
        (label_ref 3008)) 269 {jump} (nil)
    (nil))
;; End of basic block 258, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 714

(barrier 3001 3000 3002)

;; Start of basic block 259, registers live: 3 [%r3] 27 [%r27] 30 [%r30]
(code_label 3002 3001 3480 1012 "" "" [1 uses])

(note 3480 3002 3004 [bb 259] NOTE_INSN_BASIC_BLOCK)

(insn 3004 3480 3006 (set (reg:DI 716)
        (plus:DI (reg:DI 27 %r27)
            (high:DI (symbol_ref:DI ("PL_sv_no"))))) 80 {*pa.md:2328} (nil)
    (nil))

(insn 3006 3004 3008 (set (reg:DI 714)
        (mem/u:DI (lo_sum:DI (reg:DI 716)
                (unspec:DI[ 
                        (symbol_ref:DI ("PL_sv_no"))
                    ]  0)) [0 S8 A64])) 119 {*pa.md:3106} (insn_list 3004 (nil))
    (expr_list:REG_DEAD (reg:DI 716)
        (nil)))
;; End of basic block 259, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 714

;; Start of basic block 260, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 714
(code_label 3008 3006 3481 1013 "" "" [1 uses])

(note 3481 3008 3010 [bb 260] NOTE_INSN_BASIC_BLOCK)

(insn 3010 3481 3011 (set (reg/f:DI 66)
        (reg:DI 714)) 119 {*pa.md:3106} (nil)
    (expr_list:REG_DEAD (reg:DI 714)
        (nil)))

(jump_insn 3011 3010 3012 (set (pc)
        (label_ref 3086)) 269 {jump} (nil)
    (nil))
;; End of basic block 260, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 66

(barrier 3012 3011 3013)

(note 3013 3012 3016 800003fffefe3c00 NOTE_INSN_BLOCK_END)

;; Start of basic block 261, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 70 429
(code_label 3016 3013 3483 953 "" "" [1 uses])

(note 3483 3016 3019 [bb 261] NOTE_INSN_BASIC_BLOCK)

(insn 3019 3483 3020 (set (reg:SI 717)
        (const_int 56 [0x38])) 68 {*pa.md:2088} (nil)
    (expr_list:REG_EQUIV (const_int 56 [0x38])
        (nil)))

(jump_insn 3020 3019 3484 (set (pc)
        (if_then_else (ne (subreg/s:SI (reg/v:DI 70) 4)
                (reg:SI 717))
            (label_ref 3070)
            (pc))) 44 {*pa.md:1497} (insn_list 3019 (nil))
    (expr_list:REG_DEAD (reg/v:DI 70)
        (expr_list:REG_DEAD (reg:SI 717)
            (expr_list:REG_BR_PROB (const_int 7100 [0x1bbc])
                (nil)))))
;; End of basic block 261, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 429

;; Start of basic block 262, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 429
(note 3484 3020 3025 [bb 262] NOTE_INSN_BASIC_BLOCK)

(insn 3025 3484 3027 (set (reg:SI 719)
        (mem/s/j:SI (plus:DI (reg/v/f:DI 429)
                (const_int 12 [0xc])) [0 <variable>.sv_flags+0 S4 A32])) 68 {*pa.md:2088} (nil)
    (expr_list:REG_EQUIV (mem/s/j:SI (plus:DI (reg/v/f:DI 429)
                (const_int 12 [0xc])) [0 <variable>.sv_flags+0 S4 A32])
        (nil)))

(note 3027 3025 3028 NOTE_INSN_DELETED)

(insn 3028 3027 3029 (set (reg:DI 718)
        (zero_extract:DI (subreg:DI (reg:SI 719) 0)
            (const_int 1 [0x1])
            (const_int 44 [0x2c]))) 287 {extzv_64} (insn_list 3025 (nil))
    (expr_list:REG_DEAD (reg:SI 719)
        (nil)))

(jump_insn 3029 3028 3485 (set (pc)
        (if_then_else (ne (subreg:SI (reg:DI 718) 4)
                (const_int 0 [0x0]))
            (label_ref 3044)
            (pc))) 44 {*pa.md:1497} (insn_list 3028 (nil))
    (expr_list:REG_BR_PROB (const_int 9900 [0x26ac])
        (expr_list:REG_DEAD (reg:DI 718)
            (nil))))
;; End of basic block 262, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 429

;; Start of basic block 263, registers live: 3 [%r3] 27 [%r27] 30 [%r30]
(note 3485 3029 3034 [bb 263] NOTE_INSN_BASIC_BLOCK)

(insn 3034 3485 3036 (set (reg:DI 721)
        (plus:DI (reg:DI 27 %r27)
            (high:DI (symbol_ref/v/f:DI ("*L$C0096"))))) 80 {*pa.md:2328} (nil)
    (nil))

(insn 3036 3034 3037 (set (reg:DI 721)
        (mem/u:DI (lo_sum:DI (reg:DI 721)
                (unspec:DI[ 
                        (symbol_ref/v/f:DI ("*L$C0096"))
                    ]  0)) [0 S8 A64])) 119 {*pa.md:3106} (insn_list 3034 (nil))
    (nil))

(insn 3037 3036 3039 (set (reg:DI 26 %r26)
        (reg:DI 721)) 119 {*pa.md:3106} (insn_list 3036 (nil))
    (expr_list:REG_DEAD (reg:DI 721)
        (nil)))

(insn 3039 3037 3040 (set (reg/f:DI 29 %r29)
        (plus:DI (reg/f:DI 30 %r30)
            (const_int -32 [0xffffffffffffffe0]))) 162 {*pa.md:3689} (nil)
    (nil))

(call_insn 3040 3039 3043 (parallel[ 
            (call (mem:SI (symbol_ref/v:DI ("@Perl_croak")) [0 S4 A32])
                (const_int 64 [0x40]))
            (clobber (reg:SI 2 %r2))
            (use (const_int 0 [0x0]))
        ] ) 271 {call_internal_symref} (insn_list 3037 (insn_list 3039 (nil)))
    (expr_list:REG_DEAD (reg:DI 26 %r26)
        (expr_list:REG_DEAD (reg:DI 27 %r27)
            (expr_list:REG_DEAD (reg/f:DI 29 %r29)
                (expr_list:REG_UNUSED (reg:SI 2 %r2)
                    (expr_list:REG_NORETURN (const_int 0 [0x0])
                        (nil))))))
    (expr_list (use (reg/f:DI 29 %r29))
        (expr_list (use (reg:DI 27 %r27))
            (expr_list (use (reg:DI 26 %r26))
                (nil)))))
;; End of basic block 263, registers live:
 3 [%r3] 27 [%r27] 30 [%r30]

(barrier 3043 3040 3044)

;; Start of basic block 264, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 429
(code_label 3044 3043 3487 1016 "" "" [1 uses])

(note 3487 3044 3048 [bb 264] NOTE_INSN_BASIC_BLOCK)

(note 3048 3487 3051 800003fffefe3c80 NOTE_INSN_BLOCK_BEG)

(insn 3051 3048 3053 (set (reg/f:DI 724)
        (mem/s/j:DI (reg/v/f:DI 429) [0 <variable>.sv_any+0 S8 A64])) 119 {*pa.md:3106} (nil)
    (expr_list:REG_DEAD (reg/v/f:DI 429)
        (nil)))

(insn 3053 3051 3056 (set (reg/v/f:DI 723)
        (mem/s/j:DI (reg/f:DI 724) [0 <variable>.xrv_rv+0 S8 A64])) 119 {*pa.md:3106} (insn_list 3051 (nil))
    (expr_list:REG_DEAD (reg/f:DI 724)
        (nil)))

(jump_insn 3056 3053 3488 (set (pc)
        (if_then_else (eq (reg/v/f:DI 723)
                (const_int 0 [0x0]))
            (label_ref 3062)
            (pc))) 46 {*pa.md:1551} (insn_list 3053 (nil))
    (expr_list:REG_BR_PROB (const_int 1900 [0x76c])
        (nil)))
;; End of basic block 264, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 723

;; Start of basic block 265, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 723
(note 3488 3056 3058 [bb 265] NOTE_INSN_BASIC_BLOCK)

(insn 3058 3488 3059 (set (reg:SI 727)
        (mem/s/j:SI (plus:DI (reg/v/f:DI 723)
                (const_int 8 [0x8])) [0 <variable>.sv_refcnt+0 S4 A64])) 68 {*pa.md:2088} (nil)
    (expr_list:REG_EQUIV (mem/s/j:SI (plus:DI (reg/v/f:DI 723)
                (const_int 8 [0x8])) [0 <variable>.sv_refcnt+0 S4 A64])
        (nil)))

(insn 3059 3058 3061 (set (reg:SI 726)
        (plus:SI (reg:SI 727)
            (const_int 1 [0x1]))) 165 {addsi3} (insn_list 3058 (nil))
    (expr_list:REG_EQUIV (mem/s/j:SI (plus:DI (reg/v/f:DI 723)
                (const_int 8 [0x8])) [0 <variable>.sv_refcnt+0 S4 A64])
        (expr_list:REG_DEAD (reg:SI 727)
            (nil))))

(insn 3061 3059 3062 (set (mem/s/j:SI (plus:DI (reg/v/f:DI 723)
                (const_int 8 [0x8])) [0 <variable>.sv_refcnt+0 S4 A64])
        (reg:SI 726)) 68 {*pa.md:2088} (insn_list 3059 (nil))
    (expr_list:REG_DEAD (reg:SI 726)
        (nil)))
;; End of basic block 265, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 723

;; Start of basic block 266, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 723
(code_label 3062 3061 3489 1017 "" "" [1 uses])

(note 3489 3062 3063 [bb 266] NOTE_INSN_BASIC_BLOCK)

(note 3063 3489 3065 800003fffefe3c80 NOTE_INSN_BLOCK_END)

(insn 3065 3063 3066 (set (reg/f:DI 66)
        (reg/v/f:DI 723)) 119 {*pa.md:3106} (nil)
    (expr_list:REG_DEAD (reg/v/f:DI 723)
        (nil)))

(jump_insn 3066 3065 3067 (set (pc)
        (label_ref 3086)) 269 {jump} (nil)
    (nil))
;; End of basic block 266, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 66

(barrier 3067 3066 3070)

;; Start of basic block 267, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 429
(code_label 3070 3067 3491 1015 "" "" [1 uses])

(note 3491 3070 3077 [bb 267] NOTE_INSN_BASIC_BLOCK)

(insn 3077 3491 3082 (set (reg/f:DI 66)
        (reg/v/f:DI 429)) 119 {*pa.md:3106} (nil)
    (expr_list:REG_DEAD (reg/v/f:DI 429)
        (nil)))
;; End of basic block 267, registers live:
 3 [%r3] 27 [%r27] 30 [%r30] 66

(note 3082 3077 3083 800003fffefe3d00 NOTE_INSN_BLOCK_END)

(note 3083 3082 3084 800003fffefe3e00 NOTE_INSN_BLOCK_END)

(note 3084 3083 3086 NOTE_INSN_FUNCTION_END)

;; Start of basic block 268, registers live: 3 [%r3] 27 [%r27] 30 [%r30] 66
(code_label 3086 3084 3494 783 "" "" [10 uses])

(note 3494 3086 3088 [bb 268] NOTE_INSN_BASIC_BLOCK)

(insn 3088 3494 3091 (set (reg/i:DI 28 %r28)
        (reg/f:DI 66)) 119 {*pa.md:3106} (nil)
    (expr_list:REG_DEAD (reg/f:DI 66)
        (nil)))

(insn 3091 3088 0 (use (reg/i:DI 28 %r28)) -1 (insn_list 3088 (nil))
    (nil))
;; End of basic block 268, registers live:
 3 [%r3] 27 [%r27] 28 [%r28] 30 [%r30]

-- 
J. David Anglin                                  dave.anglin@nrc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6605)


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