v8/test/mjsunit/asm/if-folding.js
titzer@chromium.org e4c6f9488e Implement graph trimming in ControlReducer.
Trimming the graph consists of breaking links from nodes that are not reachable from end to nodes that are reachable from end. Such dead nodes show up in the use lists of the live nodes and though mostly harmless, just clutter up the graph. They also can limit instruction selection opportunities, so it is good to get rid of them.

This CL is one half of the ControlReducer functionality, the other half
being branch folding.

R=bmeurer@chromium.org
BUG=

Review URL: https://codereview.chromium.org/661923002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24694 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
2014-10-17 11:51:57 +00:00

101 lines
1.9 KiB
JavaScript

// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function Module() {
"use asm";
function if0() {
if (0) return 11;
return 12;
}
function if1() {
if (1) return 13;
return 14;
}
function if2() {
if (0) return 15;
else return 16;
}
function if3() {
if (1) return 17;
else return 18;
}
function if4() {
return 1 ? 19 : 20;
}
function if5() {
return 0 ? 21 : 22;
}
function if6() {
var x = 0 ? 23 : 24;
return x;
}
function if7() {
if (0) { var x = 0 ? 25 : 26; }
else { var x = 0 ? 27 : 28; }
return x;
}
function if8() {
if (0) {
if (0) { var x = 0 ? 29 : 30; }
else { var x = 0 ? 31 : 32; }
} else {
if (0) { var x = 0 ? 33 : 34; }
else { var x = 0 ? 35 : 36; }
}
return x;
}
return {if0: if0, if1: if1, if2: if2, if3: if3, if4: if4, if5: if5, if6: if6, if7: if7, if8: if8 };
}
var m = Module();
assertEquals(12, m.if0());
assertEquals(13, m.if1());
assertEquals(16, m.if2());
assertEquals(17, m.if3());
assertEquals(19, m.if4());
assertEquals(22, m.if5());
assertEquals(24, m.if6());
assertEquals(28, m.if7());
assertEquals(36, m.if8());
function Spec(a,b,c) {
"use asm";
var xx = a | 0;
var yy = b | 0;
var zz = c | 0;
function f() {
if (xx) {
if (yy) { var x = zz ? 29 : 30; }
else { var x = zz ? 31 : 32; }
} else {
if (yy) { var x = zz ? 33 : 34; }
else { var x = zz ? 35 : 36; }
}
return x;
}
return {f: f};
}
assertEquals(36, Spec(0,0,0).f());
assertEquals(35, Spec(0,0,1).f());
assertEquals(34, Spec(0,1,0).f());
assertEquals(33, Spec(0,1,1).f());
assertEquals(32, Spec(1,0,0).f());
assertEquals(31, Spec(1,0,1).f());
assertEquals(30, Spec(1,1,0).f());
assertEquals(29, Spec(1,1,1).f());