// and tries to update the scores of calls based on how their results
// are used in the function.
func rescoreBasedOnCallResultUses(fn *ir.Func, resultNameTab map[*ir.Name]resultPropAndCS, cstab CallSiteTab) {
- if os.Getenv("THANM_DEBUG") != "" {
- return
- }
enableDebugTraceIfEnv()
rua := &resultUseAnalyzer{
resultNameTab: resultNameTab,
disableDebugTrace()
}
-func examineCallResults(cs *CallSite, resultNameTab map[*ir.Name]resultPropAndCS) {
+func examineCallResults(cs *CallSite, resultNameTab map[*ir.Name]resultPropAndCS) map[*ir.Name]resultPropAndCS {
if debugTrace&debugTraceScoring != 0 {
fmt.Fprintf(os.Stderr, "=-= examining call results for %q\n",
EncodeCallSiteKey(cs))
//
names, autoTemps, props := namesDefined(cs)
if len(names) == 0 {
- return
+ return resultNameTab
}
if debugTrace&debugTraceScoring != 0 {
if ir.Reassigned(n) {
continue
}
- if _, ok := resultNameTab[n]; ok {
+ if resultNameTab == nil {
+ resultNameTab = make(map[*ir.Name]resultPropAndCS)
+ } else if _, ok := resultNameTab[n]; ok {
panic("should never happen")
}
entry := resultPropAndCS{
fmt.Fprintf(os.Stderr, "=-= add resultNameTab table entry n=%v autotemp=%v props=%s\n", n, autoTemps[idx], rprop.String())
}
}
+ return resultNameTab
}
// namesDefined returns a list of ir.Name's corresponding to locals
if cs.Assign == nil {
return nil, nil, nil
}
- fih, ok := fpmap[cs.Callee]
+ funcInlHeur, ok := fpmap[cs.Callee]
if !ok {
// TODO: add an assert/panic here.
return nil, nil, nil
}
- if len(fih.props.ResultFlags) == 0 {
+ if len(funcInlHeur.props.ResultFlags) == 0 {
return nil, nil, nil
}
// Single return case.
- if len(fih.props.ResultFlags) == 1 {
+ if len(funcInlHeur.props.ResultFlags) == 1 {
asgn, ok := cs.Assign.(*ir.AssignStmt)
if !ok {
return nil, nil, nil
if !ok {
return nil, nil, nil
}
- return []*ir.Name{aname}, []*ir.Name{nil}, fih.props
+ return []*ir.Name{aname}, []*ir.Name{nil}, funcInlHeur.props
}
// Multi-return case
if !ok || !asgn.Def {
return nil, nil, nil
}
- userVars := make([]*ir.Name, len(fih.props.ResultFlags))
- autoTemps := make([]*ir.Name, len(fih.props.ResultFlags))
+ userVars := make([]*ir.Name, len(funcInlHeur.props.ResultFlags))
+ autoTemps := make([]*ir.Name, len(funcInlHeur.props.ResultFlags))
for idx, x := range asgn.Lhs {
if n, ok := x.(*ir.Name); ok {
userVars[idx] = n
return nil, nil, nil
}
}
- return userVars, autoTemps, fih.props
+ return userVars, autoTemps, funcInlHeur.props
}
func (rua *resultUseAnalyzer) nodeVisitPost(n ir.Node) {
rua.fn.Sym().Name, rname)
}
if cs := rua.returnHasProp(rname, ResultIsConcreteTypeConvertedToInterface); cs != nil {
- // FIXME: add cond level support here
- adj := passConcreteToItfCallAdj
- cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
- adj = callResultRescoreAdj
+
+ adj := returnFeedsConcreteToInterfaceCallAdj
cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
}
case ir.OCALLFUNC:
}
}
if cs := rua.returnHasProp(rname, ResultAlwaysSameInlinableFunc); cs != nil {
- // FIXME: add cond level support here
- adj := passInlinableFuncToIndCallAdj
- cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
- adj = callResultRescoreAdj
+ adj := returnFeedsInlinableFuncToIndCallAdj
cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
} else if cs := rua.returnHasProp(rname, ResultAlwaysSameFunc); cs != nil {
- // FIXME: add cond level support here
- adj := passFuncToIndCallAdj
- cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
- adj = callResultRescoreAdj
+ adj := returnFeedsFuncToIndCallAdj
cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
+
}
}
}
if !ShouldFoldIfNameConstant(cond, namesUsed) {
return
}
- // FIXME: add cond level support here
- adj := passConstToIfAdj
- cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
- adj = callResultRescoreAdj
+ adj := returnFeedsConstToIfAdj
cs.Score, cs.ScoreMask = adjustScore(adj, cs.Score, cs.ScoreMask)
}