[Patch 3/2 ifcvt costs] Don't expand a conditional move between identical sources
authorJames Greenhalgh <james.greenhalgh@arm.com>
Thu, 21 Jul 2016 15:41:59 +0000 (15:41 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Thu, 21 Jul 2016 15:41:59 +0000 (15:41 +0000)
gcc/

* optabs.c (emit_condiitonal_move): Short circuit for identical
sources.

From-SVN: r238595

gcc/ChangeLog
gcc/optabs.c

index 602c7b8eeaaee62af36ef1dbc9bafafd6db42167..0757c89bf84adc4defdd6888f55823ed81e30147 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-21  James Greenhalgh  <james.greenhalgh@arm.com>
+
+       * optabs.c (emit_condiitonal_move): Short circuit for identical
+       sources.
+
 2016-07-21  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * ifcvt.c (noce_if_info): New fields: speed_p, original_cost,
index 51e10e217698ed9519b220b9db6af909c3061256..87b4f978420dfd2df3d915985509912d85c94569 100644 (file)
@@ -4214,6 +4214,17 @@ emit_conditional_move (rtx target, enum rtx_code code, rtx op0, rtx op1,
   enum insn_code icode;
   enum rtx_code reversed;
 
+  /* If the two source operands are identical, that's just a move.  */
+
+  if (rtx_equal_p (op2, op3))
+    {
+      if (!target)
+       target = gen_reg_rtx (mode);
+
+      emit_move_insn (target, op3);
+      return target;
+    }
+
   /* If one operand is constant, make it the second one.  Only do this
      if the other operand is not constant as well.  */