summaryrefslogtreecommitdiff
path: root/test/files/run/t8601.flags
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-05-18 10:24:43 +0200
committerJason Zaugg <jzaugg@gmail.com>2014-05-19 22:27:42 +0200
commit5b1d43d8ffda4b5881df7ce6634a7adebbb02f21 (patch)
tree3403b50da9e42b66f90922119ac9433390de35d6 /test/files/run/t8601.flags
parent1e1defd99c4b8874c517daf877b583a81e056c15 (diff)
downloadscala-5b1d43d8ffda4b5881df7ce6634a7adebbb02f21.tar.gz
scala-5b1d43d8ffda4b5881df7ce6634a7adebbb02f21.tar.bz2
scala-5b1d43d8ffda4b5881df7ce6634a7adebbb02f21.zip
SI-8601 Don't treat int/long division, or arraylength, as dead-code
`{i, l}div` and `{i, l}rem` throw an `ArithmeticException` if the divisor is 0. `arraylength` throws a `NullPointerException` on a null reference. JVM Spec: > The only integer operations that can throw an exception are the > integer divide instructions (idiv and ldiv) and the integer > remainder instructions (irem and lrem), which throw an > ArithmeticException if the divisor is zero. > The Java virtual machine's floating-point operators do not throw > runtime exceptions > If the arrayref is null, the arraylength instruction throws a > NullPointerException. I checked the other primitives in `ICode` to see if anything else should be considered as live code. Pure: // jvm : {i, l, f, d}neg case class Negation(kind: TypeKind) extends Primitive // jvm : if{eq, ne, lt, ge, le, gt}, if{null, nonnull} // if_icmp{eq, ne, lt, ge, le, gt}, if_acmp{eq,ne} case class Test(op: TestOp, kind: TypeKind, zero: Boolean) extends Primitive // jvm : lcmp, {f, d}cmp{l, g} case class Comparison(op: ComparisonOp, kind: TypeKind) extends Primitive Impure: {i, l}{div, rem}, otherwise pure // jvm : {i, l, f, d}{add, sub, mul, div, rem} case class Arithmetic(op: ArithmeticOp, kind: TypeKind) extends Primitive Pure (overflow is silent, NaN.toInt is defined): // jvm : {i, l}{and, or, xor} case class Logical(op: LogicalOp, kind: TypeKind) extends Primitive // jvm : {i, l}{shl, ushl, shr} case class Shift(op: ShiftOp, kind: TypeKind) extends Primitive // jvm : i2{l, f, d}, l2{i, f, d}, f2{i, l, d}, d2{i, l, f}, i2{b, c, s} case class Conversion(src: TypeKind, dst: TypeKind) extends Primitive Impure! May NPE! // jvm : arraylength case class ArrayLength(kind: TypeKind) extends Primitive Pure (we know that StringBuilder.{<init>, append, toString} are pure and `append` is null safe.) // jvm : It should call the appropiate 'append' method on StringBuffer case class StringConcat(el: TypeKind) extends Primitive // jvm: it should create a new StringBuffer case object StartConcat extends Primitive // jvm: convert StringBuffer to a String case object EndConcat extends Primitive
Diffstat (limited to 'test/files/run/t8601.flags')
-rw-r--r--test/files/run/t8601.flags1
1 files changed, 1 insertions, 0 deletions
diff --git a/test/files/run/t8601.flags b/test/files/run/t8601.flags
new file mode 100644
index 0000000000..1182725e86
--- /dev/null
+++ b/test/files/run/t8601.flags
@@ -0,0 +1 @@
+-optimize \ No newline at end of file