Since r16-6332-g2a84a753afcf37, if_info->cond is not used indirectly any more
for creating the conditional. So this patch stops doing the swap and fixes up
so the case where if_info->rev_cond might be null.

gcc/ChangeLog:

        * ifcvt.cc (noce_try_cond_zero_arith): Don't swap if_info->cond
        but use it directly with if_info->rev_cond.

Signed-off-by: Andrew Pinski <[email protected]>
---
 gcc/ifcvt.cc | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
index 75d959f652c..562775165a2 100644
--- a/gcc/ifcvt.cc
+++ b/gcc/ifcvt.cc
@@ -3142,10 +3142,10 @@ noce_try_cond_zero_arith (struct noce_if_info *if_info)
 {
   rtx target, a, b, a_op0, a_op1;
   rtx cond = if_info->cond;
+  rtx_code code = GET_CODE (cond);
   rtx_insn *seq;
   rtx_code op;
   machine_mode mode = GET_MODE (if_info->x);
-  bool reverse = false;
 
   /* Scalar integral modes are only supported here.
      Could support scalar floating point but that
@@ -3166,9 +3166,14 @@ noce_try_cond_zero_arith (struct noce_if_info *if_info)
   /* Canonicalize x = y : (y op z) to x = (y op z) : y.  */
   if (REG_P (a) && noce_cond_zero_binary_op_supported (b))
     {
-      std::swap (if_info->cond, if_info->rev_cond);
+      if (if_info->rev_cond)
+       {
+         cond = if_info->rev_cond;
+         code = GET_CODE (cond);
+       }
+      else
+       code = reversed_comparison_code (cond, if_info->jump);
       std::swap (a, b);
-      reverse = true;
     }
 
   /* Check if x = (y op z) : y is supported by czero based ifcvt.  */
@@ -3198,8 +3203,8 @@ noce_try_cond_zero_arith (struct noce_if_info *if_info)
   target = gen_reg_rtx (GET_MODE (XEXP (a, op != AND)));
 
   /* AND requires !cond, instead we swap ops around.  */
-  target = noce_emit_cmove (if_info, target, GET_CODE (if_info->cond),
-                           XEXP (if_info->cond, 0), XEXP (if_info->cond, 1),
+  target = noce_emit_cmove (if_info, target, code,
+                           XEXP (cond, 0), XEXP (cond, 1),
                            op != AND ? XEXP (a, 1) : const0_rtx,
                            op != AND ? const0_rtx : XEXP (a, 0));
   if (!target)
@@ -3238,8 +3243,6 @@ end_seq_n_fail:
   end_sequence ();
 
 fail:
-  if (reverse)
-    std::swap (if_info->cond, if_info->rev_cond);
 
   return false;
 }
-- 
2.43.0

Reply via email to