On Wed, Apr 20, 2016 at 6:45 PM, Patrick Palka <patr...@parcs.ath.cx> wrote: > During assert-location discovery, if an SSA name is live according to > live_on_edge() on some outgoing edge E, then the SSA name definitely has > at least two uses: the use on the outgoing edge, and the use in some BB > dominating E->src from which the SSA_NAME and the potential assertion > was discovered. These two uses can't be the same because the liveness > array is populated on-the-fly in reverse postorder so the latter use > which dominates BB couldn't have yet contributed to the liveness bitmap. > > So AFAICT it's not necessary to check live_on_edge() as well as > !has_single_use() since the former check will imply the latter. So this > patch removes these redundant calls to has_single_use() (and alse > replaces the use of has_single_use() in find_assert_locations_1 with a > liveness bitmap test which should be cheaper and more accurate). > > I bootstrapped and regtested this change on x86_64-pc-linux-gnu. I also > confirmed that the number of calls made to register_new_assert_for > before and after the patch remains the same during compilation of > libstdc++ and during compilation of gimple-match.c and when running the > tree-ssa.exp testsuite. Does this look OK to commit? > > gcc/ChangeLog: > > * tree-vrp.c (register_edge_assert_for_2): Remove redundant > has_single_use() tests. > (register_edge_assert_for_1): Likewise. > (find_assert_locations_1): Check the liveness bitmap instead of > calling has_single_use().
By the way, would it be reasonable to cache/precompute the number of non-debug uses each ssa name has so that has_single_use, has_zero_uses etc are much cheaper?