mirror of https://github.com/golang/go.git
94 lines
1.9 KiB
Go
94 lines
1.9 KiB
Go
// 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 TestDeadLoop(t *testing.T) {
|
|
fun := Fun("entry",
|
|
Bloc("entry",
|
|
Valu("mem", OpArg, TypeMem, ".mem"),
|
|
Goto("exit")),
|
|
Bloc("exit",
|
|
Exit("mem")),
|
|
// dead loop
|
|
Bloc("deadblock",
|
|
// dead value in dead block
|
|
Valu("deadval", OpConst, TypeBool, true),
|
|
If("deadval", "deadblock", "exit")))
|
|
|
|
CheckFunc(fun.f)
|
|
Deadcode(fun.f)
|
|
CheckFunc(fun.f)
|
|
|
|
for _, b := range fun.f.Blocks {
|
|
if b == fun.blocks["deadblock"] {
|
|
t.Errorf("dead block not removed")
|
|
}
|
|
for _, v := range b.Values {
|
|
if v == fun.values["deadval"] {
|
|
t.Errorf("control value of dead block not removed")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDeadValue(t *testing.T) {
|
|
fun := Fun("entry",
|
|
Bloc("entry",
|
|
Valu("mem", OpArg, TypeMem, ".mem"),
|
|
Valu("deadval", OpConst, TypeInt64, int64(37)),
|
|
Goto("exit")),
|
|
Bloc("exit",
|
|
Exit("mem")))
|
|
|
|
CheckFunc(fun.f)
|
|
Deadcode(fun.f)
|
|
CheckFunc(fun.f)
|
|
|
|
for _, b := range fun.f.Blocks {
|
|
for _, v := range b.Values {
|
|
if v == fun.values["deadval"] {
|
|
t.Errorf("dead value not removed")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNeverTaken(t *testing.T) {
|
|
fun := Fun("entry",
|
|
Bloc("entry",
|
|
Valu("cond", OpConst, TypeBool, false),
|
|
Valu("mem", OpArg, TypeMem, ".mem"),
|
|
If("cond", "then", "else")),
|
|
Bloc("then",
|
|
Goto("exit")),
|
|
Bloc("else",
|
|
Goto("exit")),
|
|
Bloc("exit",
|
|
Exit("mem")))
|
|
|
|
CheckFunc(fun.f)
|
|
Deadcode(fun.f)
|
|
CheckFunc(fun.f)
|
|
|
|
if fun.blocks["entry"].Kind != BlockPlain {
|
|
t.Errorf("if(false) not simplified")
|
|
}
|
|
for _, b := range fun.f.Blocks {
|
|
if b == fun.blocks["then"] {
|
|
t.Errorf("then block still present")
|
|
}
|
|
for _, v := range b.Values {
|
|
if v == fun.values["cond"] {
|
|
t.Errorf("constant condition still present")
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|