blob: b90abf976a5cbc6aed633cd46b97d3d829267515 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package inlheur
// This file defines a set of Go function "properties" intended to
// guide inlining heuristics; these properties may apply to the
// function as a whole, or to one or more function return values or
// parameters.
//
// IMPORTANT: function properties are produced on a "best effort"
// basis, meaning that the code that computes them doesn't verify that
// the properties are guaranteed to be true in 100% of cases. For this
// reason, properties should only be used to drive always-safe
// optimization decisions (e.g. "should I inline this call", or
// "should I unroll this loop") as opposed to potentially unsafe IR
// alterations that could change program semantics (e.g. "can I delete
// this variable" or "can I move this statement to a new location").
//
//----------------------------------------------------------------
// FuncProps describes a set of function or method properties that may
// be useful for inlining heuristics. Here 'Flags' are properties that
// we think apply to the entire function; 'RecvrParamFlags' are
// properties of specific function params (or the receiver), and
// 'ResultFlags' are things properties we think will apply to values
// of specific results. Note that 'ParamFlags' includes and entry for
// the receiver if applicable, and does include etries for blank
// params; for a function such as "func foo(_ int, b byte, _ float32)"
// the length of ParamFlags will be 3.
type FuncProps struct {
Flags FuncPropBits
ParamFlags []ParamPropBits // slot 0 receiver if applicable
ResultFlags []ResultPropBits
}
type FuncPropBits uint32
const (
// Function always panics or invokes os.Exit() or a func that does
// likewise.
FuncPropNeverReturns FuncPropBits = 1 << iota
)
type ParamPropBits uint32
const (
// No info about this param
ParamNoInfo ParamPropBits = 0
// Parameter value feeds unmodified into a top-level interface
// call (this assumes the parameter is of interface type).
ParamFeedsInterfaceMethodCall ParamPropBits = 1 << iota
// Parameter value feeds unmodified into an interface call that
// may be conditional/nested and not always executed (this assumes
// the parameter is of interface type).
ParamMayFeedInterfaceMethodCall ParamPropBits = 1 << iota
// Parameter value feeds unmodified into a top level indirect
// function call (assumes parameter is of function type).
ParamFeedsIndirectCall
// Parameter value feeds unmodified into an indirect function call
// that is conditional/nested (not guaranteed to execute). Assumes
// parameter is of function type.
ParamMayFeedIndirectCall
// Parameter value feeds unmodified into a top level "switch"
// statement or "if" statement simple expressions (see more on
// "simple" expression classification below).
ParamFeedsIfOrSwitch
// Parameter value feeds unmodified into a "switch" or "if"
// statement simple expressions (see more on "simple" expression
// classification below), where the if/switch is
// conditional/nested.
ParamMayFeedIfOrSwitch
)
type ResultPropBits uint32
const (
// No info about this result
ResultNoInfo ResultPropBits = 0
// This result always contains allocated memory.
ResultIsAllocatedMem ResultPropBits = 1 << iota
// This result is always a single concrete type that is
// implicitly converted to interface.
ResultIsConcreteTypeConvertedToInterface
// Result is always the same non-composite compile time constant.
ResultAlwaysSameConstant
// Result is always the same function or closure.
ResultAlwaysSameFunc
// Result is always the same (potentially) inlinable function or closure.
ResultAlwaysSameInlinableFunc
)