go/src/cmd/compile/internal/ssa
Keith Randall 4b00d3f4a2 cmd/compile: implement comparisons directly with memory
Allow the compiler to generate code like CMPQ 16(AX), $7

It's tricky because it's difficult to spill such a comparison during
flagalloc, because the same memory state might not be available at
the restore locations.

Solve this problem by decomposing the compare+load back into its parts
if it needs to be spilled.

The big win is that the write barrier test goes from:

MOVL	runtime.writeBarrier(SB), CX
TESTL	CX, CX
JNE	60

to

CMPL	runtime.writeBarrier(SB), $0
JNE	59

It's one instruction and one byte smaller.

Fixes #19485
Fixes #15245
Update #22460

Binaries are about 0.15% smaller.

Change-Id: I4fd8d1111b6b9924d52f9a0901ca1b2e5cce0836
Reviewed-on: https://go-review.googlesource.com/86035
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ilya Tocar <ilya.tocar@intel.com>
2018-02-26 23:49:44 +00:00
..
gen cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
testdata cmd/compile: reimplement location list generation 2018-02-14 18:29:19 +00:00
bits_bootstrap.go cmd/compile/internal/ssa: use math/bits for register sets 2018-02-14 18:29:22 +00:00
bits_go19.go cmd/compile/internal/ssa: use math/bits for register sets 2018-02-14 18:29:22 +00:00
block.go cmd/compile: adjust Pos setting for "empty" blocks 2017-11-08 22:39:49 +00:00
branchelim.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
branchelim_test.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
cache.go cmd/compile/internal: reuse more memory 2018-02-21 18:10:00 +00:00
check.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
checkbce.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
compile.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
config.go cmd/compile/internal: use sparseSet, optimize isSynthetic 2018-02-21 18:01:22 +00:00
copyelim.go all: remove some double spaces from comments 2017-08-26 15:09:09 +00:00
copyelim_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
critical.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
cse.go cmd/compile/internal/ssa: fix spelling mistake 2017-05-19 05:03:37 +00:00
cse_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
deadcode.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
deadcode_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
deadstore.go cmd/compile: remove Symbol wrappers from Aux fields 2017-09-19 22:03:10 +00:00
deadstore_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
debug.go cmd: avoid unnecessary type conversions 2018-02-26 20:22:06 +00:00
debug_test.go cmd/compile: additional test cleanup 2017-12-21 17:00:39 +00:00
decompose.go cmd/compile: repair name propagation into aggregate parts 2017-11-05 17:30:11 +00:00
dom.go cmd/compile: enhance postorder computation and repair loop finder 2017-04-19 02:57:23 +00:00
dom_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
export_test.go cmd/compile/internal: use sparseSet, optimize isSynthetic 2018-02-21 18:01:22 +00:00
flagalloc.go cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
func.go cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
func_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
fuse.go cmd/compile: reset branch prediction when deleting a branch 2018-02-20 00:56:13 +00:00
fuse_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
html.go cmd/compile: add line numbers to values & blocks in ssa.html 2017-10-11 21:46:20 +00:00
id.go cmd/compile: in a Tarjan algorithm, DFS should really be DFS 2016-04-22 19:21:16 +00:00
layout.go cmd/compile: decouple emitted block order from regalloc block order 2018-02-22 03:02:34 +00:00
lca.go cmd/compile: remove redundant function idom 2016-10-11 16:43:12 +00:00
lca_test.go cmd/compile: clean up SSA test API 2017-03-19 05:37:39 +00:00
likelyadjust.go cmd/compile: make loop finder more aware of irreducible loops 2017-10-05 18:49:10 +00:00
location.go cmd/compile: rename SSA Register.Name to Register.String 2017-08-17 21:53:08 +00:00
loop_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
loopbce.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
loopreschedchecks.go all: fix misspellings 2018-02-20 21:02:58 +00:00
looprotate.go cmd/compile: make loop finder more aware of irreducible loops 2017-10-05 18:49:10 +00:00
lower.go cmd/compile: make ssa compilation unconditional 2016-09-14 17:38:04 +00:00
magic.go cmd/compile: move constant divide strength reduction to SSA rules 2017-02-17 06:16:44 +00:00
magic_test.go cmd/compile: move constant divide strength reduction to SSA rules 2017-02-17 06:16:44 +00:00
nilcheck.go cmd/compile: fix spelling mistake 2017-09-29 20:54:55 +00:00
nilcheck_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
op.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
opGen.go cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
opt.go cmd/compile: repair name propagation into aggregate parts 2017-11-05 17:30:11 +00:00
passbm_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
phielim.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
phiopt.go Revert "cmd/compile: add Type.MustSize and Type.MustAlignment" 2017-04-28 01:24:13 +00:00
print.go cmd/compile: rename SSA Register.Name to Register.String 2017-08-17 21:53:08 +00:00
prove.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
redblack32.go cmd/compile: remove some redundant types in decls 2017-09-17 09:51:38 +00:00
redblack32_test.go cmd/compile: use sparse algorithm for phis in large program 2016-05-16 21:08:05 +00:00
regalloc.go cmd/compile: decouple emitted block order from regalloc block order 2018-02-22 03:02:34 +00:00
regalloc_test.go cmd/compile: test for moving spills 2017-05-24 21:36:06 +00:00
rewrite.go cmd/compile/internal/amd64: use appropriate NEG for div 2018-02-26 20:09:21 +00:00
rewrite386.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
rewrite_test.go cmd/compile/internal/ssa: inline memmove with known size 2017-11-02 20:30:25 +00:00
rewriteAMD64.go cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
rewriteARM.go cmd: avoid unnecessary type conversions 2018-02-26 20:22:06 +00:00
rewriteARM64.go cmd: avoid unnecessary type conversions 2018-02-26 20:22:06 +00:00
rewritedec.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
rewritedec64.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
rewritegeneric.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
rewriteMIPS.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
rewriteMIPS64.go cmd: avoid unnecessary type conversions 2018-02-26 20:22:06 +00:00
rewritePPC64.go cmd: avoid unnecessary type conversions 2018-02-26 20:22:06 +00:00
rewriteS390X.go cmd/compile: normalize spaces in rewrite rule comments. 2018-02-20 18:14:38 +00:00
schedule.go cmd/compile: implement comparisons directly with memory 2018-02-26 23:49:44 +00:00
schedule_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
shift_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
shortcircuit.go cmd/compile: lazily create true and false Values in shortcircuit 2017-04-24 00:58:27 +00:00
shortcircuit_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
sizeof_test.go [dev.debug] cmd/compile: track variable decomposition in LocalSlot 2017-07-26 18:39:39 +00:00
softfloat.go cmd/compile: use soft-float routines for soft-float targets 2017-11-30 17:37:37 +00:00
sparsemap.go [dev.inline] cmd/internal/src: introduce compact source position representation 2017-01-09 22:43:22 +00:00
sparseset.go cmd/compile: reduce element size of arrays in sparse{map,set} 2016-05-18 14:05:14 +00:00
sparsetree.go cmd/compile: fix phi-function updates for preemptible loops 2017-07-14 15:54:13 +00:00
sparsetreemap.go cmd/compile: remove redundant function idom 2016-10-11 16:43:12 +00:00
stackalloc.go cmd/compile: don't let spills clobber arguments 2018-01-23 21:51:55 +00:00
stackframe.go cmd/compile: move Frontend field from ssa.Config to ssa.Func 2017-03-17 23:18:57 +00:00
tighten.go cmd/compile: clean up ssa.Value memory arg usage 2017-03-09 21:40:47 +00:00
TODO cmd/compile/internal/ssa: use Compare instead of Equal 2016-04-17 04:50:45 +00:00
trim.go all: remove some unused result params 2017-08-28 06:52:55 +00:00
value.go cmd/compile/internal/ssa: emit csel on arm64 2018-02-20 06:00:54 +00:00
writebarrier.go runtime: remove legacy eager write barrier 2018-02-13 16:34:46 +00:00
writebarrier_test.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
zcse.go cmd/compile: change ssa.Type into *types.Type 2017-05-09 23:01:51 +00:00
zeroextension_test.go cmd/compile/internal/amd64: use appropriate NEG for div 2018-02-26 20:09:21 +00:00