diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2009-08-26 17:04:17 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2009-08-26 17:04:17 +0000 |
commit | fd58ffc924878e36a9d1dfdd9a8a2f169fd77b97 (patch) | |
tree | be4f7acb4cd330536c2258f6fa69510248f10fab /src | |
parent | 904713e98047f3364aee2c236f87edcc75c44665 (diff) | |
download | scala-fd58ffc924878e36a9d1dfdd9a8a2f169fd77b97.tar.gz scala-fd58ffc924878e36a9d1dfdd9a8a2f169fd77b97.tar.bz2 scala-fd58ffc924878e36a9d1dfdd9a8a2f169fd77b97.zip |
Fixed faulty constant propagation in the optimi...
Fixed faulty constant propagation in the optimizer (#2279)
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala index d83e7341e6..7f5ca3c357 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala @@ -23,7 +23,7 @@ abstract class CopyPropagation { import icodes._ /** Locations can be local variables, this, and fields. */ - abstract sealed class Location; + abstract sealed class Location case class LocalVar(l: Local) extends Location case class Field(r: Record, sym: Symbol) extends Location case object This extends Location @@ -459,11 +459,16 @@ abstract class CopyPropagation { final def cleanReferencesTo(s: copyLattice.State, target: Location) { def cleanRecord(r: Record): Record = { r.bindings retain { (loc, value) => - value match { + (value match { case Deref(loc1) if (loc1 == target) => false case Boxed(loc1) if (loc1 == target) => false case _ => true - } + }) && (target match { + case Field(AllRecords, sym1) => + println(target + " sym1: " + sym1.idString + " loc: " + loc.idString) + !(loc == sym1) + case _ => true + }) } r } @@ -479,8 +484,8 @@ abstract class CopyPropagation { (value match { case Deref(loc1) if (loc1 == target) => false case Boxed(loc1) if (loc1 == target) => false - case Record(_, _) => - cleanRecord(value.asInstanceOf[Record]); + case rec @ Record(_, _) => + cleanRecord(rec); true case _ => true }) && |