Josh Bleecher Snyder 77a2113925 cmd/gc: evaluate concrete == interface without allocating
Consider an interface value i of type I and concrete value c of type C.

Prior to this CL, i==c was evaluated as
	I(c) == i

Evaluating I(c) can allocate.

This CL changes the evaluation of i==c to
	x, ok := i.(C); ok && x == c

The new generated code is shorter and does not allocate directly.

If C is small, as it is in every instance in the stdlib,
the new code also uses less stack space
and makes one runtime call instead of two.

If C is very large, the original implementation is used.
The cutoff for "very large" is 1<<16,
following the stack vs heap cutoff used elsewhere.

This kind of comparison occurs in 38 places in the stdlib,
mostly in the net and os packages.

benchmark                     old ns/op     new ns/op     delta
BenchmarkEqEfaceConcrete      29.5          7.92          -73.15%
BenchmarkEqIfaceConcrete      32.1          7.90          -75.39%
BenchmarkNeEfaceConcrete      29.9          7.90          -73.58%
BenchmarkNeIfaceConcrete      35.9          7.90          -77.99%

Fixes #9370.

Change-Id: I7c4555950bcd6406ee5c613be1f2128da2c9a2b7
Reviewed-on: https://go-review.googlesource.com/2096
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
2015-02-12 22:23:38 +00:00
..
2014-07-16 19:27:10 -04:00
2012-02-25 08:47:04 +11:00
2013-12-12 17:18:12 -08:00
2012-11-08 09:04:27 -08:00
2012-09-10 13:03:07 -07:00
2012-09-10 13:03:07 -07:00
2012-09-24 00:06:41 -04:00
2012-02-16 23:48:57 -05:00
2015-01-29 13:07:30 +00:00
2012-07-01 21:59:50 +04:00
2013-12-12 17:18:12 -08:00
2012-09-28 08:30:30 -07:00
2013-06-26 18:05:02 +02:00
2012-09-28 08:30:30 -07:00
2012-10-07 21:52:57 +02:00
2012-02-24 13:17:26 +11:00
2012-02-19 14:28:53 +11:00
2012-02-18 21:18:13 -08:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-09-24 15:53:12 -04:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2013-12-12 17:18:12 -08:00
2013-12-12 17:18:12 -08:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-19 14:28:53 +11:00
2012-02-24 13:17:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-29 15:28:36 -05:00
2012-02-23 18:47:26 +11:00
2012-11-07 12:33:54 -08:00
2012-11-07 12:33:54 -08:00
2012-11-07 12:33:54 -08:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2015-01-08 20:34:56 +00:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2014-11-06 15:14:08 -05:00
2012-02-23 18:47:26 +11:00
2012-06-07 03:06:40 -04:00
2014-10-27 18:59:02 -04:00
2012-02-23 18:47:26 +11:00
2012-02-23 18:47:26 +11:00
2013-03-20 17:11:09 -04:00
2013-02-11 18:20:52 -05:00
2012-02-21 22:54:07 -05:00
2014-12-05 19:13:20 -05:00
2013-09-05 23:06:34 -04:00
2012-11-08 09:04:27 -08:00
2012-02-24 10:30:39 +11:00
2012-02-24 10:30:39 +11:00
2012-02-24 13:17:26 +11:00
2014-07-16 19:27:10 -04:00
2012-02-16 23:51:04 -05:00
2012-02-16 23:51:04 -05:00
2014-10-22 08:06:15 -07:00
2013-02-11 18:20:52 -05:00
2012-02-24 10:30:39 +11:00
2012-02-24 10:30:39 +11:00
2012-02-24 11:48:19 +11:00
2014-01-29 09:28:23 +01:00
2012-02-24 11:48:19 +11:00
2014-11-09 21:10:49 -05:00
2014-11-06 15:14:08 -05:00
2013-06-02 19:10:11 +02:00
2013-12-12 17:18:12 -08:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00
2012-02-24 11:48:19 +11:00