From f5a459a4392cacb1750c09bd2ecee8455d12af12 Mon Sep 17 00:00:00 2001 From: James Greenhalgh Date: Thu, 21 Jul 2016 15:41:59 +0000 Subject: [PATCH] [Patch 3/2 ifcvt costs] Don't expand a conditional move between identical sources gcc/ * optabs.c (emit_condiitonal_move): Short circuit for identical sources. From-SVN: r238595 --- gcc/ChangeLog | 5 +++++ gcc/optabs.c | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 602c7b8eeaa..0757c89bf84 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-07-21 James Greenhalgh + + * optabs.c (emit_condiitonal_move): Short circuit for identical + sources. + 2016-07-21 James Greenhalgh * ifcvt.c (noce_if_info): New fields: speed_p, original_cost, diff --git a/gcc/optabs.c b/gcc/optabs.c index 51e10e21769..87b4f978420 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -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. */ -- 2.30.2