On Fri, Jan 15, 2021 at 09:31:10PM +0100, Jakub Jelinek via Gcc-patches wrote: > On Fri, Jan 15, 2021 at 09:16:31PM +0100, Richard Biener wrote: > > >Apparently not. The passes after strlen1 are: > > >pr96271.c.191t.thread4 > > >pr96271.c.192t.vrp2 > > >pr96271.c.193t.copyprop5 > > >pr96271.c.194t.wrestrict > > >pr96271.c.195t.dse4 > > >pr96271.c.196t.cddce3 > > >pr96271.c.197t.forwprop4 > > >pr96271.c.198t.phiopt4 > > >pr96271.c.199t.fab1 > > >pr96271.c.200t.widening_mul > > >pr96271.c.201t.store-merging > > >pr96271.c.202t.tailc > > >pr96271.c.203t.dce7 > > >pr96271.c.204t.crited1 > > >pr96271.c.206t.uncprop1 > > >pr96271.c.207t.local-pure-const2 > > >pr96271.c.208t.modref2 > > >pr96271.c.242t.nrv > > >pr96271.c.243t.isel > > >pr96271.c.244t.optimized > > >and TODO_update_address_taken is used by the inliner, sra, ccp, loop > > >and > > >sccvn, so maybe in fre5 in 187. > > > > OK, I think it makes sense to delay until before forwprop4 so can you > > instead arrange for an unconditional run there? > > At the end of forwprop4 or start (i.e. end of previous pass)?
Like this? 2021-01-15 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/96271 * passes.def: Pass false argument to first two pass_cd_dce instances and true to last instance. Add comment that last instance rewrites no longer addressed locals. (pass_cd_dce): Add update_address_taken_p member and initialize it. (pass_cd_dce::set_pass_param): New method. (pass_cd_dce::execute): Return TODO_update_address_taken from last cd_dce instance. * gcc.target/i386/pr96271.c: New test. --- gcc/passes.def.jj 2021-01-04 10:25:38.826233904 +0100 +++ gcc/passes.def 2021-01-15 21:55:24.431629359 +0100 @@ -90,7 +90,7 @@ along with GCC; see the file COPYING3. NEXT_PASS (pass_early_vrp); NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_dse); - NEXT_PASS (pass_cd_dce); + NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */); NEXT_PASS (pass_phiopt, true /* early_p */); NEXT_PASS (pass_modref); NEXT_PASS (pass_tail_recursion); @@ -272,7 +272,7 @@ along with GCC; see the file COPYING3. NEXT_PASS (pass_loop_jam); /* All unswitching, final value replacement and splitting can expose empty loops. Remove them now. */ - NEXT_PASS (pass_cd_dce); + NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */); NEXT_PASS (pass_iv_canon); NEXT_PASS (pass_loop_distribution); NEXT_PASS (pass_linterchange); @@ -336,7 +336,9 @@ along with GCC; see the file COPYING3. NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_warn_restrict); NEXT_PASS (pass_dse); - NEXT_PASS (pass_cd_dce); + NEXT_PASS (pass_cd_dce, true /* update_address_taken_p */); + /* After late CD DCE we rewrite no longer addressed locals into SSA + form if possible. */ NEXT_PASS (pass_forwprop); NEXT_PASS (pass_phiopt, false /* early_p */); NEXT_PASS (pass_fold_builtins); --- gcc/tree-ssa-dce.c.jj 2021-01-12 11:01:51.283385011 +0100 +++ gcc/tree-ssa-dce.c 2021-01-15 21:54:19.016368431 +0100 @@ -1787,14 +1787,25 @@ class pass_cd_dce : public gimple_opt_pa { public: pass_cd_dce (gcc::context *ctxt) - : gimple_opt_pass (pass_data_cd_dce, ctxt) + : gimple_opt_pass (pass_data_cd_dce, ctxt), update_address_taken_p (false) {} /* opt_pass methods: */ opt_pass * clone () { return new pass_cd_dce (m_ctxt); } + void set_pass_param (unsigned n, bool param) + { + gcc_assert (n == 0); + update_address_taken_p = param; + } virtual bool gate (function *) { return flag_tree_dce != 0; } - virtual unsigned int execute (function *) { return tree_ssa_cd_dce (); } + virtual unsigned int execute (function *) + { + return (tree_ssa_cd_dce () + | (update_address_taken_p ? TODO_update_address_taken : 0)); + } +private: + bool update_address_taken_p; }; // class pass_cd_dce } // anon namespace --- gcc/testsuite/gcc.target/i386/pr96271.c.jj 2021-01-15 21:56:03.067192848 +0100 +++ gcc/testsuite/gcc.target/i386/pr96271.c 2021-01-15 21:56:03.067192848 +0100 @@ -0,0 +1,11 @@ +/* PR tree-optimization/96271 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=intel -msse2 -masm=att" } */ +/* { dg-final { scan-assembler "movq\t%xmm0, %r" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "movq\t%xmm1, %r" { target { ! ia32 } } } } */ + +int +foo (double a, double b) +{ + return __builtin_memcmp (&a, &b, sizeof (double)) == 0; +} Jakub