facebookarchive/prepack

Eliminate branches in residual functions when the comparison value never leaks

Open

#1,146 opened on Nov 10, 2017

View on GitHub
 (1 comment) (0 reactions) (0 assignees)JavaScript (14,268 stars) (520 forks)batch import
bootcampedenhancementhelp wantedlevel 3 (medium)react compilerserializer

Description

I'll just put this on the wish list.

(function() {
  const Foo = Symbol();
  const Bar = Symbol();
  reducer = function(action) {
    switch (action) {
      case Foo:
        console.log('foo');
        break;
      case Bar:
        console.log('bar');
        break;
    }
  };
  leak = Bar;
})();

should turn into:

(function () {
  var Bar = Symbol();
  reducer = function (action) {
    switch (action) {
      case Bar:
        console.log('bar');
        break;
    }
  };
  leak = Bar;
})();

Foo doesn't leak anywhere. Therefore it currently gets inlined to be created in the case statement producing a new Symbol every time. However, it should just dead code eliminate the whole conditional branch since it can never happen when the only remaining callsite is a condition.

Contributor guide