------- Comment #4 from ubizjak at gmail dot com 2007-08-26 10:56 ------- C testcase:
--cut here-- extern void abort (void); enum Status { P_ON_LOWER = -4, P_ON_UPPER = -2, P_FREE = -1 }; void foo (enum Status *stat, double newUpper, double lower, double max) { if (newUpper >= max) *stat = (lower <= -max) ? P_FREE : P_ON_LOWER; else if (newUpper == lower) *stat = P_ON_LOWER; } int main () { enum Status stat = P_ON_UPPER; foo (&stat, 5.0, -10.0, 10.0); if (stat != P_ON_UPPER) abort (); return 0; } --cut here-- For some reason, ifcvt converts (note 32 28 33 7 [bb 7] NOTE_INSN_BASIC_BLOCK) (insn 33 32 34 7 pr33181.c:15 (set (reg:CCFP 17 flags) (compare:CCFP (reg/v:DF 60 [ newUpper ]) (reg/v:DF 61 [ lower ]))) 35 {*cmpfp_i_sse} (expr_list:REG_DEAD (reg /v:DF 61 [ lower ]) (expr_list:REG_DEAD (reg/v:DF 60 [ newUpper ]) (nil)))) (jump_insn 34 33 54 7 pr33181.c:15 (set (pc) (if_then_else (uneq (reg:CCFP 17 flags) (const_int 0 [0x0])) (label_ref:DI 54) (pc))) 563 {*jcc_1} (expr_list:REG_DEAD (reg:CCFP 17 flags) (expr_list:REG_BR_PROB (const_int 5400 [0x1518]) (nil)))) ;; End of basic block 7 -> ( 8 9) ;; Start of basic block ( 7) -> 8 (code_label 54 34 38 8 10 "" [1 uses]) (insn 39 38 45 8 pr33181.c:16 (set (mem:SI (reg/v/f:DI 59 [ stat ]) [2 S4 A32]) (const_int -4 [0xfffffffffffffffc])) 47 {*movsi_1} (expr_list:REG_DEAD ( reg/v/f:DI 59 [ stat ]) (nil))) ;; End of basic block 8 -> ( 9) **** into **** (insn 33 32 62 7 pr33181.c:15 (set (reg:CCFP 17 flags) (compare:CCFP (reg/v:DF 60 [ newUpper ]) (reg/v:DF 61 [ lower ]))) 35 {*cmpfp_i_sse} (expr_list:REG_DEAD (reg /v:DF 61 [ lower ]) (expr_list:REG_DEAD (reg/v:DF 60 [ newUpper ]) (nil)))) (insn 62 33 61 7 pr33181.c:16 (set (reg:SI 66) (const_int -4 [0xfffffffffffffffc])) 47 {*movsi_1} (nil)) (insn 61 62 63 7 pr33181.c:16 (set (reg:CCFP 17 flags) (compare:CCFP (reg/v:DF 60 [ newUpper ]) (reg/v:DF 61 [ lower ]))) 35 {*cmpfp_i_sse} (nil)) (insn 63 61 64 7 pr33181.c:16 (set (reg:SI 65) (if_then_else:SI (ltgt (reg:CCFP 17 flags) (const_int 0 [0x0])) (reg:SI 58 [ iftmp.0 ]) (reg:SI 66))) 798 {*movsicc_noc} (nil)) (insn 64 63 45 7 pr33181.c:16 (set (mem:SI (reg/v/f:DI 59 [ stat ]) [2 S4 A32]) (reg:SI 65)) 47 {*movsi_1} (nil)) **** this conversionis wrong, beacuse iftmp.0 is uninitialized in this BB. To compensate this, df initializes iftmp.0 to zero, resulting in: .L11: movl $-4, %eax #, tmp66 movl $0, %edx #, iftmp.0 comisd %xmm1, %xmm0 # lower, newUpper cmovne %edx, %eax # iftmp.0,, tmp66 movl %eax, (%rdi) # tmp66,* stat ret instead of: .L2: comisd %xmm1, %xmm0 # lower, newUpper jne .L12 #, movl $-4, (%rdi) #,* stat .L12: rep ; ret -- ubizjak at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2007-08-26 10:56:01 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33181