This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Improve jump threading #1 of N


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I've been doing some research into improving certain aspects of our
warnings, particularly removing false positives from the warnings which
require dataflow information.  I think it's reasonably well known that
many of the false positives occur due to unexecutable edges remaining in
the CFG.

Long term I think we're going to need a more structured approach to path
isolation and I'm still pondering exactly what that might look like.

In the mean time one thing is clear the current jump threading is quite
important for eliminating many of the unexecutable edges in the CFG.
Furthermore, the cases I'm looking at require us capture more of the
secondary effects of jump threading.

Let's consider this CFG (from a routine in cfgexpand.c)


           A
          / \
         B   C
         |  / \
         | D   E
         | |  / \
         | | F   G
          \| |
            \|
             H
            / \
           I   J
          / \
         L   M
         |  / \
         | N   O
         | |  / \
         | | P   Q
          \| |
            \|
             R


As it turns out some blocks have the same condition (A,I), (C,M), (E,O).
 But because of the merge block H, no threading is possible.  I've got
patches which let us copy H into B, D & F.  That exposes the jump
threads B->L, D->M and F->M.  Unfortunately, we need another iteration
of jump threading to then thread D->N and F->O and then another
iteration to thread F->P with the net result looking something like this:


           A
          / \
        BH'L C
         |  / \
         |DH'N E
         | |  / \
         | |FH'P G
          \| |
            \|
             R



I don't think anyone is going to argue for a return to the iterated DOM
approach we had in the past.  Luckily we can often pick up the secondary
effects by looking deeper into the CFG when we do find a threading
opportunity.  ie, when we discover D->I->M, go ahead and look at M and
see if we can thread through it to N or O and so-on.

That turns out to be relatively easy and cheap if we restrict the form
of M so that we don't need to create a duplicate of M (which ties back
to our long term need for a more structured approach to path isolation).

The attached patch allows us to capture some of these secondary effects
by looking at the destination of a threadable jump to see if it is yet
another conditional with a statically computable destination.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu.  Trivial
testcase included :-)  OK for trunk?


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJNjMM7AAoJEBRtltQi2kC7mtAH/2yC58nNaW1ZZP6OQFztNTHo
nyRAIjS7NxT8Sal84cRwfaAgND74VesVUs8EgYY9G7brHWihBWYqZ8gRjRp2VJqA
EM9IIScKgYqM5/2+41Iy2yGY3yMksOpVPX3LZfCHWKW0PIycpmHnLglGUSU33rbr
8EtVbv3PuXn6OnqYqA5onCmLiI4YRapLnF+iNvH3r5DI4EJKPweLPBygye/aDI+F
DCZl9zCKfdrKvvkA81o1+f2CQPC9507w2B1MZBM3uXRJGETrLTNKiyIDyciq2OG+
SR2e72co/zbUTU1HQlpkL5nCEl4xn8fYmZQlaZjp3OypkY86vI5YnStjPKjnc2w=
=z6nn
-----END PGP SIGNATURE-----

Attachment: patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]