Skip to content

Commit 1bddd2e

Browse files
committed
cmd/compile: don't shuffle rematerializeable values around
Better to just rematerialize them when needed instead of cross-register spilling or other techniques for keeping them in registers. This helps for amd64 code that does 1 << x. It is better to do loop: MOVQ $1, AX // materialize arg to SLLQ SLLQ CX, AX ... goto loop than to do MOVQ $1, AX // materialize outsize of loop loop: MOVQ AX, DX // save value that's about to be clobbered SLLQ CX, AX MOVQ DX, AX // move it back to the correct register goto loop Update #16092 Change-Id: If7ac290208f513061ebb0736e8a79dcb0ba338c0 Reviewed-on: https://go-review.googlesource.com/30471 TryBot-Result: Gobot Gobot <[email protected]> Run-TryBot: Keith Randall <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent e5421e2 commit 1bddd2e

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/cmd/compile/internal/ssa/regalloc.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ func (s *regAllocState) allocReg(mask regMask, v *Value) register {
389389
// We generate a Copy and record it. It will be deleted if never used.
390390
v2 := s.regs[r].v
391391
m := s.compatRegs(v2.Type) &^ s.used &^ s.tmpused &^ (regMask(1) << r)
392-
if countRegs(s.values[v2.ID].regs) == 1 && m != 0 {
392+
if m != 0 && !s.values[v2.ID].rematerializeable && countRegs(s.values[v2.ID].regs) == 1 {
393393
r2 := pickReg(m)
394394
c := s.curBlock.NewValue1(v2.Line, OpCopy, v2.Type, s.regs[r].c)
395395
s.copies[c] = false
@@ -1146,6 +1146,10 @@ func (s *regAllocState) regalloc(f *Func) {
11461146
// arg0 is dead. We can clobber its register.
11471147
goto ok
11481148
}
1149+
if s.values[v.Args[0].ID].rematerializeable {
1150+
// We can rematerialize the input, don't worry about clobbering it.
1151+
goto ok
1152+
}
11491153
if countRegs(s.values[v.Args[0].ID].regs) >= 2 {
11501154
// we have at least 2 copies of arg0. We can afford to clobber one.
11511155
goto ok
@@ -1155,6 +1159,10 @@ func (s *regAllocState) regalloc(f *Func) {
11551159
args[0], args[1] = args[1], args[0]
11561160
goto ok
11571161
}
1162+
if s.values[v.Args[1].ID].rematerializeable {
1163+
args[0], args[1] = args[1], args[0]
1164+
goto ok
1165+
}
11581166
if countRegs(s.values[v.Args[1].ID].regs) >= 2 {
11591167
args[0], args[1] = args[1], args[0]
11601168
goto ok
@@ -1389,6 +1397,9 @@ func (s *regAllocState) regalloc(f *Func) {
13891397
if vi.regs != 0 {
13901398
continue
13911399
}
1400+
if vi.rematerializeable {
1401+
continue
1402+
}
13921403
v := s.orig[vid]
13931404
if s.f.Config.use387 && v.Type.IsFloat() {
13941405
continue // 387 can't handle floats in registers between blocks

0 commit comments

Comments
 (0)