This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/33181] [4.3 Regression] Revision 127766 generates bad cmov
- From: "ubizjak at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 26 Aug 2007 10:56:01 -0000
- Subject: [Bug middle-end/33181] [4.3 Regression] Revision 127766 generates bad cmov
- References: <bug-33181-682@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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