(split from PR19431)
#include <tr1/functional>
#include <algorithm>
extern void assign( long* variable, long v )
{
std::transform( variable, variable + 1, variable,
std::tr1::bind( std::plus< long >(), 0L, v ) );
}
extern void assign( long& variable, long v )
{
std::transform( &variable, &variable + 1, &variable,
std::tr1::bind( std::plus< long >(), 0L, v ) );
}
at -O3 gcc 4.2 produces:
assign(long&, long):
movq -40(%rsp), %rax
movq %rsi, -24(%rsp)
movq $0, -32(%rsp)
movq $0, -64(%rsp)
movq %rsi, -56(%rsp)
movq %rsi, (%rdi)
movq %rax, -72(%rsp)
ret
assign(long*, long):
movq %rsi, (%rdi)
ret
The problem is:
We start with
D.59982_3 = variable_2(D) + 4B;
__unary_op = __unary_op.65;
goto <bb 4> (<L1>);
<L0>:;
D.61146_10 = __unary_op._M_arg1;
D.61147_11 = __unary_op._M_arg2;
D.61093_12 = D.61146_10 + D.61147_11;
*variable_13 = D.61093_12;
variable_14 = variable_7 + 4B;
variable_15 = variable_13 + 4B;
# variable_7 = PHI <variable_2(D)(2), variable_14(3)>
# variable_13 = PHI <variable_2(D)(2), variable_15(3)>
<L1>:;
if (D.59982_3 != variable_7) goto <L0>; else goto <L2>;
and loop header copying and DOM make it optimizable:
D.59982_3 = variable_2(D) + 4B;
__unary_op.65._M_arg2 = v_1(D);
__unary_op.65._M_arg1 = 0;
__unary_op = __unary_op.65;
__unary_op$_M_arg2_54 = __unary_op._M_arg2;
__unary_op$_M_arg1_53 = __unary_op._M_arg1;
if (variable_2(D) != D.59982_3) goto <L7>; else goto <L2>;
<L2>:;
return;
# variable_49 = PHI <variable_2(D)(2)>
# variable_27 = PHI <variable_2(D)(2)>
<L7>:;
__unary_op$_M_arg1_25 = __unary_op$_M_arg1_53;
__unary_op$_M_arg2_17 = __unary_op$_M_arg2_54;
D.61093_18 = __unary_op$_M_arg1_53 + __unary_op$_M_arg2_54;
*variable_49 = D.61093_18;
variable_20 = variable_27 + 4B;
variable_21 = variable_49 + 4B;
goto <bb 3> (<L2>);
so a tweaked forwprop fixes it at least before PRE. But dunno if we want
to do tree combining on conditions here. The code is optimized at
RTL expansion time.
--
Summary: Fails to tree-combine conditions in COND_EXPRs
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Keywords: missed-optimization, TREE
Severity: enhancement
Priority: P3
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rguenth at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30965