blob: f78c7a6909ac88c6c3a23439c67ba50c5dad639c [file] [log] [blame]
// Copyright 2024 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_test
import (
"fmt"
"path/filepath"
"testing"
"golang.org/x/tools/go/packages"
"golang.org/x/tools/go/ssa/ssautil"
"golang.org/x/tools/internal/testenv"
)
func TestDominatorOrder(t *testing.T) {
testenv.NeedsGoBuild(t) // for go/packages
const src = `package p
func f(cond bool) {
// (Print operands match BasicBlock IDs.)
print(0)
if cond {
print(1)
} else {
print(2)
}
print(3)
}
`
dir := t.TempDir()
cfg := &packages.Config{
Dir: dir,
Mode: packages.LoadSyntax,
Overlay: map[string][]byte{
filepath.Join(dir, "p.go"): []byte(src),
},
}
initial, err := packages.Load(cfg, "./p.go")
if err != nil {
t.Fatal(err)
}
if packages.PrintErrors(initial) > 0 {
t.Fatal("packages contain errors")
}
_, pkgs := ssautil.Packages(initial, 0)
p := pkgs[0]
p.Build()
f := p.Func("f")
if got, want := fmt.Sprint(f.DomPreorder()), "[0 1 2 3]"; got != want {
t.Errorf("DomPreorder: got %v, want %s", got, want)
}
if got, want := fmt.Sprint(f.DomPostorder()), "[1 2 3 0]"; got != want {
t.Errorf("DomPostorder: got %v, want %s", got, want)
}
}