diff options
author | James Iry <jamesiry@gmail.com> | 2013-03-07 15:05:35 -0800 |
---|---|---|
committer | James Iry <jamesiry@gmail.com> | 2013-03-07 16:19:31 -0800 |
commit | 69109c0ace5e3ac831c3b0a5635f25317d3b28bf (patch) | |
tree | 191edbde9b7b0ae80dfc3860ff449598c8df5a60 /test/files/run | |
parent | 5967a664ab1129e28687c591bd94c0e482cb305f (diff) | |
download | scala-69109c0ace5e3ac831c3b0a5635f25317d3b28bf.tar.gz scala-69109c0ace5e3ac831c3b0a5635f25317d3b28bf.tar.bz2 scala-69109c0ace5e3ac831c3b0a5635f25317d3b28bf.zip |
Analyze constants to remove unnecessary branches
This commit adds analysis and optimization of constants to remove
unnecessary branches. It uses abstract interpretation to determine
what constant(s) a particular stack slot or variable might or might not
hold at a given spot and uses that knowledge to eliminate branches that
cannot be taken. Its primary goal is null check removal, but it also
works for other constants.
Several tests are modified to include the new optimization phase.
Two new tests are added. One verifies that branching still works as
expected. The other verifies that branches are removed.
Diffstat (limited to 'test/files/run')
-rw-r--r-- | test/files/run/constant-optimization.check | 2 | ||||
-rw-r--r-- | test/files/run/constant-optimization.scala | 18 | ||||
-rw-r--r-- | test/files/run/programmatic-main.check | 7 |
3 files changed, 24 insertions, 3 deletions
diff --git a/test/files/run/constant-optimization.check b/test/files/run/constant-optimization.check new file mode 100644 index 0000000000..090e53ac40 --- /dev/null +++ b/test/files/run/constant-optimization.check @@ -0,0 +1,2 @@ +testBothReachable: good +testOneReachable: good diff --git a/test/files/run/constant-optimization.scala b/test/files/run/constant-optimization.scala new file mode 100644 index 0000000000..86f981e13f --- /dev/null +++ b/test/files/run/constant-optimization.scala @@ -0,0 +1,18 @@ +object Test extends App { + def testBothReachable() { + val i = util.Random.nextInt + val x = if (i % 2 == 0) null else "good" + val y = if (x == null) "good" else x + "" + println(s"testBothReachable: $y") + } + + def testOneReachable() { + val i = 1 + val x = if (i != 1) null else "good" + val y = if (x == null) "good" else x + "" + println(s"testOneReachable: $y") + } + + testBothReachable() + testOneReachable() +} diff --git a/test/files/run/programmatic-main.check b/test/files/run/programmatic-main.check index d472c569d2..61b947214c 100644 --- a/test/files/run/programmatic-main.check +++ b/test/files/run/programmatic-main.check @@ -25,7 +25,8 @@ superaccessors 6 add super accessors in traits and nested classes inliner 23 optimization: do inlining inlinehandlers 24 optimization: inline exception handlers closelim 25 optimization: eliminate uncalled closures - dce 26 optimization: eliminate dead code - jvm 27 generate JVM bytecode - terminal 28 The last phase in the compiler chain + constopt 26 optimization: optimize null and other constants + dce 27 optimization: eliminate dead code + jvm 28 generate JVM bytecode + terminal 29 The last phase in the compiler chain |