aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/expand_calls.go
diff options
context:
space:
mode:
authorKatie Hockman <katie@golang.org>2021-09-20 15:45:51 -0400
committerKatie Hockman <katie@golang.org>2021-09-20 15:46:10 -0400
commitc6c884be3854f3c94f1ee93a273544c9c5c35df5 (patch)
tree12e3ece09595d359f9edc99025c3f3192aea2213 /src/cmd/compile/internal/ssa/expand_calls.go
parent51ca5706ab2074a624f8a2590a2a81e6a5821e48 (diff)
parentaf72ddfcd7826df9aefb2207b8ac270bb91fea2f (diff)
downloadgo-c6c884be3854f3c94f1ee93a273544c9c5c35df5.tar.gz
go-c6c884be3854f3c94f1ee93a273544c9c5c35df5.zip
[dev.fuzz] all: merge master (af72ddf) into dev.fuzz
This now includes the fix in CL 350729, which means we no longer need to skip the test in dev.fuzz. Conflicts: - src/cmd/compile/internal/noder/unified_test.go Merge List: + 2021-09-20 af72ddfcd7 cmd/compile: extend dump-to-file to handle "genssa" (asm) case. + 2021-09-20 3c764babe7 cmd/go: write go.mod requirements more consistently for go 1.17+ + 2021-09-20 6268468e02 cmd/link: generate DIE for types referenced only through dictionaries + 2021-09-20 6acac8b685 cmd/compile: delay all transforms for generic funcs/methods + 2021-09-20 988f18d61d go/types: export Named._Orig as Named.Origin + 2021-09-20 b6dddaccd7 cmd/compile: fix transform.AssignOp to deal with tricky case + 2021-09-20 9e60c37147 cmd/compile: document register-based ABI for ppc64 + 2021-09-20 79159f2e83 cmd/compile: fix simplification rules on arm/arm64 + 2021-09-20 eff27e858b cmd/compile: ensure constant shift amounts are in range for arm + 2021-09-20 9ebe7c8ec6 go/test: add a test for issue 48344 + 2021-09-20 6f35430faa cmd/compile: allow rotates to be merged with logical ops on arm64 + 2021-09-20 2d9b486420 cmd/compile: update doc at top of iexport.go on the changes for typeparams + 2021-09-20 a81b0dc6ee cmd/compile: rename instType -> instanceType + 2021-09-20 119213566a cmd/cgo: remove hardcoded '-pie' ldflag for linux/arm + 2021-09-20 a83a558733 cmd/compile: fix export/import of range loop. + 2021-09-19 315dbd10c9 cmd/compile: fold double negate on arm64 + 2021-09-19 83b36ffb10 cmd/compile: implement constant rotates on arm64 + 2021-09-19 771b8ea4f4 cmd/compile: fix missing markHiddenClosureDead in deadcode pass + 2021-09-18 c894b442d1 net/rpc: remove warnings on incompatible methods at registration + 2021-09-17 4b654c0eec cmd/compile: SSA ".this" variable + 2021-09-17 f01721efb9 cmd/compile: remove self copies in tail-call wrappers + 2021-09-17 163871feb1 time: re-add space-padded day of year to docs + 2021-09-17 ac7c34767d time: support fractional timezone minutes in MarshalBinary + 2021-09-17 07b30a4f77 cmd/compile: delay transformAssign if lhs/rhs have typeparam + 2021-09-17 c10b980220 cmd/compile: restore tail call for method wrappers + 2021-09-17 50e4508269 cmd/compile: fix import/export of Init and Def fields. + 2021-09-17 3fa35b5f97 go/types: ensure that we always get a new signature in expandNamed + 2021-09-17 3fa7dbeff5 cmd/go: fix GOARCH value in GOAMD64 docs + 2021-09-17 974b0166d6 syscall: implement Pipe using pipe2 syscall on all linux platforms + 2021-09-17 1a49dcb82f syscall: remove //sysnb comment generating Setreuid for linux/arm64 + 2021-09-17 cea7a71d40 cmd/compile: fix generic type handling in crawler + 2021-09-17 74e384f50d internal/poll: inject a hook into the runtime finalizer to count the closed pipes + 2021-09-17 323c6f74d3 log: don't format if writing to io.Discard + 2021-09-17 7f36ef0aff cmd/compile/internal/noder: hide TestUnifiedCompare behind -cmp flag + 2021-09-17 70493b3eb0 runtime/cgo: save and restore X3 (aka GP) for crosscall1 on riscv64 + 2021-09-17 6d02ce8584 runtime: fix prettyprinting of parametric types in gdb + 2021-09-17 6602c86a38 cmd/internal/obj/riscv: improve instruction validation + 2021-09-17 14e812bfc5 syscall: do not use handle lists on windows when NoInheritHandles is true + 2021-09-16 8d2a9c32a2 all: remove incorrectly repeated words in comments + 2021-09-16 af9da137a9 A+C: update name to real name and add to AUTHORS + 2021-09-16 265b59aefd cmd/cgo: for godefs, don't let field prefix removal cause duplicates + 2021-09-16 4efdaa7bc7 testing: skip panics when picking the line number for decoration + 2021-09-16 e09dcc211a go/types, types2: add an additional shift test case + 2021-09-16 5402b4376c spec: fix incorrect type in a shift example + 2021-09-16 d09e09bc61 cmd/compile: fixing writebarrier.go for -G=3 + 2021-09-16 bcdc61d830 cmd/compile: preserve statements better in expandCalls + 2021-09-16 48e2b1ea91 cmd/compile: fix LocResults formatting + 2021-09-16 b1bedc0774 cmd/go: add GOAMD64 environment variable + 2021-09-16 04f5116c98 cmd/go: clean paths before checking same directory + 2021-09-16 e7dbe3908e cmd/cgo: add missing tab in exports for a result of void + 2021-09-15 cfa233d76b cmd/compile: remove unneeded early transforms, with dictionary change + 2021-09-15 59a9a035ff cmd/compile: switch to computing dict format on instantiated functions + 2021-09-15 0edc6c4fa0 cmd/internal/obj/ppc64: generate prologue code compatible with new ABI + 2021-09-15 03df68d3c3 runtime: fix setting of cpu features for amd64 + 2021-09-15 6196979365 cmd/go/internal/modload: prevent tidy downgrading disambiguating modules + 2021-09-15 72bb8185b5 cmd/compile: emit DWARF info about dictionary entries + 2021-09-15 5b48fca1fa cmd/compile: mark wrapper functions with DW_AT_trampoline + 2021-09-15 e4dfd788e6 go/internal/gcimporter,cmd/compile: minor clean-up in iimport.go + 2021-09-15 4847c47cb8 cmd/compile/internal/types2: eliminate Named.instPos + 2021-09-15 3100f54f20 cmd/compile/internal/types2: merge Named type loading and expansion + 2021-09-15 738cebb174 cmd/compile/internal/types2: implement Identical for *Union types + 2021-09-15 b26d325cb1 cmd/compile/internal/types2: remove some unnecessary loading/expansion of Named types + 2021-09-15 9fc28892cb cmd/compile/internal/types2: export TypeHash, return value without blanks + 2021-09-15 2da3375e9b runtime: in adjustTimers back up as far as necessary + 2021-09-15 c7f2f51fed cmd/go: remove subcommand prefix from error messages + 2021-09-15 0bb40b08c4 go/types: implement Identical for *Union types + 2021-09-15 cb4e1de021 go/types: minor cleanup of instantiation + 2021-09-15 a0f3129466 go/types: instantiate methods when instantiating Named types + 2021-09-14 bf26e43d0f go/types: eliminate Named.instPos + 2021-09-14 2933c451a0 go/types: merge Named type loading and expansion + 2021-09-14 137543bb93 cmd/compile: set IsShape based on type being in the Shapes pkg + 2021-09-14 3a72175cdc cmd/compile: fix test/typeparam/mdempsky/4.go for -G=3 + 2021-09-14 b2c04f0d48 runtime: avoid loop variable capture in test + 2021-09-14 181e8cde30 go/internal/gcimporter: remove outdated comment + 2021-09-14 8699425b55 syscall: remove use of IN_KUBERNETES in test + 2021-09-14 b3c6de9dcd cmd/internal/obj/ppc64: allow VR register arguments to VS registers + 2021-09-14 ee91bb8319 cmd/compile: prevent typecheck importer reading type parameter twice + 2021-09-14 2953cd0083 go/internal/gcimporter: prevent importReader reading type parameter twice + 2021-09-14 b8c802b116 cmd/compile: prevent importReader reading type parameter twice + 2021-09-14 4a4221e818 all: remove some unused code + 2021-09-14 71adc658de runtime: change time.now to ABIInternal + 2021-09-14 146e8d4994 reflect: use Value.Len instead of conversion to slice header + 2021-09-13 9a58aa267e spec: fix prose about terminating statements + 2021-09-13 42057e9848 cmd/compile: save the note of fields when translating struct + 2021-09-13 960d036f8f cmd/go: add missing parenthesis in a call to "PrintVersion" + 2021-09-13 81a4fe6fd2 cmd/link/internal/ld: re-enable DWARF tests on solaris/illumos + 2021-09-13 f93a63addb reflect: add a floating point section to DeepEqual tests + 2021-09-13 a0c409cbc8 reflect: add fast paths for common, simple Kinds to DeepEqual + 2021-09-13 ac40c9872f reflect: fix _faststr optimization + 2021-09-13 c8a58f29dc cmd/go: add test to check for a potential workspace loading issue + 2021-09-13 e74e363a6b strings: add Clone function + 2021-09-13 bced369a50 cmd/link: minor code cleanup in dwarf gen + 2021-09-13 c3b217a0e5 cmd/go: document 'go install cmd@version' ignores vendor directories + 2021-09-12 ad97d204f0 go/types: remove some unnecessary loading/expansion of Named types + 2021-09-12 0d8a4bfc96 bufio: add Writer.AvailableBuffer + 2021-09-11 23832ba2e2 reflect: optimize for maps with string keys + 2021-09-11 a50225a0dc bufio: make Reader.Reset and Writer.Reset work on the zero value + 2021-09-10 cf2fe5d6f1 doc/asm: fix HTML markup + 2021-09-10 1bf2cd1291 debug/elf: retain original error message when getSymbols fails. + 2021-09-10 5a4b9f9494 time: reference -tags=timetzdata in testing panic + 2021-09-10 025308fe08 testing: increase alternation precedence + 2021-09-10 5a94a90d84 cmd/compile/internal/types2: better error message for invalid array decls + 2021-09-10 da1aa65053 cmd/compile/internal/syntax: correct follow token for type parameter lists + 2021-09-10 96ab854ab0 cmd/compile/internal: better AST line highlight in ssa.html + 2021-09-10 90c5660616 embed: guarantee the returned file of FS.Open implements io.Seeker + 2021-09-10 c69f5c0d76 cmd/compile: add support for Abs and Copysign intrinsics on riscv64 + 2021-09-10 2091bd3f26 cmd/compile: simiplify arm64 bitfield optimizations + 2021-09-09 b32209d22d cmd/compile: fix test case for unified IR (fix build) + 2021-09-09 1a708bcf1d cmd/compile: don't crash while reporting invalid alias cycle + 2021-09-09 426ff3746f cmd/cgo, runtime/cgo: avoid GCC/clang conversion warnings + 2021-09-09 73483df406 cmd/compile/internal/syntax: better error message for missing type constraint + 2021-09-09 e1c3f2158f time: propagate "," separator for fractional seconds into Format + 2021-09-09 c981874a5a cmd/compile: fix implement for closure in a global assignment + 2021-09-09 2c4f389c02 cmd/link: enable internal linker in more cases for ppc64le + 2021-09-09 fb84e99eb7 test: add compiler regress tests for #46461 + 2021-09-09 b9e1a24581 cmd/compile: fix case where init info of OAS node is dropped + 2021-09-09 f9271e4f85 go/types, types2: rename RParams -> RecvTypeParams + 2021-09-09 ea434450c2 reflect: add hooks for dealing with narrow width floats + 2021-09-09 a53e3d5f88 net: deprecate (net.Error).Temporary + 2021-09-09 19457a58e5 cmd/compile: stenciled conversions might be NOPs + 2021-09-09 a295b3cec8 test: re-enable AsmCheck tests for types2-based frontends + 2021-09-09 66f0d35f71 go/types: reduce number of delayed functions + 2021-09-09 d2a77f1c76 go/types: handle recursive type parameter constraints + 2021-09-09 9e1eea6f8b go/types: detect constraint type inference cycles + 2021-09-09 b86e8dd0f3 test/typeparam: fix issue48094b test build + 2021-09-09 c84f3a4004 syscall: drop fallback to pipe in Pipe on linux/arm + 2021-09-09 376a079762 cmd/compile: fix unified IR panic when expanding nested inline function + 2021-09-09 6edc57983a internal/poll: report open fds when TestSplicePipePool fails + 2021-09-09 2481f6e367 cmd/compile: fix wrong instantiated type for embedded receiver + 2021-09-09 d62866ef79 cmd/compile: move checkptr alignment to SSA generation + 2021-09-09 8fad81cd62 cmd/compile: fold handling OCONV logic to separate function + 2021-09-09 9cbc76bdf9 cmd/internal/obj/arm64: add checks for incorrect use of REGTMP register + 2021-09-09 42563f89d7 cmd/compile: remove 'ext' fields from unified IR reader/writer types + 2021-09-09 4c52eac49b cmd/compile: simplify value coding for unified IR + 2021-09-09 e30a09013b cmd/compile: extrapolate $GOROOT in unified IR + 2021-09-08 a1f6208e56 go/types, types2: add Environment to Config + 2021-09-08 f5f8a911d8 cmd/compile/internal/types2: spell out 'Type' in type parameter APIs + 2021-09-08 bff39cf6cb cmd/compile: add automated rewrite cycle detection + 2021-09-08 b61e1ed863 cmd/compile/internal/types2: temporarily pin the Checker to Interface during checking + 2021-09-08 47f3e1e02c cmd/compile/internal/types2: move NewTypeParam off of Checker + 2021-09-08 ccc927b8f6 cmd/compile/internal/types2: move typeHash to environment.go + 2021-09-08 30e9bfbcef cmd/compile/internal/types2: implement deduplication of instances using the Environment + 2021-09-08 0406d3a8e5 go/ast: rename MultiIndexExpr to IndexListExpr Change-Id: I7f917d45b0507c122c212305144b0b455618ff54
Diffstat (limited to 'src/cmd/compile/internal/ssa/expand_calls.go')
-rw-r--r--src/cmd/compile/internal/ssa/expand_calls.go124
1 files changed, 83 insertions, 41 deletions
diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go
index b37d3b8c9c..a0f0e653aa 100644
--- a/src/cmd/compile/internal/ssa/expand_calls.go
+++ b/src/cmd/compile/internal/ssa/expand_calls.go
@@ -176,7 +176,7 @@ func (c *registerCursor) hasRegs() bool {
type expandState struct {
f *Func
abi1 *abi.ABIConfig
- debug bool
+ debug int // odd values log lost statement markers, so likely settings are 1 (stmts), 2 (expansion), and 3 (both)
canSSAType func(*types.Type) bool
regSize int64
sp *Value
@@ -302,7 +302,7 @@ func (x *expandState) Printf(format string, a ...interface{}) (n int, err error)
//
// TODO when registers really arrive, must also decompose anything split across two registers or registers and memory.
func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64, regOffset Abi1RO) []*LocalSlot {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("rewriteSelect(%s; %s; memOff=%d; regOff=%d)\n", leaf.LongString(), selector.LongString(), offset, regOffset)
@@ -325,7 +325,7 @@ func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64,
} else {
x.f.Fatalf("Unexpected %s type, selector=%s, leaf=%s\n", selector.Op.String(), selector.LongString(), leaf.LongString())
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("---%s, break\n", selector.Op.String())
}
case OpArg:
@@ -335,7 +335,7 @@ func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64,
} else {
x.f.Fatalf("Unexpected OpArg type, selector=%s, leaf=%s\n", selector.LongString(), leaf.LongString())
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("---OpArg, break\n")
}
break
@@ -381,7 +381,7 @@ func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64,
// This case removes that StructSelect.
if leafType != selector.Type {
if x.f.Config.SoftFloat && selector.Type.IsFloat() {
- if x.debug {
+ if x.debug > 1 {
x.Printf("---OpLoad, break\n")
}
break // softfloat pass will take care of that
@@ -468,7 +468,7 @@ func (x *expandState) rewriteSelect(leaf *Value, selector *Value, offset int64,
} else {
w := call.Block.NewValue2(leaf.Pos, OpLoad, leafType, off, call)
leaf.copyOf(w)
- if x.debug {
+ if x.debug > 1 {
x.Printf("---new %s\n", w.LongString())
}
}
@@ -687,7 +687,7 @@ func (x *expandState) decomposeArg(pos src.XPos, b *Block, source, mem *Value, t
panic(fmt.Errorf("offset %d of requested register %d should be zero, source=%s", offs[loadRegOffset], loadRegOffset, source.LongString()))
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("decompose arg %s has %d locs\n", source.LongString(), len(locs))
}
@@ -836,7 +836,7 @@ func (x *expandState) decomposeLoad(pos src.XPos, b *Block, source, mem *Value,
// pos and b locate the store instruction, source is the "base" of the value input,
// mem is the input mem, t is the type in question, and offArg and offStore are the offsets from the respective bases.
func storeOneArg(x *expandState, pos src.XPos, b *Block, locs []*LocalSlot, suffix string, source, mem *Value, t *types.Type, argOffset, storeOffset int64, loadRegOffset Abi1RO, storeRc registerCursor) *Value {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("storeOneArg(%s; %s; %s; aO=%d; sO=%d; lrO=%d; %s)\n", source.LongString(), mem.String(), t.String(), argOffset, storeOffset, loadRegOffset, storeRc.String())
@@ -877,7 +877,7 @@ func storeTwoLoad(x *expandState, pos src.XPos, b *Block, source, mem *Value, t1
// stores of non-aggregate types. It recursively walks up a chain of selectors until it reaches a Load or an Arg.
// If it does not reach a Load or an Arg, nothing happens; this allows a little freedom in phase ordering.
func (x *expandState) storeArgOrLoad(pos src.XPos, b *Block, source, mem *Value, t *types.Type, storeOffset int64, loadRegOffset Abi1RO, storeRc registerCursor) *Value {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("storeArgOrLoad(%s; %s; %s; %d; %s)\n", source.LongString(), mem.String(), t.String(), storeOffset, storeRc.String())
@@ -1060,7 +1060,7 @@ func (x *expandState) storeArgOrLoad(pos src.XPos, b *Block, source, mem *Value,
dst := x.offsetFrom(b, storeRc.storeDest, storeOffset, types.NewPtr(t))
s = b.NewValue3A(pos, OpStore, types.TypeMem, t, dst, source, mem)
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("-->storeArg returns %s, storeRc=%s\n", s.LongString(), storeRc.String())
}
return s
@@ -1071,18 +1071,23 @@ func (x *expandState) storeArgOrLoad(pos src.XPos, b *Block, source, mem *Value,
// to account for any parameter stores required.
// Any of the old Args that have their use count fall to zero are marked OpInvalid.
func (x *expandState) rewriteArgs(v *Value, firstArg int) {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("rewriteArgs(%s; %d)\n", v.LongString(), firstArg)
}
// Thread the stores on the memory arg
aux := v.Aux.(*AuxCall)
- pos := v.Pos.WithNotStmt()
m0 := v.MemoryArg()
mem := m0
newArgs := []*Value{}
oldArgs := []*Value{}
+ sp := x.sp
+ if v.Op == OpTailLECall {
+ // For tail call, we unwind the frame before the call so we'll use the caller's
+ // SP.
+ sp = x.f.Entry.NewValue0(src.NoXPos, OpGetCallerSP, x.typs.Uintptr)
+ }
for i, a := range v.Args[firstArg : len(v.Args)-1] { // skip leading non-parameter SSA Args and trailing mem SSA Arg.
oldArgs = append(oldArgs, a)
auxI := int64(i)
@@ -1093,9 +1098,20 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) {
if a.MemoryArg() != m0 {
x.f.Fatalf("Op...LECall and OpDereference have mismatched mem, %s and %s", v.LongString(), a.LongString())
}
+ if v.Op == OpTailLECall {
+ // It's common for a tail call passing the same arguments (e.g. method wrapper),
+ // so this would be a self copy. Detect this and optimize it out.
+ a0 := a.Args[0]
+ if a0.Op == OpLocalAddr {
+ n := a0.Aux.(*ir.Name)
+ if n.Class == ir.PPARAM && n.FrameOffset()+x.f.Config.ctxt.FixedFrameSize() == aOffset {
+ continue
+ }
+ }
+ }
// "Dereference" of addressed (probably not-SSA-eligible) value becomes Move
// TODO(register args) this will be more complicated with registers in the picture.
- mem = x.rewriteDereference(v.Block, x.sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, pos)
+ mem = x.rewriteDereference(v.Block, sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, a.Pos)
} else {
var rc registerCursor
var result *[]*Value
@@ -1105,11 +1121,19 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) {
} else {
aOffset = aux.OffsetOfArg(auxI)
}
- if x.debug {
+ if v.Op == OpTailLECall && a.Op == OpArg && a.AuxInt == 0 {
+ // It's common for a tail call passing the same arguments (e.g. method wrapper),
+ // so this would be a self copy. Detect this and optimize it out.
+ n := a.Aux.(*ir.Name)
+ if n.Class == ir.PPARAM && n.FrameOffset()+x.f.Config.ctxt.FixedFrameSize() == aOffset {
+ continue
+ }
+ }
+ if x.debug > 1 {
x.Printf("...storeArg %s, %v, %d\n", a.LongString(), aType, aOffset)
}
- rc.init(aRegs, aux.abiInfo, result, x.sp)
- mem = x.storeArgOrLoad(pos, v.Block, a, mem, aType, aOffset, 0, rc)
+ rc.init(aRegs, aux.abiInfo, result, sp)
+ mem = x.storeArgOrLoad(a.Pos, v.Block, a, mem, aType, aOffset, 0, rc)
}
}
var preArgStore [2]*Value
@@ -1120,16 +1144,31 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) {
v.AddArg(mem)
for _, a := range oldArgs {
if a.Uses == 0 {
- if x.debug {
- x.Printf("...marking %v unused\n", a.LongString())
- }
- a.invalidateRecursively()
+ x.invalidateRecursively(a)
}
}
return
}
+func (x *expandState) invalidateRecursively(a *Value) {
+ var s string
+ if x.debug > 0 {
+ plus := " "
+ if a.Pos.IsStmt() == src.PosIsStmt {
+ plus = " +"
+ }
+ s = a.String() + plus + a.Pos.LineNumber() + " " + a.LongString()
+ if x.debug > 1 {
+ x.Printf("...marking %v unused\n", s)
+ }
+ }
+ lost := a.invalidateRecursively()
+ if x.debug&1 != 0 && lost { // For odd values of x.debug, do this.
+ x.Printf("Lost statement marker in %s on former %s\n", base.Ctxt.Pkgpath+"."+x.f.Name, s)
+ }
+}
+
// expandCalls converts LE (Late Expansion) calls that act like they receive value args into a lower-level form
// that is more oriented to a platform's ABI. The SelectN operations that extract results are rewritten into
// more appropriate forms, and any StructMake or ArrayMake inputs are decomposed until non-struct values are
@@ -1148,7 +1187,7 @@ func expandCalls(f *Func) {
x := &expandState{
f: f,
abi1: f.ABI1,
- debug: f.pass.debug > 0,
+ debug: f.pass.debug,
canSSAType: f.fe.CanSSA,
regSize: f.Config.RegSize,
sp: sp,
@@ -1170,7 +1209,7 @@ func expandCalls(f *Func) {
x.loRo, x.hiRo = 0, 1
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("\nexpandsCalls(%s)\n", f.Name)
}
@@ -1193,7 +1232,7 @@ func expandCalls(f *Func) {
for _, v := range b.Values {
firstArg := 0
switch v.Op {
- case OpStaticLECall:
+ case OpStaticLECall, OpTailLECall:
case OpInterLECall:
firstArg = 1
case OpClosureLECall:
@@ -1210,9 +1249,8 @@ func expandCalls(f *Func) {
m0 := v.MemoryArg()
mem := m0
aux := f.OwnAux
- pos := v.Pos.WithNotStmt()
allResults := []*Value{}
- if x.debug {
+ if x.debug > 1 {
x.Printf("multiValueExit rewriting %s\n", v.LongString())
}
var oldArgs []*Value
@@ -1233,7 +1271,7 @@ func expandCalls(f *Func) {
}
continue
}
- mem = x.rewriteDereference(v.Block, auxBase, a, mem, auxOffset, auxSize, auxType, pos)
+ mem = x.rewriteDereference(v.Block, auxBase, a, mem, auxOffset, auxSize, auxType, a.Pos)
} else {
if a.Op == OpLoad && a.Args[0].Op == OpLocalAddr {
addr := a.Args[0] // This is a self-move. // TODO(register args) do what here for registers?
@@ -1257,13 +1295,13 @@ func expandCalls(f *Func) {
b.SetControl(v)
for _, a := range oldArgs {
if a.Uses == 0 {
- if x.debug {
+ if x.debug > 1 {
x.Printf("...marking %v unused\n", a.LongString())
}
- a.invalidateRecursively()
+ x.invalidateRecursively(a)
}
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("...multiValueExit new result %s\n", v.LongString())
}
x.indent(-3)
@@ -1317,7 +1355,7 @@ func expandCalls(f *Func) {
switch w.Op {
case OpStructSelect, OpArraySelect, OpSelectN, OpArg:
val2Preds[w] += 1
- if x.debug {
+ if x.debug > 1 {
x.Printf("v2p[%s] = %d\n", w.LongString(), val2Preds[w])
}
}
@@ -1326,7 +1364,7 @@ func expandCalls(f *Func) {
case OpSelectN:
if _, ok := val2Preds[v]; !ok {
val2Preds[v] = 0
- if x.debug {
+ if x.debug > 1 {
x.Printf("v2p[%s] = %d\n", v.LongString(), val2Preds[v])
}
}
@@ -1337,7 +1375,7 @@ func expandCalls(f *Func) {
}
if _, ok := val2Preds[v]; !ok {
val2Preds[v] = 0
- if x.debug {
+ if x.debug > 1 {
x.Printf("v2p[%s] = %d\n", v.LongString(), val2Preds[v])
}
}
@@ -1451,7 +1489,7 @@ func expandCalls(f *Func) {
if dupe == nil {
x.commonSelectors[sk] = v
} else if x.sdom.IsAncestorEq(dupe.Block, v.Block) {
- if x.debug {
+ if x.debug > 1 {
x.Printf("Duplicate, make %s copy of %s\n", v, dupe)
}
v.copyOf(dupe)
@@ -1467,12 +1505,12 @@ func expandCalls(f *Func) {
// Rewrite selectors.
for i, v := range allOrdered {
- if x.debug {
+ if x.debug > 1 {
b := v.Block
x.Printf("allOrdered[%d] = b%d, %s, uses=%d\n", i, b.ID, v.LongString(), v.Uses)
}
if v.Uses == 0 {
- v.invalidateRecursively()
+ x.invalidateRecursively(v)
continue
}
if v.Op == OpCopy {
@@ -1512,6 +1550,10 @@ func expandCalls(f *Func) {
v.Op = OpStaticCall
rts := abi.RegisterTypes(v.Aux.(*AuxCall).abiInfo.OutParams())
v.Type = types.NewResults(append(rts, types.TypeMem))
+ case OpTailLECall:
+ v.Op = OpTailCall
+ rts := abi.RegisterTypes(v.Aux.(*AuxCall).abiInfo.OutParams())
+ v.Type = types.NewResults(append(rts, types.TypeMem))
case OpClosureLECall:
v.Op = OpClosureCall
rts := abi.RegisterTypes(v.Aux.(*AuxCall).abiInfo.OutParams())
@@ -1583,7 +1625,7 @@ func expandCalls(f *Func) {
v.SetArg(i, aa)
for a.Uses == 0 {
b := a.Args[0]
- a.invalidateRecursively()
+ x.invalidateRecursively(a)
a = b
}
}
@@ -1619,7 +1661,7 @@ func expandCalls(f *Func) {
// rewriteArgToMemOrRegs converts OpArg v in-place into the register version of v,
// if that is appropriate.
func (x *expandState) rewriteArgToMemOrRegs(v *Value) *Value {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("rewriteArgToMemOrRegs(%s)\n", v.LongString())
@@ -1650,7 +1692,7 @@ func (x *expandState) rewriteArgToMemOrRegs(v *Value) *Value {
default:
panic(badVal("Saw unexpanded OpArg", v))
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("-->%s\n", v.LongString())
}
return v
@@ -1660,7 +1702,7 @@ func (x *expandState) rewriteArgToMemOrRegs(v *Value) *Value {
// or rewrites it into a copy of the appropriate OpArgXXX. The actual OpArgXXX is determined by combining baseArg (an OpArg)
// with offset, regOffset, and t to determine which portion of it to reference (either all or a part, in memory or in registers).
func (x *expandState) newArgToMemOrRegs(baseArg, toReplace *Value, offset int64, regOffset Abi1RO, t *types.Type, pos src.XPos) *Value {
- if x.debug {
+ if x.debug > 1 {
x.indent(3)
defer x.indent(-3)
x.Printf("newArgToMemOrRegs(base=%s; toReplace=%s; t=%s; memOff=%d; regOff=%d)\n", baseArg.String(), toReplace.LongString(), t.String(), offset, regOffset)
@@ -1696,7 +1738,7 @@ func (x *expandState) newArgToMemOrRegs(baseArg, toReplace *Value, offset int64,
if toReplace != nil {
toReplace.copyOf(w)
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("-->%s\n", w.LongString())
}
return w
@@ -1727,7 +1769,7 @@ func (x *expandState) newArgToMemOrRegs(baseArg, toReplace *Value, offset int64,
if toReplace != nil {
toReplace.copyOf(w)
}
- if x.debug {
+ if x.debug > 1 {
x.Printf("-->%s\n", w.LongString())
}
return w