Bug 35972 - [4.4 Regression] load-PRE missed opportunities without SFTs
Summary: [4.4 Regression] load-PRE missed opportunities without SFTs
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.4.0
: P2 normal
Target Milestone: 4.4.0
Assignee: Richard Biener
URL:
Keywords: missed-optimization
Depends on:
Blocks: 22501 32921
  Show dependency treegraph
 
Reported: 2008-04-18 14:12 UTC by Richard Biener
Modified: 2008-08-19 09:07 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2008-08-16 23:17:45


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2008-04-18 14:12:15 UTC
struct Loc {
  int x[3];
};

int foo (int i, int j, int k, int b)
{
  struct Loc IND;

  if (b)
    {
      IND.x[0] = i;
      IND.x[1] = j;
      IND.x[2] = k-1;
    }
  else
    {
      IND.x[0] = i;
      IND.x[1] = j;
      IND.x[2] = k;
    }

  return IND.x[0] + IND.x[1] + IND.x[2];
}

used to be optimized to operations on only the scalars i, j and k.
Comment 1 Richard Biener 2008-04-18 14:12:53 UTC
Mine (from tramp3d).
Comment 2 Richard Biener 2008-04-18 14:22:48 UTC
Shorter testcase:

struct Loc { int x[2]; };

int foo (int i, int b) 
{
  struct Loc IND;

  if (b)
    {
      IND.x[0] = i;
      IND.x[1] = 0;
    }
  else
    {
      IND.x[0] = i;
      IND.x[1] = 1;
    }

  return IND.x[0];
}

this breaks during PHI translation where the oracle is not properly used.
Comment 3 Richard Biener 2008-04-18 14:34:25 UTC
Huhm.  This is just because PRE and SCCVN are disconnected and use their own IL.
Maybe finally time to fix this...
Comment 4 Bernhard Reutner-Fischer 2008-04-18 18:00:20 UTC
While not really useful, i dare to state that SCC(N)-VN unfortunately misses a lot of what it is ment to serve (IMHO), generally:

1) PR11832
testcase from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11832#c0
Needs adjustment (looked into it -- AFAICR -- befor 4.3 was branched; didn't retry after you recently touching SCCVN, i admit)

2) PR5738
The testcase from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=5738#c0
is completely undiagnosed (and _severely_ mishandled -- IMHO) by current SCCVN.
This one is particularly mean since you may run into dominator related pitfalls very, very fast, from what i've seen (before you touched tree-ssa-pre, admitteldy).

A couple of sensible and nice improvements are mentioned in ¹) above.
Comment 5 rguenther@suse.de 2008-04-19 01:50:43 UTC
Subject: Re:  [4.4 Regression] load-PRE missed
 opportunities without SFTs

On Fri, 18 Apr 2008, aldot at gcc dot gnu dot org wrote:

> ------- Comment #4 from aldot at gcc dot gnu dot org  2008-04-18 18:00 -------
> While not really useful, i dare to state that SCC(N)-VN unfortunately misses a
> lot of what it is ment to serve (IMHO), generally:
> 
> 1) PR11832
> testcase from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11832#c0
> Needs adjustment (looked into it -- AFAICR -- befor 4.3 was branched; didn't
> retry after you recently touching SCCVN, i admit)
> 
> 2) PR5738
> The testcase from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=5738#c0
> is completely undiagnosed (and _severely_ mishandled -- IMHO) by current SCCVN.
> This one is particularly mean since you may run into dominator related pitfalls
> very, very fast, from what i've seen (before you touched tree-ssa-pre,
> admitteldy).
> 
> A couple of sensible and nice improvements are mentioned in ¹) above.

These are both testcases for missed code-motion which neither PRE nor
FRE performs.  While SCCVN can figure out that two stmts compute the
same value it still needs a pass that makes use of it ;)

Richard.
Comment 6 Steven Bosscher 2008-04-19 13:09:01 UTC
Re. comment #4: If you have no idea what SCC-VN is supposed to serve, such bold statements as made in this comment are _severely_ misguided.
Comment 7 Andrew Pinski 2008-08-16 23:17:45 UTC
Note, SRA needs to be disabled for the testcase to show the issue.
Comment 8 Richard Biener 2008-08-17 10:20:33 UTC
Hm, I have a patch that makes PRE phi-translation use the oracle, but still
the testcase is not optimized because for

struct Loc { int x[1]; };

int foo (int i, int b)
{
  struct Loc IND;

  if (b)
    IND.x[0] = i;
  else
    IND.x[0] = i;

  return IND.x[0];
}

PRE doesn't do anything either (instead this case looks like something
FRE can handle with the patch I have for PR23094).

But the patch handles

struct Loc { int x[2]; };

int foo (int i, int j, int b)
{
  struct Loc IND;

  if (b)
    {
      IND.x[0] = i;
      IND.x[1] = 1;
    }
  else
    {
      IND.x[0] = j;
      IND.x[1] = 0;
    }

  return IND.x[0];
}

I suspect that the original testcase was handled by DOM, which also lacks
support from the alias-oracle.  Hmm, checking with 4.3 it doesn't do anything
for the testcase - not even the PRE opportunity for IND.x[2].  So
eventually this was something done by LIM, as the testcase was placed
inside a loop? ...
Comment 9 Richard Biener 2008-08-17 10:57:55 UTC
In theory elminate should handle these case, but even though phi-translation
reveals that the value of the load is available in bb 5 we do not update
avail-out if we do not end up doing an insertion.

Comment 10 Richard Biener 2008-08-17 11:18:03 UTC
And I have a patch to fix regular insertion.  Which means PRE now produces

foo (int i, int j, int k, int b)
{
  int prephitmp.12;
  int pretmp.11;
  struct Loc IND;
  int D.1922;
  int D.1921;
  int D.1920;
  int D.1919;
  int D.1918;
  int D.1916;

<bb 2>:
  if (b_1(D) != 0)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  IND.x[0] = i_2(D);
  IND.x[1] = j_3(D);
  D.1916_5 = k_4(D) + -1;
  IND.x[2] = D.1916_5;
  goto <bb 5>;

<bb 4>:
  IND.x[0] = i_2(D);
  IND.x[1] = j_3(D);
  IND.x[2] = k_4(D);

<bb 5>:
  # prephitmp.12_20 = PHI <D.1916_5(3), k_4(D)(4)>
  D.1919_6 = i_2(D);
  D.1920_7 = j_3(D);
  D.1922_9 = prephitmp.12_20;
  D.1921_8 = D.1920_7 + D.1919_6;
  D.1918_10 = D.1921_8 + D.1922_9;
  return D.1918_10;

}

for the original testcase.
Comment 11 Richard Biener 2008-08-19 09:07:59 UTC
Fixed.
Comment 12 Richard Biener 2008-08-19 09:08:24 UTC
Subject: Bug 35972

Author: rguenth
Date: Tue Aug 19 09:06:54 2008
New Revision: 139226

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=139226
Log:
2008-08-19  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/35972
	PR tree-optimization/23094
	* tree-ssa-sccvn.h (vn_reference_lookup_pieces): Add maywalk
	parameter.
	* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Properly
	handle MISALIGNED_INDIRECT_REF.
	(get_ref_from_reference_ops): New helper.
	(vn_reference_lookup_pieces): Walk the use-def chain using the
	alias-oracle if requested.
	* tree-ssa-pre.c (phi_translate_1): Do reference lookup with
	walking the use-def chain.
	(compute_avail): But not here.
	(create_component_ref_by_pieces_1): Properly handle
	MISALIGNED_INDIRECT_REF.
	(do_regular_insertion): Handle fully redundant
	expressions after PHI-translation also for SSA_NAME values, not
	only constants.  Correctly use edoubleprime for that.

	* gcc.dg/tree-ssa/ssa-pre-19.c: New testcase.
	* gcc.dg/autopar/reduc-1.c: Move constant initialized arrays to
	global memory.
	* gcc.dg/autopar/reduc-1char.c: Likewise.
	* gcc.dg/autopar/reduc-1short.c: Likewise.
	* gcc.dg/autopar/reduc-2.c: Likewise.
	* gcc.dg/autopar/reduc-2char.c: Likewise.
	* gcc.dg/autopar/reduc-2short.c: Likewise.
	* gcc.dg/autopar/reduc-3.c: Likewise.
	* gcc.dg/tree-ssa/ifc-20040816-1.c: Likewise.
	* gcc.dg/vect/costmodel/i386/costmodel-vect-reduc-1char.c: Likewise.
	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-reduc-1char.c: Likewise.
	* gcc.dg/vect/fast-math-vect-reduc-5.c: Likewise.
	* gcc.dg/vect/fast-math-vect-reduc-7.c: Likewise.
	* gcc.dg/vect/no-trapping-math-2.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-111.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c: Likewise.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c: Likewise.
	* gcc.dg/vect/no-vfa-vect-37.c: Likewise.
	* gcc.dg/vect/no-vfa-vect-depend-1.c: Likewise.
	* gcc.dg/vect/pr18400.c: Likewise.
	* gcc.dg/vect/slp-12b.c: Likewise.
	* gcc.dg/vect/slp-14.c: Likewise.
	* gcc.dg/vect/slp-7.c: Likewise.
	* gcc.dg/vect/slp-15.c: Likewise.
	* gcc.dg/vect/slp-16.c: Likewise.
	* gcc.dg/vect/slp-17.c: Likewise.
	* gcc.dg/vect/slp-24.c: Likewise.
	* gcc.dg/vect/slp-28.c: Likewise.
	* gcc.dg/vect/slp-3.c: Likewise.
	* gcc.dg/vect/slp-34.c: Likewise.
	* gcc.dg/vect/slp-6.c: Likewise.
	* gcc.dg/vect/slp-8.c: Likewise.
	* gcc.dg/vect/vect-107.c: Likewise.
	* gcc.dg/vect/vect-108.c: Likewise.
	* gcc.dg/vect/vect-11.c: Likewise.
	* gcc.dg/vect/vect-112.c: Likewise.
	* gcc.dg/vect/vect-115.c: Likewise.
	* gcc.dg/vect/vect-11a.c: Likewise.
	* gcc.dg/vect/vect-34.c: Likewise.
	* gcc.dg/vect/vect-9.c: Likewise.
	* gcc.dg/vect/vect-97.c: Likewise.
	* gcc.dg/vect/vect-align-1.c: Likewise.
	* gcc.dg/vect/vect-float-extend-1.c: Likewise.
	* gcc.dg/vect/vect-floatint-conversion-1.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-16.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-17.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-2.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-3.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-4.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-5.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-6.c: Likewise.
	* gcc.dg/vect/vect-ifcvt-7.c: Likewise.
	* gcc.dg/vect/vect-intfloat-conversion-1.c: Likewise.
	* gcc.dg/vect/vect-intfloat-conversion-2.c: Likewise.
	* gcc.dg/vect/vect-intfloat-conversion-3.c: Likewise.
	* gcc.dg/vect/vect-intfloat-conversion-4a.c: Likewise.
	* gcc.dg/vect/vect-intfloat-conversion-4b.c: Likewise.
	* gcc.dg/vect/vect-multitypes-2.c: Likewise.
	* gcc.dg/vect/vect-multitypes-5.c: Likewise.
	* gcc.dg/vect/vect-reduc-1.c: Likewise.
	* gcc.dg/vect/vect-reduc-1char.c: Likewise.
	* gcc.dg/vect/vect-reduc-1short.c: Likewise.
	* gcc.dg/vect/vect-reduc-2.c: Likewise.
	* gcc.dg/vect/vect-reduc-3.c: Likewise.
	* gcc.dg/vect/vect-shift-1.c: Likewise.
	* gcc.dg/vect/vect-strided-float.c: Likewise.
	* gcc.dg/vect/vect-strided-store-u32-i2.c: Likewise.
	* gcc.dg/vect/wrapv-vect-reduc-2char.c: Likewise.
	* gcc.dg/vect/wrapv-vect-reduc-2short.c: Likewise.
	* gcc.dg/tree-ssa/gen-vect-11.c: Likewise.
	* gcc.dg/tree-ssa/gen-vect-11a.c: Likewise.
	* gcc.dg/tree-ssa/gen-vect-2.c: Likewise.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-76c.c: Likewise.

Added:
    trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-19.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-1.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-1char.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-1short.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-2.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-2char.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-2short.c
    trunk/gcc/testsuite/gcc.dg/autopar/reduc-3.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c
    trunk/gcc/testsuite/gcc.dg/tree-ssa/ifc-20040816-1.c
    trunk/gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-reduc-1char.c
    trunk/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-vect-76c.c
    trunk/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-reduc-1char.c
    trunk/gcc/testsuite/gcc.dg/vect/fast-math-vect-reduc-5.c
    trunk/gcc/testsuite/gcc.dg/vect/fast-math-vect-reduc-7.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-2.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c
    trunk/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c
    trunk/gcc/testsuite/gcc.dg/vect/no-vfa-vect-37.c
    trunk/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c
    trunk/gcc/testsuite/gcc.dg/vect/pr18400.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-12b.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-14.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-15.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-16.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-17.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-24.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-28.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-3.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-34.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-6.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-7.c
    trunk/gcc/testsuite/gcc.dg/vect/slp-8.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-107.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-108.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-11.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-112.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-115.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-11a.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-34.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-9.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-97.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-align-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-float-extend-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-floatint-conversion-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-16.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-17.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-2.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-3.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-4.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-5.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-6.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-ifcvt-7.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-2.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-3.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-4a.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-intfloat-conversion-4b.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-multitypes-2.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-multitypes-5.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-reduc-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-reduc-1char.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-reduc-1short.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-reduc-2.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-reduc-3.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-shift-1.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-strided-float.c
    trunk/gcc/testsuite/gcc.dg/vect/vect-strided-store-u32-i2.c
    trunk/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-2char.c
    trunk/gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-2short.c
    trunk/gcc/tree-ssa-pre.c
    trunk/gcc/tree-ssa-sccvn.c
    trunk/gcc/tree-ssa-sccvn.h