// Copyright 2016 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 ( "cmd/compile/internal/types" "testing" ) func TestShortCircuit(t *testing.T) { c := testConfig(t) fun := c.Fun("entry", Bloc("entry", Valu("mem", OpInitMem, types.TypeMem, 0, nil), Valu("arg1", OpArg, c.config.Types.Int64, 0, nil), Valu("arg2", OpArg, c.config.Types.Int64, 0, nil), Valu("arg3", OpArg, c.config.Types.Int64, 0, nil), Goto("b1")), Bloc("b1", Valu("cmp1", OpLess64, c.config.Types.Bool, 0, nil, "arg1", "arg2"), If("cmp1", "b2", "b3")), Bloc("b2", Valu("cmp2", OpLess64, c.config.Types.Bool, 0, nil, "arg2", "arg3"), Goto("b3")), Bloc("b3", Valu("phi2", OpPhi, c.config.Types.Bool, 0, nil, "cmp1", "cmp2"), If("phi2", "b4", "b5")), Bloc("b4", Valu("cmp3", OpLess64, c.config.Types.Bool, 0, nil, "arg3", "arg1"), Goto("b5")), Bloc("b5", Valu("phi3", OpPhi, c.config.Types.Bool, 0, nil, "phi2", "cmp3"), If("phi3", "b6", "b7")), Bloc("b6", Exit("mem")), Bloc("b7", Exit("mem"))) CheckFunc(fun.f) shortcircuit(fun.f) CheckFunc(fun.f) for _, b := range fun.f.Blocks { for _, v := range b.Values { if v.Op == OpPhi { t.Errorf("phi %s remains", v) } } } }