This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

No ifcvt during ce1 pass (fails i386/ssefp-2.c)


Hello!

Recent committed patch breaks i386ssefp-2.c testcase, where maxsd is
not generated anymore.

I have looked a bit into this failure and noticed that for some reason
we don't perform ifcvt transformations during ce1 RTL pass. The second
transformation is still performed during ce2 pass, but this is late as
combine already combined some patterns into patterns that can't be
split into maxsd pattern.

Previously, ce1 pass generated:

IF-THEN block found, pass 1, start block 2 [insn 5], then 3 [15], join 4 [17]
Replacing insn 10 by jump 35
Conversion succeeded on pass 1.

1 possible IF blocks searched.
1 IF blocks converted.
2 true changes made.

(insn 34 9 19 2 (set (reg:DF 58 [ iftmp.0 ])
       (unspec:DF [
               (reg:DF 60)
               (reg:DF 58 [ iftmp.0 ])
           ] 52)) 564 {*ieee_smaxdf3} (nil)
   (nil))

but now all relevant insns remain unaffected at the end of ce1 pass:

(insn 9 8 10 2 (set (reg:CCFPU 17 flags)
       (compare:CCFPU (reg:DF 60)
           (reg:DF 58 [ iftmp.0 ]))) 26 {*cmpfp_iu_sse} (nil)
   (nil))

(jump_insn 10 9 14 2 (set (pc)
       (if_then_else (gt (reg:CCFPU 17 flags)
               (const_int 0 [0x0]))
           (label_ref:SI 14)
           (pc))) 365 {*jcc_1} (nil)
   (expr_list:REG_BR_PROB (const_int 4600 [0x11f8])
       (nil)))

Uros.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]