On Mon, Jan 5, 2015 at 9:26 PM, Jeff Law <l...@redhat.com> wrote:
> On 12/29/14 06:30, Yuri Rumyantsev wrote:
>>
>> Hi All,
>>
>> Here is a patch which fixed several performance degradation after
>> operand canonicalization (r216728). Very simple approach is used - if
>> operation is commutative and its second operand required more
>> operations (statements) for computation, swap operands.
>> Currently this is done under special option which is set-up to true
>> only for x86 32-bit targets ( we have not  seen any performance
>> improvements on 64-bit).
>>
>> Is it OK for trunk?
>>
>> 2014-12-26  Yuri Rumyantsev  <ysrum...@gmail.com>
>>
>> * cfgexpand.c (count_num_stmt): New function.
>> (reorder_operands): Likewise.
>> (expand_gimple_basic_block): Insert call of reorder_operands.
>> * common.opt(flag_reorder_operands): Add new flag.
>> * config/i386/i386.c (ix86_option_override_internal): Add setup of
>> flag_reorder_operands for 32-bit target only.
>> * (doc/invoke.texi: Add new optimization option -freorder-operands.
>>
>> gcc/testsuite/ChangeLog
>> * gcc.target/i386/swap_opnd.c: New test.
>
> I'd do this unconditionally -- I don't think there's a compelling reason to
> add another flag here.

Indeed.

> Could you use estimate_num_insns rather than rolling your own estimate code
> here?  All you have to do is setup the weights structure and call the
> estimation code.  I wouldn't be surprised if ultimately the existing insn
> estimator is better than the one you're adding.

Just use eni_size_weights.

Your counting is quadratic, that's a no-go.  You'd have to keep a lattice
of counts for SSA names to avoid this.  There is swap_ssa_operands (),
in your swapping code you fail to update SSA operands (maybe non-fatal
because we are just expanding to RTL, but ...).

bb->loop_father is always non-NULL, but doing this everywhere, not only
in loops looks fine to me.

You can swap comparison operands on GIMPLE_CONDs for all
codes by also swapping the EDGE_TRUE_VALUE/EDGE_FALSE_VALUE
flags on the outgoing BB edges.

There are more cases that can be swapped in regular stmts as well,
but I suppose we don't need to be "complete" here.

So, in reorder_operands I'd do (pseudo-code)

  n = 0;
  for-all-stmts
    gimple_set_uid (stmt, n++);
  lattice = XALLOCVEC (unsigned, n);

  i = 0;
  for-all-stmts
    this_stmt_cost = estimate_num_insns (stmt, &eni_size_weights);
    lattice[i] = this_stmt_cost;
    FOR_EACH_SSA_USE_OPERAND ()
       if (use-in-this-BB)
         lattice[i] += lattice[gimple_uid (SSA_NAME_DEF_STMT)];
     i++;
    swap-if-operand-cost says so

Richard.

> Make sure to reference the PR in the ChangeLog.
>
> Please update and resubmit.
>
> Thanks,
> Jeff

Reply via email to