// Do not edit. Bootstrap copy of /Volumes/Android/buildbot/src/android/build-tools/out/obj/go/src/cmd/compile/internal/ssa/schedule_test.go

//line /Volumes/Android/buildbot/src/android/build-tools/out/obj/go/src/cmd/compile/internal/ssa/schedule_test.go:1
// Copyright 2015 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 ssa

import "testing"

func TestSchedule(t *testing.T) {
	c := testConfig(t)
	cases := []fun{
		Fun(c, "entry",
			Bloc("entry",
				Valu("mem0", OpInitMem, TypeMem, 0, nil),
				Valu("ptr", OpConst64, TypeInt64, 0xABCD, nil),
				Valu("v", OpConst64, TypeInt64, 12, nil),
				Valu("mem1", OpStore, TypeMem, 8, nil, "ptr", "v", "mem0"),
				Valu("mem2", OpStore, TypeMem, 8, nil, "ptr", "v", "mem1"),
				Valu("mem3", OpStore, TypeInt64, 8, nil, "ptr", "sum", "mem2"),
				Valu("l1", OpLoad, TypeInt64, 0, nil, "ptr", "mem1"),
				Valu("l2", OpLoad, TypeInt64, 0, nil, "ptr", "mem2"),
				Valu("sum", OpAdd64, TypeInt64, 0, nil, "l1", "l2"),
				Goto("exit")),
			Bloc("exit",
				Exit("mem3"))),
	}
	for _, c := range cases {
		schedule(c.f)
		if !isSingleLiveMem(c.f) {
			t.Error("single-live-mem restriction not enforced by schedule for func:")
			printFunc(c.f)
		}
	}
}

func isSingleLiveMem(f *Func) bool {
	for _, b := range f.Blocks {
		var liveMem *Value
		for _, v := range b.Values {
			for _, w := range v.Args {
				if w.Type.IsMemory() {
					if liveMem == nil {
						liveMem = w
						continue
					}
					if w != liveMem {
						return false
					}
				}
			}
			if v.Type.IsMemory() {
				liveMem = v
			}
		}
	}
	return true
}
