// lookupVarOutgoing finds the variable's value at the end of block b. func (s *simplePhiState) lookupVarOutgoing(b *ssa.Block, t ssa.Type, var_ *Node, line int32) *ssa.Value { for { if v := s.defvars[b.ID][var_]; v != nil { return v } // The variable is not defined by b and we haven't looked it up yet. // If b has exactly one predecessor, loop to look it up there. // Otherwise, give up and insert a new FwdRef and resolve it later. if len(b.Preds) != 1 { break } b = b.Preds[0].Block() } // Generate a FwdRef for the variable and return that. v := b.NewValue0A(line, ssa.OpFwdRef, t, var_) s.defvars[b.ID][var_] = v s.s.addNamedValue(var_, v) s.fwdrefs = append(s.fwdrefs, v) return v }