B3::LowerToAir should not duplicate Loads
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 29 Oct 2015 01:28:06 +0000 (01:28 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 29 Oct 2015 01:28:06 +0000 (01:28 +0000)
commit5f9a72516bfe3ee1f9a9251a777b7dda763b3779
treed28787cfe96b6f7d4b1962d3b58ebe0bfa214688
parent0d13736af4b2d07e9ddf8ee732d2fa161cf344fe
B3::LowerToAir should not duplicate Loads
https://bugs.webkit.org/show_bug.cgi?id=150651

Reviewed by Benjamin Poulain.

The instruction selector may decide to fuse two Values into one. This ordinarily only happens
if we haven't already emitted code that uses the Value and the Value has only one direct
user. Once we have emitted such code, we ensure that everyone knows that we have "locked" the
Value: we won't emit any more code for it in the future.

The optimization to fuse Loads was forgetting to do all of these things, and so generated
code would have a lot of duplicated Loads. That's bad and this change fixes that.

Ordinarily, this is far less tricky because the pattern matcher does this for us via
acceptInternals() and acceptInternalsLate(). I added a comment to this effect. I hope that we
won't need to do this manually very often.

Also found an uninitialized value bug in UseCounts. That was making all of this super hard to
debug.

* b3/B3IndexMap.h:
(JSC::B3::IndexMap::IndexMap):
(JSC::B3::IndexMap::resize):
(JSC::B3::IndexMap::operator[]):
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::tmp):
(JSC::B3::Air::LowerToAir::canBeInternal):
(JSC::B3::Air::LowerToAir::commitInternal):
(JSC::B3::Air::LowerToAir::effectiveAddr):
(JSC::B3::Air::LowerToAir::loadAddr):
(JSC::B3::Air::LowerToAir::appendBinOp):
(JSC::B3::Air::LowerToAir::tryAppendStoreBinOp):
(JSC::B3::Air::LowerToAir::acceptInternals):
* b3/B3UseCounts.cpp:
(JSC::B3::UseCounts::UseCounts):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@191716 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/b3/B3IndexMap.h
Source/JavaScriptCore/b3/B3LowerToAir.cpp
Source/JavaScriptCore/b3/B3UseCounts.cpp