]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
optabs.c (prepare_float_lib_cmp): Avoid searching for REG_RETVAL instruction by using...
authorRoger Sayle <roger@eyesopen.com>
Mon, 6 Oct 2003 23:09:28 +0000 (23:09 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Mon, 6 Oct 2003 23:09:28 +0000 (23:09 +0000)
* optabs.c (prepare_float_lib_cmp): Avoid searching for REG_RETVAL
instruction by using LCT_CONST and then calling emit_libcall_block
ourselves.

Co-Authored-By: Zack Weinberg <zack@codesourcery.com>
From-SVN: r72171

gcc/ChangeLog
gcc/optabs.c

index f08a16dc6ee24bf57f4f6b9750a76c656319da1f..06ea6114c54ec4c6e1cc23dbe966dc3ded9ba297 100644 (file)
@@ -1,3 +1,10 @@
+2003-10-06  Roger Sayle  <roger@eyesopen.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * optabs.c (prepare_float_lib_cmp): Avoid searching for REG_RETVAL
+       instruction by using LCT_CONST and then calling emit_libcall_block
+       ourselves.
+
 2003-10-06  Falk Hueffner  <falk.hueffner@student.uni-tuebingen.de>
 
         PR optimization/11974
index d3e55b1afe74f4f5ecebda9b88f1b04da8f7e30d..b0953ebe77b7ff45801c5e8b2d77fa9033efc417 100644 (file)
@@ -3878,9 +3878,8 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
   rtx y = protect_from_queue (*py, 0);
   enum machine_mode orig_mode = GET_MODE (x);
   enum machine_mode mode;
-  rtx before_call;
+  rtx value, target, insns, equiv;
   rtx libfunc = 0;
-  rtx result;
 
   for (mode = orig_mode; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
     {
@@ -3905,11 +3904,6 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
       y = convert_to_mode (mode, y, 0);
     }
 
-  before_call = get_last_insn ();
-
-  result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
-                                   word_mode, 2, x, mode, y, mode);
-
   /* If we're optimizing attach a REG_EQUAL note describing the semantics
      of the libcall to the RTL.  The allows the RTL optimizers to delete
      the libcall if the condition can be determined at compile-time.  */
@@ -3917,86 +3911,79 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
       && ! side_effects_p (x)
       && ! side_effects_p (y))
     {
-      /* Search backwards through the insns emitted above looking for
-        the instruction with the REG_RETVAL note.  */
-      rtx last = get_last_insn ();
-      while (last != before_call)
+      if (comparison == UNORDERED)
        {
-         if (find_reg_note (last, REG_RETVAL, NULL))
-           break;
-         last = PREV_INSN (last);
+         rtx temp = simplify_gen_relational (NE, word_mode, mode, x, x);
+         equiv = simplify_gen_relational (NE, word_mode, mode, y, y);
+         equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
+                                       temp, const_true_rtx, equiv);
        }
-
-      if (last != before_call)
+      else
        {
-         rtx equiv;
-         if (comparison == UNORDERED)
+         equiv = simplify_gen_relational (comparison, word_mode, mode, x, y);
+         if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
            {
-             rtx temp = simplify_gen_relational (NE, word_mode,
-                                                 mode, x, x);
-             equiv = simplify_gen_relational (NE, word_mode,
-                                              mode, y, y);
-             equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode,
-                                           word_mode, temp,
-                                           const_true_rtx, equiv);
-           }
-         else
-           {
-             equiv = simplify_gen_relational (comparison, word_mode,
-                                              mode, x, y);
-             if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
+             rtx true_rtx, false_rtx;
+
+             switch (comparison)
                {
-                 rtx true_rtx, false_rtx;
+               case EQ:
+                 true_rtx = const0_rtx;
+                 false_rtx = const_true_rtx;
+                 break;
 
-                 switch (comparison)
-                   {
-                   case EQ:
-                     true_rtx = const0_rtx;
-                     false_rtx = const_true_rtx;
-                     break;
-
-                   case NE:
-                     true_rtx = const_true_rtx;
-                     false_rtx = const0_rtx;
-                     break;
-
-                   case GT:
-                     true_rtx = const1_rtx;
-                     false_rtx = const0_rtx;
-                     break;
-
-                   case GE:
-                     true_rtx = const0_rtx;
-                     false_rtx = constm1_rtx;
-                     break;
-
-                   case LT:
-                     true_rtx = constm1_rtx;
-                     false_rtx = const0_rtx;
-                     break;
-
-                   case LE:
-                     true_rtx = const0_rtx;
-                     false_rtx = const1_rtx;
-                     break;
-
-                   default:
-                     abort ();
-                   }
-                 equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode,
-                                               word_mode, equiv,
-                                               true_rtx, false_rtx);
+               case NE:
+                 true_rtx = const_true_rtx;
+                 false_rtx = const0_rtx;
+                 break;
+
+               case GT:
+                 true_rtx = const1_rtx;
+                 false_rtx = const0_rtx;
+                 break;
+
+               case GE:
+                 true_rtx = const0_rtx;
+                 false_rtx = constm1_rtx;
+                 break;
+
+               case LT:
+                 true_rtx = constm1_rtx;
+                 false_rtx = const0_rtx;
+                 break;
+
+               case LE:
+                 true_rtx = const0_rtx;
+                 false_rtx = const1_rtx;
+                 break;
+
+               default:
+                 abort ();
                }
+             equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode,
+                                           word_mode, equiv,
+                                           true_rtx, false_rtx);
            }
-         set_unique_reg_note (last, REG_EQUAL, equiv);
        }
     }
+  else
+    equiv = NULL_RTX;
+
+  start_sequence ();
+  value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
+                                  word_mode, 2, x, mode, y, mode);
+  insns = get_insns ();
+  end_sequence ();
+
+  target = gen_reg_rtx (word_mode);
+  emit_libcall_block (insns, target, value, equiv);
+
 
   if (comparison == UNORDERED
       || FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
     comparison = NE;
 
-  *px = result;
+  *px = target;
   *py = const0_rtx;
   *pmode = word_mode;
   *pcomparison = comparison;