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