I am using gcc 3.3.1 release as my port, and looks like I have hit a problem with greg.
The source program is the sqrt.c math function __ieee754_sqrt. ( I am pasting the relevent part here) typedef union { double value; struct { unsigned int lsw; unsigned int msw; } parts; } ieee_double_shape_type; double __ieee754_sqrt (double x) { double z; int sign = (int) 0x80000000; unsigned int r, t1, s1, ix1, q1; int ix0, s0, q, m, t, i; .. .. if ((q & 1) == 1) ix1 |= sign; ix0 += (m << 20); do { ieee_double_shape_type iw_u; iw_u.parts.msw = (ix0); // line 140 iw_u.parts.lsw = (ix1); // line 141 (z) = iw_u.value; // line 142 } } The dump of corresponding BBs of .23.lreg is as (insn 419 516 420 38 0x1002f450 (set (reg/v:SI 77) (ior:SI (reg/v:SI 77) (const_int -2147483648 [0x80000000]))) 26 {iorsi3} (nil) (nil)) ;; End of basic block 38, registers live: 20 [r20] 21 [r21] 30 [r30] 64 [ap] 77 79 82 153 ;; Start of basic block 39, registers live: 20 [r20] 21 [r21] 30 [r30] 64 [ap] 7 7 79 82 153 (code_label 420 419 517 39 43 "" [1 uses]) (note 517 420 421 39 [bb 39] NOTE_INSN_BASIC_BLOCK) (note 421 517 422 39 ("sqrt.c") 136) (insn 422 421 423 39 0x1002f450 (set (reg/v:SI 82) (ashift:SI (reg/v:SI 82) (const_int 20 [0x14]))) 22 {ashlsi3} (nil) (nil)) (note 423 422 427 39 NOTE_INSN_DELETED) (note 427 423 428 39 ("sqrt.c") 139) (note 428 427 429 39 ("sqrt.c") 140) (insn 429 428 430 39 0x1002f420 (set (subreg:SI (reg/v:DI 153) 4) (plus:SI (reg/v:SI 79) (reg/v:SI 82))) 12 {addsi3} (insn_list 422 (nil)) (expr_list:REG_DEAD (reg/v:SI 82) (expr_list:REG_DEAD (reg/v:SI 79) (nil)))) (note 430 429 431 39 ("sqrt.c") 141) (insn 431 430 432 39 0x1002f420 (set (subreg:SI (reg/v:DI 153) 0) (reg/v:SI 77)) 6 {*movsi} (insn_list 429 (nil)) (expr_list:REG_DEAD (reg/v:SI 77) (nil))) (note 432 431 433 39 ("sqrt.c") 142) (insn 433 432 436 39 0x1002f420 (set (reg:DF 70) (subreg:DF (reg/v:DI 153) 0)) 10 {*movdf} (insn_list 431 (nil)) (expr_list:REG_DEAD (reg/v:DI 153) (nil))) And the dump of .24.greg pass is as: (insn 419 516 420 38 0x1002f450 (set (reg/v:SI 12 r12 [77]) (ior:SI (reg/v:SI 12 r12 [77]) (const_int -2147483648 [0x80000000]))) 26 {iorsi3} (nil) (nil)) ;; End of basic block 38, registers live: 20 [r20] 21 [r21] 30 [r30] 64 [ap] 77 79 82 153 ;; Start of basic block 39, registers live: 20 [r20] 21 [r21] 30 [r30] 77 79 82 153 (code_label 420 419 517 39 43 "" [1 uses]) (note 517 420 421 39 [bb 39] NOTE_INSN_BASIC_BLOCK) (note 421 517 422 39 ("sqrt.c") 136) (insn 422 421 423 39 0x1002f450 (set (reg/v:SI 4 r4 [82]) (ashift:SI (reg/v:SI 4 r4 [82]) (const_int 20 [0x14]))) 22 {ashlsi3} (nil) (nil)) (note 423 422 427 39 NOTE_INSN_DELETED) (note 427 423 428 39 ("sqrt.c") 139) (note 428 427 429 39 ("sqrt.c") 140) (insn 429 428 618 39 0x1002f420 (set (reg/v:SI 4 r4 [82]) (plus:SI (reg/v:SI 4 r4 [82]) (reg/v:SI 3 r3 [79]))) 12 {addsi3} (insn_list 422 (nil)) (nil)) (insn 618 429 619 39 0x0 (set (reg:SI 0 r0) (reg/v:SI 4 r4 [82])) 6 {*movsi} (nil) (nil)) (insn 619 618 430 39 0x0 (set (mem:SI (plus:SI (reg/f:SI 21 r21) (const_int -4 [0xfffffffc])) [3 iw_u S4 A32]) (reg:SI 0 r0)) 6 {*movsi} (nil) (nil)) (note 430 619 431 39 ("sqrt.c") 141) (insn 431 430 620 39 0x1002f420 (set (reg:SI 0 r0) (reg/v:SI 12 r12 [77])) 6 {*movsi} (insn_list 429 (nil)) (nil)) (insn 620 431 621 39 0x0 (set (reg:DI 2 r2) (reg:DI 0 r0)) 7 {*movdi} (nil) (nil)) (insn 621 620 432 39 0x0 (set (mem:DI (plus:SI (reg/f:SI 21 r21) (const_int -8 [0xfffffff8])) [3 iw_u S8 A32]) (reg:DI 2 r2)) 7 {*movdi} (nil) (nil)) (note 432 621 433 39 ("sqrt.c") 142) (insn 433 432 436 39 0x1002f420 (set (reg:DF 14 r14 [70]) (reg:DF 0 r0)) 10 {*movdf} (insn_list 431 (nil)) (nil)) I couldn't understand why the insns 620 and 621 are being generated here as DI moves. This is creating problem since insn 621 gets splitted after reload into two SI moves,i.e. @(r21, -8) and @(r21, -4). This renders insns 619 as dead and hence insns 618 and insn 429 as dead, which are eliminated by flow2. I could not analyze beyond this and need your help to move further. Thanks in advance. Sanjiv __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com