http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53346



--- Comment #22 from Jan Hubicka <hubicka at gcc dot gnu.org> 2012-11-14 
22:38:19 UTC ---

OK, similar loop in C looks like:

float a[10000];

float b[10000];

t()

{

  int mi = 0,i;

  for (i=0;i<1000;i++)

    if (a[i]<b[i])

      mi = i;

  return mi;

}

and the why we do not ifconvert at RTl level is that the condition is UNLE that

do not pass unordered_comparsion_operator.  This was noticed by Jakub in other

PR, we do not really need to test unorderedness here since expander knows how

to handle it.  So this was more by chance than by design. I am testing

Index: config/i386/i386.md

===================================================================

--- config/i386/i386.md (revision 193503)

+++ config/i386/i386.md (working copy)

@@ -964,7 +964,7 @@

        (compare:CC (match_operand:SDWIM 1 "nonimmediate_operand")

                    (match_operand:SDWIM 2 "<general_operand>")))

    (set (pc) (if_then_else

-              (match_operator 0 "ordered_comparison_operator"

+              (match_operator 0 "comparison_operator"

                [(reg:CC FLAGS_REG) (const_int 0)])

               (label_ref (match_operand 3))

               (pc)))]

@@ -982,7 +982,7 @@

        (compare:CC (match_operand:SWIM 2 "nonimmediate_operand")

                    (match_operand:SWIM 3 "<general_operand>")))

    (set (match_operand:QI 0 "register_operand")

-       (match_operator 1 "ordered_comparison_operator"

+       (match_operator 1 "comparison_operator"

          [(reg:CC FLAGS_REG) (const_int 0)]))]

   ""

 {

@@ -16120,7 +16120,7 @@



 (define_expand "mov<mode>cc"

   [(set (match_operand:SWIM 0 "register_operand")

-       (if_then_else:SWIM (match_operand 1 "ordered_comparison_operator")

+       (if_then_else:SWIM (match_operand 1 "comparison_operator")

                           (match_operand:SWIM 2 "<general_operand>")

                           (match_operand:SWIM 3 "<general_operand>")))]

   ""

Reply via email to