(ConstNil <v.Type.Elem().PtrTo()>)
(Const64 <typ.Int> [0])
(Const64 <typ.Int> [0]))
+(SliceLen (Phi (SliceMake _ x _) (SliceMake _ x _))) => x
+(SliceCap (Phi (SliceMake _ _ x) (SliceMake _ _ x))) => x
// Special rule to help constant slicing; len > 0 implies cap > 0 implies Slicemask is all 1
(SliceMake (AddPtr <t> x (And64 y (Slicemask _))) w:(Const64 [c]) z) && c > 0 => (SliceMake (AddPtr <t> x y) w z)
func removeBranch(b *Block, branch branch) {
c := b.Controls[0]
- if b.Func.pass.debug > 0 {
+ if c != nil && b.Func.pass.debug > 0 {
verb := "Proved"
if branch == positive {
verb = "Disproved"
v.AddArg(x)
return true
}
+ // match: (SliceCap (Phi (SliceMake _ _ x) (SliceMake _ _ x)))
+ // result: x
+ for {
+ if v_0.Op != OpPhi || len(v_0.Args) != 2 {
+ break
+ }
+ _ = v_0.Args[1]
+ v_0_0 := v_0.Args[0]
+ if v_0_0.Op != OpSliceMake {
+ break
+ }
+ x := v_0_0.Args[2]
+ v_0_1 := v_0.Args[1]
+ if v_0_1.Op != OpSliceMake {
+ break
+ }
+ _ = v_0_1.Args[2]
+ if x != v_0_1.Args[2] {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
return false
}
func rewriteValuegeneric_OpSliceLen(v *Value) bool {
v.AddArg(x)
return true
}
+ // match: (SliceLen (Phi (SliceMake _ x _) (SliceMake _ x _)))
+ // result: x
+ for {
+ if v_0.Op != OpPhi || len(v_0.Args) != 2 {
+ break
+ }
+ _ = v_0.Args[1]
+ v_0_0 := v_0.Args[0]
+ if v_0_0.Op != OpSliceMake {
+ break
+ }
+ x := v_0_0.Args[1]
+ v_0_1 := v_0.Args[1]
+ if v_0_1.Op != OpSliceMake {
+ break
+ }
+ _ = v_0_1.Args[1]
+ if x != v_0_1.Args[1] {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (SliceLen (SelectN [0] (StaticLECall {sym} _ newLen:(Const64) _ _ _ _)))
// cond: (isSameCall(sym, "runtime.growslice") || isSameCall(sym, "runtime.growsliceNoAlias"))
// result: newLen
--- /dev/null
+// asmcheck
+
+// Copyright 2026 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 codegen
+
+func Range(n int) []int {
+ m := make([]int, n)
+
+ for i := 0; i < n; i++ {
+ m[i] = i
+ }
+
+ for i := range n {
+ m[i] = i
+ }
+
+ for i := range len(m) {
+ m[i] = i
+ }
+
+ for i := range m {
+ m[i] = i
+ }
+
+ return m
+}
+
+func F(size int) {
+ // amd64:-`.*panicBounds`
+ // arm64:-`.*panicBounds`
+ Range(size)
+}
+
+func main() {
+ F(-1)
+}