Skip to content

Commit

Permalink
cmd/compile/internal/ir: export 'reassigned', handle OASOP
Browse files Browse the repository at this point in the history
Rename the ir-local function "reassigned" to "Reassigned" so that it
can be used as part of inline heuristic analysis. Fix up the header
comment along that way, which had some stale material. Add support for
detecting reassignments via OASOP (as opposed to just simple
assignments).

Updates #61502.

Change-Id: I50f40f81263c0d7f61f30fcf0258f0b0f93acdca
Reviewed-on: https://go-review.googlesource.com/c/go/+/511560
Reviewed-by: Matthew Dempsky <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Run-TryBot: Than McIntosh <[email protected]>
  • Loading branch information
thanm committed Aug 10, 2023
1 parent b888ec4 commit 7087b8a
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions src/cmd/compile/internal/ir/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -906,20 +906,20 @@ FindRHS:
base.Fatalf("RHS is nil: %v", defn)
}

if reassigned(n) {
if Reassigned(n) {
return nil
}

return rhs
}

// reassigned takes an ONAME node, walks the function in which it is defined, and returns a boolean
// indicating whether the name has any assignments other than its declaration.
// The second return value is the first such assignment encountered in the walk, if any. It is mostly
// useful for -m output documenting the reason for inhibited optimizations.
// Reassigned takes an ONAME node, walks the function in which it is
// defined, and returns a boolean indicating whether the name has any
// assignments other than its declaration.
// NB: global variables are always considered to be re-assigned.
// TODO: handle initial declaration not including an assignment and followed by a single assignment?
func reassigned(name *Name) bool {
// TODO: handle initial declaration not including an assignment and
// followed by a single assignment?
func Reassigned(name *Name) bool {
if name.Op() != ONAME {
base.Fatalf("reassigned %v", name)
}
Expand All @@ -934,7 +934,10 @@ func reassigned(name *Name) bool {

// isName reports whether n is a reference to name.
isName := func(x Node) bool {
n, ok := x.(*Name)
if x == nil {
return false
}
n, ok := OuterValue(x).(*Name)
return ok && n.Canonical() == name
}

Expand All @@ -953,9 +956,14 @@ func reassigned(name *Name) bool {
return true
}
}
case OASOP:
n := n.(*AssignOpStmt)
if isName(n.X) {
return true
}
case OADDR:
n := n.(*AddrExpr)
if isName(OuterValue(n.X)) {
if isName(n.X) {
return true
}
case ORANGE:
Expand Down

0 comments on commit 7087b8a

Please sign in to comment.