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.
Mine (from tramp3d).
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.
Huhm. This is just because PRE and SCCVN are disconnected and use their own IL. Maybe finally time to fix this...
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.
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.
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.
Note, SRA needs to be disabled for the testcase to show the issue.
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? ...
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.
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.
Fixed.
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