| // 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") |
| } |
| } |
| } |
| |
| } |