blob: ff9e6800dabb71a4aa44a93c2acb75c87a3252fd [file] [log] [blame]
// 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) {
c := NewConfig("amd64", DummyFrontend{t})
fun := Fun(c, "entry",
Bloc("entry",
Valu("mem", OpArg, TypeMem, 0, ".mem"),
Goto("exit")),
Bloc("exit",
Exit("mem")),
// dead loop
Bloc("deadblock",
// dead value in dead block
Valu("deadval", OpConst, TypeBool, 0, 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) {
c := NewConfig("amd64", DummyFrontend{t})
fun := Fun(c, "entry",
Bloc("entry",
Valu("mem", OpArg, TypeMem, 0, ".mem"),
Valu("deadval", OpConst, TypeInt64, 37, nil),
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) {
c := NewConfig("amd64", DummyFrontend{t})
fun := Fun(c, "entry",
Bloc("entry",
Valu("cond", OpConst, TypeBool, 0, false),
Valu("mem", OpArg, TypeMem, 0, ".mem"),
If("cond", "then", "else")),
Bloc("then",
Goto("exit")),
Bloc("else",
Goto("exit")),
Bloc("exit",
Exit("mem")))
CheckFunc(fun.f)
Opt(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")
}
}
}
}