re PR rtl-optimization/78120 (If conversion no longer performed)
PR rtl-optimization/78120 * ifcvt.c (noce_conversion_profitable_p): Check original cost in all cases, and additionally test against max_seq_cost for speed optimization. (noce_process_if_block): Compute an estimate for the original cost when optimizing for speed, using the minimum of then and else block costs. testsuite/ PR rtl-optimization/78120 * gcc.target/i386/pr78120.c: New test. From-SVN: r242834
This commit is contained in:
parent
334442f282
commit
2d8fec87b1
4 changed files with 61 additions and 10 deletions
|
@ -1,5 +1,12 @@
|
|||
2016-11-24 Bernd Schmidt <bschmidt@redhat.com>
|
||||
|
||||
PR rtl-optimization/78120
|
||||
* ifcvt.c (noce_conversion_profitable_p): Check original cost in all
|
||||
cases, and additionally test against max_seq_cost for speed
|
||||
optimization.
|
||||
(noce_process_if_block): Compute an estimate for the original cost when
|
||||
optimizing for speed, using the minimum of then and else block costs.
|
||||
|
||||
PR rtl-optimization/78120
|
||||
* rtlanal.c (insn_rtx_cost): Use set_rtx_cost.
|
||||
|
||||
|
|
31
gcc/ifcvt.c
31
gcc/ifcvt.c
|
@ -812,8 +812,10 @@ struct noce_if_info
|
|||
we're optimizing for size. */
|
||||
bool speed_p;
|
||||
|
||||
/* The combined cost of COND, JUMP and the costs for THEN_BB and
|
||||
ELSE_BB. */
|
||||
/* An estimate of the original costs. When optimizing for size, this is the
|
||||
combined cost of COND, JUMP and the costs for THEN_BB and ELSE_BB.
|
||||
When optimizing for speed, we use the costs of COND plus the minimum of
|
||||
the costs for THEN_BB and ELSE_BB, as computed in the next field. */
|
||||
unsigned int original_cost;
|
||||
|
||||
/* Maximum permissible cost for the unconditional sequence we should
|
||||
|
@ -852,12 +854,12 @@ noce_conversion_profitable_p (rtx_insn *seq, struct noce_if_info *if_info)
|
|||
/* Cost up the new sequence. */
|
||||
unsigned int cost = seq_cost (seq, speed_p);
|
||||
|
||||
if (cost <= if_info->original_cost)
|
||||
return true;
|
||||
|
||||
/* When compiling for size, we can make a reasonably accurately guess
|
||||
at the size growth. */
|
||||
if (!speed_p)
|
||||
return cost <= if_info->original_cost;
|
||||
else
|
||||
return cost <= if_info->max_seq_cost;
|
||||
at the size growth. When compiling for speed, use the maximum. */
|
||||
return speed_p && cost <= if_info->max_seq_cost;
|
||||
}
|
||||
|
||||
/* Helper function for noce_try_store_flag*. */
|
||||
|
@ -3441,15 +3443,24 @@ noce_process_if_block (struct noce_if_info *if_info)
|
|||
}
|
||||
}
|
||||
|
||||
if (! bb_valid_for_noce_process_p (then_bb, cond, &if_info->original_cost,
|
||||
bool speed_p = optimize_bb_for_speed_p (test_bb);
|
||||
unsigned int then_cost = 0, else_cost = 0;
|
||||
if (!bb_valid_for_noce_process_p (then_bb, cond, &then_cost,
|
||||
&if_info->then_simple))
|
||||
return false;
|
||||
|
||||
if (else_bb
|
||||
&& ! bb_valid_for_noce_process_p (else_bb, cond, &if_info->original_cost,
|
||||
&if_info->else_simple))
|
||||
&& !bb_valid_for_noce_process_p (else_bb, cond, &else_cost,
|
||||
&if_info->else_simple))
|
||||
return false;
|
||||
|
||||
if (else_bb == NULL)
|
||||
if_info->original_cost += then_cost;
|
||||
else if (speed_p)
|
||||
if_info->original_cost += MIN (then_cost, else_cost);
|
||||
else
|
||||
if_info->original_cost += then_cost + else_cost;
|
||||
|
||||
insn_a = last_active_insn (then_bb, FALSE);
|
||||
set_a = single_set (insn_a);
|
||||
gcc_assert (set_a);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2016-11-24 Bernd Schmidt <bschmidt@redhat.com>
|
||||
|
||||
PR rtl-optimization/78120
|
||||
* gcc.target/i386/pr78120.c: New test.
|
||||
|
||||
2016-11-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc.c-torture/compile/20161124-1.c: New test.
|
||||
|
|
28
gcc/testsuite/gcc.target/i386/pr78120.c
Normal file
28
gcc/testsuite/gcc.target/i386/pr78120.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mtune=generic" } */
|
||||
/* { dg-final { scan-assembler "adc" } } */
|
||||
/* { dg-final { scan-assembler-not "jmp" } } */
|
||||
|
||||
typedef unsigned long u64;
|
||||
|
||||
typedef struct {
|
||||
u64 hi, lo;
|
||||
} u128;
|
||||
|
||||
static inline u128 add_u128 (u128 a, u128 b)
|
||||
{
|
||||
a.hi += b.hi;
|
||||
a.lo += b.lo;
|
||||
if (a.lo < b.lo)
|
||||
a.hi++;
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
extern u128 t1, t2, t3;
|
||||
|
||||
void foo (void)
|
||||
{
|
||||
t1 = add_u128 (t1, t2);
|
||||
t1 = add_u128 (t1, t3);
|
||||
}
|
Loading…
Add table
Reference in a new issue