------- 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

Reply via email to