diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2008-11-06 17:26:52 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2008-11-06 17:26:52 +0000 |
commit | 7e736ed0a8109f00d721cb1a78152c91ef133b2d (patch) | |
tree | bc29db92f2615a58d8ed7d6c18dbc84eb8fcdc8e /src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala | |
parent | 67935e969fb3315e209b52600bbafff97598a20e (diff) | |
download | scala-7e736ed0a8109f00d721cb1a78152c91ef133b2d.tar.gz scala-7e736ed0a8109f00d721cb1a78152c91ef133b2d.tar.bz2 scala-7e736ed0a8109f00d721cb1a78152c91ef133b2d.zip |
Fixed optimiser bugs, now all tests pass when u...
Fixed optimiser bugs, now all tests pass when using the optimised
compiler.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala | 23 |
1 files changed, 20 insertions, 3 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 44b56dac79..9b9b58c39b 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala @@ -499,12 +499,29 @@ abstract class CopyPropagation { var values = in.stack.take(1 + ctor.info.paramTypes.length).reverse.drop(1); val bindings = new HashMap[Symbol, Value]; - if (settings.debug.value) log("getBindings for: " + ctor) + if (settings.debug.value) log("getBindings for: " + ctor + " acc: " + paramAccessors) + + var paramTypes = ctor.tpe.paramTypes + val diff = paramTypes.length - paramAccessors.length + diff match { + case 0 => () + case 1 if ctor.tpe.paramTypes.head == ctor.owner.rawowner.tpe => + // it's an unused outer + log("considering unused outer at position 0 in " + ctor.tpe.paramTypes) + paramTypes = paramTypes.tail + values = values.tail + case _ => + log("giving up on " + ctor + "(diff: " + diff + ")") + return bindings + } + // this relies on having the same order in paramAccessors and // the arguments on the stack. It should be the same! for ((p, i) <- paramAccessors.zipWithIndex) { -// assert(p.tpe == ctor.tpe.paramTypes(i), "In: " + ctor.fullNameString + " having: " + (paramAccessors map (_.tpe))+ " vs. " + ctor.tpe.paramTypes) - if (p.tpe == ctor.tpe.paramTypes(i)) +// assert(p.tpe == paramTypes(i), "In: " + ctor.fullNameString +// + " having acc: " + (paramAccessors map (_.tpe))+ " vs. params" + paramTypes +// + "\n\t failed at pos " + i + " with " + p.tpe + " == " + paramTypes(i)) + if (p.tpe == paramTypes(i)) bindings += (p -> values.head); values = values.tail; } |