// 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.

// TODO: these tests are pretty verbose.  Is there a way to simplify
// building a small Func for testing?

package ssa_test

import (
	. "cmd/internal/ssa"
	"testing"
)

func TestDeadLoop(t *testing.T) {
	f := new(Func)
	entry := f.NewBlock(BlockPlain)
	exit := f.NewBlock(BlockExit)
	f.Entry = entry
	addEdge(entry, exit)
	mem := entry.NewValue(OpArg, TypeMem, ".mem")
	exit.Control = mem

	// dead loop
	deadblock := f.NewBlock(BlockIf)
	addEdge(deadblock, deadblock)
	addEdge(deadblock, exit)

	// dead value in dead block
	deadval := deadblock.NewValue(OpConst, TypeBool, true)
	deadblock.Control = deadval

	CheckFunc(f)
	Deadcode(f)
	CheckFunc(f)

	for _, b := range f.Blocks {
		if b == deadblock {
			t.Errorf("dead block not removed")
		}
		for _, v := range b.Values {
			if v == deadval {
				t.Errorf("control value of dead block not removed")
			}
		}
	}
}

func TestDeadValue(t *testing.T) {
	f := new(Func)
	entry := f.NewBlock(BlockPlain)
	exit := f.NewBlock(BlockExit)
	f.Entry = entry
	addEdge(entry, exit)
	mem := entry.NewValue(OpArg, TypeMem, ".mem")
	exit.Control = mem

	deadval := entry.NewValue(OpConst, TypeInt64, int64(37))

	CheckFunc(f)
	Deadcode(f)
	CheckFunc(f)

	for _, b := range f.Blocks {
		for _, v := range b.Values {
			if v == deadval {
				t.Errorf("dead value not removed")
			}
		}
	}
}

func TestNeverTaken(t *testing.T) {
	f := new(Func)
	entry := f.NewBlock(BlockIf)
	exit := f.NewBlock(BlockExit)
	then := f.NewBlock(BlockPlain)
	else_ := f.NewBlock(BlockPlain)
	f.Entry = entry
	addEdge(entry, then)
	addEdge(entry, else_)
	addEdge(then, exit)
	addEdge(else_, exit)
	mem := entry.NewValue(OpArg, TypeMem, ".mem")
	exit.Control = mem

	cond := entry.NewValue(OpConst, TypeBool, false)
	entry.Control = cond

	CheckFunc(f)
	Deadcode(f)
	CheckFunc(f)

	if entry.Kind != BlockPlain {
		t.Errorf("if(false) not simplified")
	}
	for _, b := range f.Blocks {
		if b == then {
			t.Errorf("then block still present")
		}
		for _, v := range b.Values {
			if v == cond {
				t.Errorf("constant condition still present")
			}
		}
	}
}

func addEdge(b, c *Block) {
	b.Succs = append(b.Succs, c)
	c.Preds = append(c.Preds, b)
}
