summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2014-05-19 13:01:18 +0200
committerAdriaan Moors <adriaan.moors@typesafe.com>2014-05-19 13:01:18 +0200
commit1e1defd99c4b8874c517daf877b583a81e056c15 (patch)
tree944a78faa022dbd193b3e464a9b20adcd71a2cae
parent8cc18877a6be106e86d6aa5c3d539e86e11280e8 (diff)
parent81309e7e0fb568b3ba12df9631c607232b68960b (diff)
downloadscala-1e1defd99c4b8874c517daf877b583a81e056c15.tar.gz
scala-1e1defd99c4b8874c517daf877b583a81e056c15.tar.bz2
scala-1e1defd99c4b8874c517daf877b583a81e056c15.zip
Merge pull request #3763 from adriaanm/revert-3760v2.11.1
Revert #3760
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala9
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala6
-rw-r--r--test/files/run/t8601.flags1
-rw-r--r--test/files/run/t8601.scala15
-rw-r--r--test/files/run/t8601b.flags1
-rw-r--r--test/files/run/t8601b.scala14
-rw-r--r--test/files/run/t8601c.flags1
-rw-r--r--test/files/run/t8601c.scala12
-rw-r--r--test/files/run/t8601d.flags1
-rw-r--r--test/files/run/t8601d.scala8
10 files changed, 7 insertions, 61 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
index 0b943360de..c49f23852f 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
@@ -56,10 +56,11 @@ abstract class ClosureElimination extends SubComponent {
case (BOX(t1), UNBOX(t2)) if (t1 == t2) =>
Some(Nil)
- // Can't eliminate (LOAD_FIELD, DROP) without eliding side effects:
- // - static class initialization
- // - NPE if the receiver is null
- // We could replace the LOAD/DROP with a null check to preserve semantics.
+ case (LOAD_FIELD(sym, isStatic), DROP(_)) if !sym.hasAnnotation(definitions.VolatileAttr) =>
+ if (isStatic)
+ Some(Nil)
+ else
+ Some(DROP(REFERENCE(definitions.ObjectClass)) :: Nil)
case _ => None
}
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
index 245894a4af..90c37ba0b3 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
@@ -167,9 +167,9 @@ abstract class DeadCodeElimination extends SubComponent {
set += idx
localStores(key) = set
- case RETURN(_) | JUMP(_) | CJUMP(_, _, _, _) | CZJUMP(_, _, _, _) | STORE_FIELD(_, _) | LOAD_FIELD(_, _) | // Why LOAD_FIELD? It can NPE!
+ case RETURN(_) | JUMP(_) | CJUMP(_, _, _, _) | CZJUMP(_, _, _, _) | STORE_FIELD(_, _) |
THROW(_) | LOAD_ARRAY_ITEM(_) | STORE_ARRAY_ITEM(_) | SCOPE_ENTER(_) | SCOPE_EXIT(_) | STORE_THIS(_) |
- LOAD_EXCEPTION(_) | SWITCH(_, _) | MONITOR_ENTER() | MONITOR_EXIT() | CHECK_CAST(_) | CREATE_ARRAY(_, _) =>
+ LOAD_EXCEPTION(_) | SWITCH(_, _) | MONITOR_ENTER() | MONITOR_EXIT() | CHECK_CAST(_) =>
moveToWorkList()
case CALL_METHOD(m1, _) if isSideEffecting(m1) =>
@@ -193,8 +193,6 @@ abstract class DeadCodeElimination extends SubComponent {
moveToWorkListIf(necessary)
case LOAD_MODULE(sym) if isLoadNeeded(sym) =>
moveToWorkList() // SI-4859 Module initialization might side-effect.
- case CALL_PRIMITIVE(Arithmetic(DIV | REM, INT | LONG) | ArrayLength(_)) =>
- moveToWorkList() // SI-8601 Might divide by zero
case _ => ()
moveToWorkListIf(cond = false)
}
diff --git a/test/files/run/t8601.flags b/test/files/run/t8601.flags
deleted file mode 100644
index 1182725e86..0000000000
--- a/test/files/run/t8601.flags
+++ /dev/null
@@ -1 +0,0 @@
--optimize \ No newline at end of file
diff --git a/test/files/run/t8601.scala b/test/files/run/t8601.scala
deleted file mode 100644
index e1afc23cc4..0000000000
--- a/test/files/run/t8601.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-object Test {
- def idiv(x: Int): Unit = x / 0
- def ldiv(x: Long): Unit = x / 0
- def irem(x: Int): Unit = x % 0
- def lrem(x: Long): Unit = x % 0
-
- def check(x: => Any) = try { x; sys.error("failed to throw divide by zero!") } catch { case _: ArithmeticException => }
-
- def main(args: Array[String]) {
- check(idiv(1))
- check(ldiv(1L))
- check(irem(1))
- check(lrem(1L))
- }
-}
diff --git a/test/files/run/t8601b.flags b/test/files/run/t8601b.flags
deleted file mode 100644
index 1182725e86..0000000000
--- a/test/files/run/t8601b.flags
+++ /dev/null
@@ -1 +0,0 @@
--optimize \ No newline at end of file
diff --git a/test/files/run/t8601b.scala b/test/files/run/t8601b.scala
deleted file mode 100644
index 9c37ce33d6..0000000000
--- a/test/files/run/t8601b.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-object Test {
- def len(x: Array[String]): Unit = x.length
- def load(x: Array[String]): Unit = x(0)
- def newarray(i: Int): Unit = new Array[Int](i)
-
- def check(x: => Any) = try { x; sys.error("failed to throw NPE!") } catch { case _: NullPointerException => }
- def checkNegSize(x: => Any) = try { x; sys.error("failed to throw NegativeArraySizeException!") } catch { case _: NegativeArraySizeException => }
-
- def main(args: Array[String]) {
- check(len(null)) // bug: did not NPE
- check(load(null))
- checkNegSize(newarray(-1))
- }
-}
diff --git a/test/files/run/t8601c.flags b/test/files/run/t8601c.flags
deleted file mode 100644
index 1182725e86..0000000000
--- a/test/files/run/t8601c.flags
+++ /dev/null
@@ -1 +0,0 @@
--optimize \ No newline at end of file
diff --git a/test/files/run/t8601c.scala b/test/files/run/t8601c.scala
deleted file mode 100644
index c487d6825e..0000000000
--- a/test/files/run/t8601c.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-object Test {
- def loadField(x: scala.runtime.IntRef): Unit = x.elem
- def storeField(x: scala.runtime.IntRef): Unit = x.elem = 42
-
- def check(x: => Any) = try { x; sys.error("failed to throw NPE!") } catch { case _: NullPointerException => }
-
- def main(args: Array[String]) {
- check(loadField(null)) // bug: did not NPE under -Ydead-code
- check(storeField(null))
-
- }
-}
diff --git a/test/files/run/t8601d.flags b/test/files/run/t8601d.flags
deleted file mode 100644
index 1182725e86..0000000000
--- a/test/files/run/t8601d.flags
+++ /dev/null
@@ -1 +0,0 @@
--optimize \ No newline at end of file
diff --git a/test/files/run/t8601d.scala b/test/files/run/t8601d.scala
deleted file mode 100644
index ac89963d67..0000000000
--- a/test/files/run/t8601d.scala
+++ /dev/null
@@ -1,8 +0,0 @@
-object Test {
- def monitor(x: AnyRef): Unit = {x.synchronized(()); ()}
- def check(x: => Any) = try { x; sys.error("failed to throw NPE") } catch { case _: NullPointerException => }
-
- def main(args: Array[String]) {
- check(monitor(null))
- }
-}