------- Comment #7 from thomas at coware dot com 2009-08-07 07:37 ------- This is how function func looks after the if conversion (test.c.144r.ce1):
(note 4 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 2 4 3 2 test.c:3 (set (reg/v:SI 63 [ arg ]) (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32])) 41 {*movsi_1} (expr_list:REG_EQUIV (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32]) (nil))) (note 3 2 7 2 NOTE_INSN_FUNCTION_BEG) (insn 7 3 34 2 test.c:5 (set (reg:CCGOC 17 flags) (compare:CCGOC (reg/v:SI 63 [ arg ]) (const_int 0 [0x0]))) 0 {*cmpsi_ccno_1} (nil)) (insn 34 7 35 2 test.c:5 (parallel [ (set (reg:DI 65) (sign_extend:DI (reg/v:SI 63 [ arg ]))) (clobber (reg:CC 17 flags)) (clobber (scratch:SI)) ]) 87 {*extendsidi2_1} (nil)) (insn 35 34 36 2 test.c:5 (parallel [ (set (reg/v:DI 60 [ val ]) (lshiftrt:DI (reg:DI 65) (const_int 63 [0x3f]))) (clobber (reg:CC 17 flags)) ]) 356 {*lshrdi3_1} (nil)) (insn 36 35 24 2 test.c:5 (parallel [ (set (reg/v:DI 60 [ val ]) (ashift:DI (reg/v:DI 60 [ val ]) (const_int 31 [0x1f]))) (clobber (reg:CC 17 flags)) ]) 319 {*ashldi3_1} (nil)) (insn 24 36 30 2 test.c:9 (set (reg/i:DI 0 ax) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 30 24 0 2 test.c:9 (use (reg/i:DI 0 ax)) -1 (nil)) This already looks wrong to me, but I am not completely sure. Could somebody have a look who understands this RTL code better than me? The last version before the if conversion looks like this (test.c.141r.cse1): (note 4 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 2 4 3 2 test.c:3 (set (reg/v:SI 63 [ arg ]) (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32])) 41 {*movsi_1} (expr_list:REG_EQUIV (mem/c/i:SI (reg/f:SI 16 argp) [0 arg+0 S4 A32]) (nil))) (note 3 2 7 2 NOTE_INSN_FUNCTION_BEG) (insn 7 3 8 2 test.c:5 (set (reg:CCGOC 17 flags) (compare:CCGOC (reg/v:SI 63 [ arg ]) (const_int 0 [0x0]))) 0 {*cmpsi_ccno_1} (nil)) (jump_insn 8 7 9 2 test.c:5 (set (pc) (if_then_else (lt (reg:CCGOC 17 flags) (const_int 0 [0x0])) (label_ref 13) (pc))) 401 {*jcc_1} (nil)) (note 9 8 10 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 10 9 13 3 test.c:5 (set (reg/v:DI 60 [ val ]) (const_int 0 [0x0])) 63 {*movdi_2} (nil)) (code_label 13 10 14 4 2 "" [1 uses]) (note 14 13 16 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 16 14 17 4 test.c:6 (set (reg/v:DI 60 [ val ]) (const_int -2147483648 [0x80000000])) 63 {*movdi_2} (nil)) (code_label 17 16 18 5 3 "" [0 uses]) (note 18 17 20 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 20 18 24 5 test.c:8 (set (reg:DI 62 [ <result> ]) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 24 20 30 5 test.c:9 (set (reg/i:DI 0 ax) (reg/v:DI 60 [ val ])) 63 {*movdi_2} (nil)) (insn 30 24 0 5 test.c:9 (use (reg/i:DI 0 ax)) -1 (nil)) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40987