OSDN Git Service

Reimplement depedency tracking in the ImplicitNullChecks pass
authorSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 23 Dec 2016 00:41:21 +0000 (00:41 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Fri, 23 Dec 2016 00:41:21 +0000 (00:41 +0000)
commit2f275ef1c85d34eb2d9fa962b36a36fb74ee3767
tree614e2874ae63ff22b1e4184f128d85b74a15b811
parent2feb23fd5ed2393d031d3608ebd61d4d16150419
Reimplement depedency tracking in the ImplicitNullChecks pass

Summary:
This change rewrites a core component in the ImplicitNullChecks pass for
greater simplicity since the original design was over-complicated for no
good reason.  Please review this as essentially a new pass.  The change
is almost NFC and I've added a test case for a scenario that this new
code handles that wasn't handled earlier.

The implicit null check pass, at its core, is a code hoisting transform.
It differs from "normal" code transforms in that it speculates
potentially faulting instructions (by design), but a lot of the usual
hazard detection logic (register read-after-write etc.) still applies.
We previously detected hazards by keeping track of registers defined and
used by machine instructions over an instruction range, but that was
unwieldy and did not actually confer any performance benefits.  The
intent was to have linear time complexity over the number of machine
instructions considered, but it ended up being N^2 is practice.

This new version is more obviously O(N^2) (with N capped to 8 by
default) in hazard detection.  It does not attempt to be clever in
tracking register uses or defs (the previous cleverness here was a
source of bugs).

Once this is checked in, I'll extract out the `IsSuitableMemoryOp` and
`CanHoistLoadInst` lambda into member functions (they're too complicated
to be inline lambdas) and do some other related NFC cleanups.

Reviewers: reames, anna, atrick

Subscribers: mcrosier, llvm-commits

Differential Revision: https://reviews.llvm.org/D27592

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290394 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/ImplicitNullChecks.cpp
test/CodeGen/X86/implicit-null-checks.mir