Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't allocate Val.Zero for reference types #683

Merged
merged 2 commits into from May 1, 2017

Conversation

densh
Copy link
Member

@densh densh commented Apr 28, 2017

No description provided.

@densh
Copy link
Member Author

densh commented Apr 28, 2017

Note: this change does change the NIR but doesn't affect the binary representation.

case Type.Ptr | _: Type.RefKind => Val.Null
case _ => Val.Zero(ty)
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Binary compatibility hacks are the best.

@densh
Copy link
Member Author

densh commented Apr 28, 2017

This considerably improves linking performance on 1G heaps. As discovered by @xuwei-k in https://twitter.com/xuwei_k/status/857620328624701440.

@xuwei-k
Copy link
Contributor

xuwei-k commented Apr 28, 2017

git clone -b scala-native https://github.com/scalaprops/scalaprops
cd scalaprops
sbt nativeTest/run
[info] Compiling 101 Scala sources to /home/travis/build/scalaprops/scalaprops/nativeTest/target/scala-2.11/classes...
[info] Linking (7498 ms)
[info] Discovered 7661 classes and 43896 methods
[info] Optimizing (78139 ms)
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:192)
	at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:188)
	at sbt.Execute.next$1(Execute.scala:85)
	at sbt.Execute.processAll(Execute.scala:88)
	at sbt.Execute.runKeep(Execute.scala:68)
	at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:359)
	at sbt.EvaluateTask$.run$1(EvaluateTask.scala:358)
	at sbt.EvaluateTask$.runTask(EvaluateTask.scala:378)
	at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:69)
	at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:67)
	at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:314)
	at sbt.Aggregation$.timedRun(Aggregation.scala:67)
	at sbt.Aggregation$.runTasks(Aggregation.scala:76)
	at sbt.Aggregation$$anonfun$applyDynamicTasks$1.apply(Aggregation.scala:117)
	at sbt.Aggregation$$anonfun$applyDynamicTasks$1.apply(Aggregation.scala:115)
	at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
	at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
	at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:253)
	at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:250)
	at sbt.Command$.process(Command.scala:93)
	at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
	at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
	at sbt.State$$anon$1.doX$1(State.scala:183)
	at sbt.State$$anon$1.process(State.scala:190)
	at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
	at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
	at sbt.MainLoop$.next(MainLoop.scala:96)
	at sbt.MainLoop$.run(MainLoop.scala:89)
	at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:68)
	at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:63)
	at sbt.Using.apply(Using.scala:24)
	at sbt.MainLoop$.runWithNewLog(MainLoop.scala:63)
	at sbt.MainLoop$.runAndClearLast(MainLoop.scala:46)
	at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:30)
	at sbt.MainLoop$.runLogged(MainLoop.scala:22)
	at sbt.StandardMain$.runManaged(Main.scala:109)
	at sbt.xMain.run(Main.scala:38)
	at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
	at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
	at xsbt.boot.Launch$.run(Launch.scala:109)
	at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
	at xsbt.boot.Launch$.launch(Launch.scala:117)
	at xsbt.boot.Launch$.apply(Launch.scala:18)
	at xsbt.boot.Boot$.runImpl(Boot.scala:41)
	at xsbt.boot.Boot$.main(Boot.scala:17)
	at xsbt.boot.Boot.main(Boot.scala)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
	at java.lang.StringCoding.encode(StringCoding.java:344)
	at java.lang.String.getBytes(String.java:918)
	at scala.scalanative.codegen.CodeGen$Impl.gen(CodeGen.scala:79)
	at scala.scalanative.codegen.CodeGen$$anonfun$apply$1$$anonfun$debug$1$2.apply(CodeGen.scala:43)
	at scala.scalanative.codegen.CodeGen$$anonfun$apply$1$$anonfun$debug$1$2.apply(CodeGen.scala:38)
	at scala.collection.Iterator$class.foreach(Iterator.scala:727)
	at scala.collection.parallel.mutable.ParHashTable$EntryIterator.foreach(ParHashTable.scala:31)
	at scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:975)
	at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:54)
	at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
	at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
	at scala.collection.parallel.Task$class.tryLeaf(Tasks.scala:56)
	at scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:972)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.internal(Tasks.scala:183)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:514)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.compute(Tasks.scala:162)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:514)
	at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:160)
	at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
	at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
	at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
	at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space

@xuwei-k
Copy link
Contributor

xuwei-k commented Apr 28, 2017

when succeeded (-Xmx8G)

$ ll -h nativeTest/target/scala-2.11/nativetest-out 
-rwxr-xr-x  1 kenji   174M Apr 28 23:46 nativeTest/target/scala-2.11/nativetest-out
$ ll -hS nativeTest/target/scala-2.11/native/ | head
total 1486560
-rw-r--r--   1 kenji   413M Apr 28 23:46 __dispatch.ll
-rw-r--r--   1 kenji   156M Apr 28 23:46 __dispatch.ll.o
-rw-r--r--   1 kenji    56M Apr 28 23:45 __class_has_trait.ll
-rw-r--r--   1 kenji    26M Apr 28 23:45 scalaz.ll
-rw-r--r--   1 kenji    11M Apr 28 23:45 scalaprops.ll
-rw-r--r--   1 kenji   7.4M Apr 28 23:45 __const.ll
-rw-r--r--   1 kenji   7.2M Apr 28 23:45 __trait_has_trait.ll
-rw-r--r--   1 kenji   6.9M Apr 28 23:46 scalaz.ll.o
-rw-r--r--   1 kenji   5.6M Apr 28 23:46 __class_has_trait.ll.o

@densh
Copy link
Member Author

densh commented Apr 28, 2017

-rw-r--r-- 1 kenji 413M Apr 28 23:46 __dispatch.ll
-rw-r--r-- 1 kenji 156M Apr 28 23:46 __dispatch.ll.o

This looks like #180 strikes again, thanks for the detailed reproduction information, @xuwei-k !

@densh densh merged commit 804df93 into scala-native:master May 1, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants