Home | History | Annotate | Download | only in ssa
      1 // Copyright 2015 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package ssa
      6 
      7 // convert to machine-dependent ops
      8 func lower(f *Func) {
      9 	// repeat rewrites until we find no more rewrites
     10 	applyRewrite(f, f.Config.lowerBlock, f.Config.lowerValue)
     11 }
     12 
     13 // checkLower checks for unlowered opcodes and fails if we find one.
     14 func checkLower(f *Func) {
     15 	// Needs to be a separate phase because it must run after both
     16 	// lowering and a subsequent dead code elimination (because lowering
     17 	// rules may leave dead generic ops behind).
     18 	for _, b := range f.Blocks {
     19 		for _, v := range b.Values {
     20 			if !opcodeTable[v.Op].generic {
     21 				continue // lowered
     22 			}
     23 			switch v.Op {
     24 			case OpSP, OpSB, OpInitMem, OpArg, OpPhi, OpVarDef, OpVarKill, OpVarLive, OpKeepAlive, OpSelect0, OpSelect1:
     25 				continue // ok not to lower
     26 			case OpGetG:
     27 				if f.Config.hasGReg {
     28 					// has hardware g register, regalloc takes care of it
     29 					continue // ok not to lower
     30 				}
     31 			}
     32 			s := "not lowered: " + v.String() + ", " + v.Op.String() + " " + v.Type.SimpleString()
     33 			for _, a := range v.Args {
     34 				s += " " + a.Type.SimpleString()
     35 			}
     36 			f.Fatalf("%s", s)
     37 		}
     38 	}
     39 }
     40