Harden DFGForAllKills
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Apr 2015 20:32:20 +0000 (20:32 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Apr 2015 20:32:20 +0000 (20:32 +0000)
commit0b8518c2bda94eeec8031f2d18b035fb596359e8
treef3edd43eb7bacefbe75d1959d2d4750fab8ffbc9
parent208ba55631effc684a9497779ba7454d83e436e0
Harden DFGForAllKills
https://bugs.webkit.org/show_bug.cgi?id=143792

Reviewed by Geoffrey Garen.

Unfortunately, we don't have a good way to test this yet - but it will be needed to prevent
bugs in https://bugs.webkit.org/show_bug.cgi?id=143734.

Previously ForAllKills used the bytecode kill analysis. That seemed like a good idea because
that analysis is cheaper than the full liveness analysis. Unfortunately, it's probably wrong:

- It looks for kill sites at forExit origin boundaries. But, something might have been killed
  by an operation that was logically in between the forExit origins at the boundary, but was
  removed from the DFG for whatever reason. The DFG is allowed to have bytecode instruction
  gaps.

- It overlooked the fact that a MovHint that addresses a local that is always live kills that
  local. For example, storing to an argument means that the prior value of the argument is
  killed.

This fixes the analysis by making it handle MovHints directly, and making it define kills in
the most conservative way possible: it asks if you were live before but dead after. If we
have the compile time budget to afford this more direct approach, then it's definitel a good
idea since it's so fool-proof.

* dfg/DFGArgumentsEliminationPhase.cpp:
* dfg/DFGForAllKills.h:
(JSC::DFG::forAllKilledOperands):
(JSC::DFG::forAllKilledNodesAtNodeIndex):
(JSC::DFG::forAllDirectlyKilledOperands): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@182857 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp
Source/JavaScriptCore/dfg/DFGForAllKills.h