Bug 57511 - [4.8 Regression] Missing SCEV final value replacement
Summary: [4.8 Regression] Missing SCEV final value replacement
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.8.0
: P3 normal
Target Milestone: 4.9.0
Assignee: Richard Biener
URL:
Keywords: missed-optimization
: 58122 58717 (view as bug list)
Depends on:
Blocks: 55555
  Show dependency treegraph
 
Reported: 2013-06-03 12:50 UTC by Alexander Monakov
Modified: 2021-12-17 07:58 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.9.0
Known to fail: 4.8.4
Last reconfirmed: 2013-06-04 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Monakov 2013-06-03 12:50:02 UTC
The following simple loop is no longer optimized out with 4.8 and 4.9:


int main(int argc, char* argv[])
{
    int i, a = 0;
    for (i=0; i < 10000; i++)
            a += i + 0xff00ff;
    return a;
}


$ gcc-4.7.2 -O2 -S main.c -o-
main:
.LFB0:
	.cfi_startproc
	movl	$-334379544, %eax
	ret


$ gcc-4.8.0 -O2 -S main.c -o-
main:
.LFB0:
	.cfi_startproc
	movl	$16711935, %edx
	xorl	%eax, %eax
	.p2align 4,,10
	.p2align 3
.L3:
	addl	%edx, %eax
	addl	$1, %edx
	cmpl	$16721935, %edx
	jne	.L3
	rep ret
Comment 1 Alexander Monakov 2013-06-03 13:41:14 UTC
The loop invokes signed integer overflow, but changing 10000 to 10 still keeps the missed optimization there.
Comment 2 Richard Biener 2013-06-04 12:40:31 UTC
Confirmed.  I will have a look.
Comment 3 Richard Biener 2013-08-28 14:17:54 UTC
analyze_scalar_evolution_in_loop fails for a_4 in

  <bb 4>:
  # i_11 = PHI <i_5(3), 0(2)>
  # a_12 = PHI <a_4(3), 0(2)>
  _3 = i_11 + 16711935;
  a_4 = _3 + a_12;
  i_5 = i_11 + 1;
  if (i_5 != 10)
    goto <bb 3>;
  else
    goto <bb 5>;

  <bb 5>:
  # a_6 = PHI <a_4(4)>
  return a_6;

the evolution is {16711935, +, _3 + 1}_1 but the evolution of _3
is { 16711935, +, 1 }_1 and { 16711935, +, { 16711935, +, 1 }_1 + 1}_1
isn't a valid evolution.  Even though 4.7 computed:

(chrec_apply
  (varying_loop = 1
)
  (chrec = {16711935, +, {16711936, +, 1}_1}_1)
  (x = 9)
  (res = 167119395))

this is probably caused by the fix for PR55555.

I will experiment with relaxing it a bit tomorrow.  But the question
remains(?), is

  { 16711935, +, { 16711935, +, 1 }_1 + 1}_1

a valid scalar evolution?
Comment 4 Richard Biener 2013-08-29 09:42:06 UTC
It looks like

Index: gcc/tree-scalar-evolution.c
===================================================================
--- gcc/tree-scalar-evolution.c (revision 202068)
+++ gcc/tree-scalar-evolution.c (working copy)
@@ -2252,6 +2252,7 @@ instantiate_scev_name (basic_block insta
   else if (res != chrec_dont_know)
     {
       if (inner_loop
+         && def_bb->loop_father != inner_loop
          && !flow_loop_nested_p (def_bb->loop_father, inner_loop))
        /* ???  We could try to compute the overall effect of the loop here.  */
        res = chrec_dont_know;

should be correct, but it has some testsuite fallout that needs to be
analyzed (at least uncovering an IVOPTS issue).
Comment 5 Richard Biener 2013-09-02 08:28:30 UTC
(In reply to Richard Biener from comment #4)
> It looks like
> 
> Index: gcc/tree-scalar-evolution.c
> ===================================================================
> --- gcc/tree-scalar-evolution.c (revision 202068)
> +++ gcc/tree-scalar-evolution.c (working copy)
> @@ -2252,6 +2252,7 @@ instantiate_scev_name (basic_block insta
>    else if (res != chrec_dont_know)
>      {
>        if (inner_loop
> +         && def_bb->loop_father != inner_loop
>           && !flow_loop_nested_p (def_bb->loop_father, inner_loop))
>         /* ???  We could try to compute the overall effect of the loop here.
> */
>         res = chrec_dont_know;
> 
> should be correct, but it has some testsuite fallout that needs to be
> analyzed (at least uncovering an IVOPTS issue).

Ok, the only issue is gcc.dg/tree-ssa/reassoc-19.c FAILing because IVOPTs
now detects a BIV and does something - previously it bailed out.  We have

  <bb 2>:
  goto <bb 4>;

  <bb 3>:
  _7 = (sizetype) element_6(D);
  _8 = -_7;
  rite_9 = rite_1 + _8;
  bar (left_5(D), rite_9, element_6(D));

  <bb 4>:
  # rite_1 = PHI <rite_3(D)(2), rite_9(3)>
  if (left_5(D) <= rite_1)
    goto <bb 3>;
  else
    goto <bb 5>;

  <bb 5>:
  return;

and the BIV rite_1 is {rite_3(D), +, -(sizetype) element_6(D)}_1

that's good and an improvement.  IVOPTs decides to use the original BIV:

candidate 8 (important)
  var_before rite_1
  var_after rite_9
  original biv
  type char *
  base rite_3(D)
  step -(sizetype) element_6(D)
  base object (void *) rite_3(D)

which ideally would result in no code change ...?

Well.

The issue is that rewrite_use_nonlinear_expr of rite_9 = rite_1 + _8
gets things folded back to (char *) ((unsigned long) rite_1 - (unsigned long) element_6(D)) from the more optimal
rite_1 + (-(sizetype) element_6(D))

Which is because of the way we try to get around plus vs. pointer-plus
in get_computation_aff and ultimately aff_combination_to_tree.

I'm going to clean that up ...
Comment 6 Richard Biener 2013-09-02 13:24:33 UTC
Author: rguenth
Date: Mon Sep  2 13:24:30 2013
New Revision: 202168

URL: http://gcc.gnu.org/viewcvs?rev=202168&root=gcc&view=rev
Log:
2013-09-02  Richard Biener  <rguenther@suse.de>

	PR middle-end/57511
	* tree-scalar-evolution.c (instantiate_scev_name): Allow
	non-linear SCEVs.

	* gcc.dg/tree-ssa/sccp-1.c: New testcase.

Added:
    trunk/gcc/testsuite/gcc.dg/tree-ssa/sccp-1.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-scalar-evolution.c
Comment 7 Richard Biener 2013-09-02 13:25:53 UTC
Fixed on trunk.  Note that patch requires

2013-09-02  Richard Biener  <rguenther@suse.de>

        * tree-affine.c (add_elt_to_tree): Avoid converting all pointer
        arithmetic to sizetype.

to not regress gcc.dg/tree-ssa/reassoc-19.c which means it isn't suitable
for backporting IMHO.
Comment 8 Jakub Jelinek 2013-10-14 07:13:21 UTC
*** Bug 58717 has been marked as a duplicate of this bug. ***
Comment 9 Jakub Jelinek 2013-10-16 09:50:34 UTC
GCC 4.8.2 has been released.
Comment 10 Richard Biener 2014-05-22 09:05:24 UTC
GCC 4.8.3 is being released, adjusting target milestone.
Comment 11 Richard Biener 2014-12-10 12:39:55 UTC
Fixed for 4.9, not backporting for said reasons and dependencies.
Comment 12 Andrew Pinski 2021-12-17 07:58:46 UTC
*** Bug 58122 has been marked as a duplicate of this bug. ***