On Thu, Apr 21, 2016 at 2:47 AM, Patrick Palka <patr...@parcs.ath.cx> wrote: > 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?
Not sure whether that's good (think of the need to update this plus the storage required for it). Maybe keep the immediate use list in order { real uses, debug uses }? (thus do inserting at head/tail depending on use stmt case) Richard.