]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: note zero-width Ops
authorHeschi Kreinick <heschi@google.com>
Wed, 28 Feb 2018 21:30:07 +0000 (16:30 -0500)
committerHeschi Kreinick <heschi@google.com>
Fri, 2 Mar 2018 18:55:45 +0000 (18:55 +0000)
Add a bool to opInfo to indicate if an Op never results in any
instructions. This is a conservative approximation: some operations,
like Copy, may or may not generate code depending on their arguments.

I built the list by reading each arch's ssaGenValue function. Hopefully
I got them all.

Change-Id: I130b251b65f18208294e129bb7ddc3f91d57d31d
Reviewed-on: https://go-review.googlesource.com/97957
Reviewed-by: Keith Randall <khr@golang.org>
12 files changed:
src/cmd/compile/internal/ssa/gen/386Ops.go
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/ARM64Ops.go
src/cmd/compile/internal/ssa/gen/ARMOps.go
src/cmd/compile/internal/ssa/gen/MIPS64Ops.go
src/cmd/compile/internal/ssa/gen/MIPSOps.go
src/cmd/compile/internal/ssa/gen/PPC64Ops.go
src/cmd/compile/internal/ssa/gen/S390XOps.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/gen/main.go
src/cmd/compile/internal/ssa/op.go
src/cmd/compile/internal/ssa/opGen.go

index d9aaf5d63b47927db1927460ee205c97d1dfd310..fe88b456f12834221ee5c4f59d3e8039f141fa1c 100644 (file)
@@ -439,7 +439,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of DX (the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}, zeroWidth: true},
                // LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
                // I.e., if f calls g "calls" getcallerpc,
                // the result should be the PC within f that g will return to.
@@ -459,7 +459,7 @@ func init() {
                // (particularly stack maps).  It takes a memory arg so it
                // gets correctly ordered with respect to GC safepoints.
                // arg0=ptr/int arg1=mem, output=int/ptr
-               {name: "MOVLconvert", argLength: 2, reg: gp11, asm: "MOVL", resultInArg0: true},
+               {name: "MOVLconvert", argLength: 2, reg: gp11, asm: "MOVL", resultInArg0: true, zeroWidth: true},
 
                // Constant flag values. For any comparison, there are 5 possible
                // outcomes: the three from the signed total order (<,==,>) and the
index d3394606f4a6710c247267e896b7e2ce06a9fd2b..c5c2e8ceacb9a1b9e30c4ec05ff623eb2be3b3fe 100644 (file)
@@ -568,7 +568,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of DX (the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("DX")}}, zeroWidth: true},
                // LoweredGetCallerPC evaluates to the PC to which its "caller" will return.
                // I.e., if f calls g "calls" getcallerpc,
                // the result should be the PC within f that g will return to.
@@ -588,8 +588,8 @@ func init() {
                // (particularly stack maps).  It takes a memory arg so it
                // gets correctly ordered with respect to GC safepoints.
                // arg0=ptr/int arg1=mem, output=int/ptr
-               {name: "MOVQconvert", argLength: 2, reg: gp11, asm: "MOVQ", resultInArg0: true},
-               {name: "MOVLconvert", argLength: 2, reg: gp11, asm: "MOVL", resultInArg0: true}, // amd64p32 equivalent
+               {name: "MOVQconvert", argLength: 2, reg: gp11, asm: "MOVQ", resultInArg0: true, zeroWidth: true},
+               {name: "MOVLconvert", argLength: 2, reg: gp11, asm: "MOVL", resultInArg0: true, zeroWidth: true}, // amd64p32 equivalent
 
                // Constant flag values. For any comparison, there are 5 possible
                // outcomes: the three from the signed total order (<,==,>) and the
index 0e458053cfa3cf02dd1d3bcb3c6d10996f92ca25..14b1c9afa43a94ebed6ea075253fe303d0d4ff85 100644 (file)
@@ -217,8 +217,8 @@ func init() {
                {name: "CLZW", argLength: 1, reg: gp11, asm: "CLZW"},       // count leading zero, 32-bit
                {name: "VCNT", argLength: 1, reg: fp11, asm: "VCNT"},       // count set bits for each 8-bit unit and store the result in each 8-bit unit
                {name: "VUADDLV", argLength: 1, reg: fp11, asm: "VUADDLV"}, // unsigned sum of eight bytes in a 64-bit value, zero extended to 64-bit.
-               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true},
-               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true},
+               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
+               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
 
                // 3-operand, the addend comes first
                {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS"},   // +arg0 + (arg1 * arg2)
@@ -459,7 +459,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of R26 (arm64.REGCTXT, the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R26")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R26")}}, zeroWidth: true},
 
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
index de6c13cc97a5ffb83395f3ac39388a0b20066742..d668ed8c02685a1c2c2357b3802a2eaabe2c9d66 100644 (file)
@@ -514,7 +514,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of R7 (arm.REGCTXT, the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R7")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R7")}}, zeroWidth: true},
 
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
index 163a88c8fecadd54bc9e8528b6bf7977fbed1896..d5cae59147820ac956bf541a702568962f5990a2 100644 (file)
@@ -404,7 +404,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of R22 (mips.REGCTXT, the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}, zeroWidth: true},
 
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
index 868e4d90daa00bdc80f2babf52846f5fdf14c696..a38f3383b9aba67e2fc766fa279765de6e64c904 100644 (file)
@@ -374,7 +374,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of R22 (mips.REGCTXT, the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}, zeroWidth: true},
 
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
index 2043887a7850ad08b5c81055629aedcfd6e08754..ecd6944b1ed85240b3bc30c83908f03a5c21ed6c 100644 (file)
@@ -316,7 +316,7 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of the closure pointer.
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
 
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
@@ -324,8 +324,8 @@ func init() {
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
                // Round ops to block fused-multiply-add extraction.
-               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true},
-               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true},
+               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
+               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
 
                // Convert pointer to integer, takes a memory operand for ordering.
                {name: "MOVDconvert", argLength: 2, reg: gp11, asm: "MOVD"},
index 1d6fea00c73cc010103c1edbb5cc77e137679b16..673085dd2b9ff88914decaa80d92fb068956b82b 100644 (file)
@@ -445,14 +445,14 @@ func init() {
                // Scheduler ensures LoweredGetClosurePtr occurs only in entry block,
                // and sorts it to the very beginning of the block to prevent other
                // use of R12 (the closure pointer)
-               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}},
+               {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}, zeroWidth: true},
                // arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                // LoweredGetCallerSP returns the SP of the caller of the current function.
                {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{ptrsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
                // Round ops to block fused-multiply-add extraction.
-               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true},
-               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true},
+               {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
+               {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
 
                // LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
                // It saves all GP registers if necessary,
index 17080fbb3d7197ce744c306dfa1be2fbe94b83c7..49160ab7c442b7889760915771045cd0fae5befc 100644 (file)
@@ -285,8 +285,8 @@ var genericOps = []opData{
 
        // Data movement, max argument length for Phi is indefinite so just pick
        // a really large number
-       {name: "Phi", argLength: -1}, // select an argument based on which predecessor block we came from
-       {name: "Copy", argLength: 1}, // output = arg0
+       {name: "Phi", argLength: -1, zeroWidth: true}, // select an argument based on which predecessor block we came from
+       {name: "Copy", argLength: 1},                  // output = arg0
        // Convert converts between pointers and integers.
        // We have a special op for this so as to not confuse GC
        // (particularly stack maps).  It takes a memory arg so it
@@ -311,8 +311,8 @@ var genericOps = []opData{
        {name: "ConstSlice"},               // nil slice
 
        // Constant-like things
-       {name: "InitMem"},                               // memory input to the function.
-       {name: "Arg", aux: "SymOff", symEffect: "Read"}, // argument to the function.  aux=GCNode of arg, off = offset in that arg.
+       {name: "InitMem", zeroWidth: true},                               // memory input to the function.
+       {name: "Arg", aux: "SymOff", symEffect: "Read", zeroWidth: true}, // argument to the function.  aux=GCNode of arg, off = offset in that arg.
 
        // The address of a variable.  arg0 is the base pointer.
        // If the variable is a global, the base pointer will be SB and
@@ -321,9 +321,9 @@ var genericOps = []opData{
        // the Aux field will be a *gc.Node.
        {name: "Addr", argLength: 1, aux: "Sym", symEffect: "Addr"}, // Address of a variable.  Arg0=SP or SB.  Aux identifies the variable.
 
-       {name: "SP"},                 // stack pointer
-       {name: "SB", typ: "Uintptr"}, // static base pointer (a.k.a. globals pointer)
-       {name: "Invalid"},            // unused value
+       {name: "SP", zeroWidth: true},                 // stack pointer
+       {name: "SB", typ: "Uintptr", zeroWidth: true}, // static base pointer (a.k.a. globals pointer)
+       {name: "Invalid"},                             // unused value
 
        // Memory operations
        {name: "Load", argLength: 2},                          // Load from arg0.  arg1=memory
@@ -395,10 +395,10 @@ var genericOps = []opData{
        {name: "NilCheck", argLength: 2, typ: "Void"},        // arg0=ptr, arg1=mem. Panics if arg0 is nil. Returns void.
 
        // Pseudo-ops
-       {name: "GetG", argLength: 1}, // runtime.getg() (read g pointer). arg0=mem
-       {name: "GetClosurePtr"},      // get closure pointer from dedicated register
-       {name: "GetCallerPC"},        // for getcallerpc intrinsic
-       {name: "GetCallerSP"},        // for getcallersp intrinsic
+       {name: "GetG", argLength: 1, zeroWidth: true}, // runtime.getg() (read g pointer). arg0=mem
+       {name: "GetClosurePtr"},                       // get closure pointer from dedicated register
+       {name: "GetCallerPC"},                         // for getcallerpc intrinsic
+       {name: "GetCallerSP"},                         // for getcallersp intrinsic
 
        // Indexing operations
        {name: "PtrIndex", argLength: 2},             // arg0=ptr, arg1=index. Computes ptr+sizeof(*v.type)*index, where index is extended to ptrwidth type
@@ -451,10 +451,10 @@ var genericOps = []opData{
        // Unknown value. Used for Values whose values don't matter because they are dead code.
        {name: "Unknown"},
 
-       {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem", symEffect: "None"}, // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
-       {name: "VarKill", argLength: 1, aux: "Sym", symEffect: "None"},            // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
-       {name: "VarLive", argLength: 1, aux: "Sym", symEffect: "Read"},            // aux is a *gc.Node of a variable that must be kept live.  arg0=mem, returns mem
-       {name: "KeepAlive", argLength: 2, typ: "Mem"},                             // arg[0] is a value that must be kept alive until this mark.  arg[1]=mem, returns mem
+       {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem", symEffect: "None", zeroWidth: true}, // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
+       {name: "VarKill", argLength: 1, aux: "Sym", symEffect: "None"},                             // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
+       {name: "VarLive", argLength: 1, aux: "Sym", symEffect: "Read", zeroWidth: true},            // aux is a *gc.Node of a variable that must be kept live.  arg0=mem, returns mem
+       {name: "KeepAlive", argLength: 2, typ: "Mem", zeroWidth: true},                             // arg[0] is a value that must be kept alive until this mark.  arg[1]=mem, returns mem
 
        // Ops for breaking 64-bit operations on 32-bit architectures
        {name: "Int64Make", argLength: 2, typ: "UInt64"}, // arg0=hi, arg1=lo
@@ -481,8 +481,8 @@ var genericOps = []opData{
        {name: "Cvt64Fto64U", argLength: 1}, // float64 -> uint64, only used on archs that has the instruction
 
        // pseudo-ops for breaking Tuple
-       {name: "Select0", argLength: 1}, // the first component of a tuple
-       {name: "Select1", argLength: 1}, // the second component of a tuple
+       {name: "Select0", argLength: 1, zeroWidth: true}, // the first component of a tuple
+       {name: "Select1", argLength: 1, zeroWidth: true}, // the second component of a tuple
 
        // Atomic operations used for semantically inlining runtime/internal/atomic.
        // Atomic loads return a new memory so that the loads are properly ordered
index 0966d4c39dbdf7da40fdeb538ea9fbdc65419e29..6b0ee41f64b87a332ebaa8dea4fcb25c92da1d05 100644 (file)
@@ -54,6 +54,7 @@ type opData struct {
        faultOnNilArg1    bool   // this op will fault if arg1 is nil (and aux encodes a small offset)
        usesScratch       bool   // this op requires scratch memory space
        hasSideEffects    bool   // for "reasons", not to be eliminated.  E.g., atomic store, #19182.
+       zeroWidth         bool   // op never translates into any machine code. example: copy, which may sometimes translate to machine code, is not zero-width.
        symEffect         string // effect this op has on symbol in aux
 }
 
@@ -216,6 +217,9 @@ func genOp() {
                        if v.hasSideEffects {
                                fmt.Fprintln(w, "hasSideEffects: true,")
                        }
+                       if v.zeroWidth {
+                               fmt.Fprintln(w, "zeroWidth: true,")
+                       }
                        needEffect := strings.HasPrefix(v.aux, "Sym")
                        if v.symEffect != "" {
                                if !needEffect {
index 621063cbbbcef9262263445e147fabbbd98eea61..610921808e723053f753e508e4b141317d9939e1 100644 (file)
@@ -35,6 +35,7 @@ type opInfo struct {
        faultOnNilArg1    bool      // this op will fault if arg1 is nil (and aux encodes a small offset)
        usesScratch       bool      // this op requires scratch memory space
        hasSideEffects    bool      // for "reasons", not to be eliminated.  E.g., atomic store, #19182.
+       zeroWidth         bool      // op never translates into any machine code. example: copy, which may sometimes translate to machine code, is not zero-width.
        symEffect         SymEffect // effect this op has on symbol in aux
 }
 
index 586fe2218faff7e3826505124f213c8e2f43ddc1..d07486154449f6601d1ca1118d861b7aadc7b842 100644 (file)
@@ -4394,8 +4394,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 4}, // DX
@@ -4452,6 +4453,7 @@ var opcodeTable = [...]opInfo{
                name:         "MOVLconvert",
                argLen:       2,
                resultInArg0: true,
+               zeroWidth:    true,
                asm:          x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -8308,8 +8310,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 4}, // DX
@@ -8366,6 +8369,7 @@ var opcodeTable = [...]opInfo{
                name:         "MOVQconvert",
                argLen:       2,
                resultInArg0: true,
+               zeroWidth:    true,
                asm:          x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -8380,6 +8384,7 @@ var opcodeTable = [...]opInfo{
                name:         "MOVLconvert",
                argLen:       2,
                resultInArg0: true,
+               zeroWidth:    true,
                asm:          x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12082,8 +12087,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 128}, // R7
@@ -12908,6 +12914,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound32F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 9223372034707292160}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
@@ -12921,6 +12928,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound64F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 9223372034707292160}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
@@ -14667,8 +14675,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 67108864}, // R26
@@ -16269,8 +16278,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 4194304}, // R22
@@ -17801,8 +17811,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 4194304}, // R22
@@ -19488,8 +19499,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 2048}, // R11
@@ -19523,6 +19535,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound32F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 576460743713488896}, // F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
@@ -19536,6 +19549,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound64F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 576460743713488896}, // F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
@@ -22594,8 +22608,9 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:   "LoweredGetClosurePtr",
-               argLen: 0,
+               name:      "LoweredGetClosurePtr",
+               argLen:    0,
+               zeroWidth: true,
                reg: regInfo{
                        outputs: []outputInfo{
                                {0, 4096}, // R12
@@ -22628,6 +22643,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound32F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
@@ -22641,6 +22657,7 @@ var opcodeTable = [...]opInfo{
                name:         "LoweredRound64F",
                argLen:       1,
                resultInArg0: true,
+               zeroWidth:    true,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
@@ -24092,9 +24109,10 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "Phi",
-               argLen:  -1,
-               generic: true,
+               name:      "Phi",
+               argLen:    -1,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:    "Copy",
@@ -24170,14 +24188,16 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "InitMem",
-               argLen:  0,
-               generic: true,
+               name:      "InitMem",
+               argLen:    0,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:      "Arg",
                auxType:   auxSymOff,
                argLen:    0,
+               zeroWidth: true,
                symEffect: SymRead,
                generic:   true,
        },
@@ -24189,14 +24209,16 @@ var opcodeTable = [...]opInfo{
                generic:   true,
        },
        {
-               name:    "SP",
-               argLen:  0,
-               generic: true,
+               name:      "SP",
+               argLen:    0,
+               zeroWidth: true,
+               generic:   true,
        },
        {
-               name:    "SB",
-               argLen:  0,
-               generic: true,
+               name:      "SB",
+               argLen:    0,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:    "Load",
@@ -24439,9 +24461,10 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "GetG",
-               argLen:  1,
-               generic: true,
+               name:      "GetG",
+               argLen:    1,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:    "GetClosurePtr",
@@ -24607,6 +24630,7 @@ var opcodeTable = [...]opInfo{
                name:      "VarDef",
                auxType:   auxSym,
                argLen:    1,
+               zeroWidth: true,
                symEffect: SymNone,
                generic:   true,
        },
@@ -24621,13 +24645,15 @@ var opcodeTable = [...]opInfo{
                name:      "VarLive",
                auxType:   auxSym,
                argLen:    1,
+               zeroWidth: true,
                symEffect: SymRead,
                generic:   true,
        },
        {
-               name:    "KeepAlive",
-               argLen:  2,
-               generic: true,
+               name:      "KeepAlive",
+               argLen:    2,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:    "Int64Make",
@@ -24722,14 +24748,16 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "Select0",
-               argLen:  1,
-               generic: true,
+               name:      "Select0",
+               argLen:    1,
+               zeroWidth: true,
+               generic:   true,
        },
        {
-               name:    "Select1",
-               argLen:  1,
-               generic: true,
+               name:      "Select1",
+               argLen:    1,
+               zeroWidth: true,
+               generic:   true,
        },
        {
                name:    "AtomicLoad32",