diff --git a/CLAUDE.md b/CLAUDE.md index 2451cf4c56..3cb6ff4d13 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -51,55 +51,44 @@ go test ./... **Important:** The `LLGO_ROOT` environment variable must be set to the repository root when running llgo commands during development. -### Update out.ll files after modifying compiler IR generation - -**CRITICAL:** When you modify the compiler's IR generation logic (especially in `ssa/` or `cl/` packages), you MUST update all out.ll test files under the `cl/` directory. - -#### Understanding out.ll files - -The `out.ll` files under the `cl/` directory are comparison IR files that serve as reference outputs for the test suite: -- They are generated by `llgen` from the corresponding `in.go` files in the same directory -- They reflect the current compiler's LLVM IR representation of the Go source code -- They are used by tests to verify that the compiler generates correct and consistent IR output - -#### Required steps after modifying IR generation logic - -1. **Reinstall the tools** to apply your compiler changes: - ```bash - go install -v ./chore/gentests - go install -v ./chore/llgen - ``` - -2. **Regenerate out.ll files**: - - **For batch updates (recommended)** - Use `gentests` to regenerate all test files: - ```bash - gentests - ``` - This will automatically regenerate all out.ll files in these directories: - - `cl/_testlibc` - - `cl/_testlibgo` - - `cl/_testrt` - - `cl/_testgo` - - `cl/_testpy` - - `cl/_testdata` - - **For individual test inspection** - Use `llgen` to regenerate specific test directories: - ```bash - llgen cl/_testgo/interface - llgen cl/_testrt/tpmethod - ``` - -3. **Verify the changes** make sense by reviewing the diff in the out.ll files - -4. **Commit the updated out.ll files** along with your compiler changes - -#### Why this matters - -This process ensures that: -- The test suite reflects the current compiler behavior -- Changes to IR generation are properly documented and reviewed -- Future regressions can be detected by comparing against the reference output +### Maintain LLVM IR checks by test intent + +Do not refresh every FileCheck assertion after an IR change. First identify the +single compiler property a test is intended to protect, then keep the smallest +handwritten assertions that prove that property. Runtime output and focused IR +checks protect different contracts; avoid only the redundant full IR snapshot. + +Treat 100 FileCheck directive lines as a review threshold, not a hard limit. +Above that threshold, verify that each handwritten group protects a distinct, +named semantic contract. If the test instead needs a long contiguous IR shape, +make that region reproducible with `litgen`. + +The repository keeps a curated set of 40 source-embedded autogenerated checks +for cases where a broad function or module shape is itself the contract. They +remain in the Go source and carry a reproducible `UTC_ARGS` note: + +```go +// LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --check-globals=smart +``` + +Refresh and verify all opted-in snapshots with: + +```bash +go run ./chore/litgen -u cl +go run ./chore/litgen -u --check cl +``` + +`litgen` will not replace a handwritten test during update-only operation. When +creating an autogenerated test, pass one or more `--function` expressions; use +`--all-functions` only for a deliberate whole-module contract. See +`dev/README.md` for the complete options and marker conventions. + +IR checks observe the module after aggregate and target ABI lowering and before +the LLVM optimization pipeline. Keep portable assertions under `CHECK`; use +`DARWIN`, `LINUX`, `ARM64`, `AMD64`, or a combined prefix such as +`LINUX-AMD64` only for genuine target differences. Compiler fixtures no longer +use separate literal `out.ll` golden files. ## Code Quality @@ -179,4 +168,3 @@ LLGO_ROOT=/path/to/llgo llgo run . 3. **Defer in Loops:** LLGo now supports `defer` within loops, matching Go's semantics of executing defers in LIFO order for every iteration. Be mindful of loop-heavy defer usage as it allocates per iteration. 4. **C Ecosystem Integration:** LLGo uses `go:linkname` directive to link external symbols through ABI 5. **Python Integration:** Third-party Python libraries require separate installation of library files - diff --git a/README.md b/README.md index a8185aec21..965aa0406b 100644 --- a/README.md +++ b/README.md @@ -344,10 +344,10 @@ Here are the Go packages that can be imported correctly: - [LLVM 18](https://llvm.org) - [Clang 18](https://clang.llvm.org) - [LLD 18](https://lld.llvm.org) -- [pkg-config 0.29+](https://www.freedesktop.org/wiki/Software/pkg-config/) +- [pkg-config 0.29+](https://gitlab.freedesktop.org/pkg-config/pkg-config) - [bdwgc/libgc 8.0+](https://www.hboehm.info/gc/) - [OpenSSL 3.0+](https://www.openssl.org/) -- [zlib 1.2+](https://www.zlib.net) +- [zlib 1.2+](https://github.com/madler/zlib) - [Python 3.12+](https://www.python.org) (optional, for [github.com/goplus/lib/py](https://pkg.go.dev/github.com/goplus/lib/py)) ## How to install @@ -423,8 +423,8 @@ cd llgo * [pysigfetch](https://github.com/goplus/hdq/tree/main/chore/pysigfetch): It generates symbol information by extracting information from Python's documentation site. This tool is not part of the `llgo` project, but we depend on it. * [llpyg](chore/llpyg): It is used to automatically convert Python libraries into Go packages that `llgo` can import. It depends on `pydump` and `pysigfetch` to accomplish the task. * [llgen](chore/llgen): It is used to compile Go packages into LLVM IR files (*.ll). -* [gentests](chore/gentests): It refreshes the built-in golden test data under `cl/_test*`, including `out.ll` and `expect.txt`. Directories that use source-embedded `// LITTEST` checks are skipped for `out.ll` regeneration. -* [litgen](chore/litgen): It generates and refreshes source-embedded `// LITTEST` FileCheck directives from the current LLVM IR for marked Go source files. +* [gentests](chore/gentests): It refreshes runtime output and package metadata golden data under `cl/_test*`. +* [litgen](chore/litgen): It maintains explicitly opted-in, source-embedded FileCheck snapshots of post-ABI, pre-optimization LLVM IR. It supports function/global selection, target-specific prefixes, update-only operation, stale-check verification, and stable LLVM value abstractions. Small handwritten checks remain manual. * [ssadump](chore/ssadump): It is a Go SSA builder and interpreter. For local workflows and test-golden refresh commands, see [dev/README.md](dev/README.md#6-refresh-test-goldens). diff --git a/chore/gentests/gentests.go b/chore/gentests/gentests.go index c306925bf3..4c96fd4d59 100644 --- a/chore/gentests/gentests.go +++ b/chore/gentests/gentests.go @@ -24,8 +24,6 @@ import ( "github.com/goplus/llgo/cl/cltest" "github.com/goplus/llgo/internal/build" - "github.com/goplus/llgo/internal/littest" - "github.com/goplus/llgo/internal/llgen" "github.com/goplus/llgo/internal/lto" "github.com/goplus/llgo/xtool/env/llvm" "github.com/goplus/mod" @@ -36,38 +34,11 @@ func main() { dir, _, err := mod.FindGoMod(".") check(err) - llgenDir(dir + "/cl/_testlibc") - llgenDir(dir + "/cl/_testlibgo") - llgenDir(dir + "/cl/_testrt") - llgenDir(dir + "/cl/_testgo") - llgenDir(dir + "/cl/_testpy") - llgenDir(dir + "/cl/_testdata") genMetaDir(dir + "/cl/_testmeta") genExpects(dir) } -func llgenDir(dir string) { - fis, err := os.ReadDir(dir) - check(err) - for _, fi := range fis { - name := fi.Name() - if !fi.IsDir() || strings.HasPrefix(name, "_") { - continue - } - testDir := dir + "/" + name - skip, err := dirHasLITTESTSource(testDir) - check(err) - if skip { - fmt.Fprintln(os.Stderr, "skip llgen", testDir, "(// LITTEST)") - continue - } - fmt.Fprintln(os.Stderr, "llgen", testDir) - check(os.Chdir(testDir)) - llgen.SmartDoFile(testDir) - } -} - func genExpects(root string) { runExpectDir(root, "cl/_testlibc") runExpectDir(root, "cl/_testlibgo") @@ -150,11 +121,3 @@ func check(err error) { panic(err) } } - -func dirHasLITTESTSource(dir string) (bool, error) { - _, ok, err := littest.FindMarkedSourceFile(dir) - if err != nil { - return false, err - } - return ok, nil -} diff --git a/chore/gentests/gentests_test.go b/chore/gentests/gentests_test.go deleted file mode 100644 index 4a212969fc..0000000000 --- a/chore/gentests/gentests_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "os" - "path/filepath" - "testing" -) - -func TestDirHasLITTESTSource(t *testing.T) { - dir := t.TempDir() - if err := os.WriteFile(filepath.Join(dir, "in.go"), []byte("// LITTEST\npackage main\n"), 0644); err != nil { - t.Fatal(err) - } - ok, err := dirHasLITTESTSource(dir) - if err != nil { - t.Fatal(err) - } - if !ok { - t.Fatal("dirHasLITTESTSource = false, want true") - } -} - -func TestDirHasLITTESTSource_IgnoresUnmarkedFiles(t *testing.T) { - dir := t.TempDir() - if err := os.WriteFile(filepath.Join(dir, "in.go"), []byte("package main\n"), 0644); err != nil { - t.Fatal(err) - } - ok, err := dirHasLITTESTSource(dir) - if err != nil { - t.Fatal(err) - } - if ok { - t.Fatal("dirHasLITTESTSource = true, want false") - } -} diff --git a/chore/litgen/litgen.go b/chore/litgen/litgen.go index 34d51fe437..a9731da003 100644 --- a/chore/litgen/litgen.go +++ b/chore/litgen/litgen.go @@ -17,19 +17,55 @@ package main import ( + "errors" "flag" "fmt" "os" "path/filepath" + "regexp" + "sort" + "strings" "github.com/goplus/llgo/internal/littest" "github.com/goplus/llgo/xtool/env/llvm" ) +type stringListFlag []string + +func (v *stringListFlag) String() string { + return strings.Join(*v, ",") +} + +func (v *stringListFlag) Set(value string) error { + if value == "" { + return errors.New("empty function pattern") + } + *v = append(*v, value) + return nil +} + +type commandOptions struct { + updateOnly bool + check bool + allFuncs bool + functions stringListFlag + globals string + configFlags map[string]bool +} + +var errSkippedManual = errors.New("manual LITTEST is not autogenerated") + func main() { llvm.SetupPath() + var opts commandOptions + flag.BoolVar(&opts.updateOnly, "u", false, "update only tests already marked as autogenerated") + flag.BoolVar(&opts.updateOnly, "update-only", false, "update only tests already marked as autogenerated") + flag.BoolVar(&opts.check, "check", false, "check that autogenerated assertions are current without writing files") + flag.BoolVar(&opts.allFuncs, "all-functions", false, "generate assertions for every emitted function") + flag.Var(&opts.functions, "function", "generate assertions for functions matching this regular expression (repeatable)") + flag.StringVar(&opts.globals, "check-globals", "smart", "global assertion policy: none, smart, or all") flag.Usage = func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [...]\n", filepath.Base(os.Args[0])) + fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [flags] [...]\n", filepath.Base(os.Args[0])) flag.PrintDefaults() } flag.Parse() @@ -37,12 +73,39 @@ func main() { flag.Usage() os.Exit(2) } + opts.configFlags = make(map[string]bool) + flag.Visit(func(f *flag.Flag) { + opts.configFlags[f.Name] = true + }) + if opts.check { + opts.updateOnly = true + } + if err := opts.validate(); err != nil { + fatal(err) + } for _, arg := range flag.Args() { - fatal(processPath(arg)) + fatal(processPath(arg, opts)) + } +} + +func (o commandOptions) validate() error { + if o.allFuncs && len(o.functions) != 0 { + return errors.New("--all-functions and --function cannot be used together") + } + switch o.globals { + case "none", "smart", "all": + default: + return fmt.Errorf("invalid --check-globals value %q: want none, smart, or all", o.globals) + } + for _, pattern := range o.functions { + if _, err := regexp.Compile(pattern); err != nil { + return fmt.Errorf("invalid --function pattern %q: %w", pattern, err) + } } + return nil } -func processPath(path string) error { +func processPath(path string, opts commandOptions) error { abs, err := filepath.Abs(path) if err != nil { return err @@ -52,7 +115,7 @@ func processPath(path string) error { return err } if fi.IsDir() { - return processTree(abs) + return processTree(abs, opts) } if filepath.Ext(abs) != ".go" { return fmt.Errorf("%s: expected .go file or directory", abs) @@ -64,15 +127,30 @@ func processPath(path string) error { if !ok { return fmt.Errorf("%s: missing // LITTEST marker", abs) } + if opts.updateOnly { + autogenerated, err := isAutogeneratedSource(abs) + if err != nil { + return err + } + if !autogenerated { + fmt.Fprintln(os.Stderr, "skip", abs, "(manual LITTEST)") + return nil + } + } target, err := resolveTarget(abs, filepath.Dir(abs)) if err != nil { return err } fmt.Fprintln(os.Stderr, "litgen", target.sourceFile) - return generateFile(target) + err = generateFile(target, opts) + if errors.Is(err, errSkippedManual) && opts.updateOnly { + fmt.Fprintln(os.Stderr, "skip", target.sourceFile, "(manual LITTEST)") + return nil + } + return err } -func processTree(root string) error { +func processTree(root string, opts commandOptions) error { var targets []resolvedTarget err := filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error { if err != nil { @@ -81,9 +159,6 @@ func processTree(root string) error { if !d.IsDir() { return nil } - if path != root && len(d.Name()) > 0 && d.Name()[0] == '_' { - return filepath.SkipDir - } marked, found, err := littest.FindMarkedSourceFile(path) if err != nil { return err @@ -91,6 +166,15 @@ func processTree(root string) error { if !found { return nil } + if opts.updateOnly { + autogenerated, err := isAutogeneratedSource(marked) + if err != nil { + return err + } + if !autogenerated { + return nil + } + } target, err := resolveTarget(marked, path) if err != nil { return err @@ -104,15 +188,38 @@ func processTree(root string) error { if len(targets) == 0 { return fmt.Errorf("%s: no // LITTEST sources found", root) } + sort.Slice(targets, func(i, j int) bool { + return targets[i].sourceFile < targets[j].sourceFile + }) + processed := 0 for _, target := range targets { fmt.Fprintln(os.Stderr, "litgen", target.sourceFile) - if err := generateFile(target); err != nil { + if err := generateFile(target, opts); errors.Is(err, errSkippedManual) && opts.updateOnly { + fmt.Fprintln(os.Stderr, "skip", target.sourceFile, "(manual LITTEST)") + continue + } else if err != nil { return err } + processed++ + } + if processed == 0 { + return fmt.Errorf("%s: no autogenerated LITTEST sources found", root) } return nil } +func isAutogeneratedSource(path string) (bool, error) { + data, err := os.ReadFile(path) + if err != nil { + return false, err + } + _, autogenerated, err := parseAutogeneratedNote(string(data)) + if err != nil { + return false, fmt.Errorf("%s: %w", path, err) + } + return autogenerated, nil +} + func fatal(err error) { if err != nil { fmt.Fprintf(os.Stderr, "litgen: %v\n", err) diff --git a/chore/litgen/litgen_test.go b/chore/litgen/litgen_test.go index 75d9cd41e7..d1ce6601a7 100644 --- a/chore/litgen/litgen_test.go +++ b/chore/litgen/litgen_test.go @@ -3,10 +3,17 @@ package main import ( "os" "path/filepath" + "runtime" "strings" "testing" + + "github.com/goplus/llgo/internal/filecheck" ) +func hostSnapshotDirective() string { + return "// " + filecheck.TargetSnapshotPrefix(runtime.GOOS, runtime.GOARCH, "") +} + func TestProcessPath_SingleFileUsesContainingDir(t *testing.T) { wd, err := os.Getwd() if err != nil { @@ -27,7 +34,7 @@ func TestProcessPath_SingleFileUsesContainingDir(t *testing.T) { t.Fatal(err) } - if err := processPath(sourceFile); err != nil { + if err := processPath(sourceFile, commandOptions{allFuncs: true, globals: "smart"}); err != nil { t.Fatal(err) } @@ -39,7 +46,7 @@ func TestProcessPath_SingleFileUsesContainingDir(t *testing.T) { if strings.Contains(text, "command-line-arguments") { t.Fatalf("single-file mode should compile the containing package, got:\n%s", text) } - want := `// CHECK-LABEL: define void @main.main(){{.*}} {` + want := hostSnapshotDirective() + `-LABEL: define void @main.main(){{.*}} {` if !strings.Contains(text, want) { t.Fatalf("missing canonical main check:\n%s", text) } @@ -68,7 +75,7 @@ func TestProcessPath_UsesFlagsFileTarget(t *testing.T) { t.Fatal(err) } - if err := processPath(sourceFile); err != nil { + if err := processPath(sourceFile, commandOptions{allFuncs: true, globals: "smart"}); err != nil { t.Fatal(err) } @@ -77,10 +84,103 @@ func TestProcessPath_UsesFlagsFileTarget(t *testing.T) { t.Fatal(err) } text := string(data) - if !strings.Contains(text, "// CHECK-NEXT: switch i32") { + if !strings.Contains(text, "// TARGET-WASM-NEXT: switch i32") { t.Fatalf("litgen did not use the wasm target from flags.txt:\n%s", text) } if strings.Contains(text, "blockaddress") || strings.Contains(text, "indirectbr") { t.Fatalf("litgen generated native defer dispatch for a wasm target:\n%s", text) } } + +func TestProcessPath_UpdateOnlyPreservesManualChecks(t *testing.T) { + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + pkgDir, err := os.MkdirTemp(wd, "manual-") + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = os.RemoveAll(pkgDir) }) + path := filepath.Join(pkgDir, "in.go") + want := "// LITTEST\npackage main\n\n// CHECK: ret void\nfunc main() {}\n" + if err := os.WriteFile(path, []byte(want), 0644); err != nil { + t.Fatal(err) + } + if err := processPath(path, commandOptions{updateOnly: true, globals: "smart"}); err != nil { + t.Fatal(err) + } + got, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if string(got) != want { + t.Fatalf("manual checks changed:\n--- got ---\n%s--- want ---\n%s", got, want) + } +} + +func TestProcessPath_UpdateOnlyWalksUnderscoreSuites(t *testing.T) { + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + root, err := os.MkdirTemp(wd, "tree-") + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = os.RemoveAll(root) }) + pkgDir := filepath.Join(root, "_testgo", "generated") + if err := os.MkdirAll(pkgDir, 0755); err != nil { + t.Fatal(err) + } + path := filepath.Join(pkgDir, "in.go") + source := "// LITTEST\n// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=value --check-globals=none\npackage main\n\nfunc value() int { return 1 }\n" + if err := os.WriteFile(path, []byte(source), 0644); err != nil { + t.Fatal(err) + } + if err := processPath(root, commandOptions{updateOnly: true, globals: "smart"}); err != nil { + t.Fatal(err) + } + data, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(data), hostSnapshotDirective()+`-LABEL: define i64 @main.value(){{.*}} {`) { + t.Fatalf("underscore suite was not refreshed:\n%s", data) + } +} + +func TestProcessPath_CheckDetectsStaleGeneratedChecks(t *testing.T) { + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + pkgDir, err := os.MkdirTemp(wd, "check-") + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = os.RemoveAll(pkgDir) }) + path := filepath.Join(pkgDir, "in.go") + if err := os.WriteFile(path, []byte("// LITTEST\npackage main\n\nfunc value() int { return 1 }\n"), 0644); err != nil { + t.Fatal(err) + } + if err := processPath(path, commandOptions{functions: []string{"value"}, globals: "none"}); err != nil { + t.Fatal(err) + } + checkOpts := commandOptions{updateOnly: true, check: true, globals: "smart"} + if err := processPath(path, checkOpts); err != nil { + t.Fatalf("fresh generated checks reported stale: %v", err) + } + data, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + stale := strings.Replace(string(data), "return 1", "return 2", 1) + if err := os.WriteFile(path, []byte(stale), 0644); err != nil { + t.Fatal(err) + } + err = processPath(path, checkOpts) + if err == nil || !strings.Contains(err.Error(), "autogenerated assertions are stale") { + t.Fatalf("unexpected stale-check error: %v", err) + } +} diff --git a/chore/litgen/rewrite.go b/chore/litgen/rewrite.go index 6a3eeff002..a82b9d047b 100644 --- a/chore/litgen/rewrite.go +++ b/chore/litgen/rewrite.go @@ -17,6 +17,8 @@ package main import ( + "bytes" + "errors" "fmt" "go/ast" "go/format" @@ -31,6 +33,7 @@ import ( "sort" "strings" + "github.com/goplus/llgo/internal/filecheck" "github.com/goplus/llgo/internal/llgen" "github.com/goplus/mod" "golang.org/x/mod/modfile" @@ -59,39 +62,259 @@ type irFunction struct { lines []string } +type generationConfig struct { + allFunctions bool + functions []string + functionREs []*regexp.Regexp + checkGlobals string + checkPrefix string +} + +const ( + autogeneratedNote = "// NOTE: Assertions have been autogenerated by chore/litgen" + utcArgsKey = " UTC_ARGS:" + snapshotTargetsNote = "// NOTE: Autogenerated snapshot targets:" +) + var ( - defineQuotedRE = regexp.MustCompile(`^define\b.* @"([^"]+)"\(`) - definePlainRE = regexp.MustCompile(`^define\b.* @([^\s(]+)\(`) - globalQuotedRE = regexp.MustCompile(`^@"([^"]+)"\s*=`) - globalPlainRE = regexp.MustCompile(`^@([A-Za-z0-9$._-]+)\s*=`) - globalRefRE = regexp.MustCompile(`@"([^"]+)"|@([A-Za-z0-9$._-]+)`) - checkLineRE = regexp.MustCompile(`^\s*//\s*CHECK(?:-[A-Z]+)?:`) - debugMetaRE = regexp.MustCompile(`, ![A-Za-z0-9_.-]+ ![0-9]+`) - closureEnvRE = regexp.MustCompile(`(\s)(?:nest|swiftself)(\s)`) - numericNameRE = regexp.MustCompile(`^\d+$`) + defineQuotedRE = regexp.MustCompile(`^define\b.* @"([^"]+)"\(`) + definePlainRE = regexp.MustCompile(`^define\b.* @([^\s(]+)\(`) + globalQuotedRE = regexp.MustCompile(`^@"([^"]+)"\s*=`) + globalPlainRE = regexp.MustCompile(`^@([A-Za-z0-9$._-]+)\s*=`) + globalRefRE = regexp.MustCompile(`@"([^"]+)"|@([A-Za-z0-9$._-]+)`) + debugMetaRE = regexp.MustCompile(`, ![A-Za-z0-9_.-]+ ![0-9]+`) + closureEnvRE = regexp.MustCompile(`(\s)(?:nest|swiftself)(\s)`) + cgoSymbolHashRE = regexp.MustCompile(`_cgo_[0-9a-f]+_`) + numericNameRE = regexp.MustCompile(`^\d+$`) + predsCommentRE = regexp.MustCompile(`\s+; preds =.*$`) + checkDirectiveRE = regexp.MustCompile(`^// [A-Z0-9_-]+(?:-(?:EMPTY|LABEL|NEXT|SAME))?:`) + checkPrefixRE = regexp.MustCompile(`^[A-Z0-9_-]+$`) + numericGlobalRE = regexp.MustCompile(`@([0-9]+)\b`) + numericLocalRE = regexp.MustCompile(`%([0-9]+)\b`) + numericBlockRE = regexp.MustCompile(`_llgo_([0-9]+)\b`) ) -func generateFile(target resolvedTarget) error { +func generateFile(target resolvedTarget, opts commandOptions) error { data, err := os.ReadFile(target.sourceFile) if err != nil { return err } - cleaned := stripCheckDirectives(string(data)) - ir, err := genIR(target.genTarget) + cfg, autogenerated, err := generationConfigForSource(string(data), opts) + if err != nil { + return fmt.Errorf("%s: %w", target.sourceFile, err) + } + if !autogenerated && opts.updateOnly { + return errSkippedManual + } + generated, err := genIR(target.genTarget) if err != nil { return err } - updated, err := rewriteSource(cleaned, target.sourceFile, target.pkgPath, target.modulePath, ir) + cfg.checkPrefix = filecheck.TargetSnapshotPrefix(generated.GOOS, generated.GOARCH, generated.Target) + targets := snapshotTargets(string(data)) + expanded := expandTargetSnapshots(string(data), targets) + targets = appendUnique(targets, cfg.checkPrefix) + cleaned := stripCheckDirectives(expanded, cfg.checkPrefix) + cleaned = setAutogeneratedNote(cleaned, cfg) + cleaned = setSnapshotTargetsNote(cleaned, targets) + updated, err := rewriteSource(cleaned, target.sourceFile, target.pkgPath, target.modulePath, generated.Text, cfg) if err != nil { return err } + updated = mergeTargetSnapshots(updated, targets) formatted, err := format.Source([]byte(updated)) if err != nil { return fmt.Errorf("%s: gofmt failed: %w", target.sourceFile, err) } + if bytes.Equal(data, formatted) { + return nil + } + if opts.check { + return fmt.Errorf("%s: autogenerated assertions are stale", target.sourceFile) + } return writeFileAtomically(target.sourceFile, formatted, 0644) } +func generationConfigForSource(src string, opts commandOptions) (generationConfig, bool, error) { + embedded, autogenerated, err := parseAutogeneratedNote(src) + if err != nil { + return generationConfig{}, autogenerated, err + } + if !autogenerated && opts.updateOnly { + return generationConfig{}, false, nil + } + cfg := embedded + if !autogenerated { + cfg = generationConfig{ + allFunctions: opts.allFuncs, + functions: append([]string(nil), opts.functions...), + checkGlobals: opts.globals, + } + } + if opts.configFlags["all-functions"] || opts.configFlags["function"] { + cfg.allFunctions = opts.allFuncs + cfg.functions = append([]string(nil), opts.functions...) + } + if opts.configFlags["check-globals"] { + cfg.checkGlobals = opts.globals + } + if cfg.checkGlobals == "" { + cfg.checkGlobals = "smart" + } + if err := cfg.compile(); err != nil { + return generationConfig{}, autogenerated, err + } + return cfg, autogenerated, nil +} + +func (cfg *generationConfig) compile() error { + if cfg.allFunctions && len(cfg.functions) != 0 { + return fmt.Errorf("autogenerated arguments contain both --all-functions and --function") + } + if !cfg.allFunctions && len(cfg.functions) == 0 { + return fmt.Errorf("refusing to replace manual CHECK lines: pass --all-functions or at least one --function") + } + switch cfg.checkGlobals { + case "none", "smart", "all": + default: + return fmt.Errorf("invalid autogenerated --check-globals value %q", cfg.checkGlobals) + } + cfg.functionREs = cfg.functionREs[:0] + for _, pattern := range cfg.functions { + re, err := regexp.Compile("^(?:" + pattern + ")$") + if err != nil { + return fmt.Errorf("invalid autogenerated --function pattern %q: %w", pattern, err) + } + cfg.functionREs = append(cfg.functionREs, re) + } + return nil +} + +func parseAutogeneratedNote(src string) (generationConfig, bool, error) { + for _, line := range strings.Split(src, "\n") { + line = strings.TrimSpace(line) + if !strings.HasPrefix(line, autogeneratedNote) { + continue + } + cfg := generationConfig{checkGlobals: "smart"} + rest := strings.TrimSpace(strings.TrimPrefix(line, autogeneratedNote)) + if rest == "" { + return cfg, true, errors.New("autogenerated note is missing UTC_ARGS") + } + if !strings.HasPrefix(rest, strings.TrimSpace(utcArgsKey)) { + return cfg, true, fmt.Errorf("malformed autogenerated note %q", line) + } + args := strings.Fields(strings.TrimSpace(strings.TrimPrefix(rest, strings.TrimSpace(utcArgsKey)))) + for _, arg := range args { + switch { + case arg == "--all-functions": + cfg.allFunctions = true + case strings.HasPrefix(arg, "--function="): + pattern := strings.TrimPrefix(arg, "--function=") + if pattern == "" { + return cfg, true, errors.New("empty --function in autogenerated note") + } + cfg.functions = append(cfg.functions, pattern) + case strings.HasPrefix(arg, "--check-globals="): + cfg.checkGlobals = strings.TrimPrefix(arg, "--check-globals=") + default: + return cfg, true, fmt.Errorf("unsupported autogenerated argument %q", arg) + } + } + return cfg, true, nil + } + return generationConfig{}, false, nil +} + +func setAutogeneratedNote(src string, cfg generationConfig) string { + lines := strings.Split(strings.ReplaceAll(src, "\r\n", "\n"), "\n") + out := make([]string, 0, len(lines)+1) + for _, line := range lines { + if strings.HasPrefix(strings.TrimSpace(line), autogeneratedNote) { + continue + } + out = append(out, line) + } + note := autogeneratedNote + utcArgsKey + if cfg.allFunctions { + note += " --all-functions" + } else { + for _, pattern := range cfg.functions { + note += " --function=" + pattern + } + } + note += " --check-globals=" + cfg.checkGlobals + if len(out) == 0 { + return note + "\n" + } + out = append(out[:1], append([]string{note}, out[1:]...)...) + return strings.Join(out, "\n") +} + +func snapshotTargets(src string) []string { + var targets []string + for _, line := range strings.Split(src, "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, snapshotTargetsNote) { + for _, target := range strings.Fields(strings.TrimSpace(strings.TrimPrefix(line, snapshotTargetsNote))) { + targets = appendUnique(targets, target) + } + } + } + if len(targets) != 0 { + return targets + } + for _, line := range strings.Split(src, "\n") { + prefix, _, ok := splitCheckDirective(strings.TrimSpace(line)) + if ok && prefix != "CHECK" { + targets = appendUnique(targets, prefix) + } + } + return targets +} + +func setSnapshotTargetsNote(src string, targets []string) string { + lines := strings.Split(strings.ReplaceAll(src, "\r\n", "\n"), "\n") + out := make([]string, 0, len(lines)+1) + insertAt := -1 + for _, line := range lines { + trimmed := strings.TrimSpace(line) + if strings.HasPrefix(trimmed, snapshotTargetsNote) { + continue + } + out = append(out, line) + if strings.HasPrefix(trimmed, autogeneratedNote) { + insertAt = len(out) + } + } + if len(targets) == 0 { + return strings.Join(out, "\n") + } + note := snapshotTargetsNote + " " + strings.Join(targets, " ") + if insertAt < 0 { + insertAt = 1 + if insertAt > len(out) { + insertAt = len(out) + } + } + out = append(out, "") + copy(out[insertAt+1:], out[insertAt:]) + out[insertAt] = note + return strings.Join(out, "\n") +} + +func appendUnique(values []string, value string) []string { + if value == "" { + return values + } + for _, item := range values { + if item == value { + return values + } + } + return append(values, value) +} + func resolveTarget(sourceFile, genTarget string) (resolvedTarget, error) { pkgDir := filepath.Dir(sourceFile) root, goMod, err := mod.FindGoMod(pkgDir) @@ -115,7 +338,7 @@ func resolveTarget(sourceFile, genTarget string) (resolvedTarget, error) { }, nil } -func genIR(target string) (ret string, err error) { +func genIR(target string) (ret llgen.GeneratedIR, err error) { defer func() { if r := recover(); r != nil { switch v := r.(type) { @@ -129,7 +352,7 @@ func genIR(target string) (ret string, err error) { } } }() - return llgen.GenFrom(target), nil + return llgen.GenerateFrom(target), nil } func readModulePath(goMod string) (string, error) { @@ -155,7 +378,7 @@ func packagePath(modulePath, root, pkgDir string) (string, error) { return path.Join(modulePath, filepath.ToSlash(rel)), nil } -func rewriteSource(src, srcPath, pkgPath, modulePath, ir string) (string, error) { +func rewriteSource(src, srcPath, pkgPath, modulePath, ir string, cfg generationConfig) (string, error) { fset := token.NewFileSet() file, err := parser.ParseFile(fset, srcPath, src, parser.ParseComments) if err != nil { @@ -165,19 +388,22 @@ func rewriteSource(src, srcPath, pkgPath, modulePath, ir string) (string, error) anchors, topPos := collectAnchors(src, fset, file) injections := make(map[int][]string) - if globals := buildGlobalChecks(prog, modulePath); len(globals) != 0 { + generalizer := newIRGeneralizer() + if globals := buildGlobalChecks(prog, pkgPath, modulePath, cfg, generalizer); len(globals) != 0 { + globals = withCheckPrefix(globals, cfg.checkPrefix) injections[topPos] = append(injections[topPos], formatDirectiveBlock(indentAt(src, topPos), globals)) } eof := len(src) lastOffset := topPos for _, fn := range prog.funcs { - if shouldSkipFunctionCheck(fn.symbol) { + if shouldSkipFunctionCheck(fn.symbol) || !cfg.matchesFunction(fn.symbol, pkgPath) { continue } - lines := buildFunctionChecks(fn, modulePath) + lines := buildFunctionChecks(fn, modulePath, generalizer) if len(lines) == 0 { continue } + lines = withCheckPrefix(lines, cfg.checkPrefix) offset := eof if name, ok := trimPkgPrefix(fn.symbol, pkgPath); ok { if pos, found := anchors[name]; found { @@ -193,6 +419,30 @@ func rewriteSource(src, srcPath, pkgPath, modulePath, ir string) (string, error) return applyInjections(src, injections), nil } +func (cfg generationConfig) matchesFunction(symbol, pkgPath string) bool { + if cfg.allFunctions { + return true + } + candidates := []string{symbol} + if name, ok := trimPkgPrefix(symbol, pkgPath); ok { + candidates = append(candidates, name) + } + if strings.HasPrefix(symbol, "main.") { + candidates = append(candidates, strings.TrimPrefix(symbol, "main.")) + } + if dot := strings.LastIndex(symbol, "."); dot >= 0 && dot+1 < len(symbol) { + candidates = append(candidates, symbol[dot+1:]) + } + for _, re := range cfg.functionREs { + for _, candidate := range candidates { + if re.MatchString(candidate) { + return true + } + } + } + return false +} + func collectAnchors(src string, fset *token.FileSet, file *ast.File) (map[string]int, int) { anchors := make(map[string]int) counts := make(map[string]int) @@ -407,11 +657,14 @@ func extractGlobalSymbol(line string) (string, bool) { return "", false } -func buildGlobalChecks(prog irProgram, modulePath string) []string { +func buildGlobalChecks(prog irProgram, pkgPath, modulePath string, cfg generationConfig, generalizer *irGeneralizer) []string { + if cfg.checkGlobals == "none" { + return nil + } defs := make(map[string]string, len(prog.globals)) order := make([]string, 0, len(prog.globals)) for _, g := range prog.globals { - if !shouldCheckGlobal(g.symbol) { + if cfg.checkGlobals != "all" && !shouldCheckGlobal(g.symbol) { continue } defs[g.symbol] = g.line @@ -422,7 +675,7 @@ func buildGlobalChecks(prog irProgram, modulePath string) []string { } needed := make(map[string]bool) for _, fn := range prog.funcs { - if shouldSkipFunctionCheck(fn.symbol) { + if shouldSkipFunctionCheck(fn.symbol) || !cfg.matchesFunction(fn.symbol, pkgPath) { continue } for _, line := range fn.lines[1:] { @@ -435,30 +688,147 @@ func buildGlobalChecks(prog irProgram, modulePath string) []string { } var lines []string for _, symbol := range order { - if !needed[symbol] { + if cfg.checkGlobals == "smart" && !needed[symbol] { continue } - lines = append(lines, "// CHECK: {{^}}"+generalizeIRLine(defs[symbol], modulePath)+"{{$}}") + line := generalizeIRLine(defs[symbol], modulePath) + lines = append(lines, "// CHECK: {{^}}"+generalizer.generalizeGlobal(line)+"{{$}}") } return lines } -func buildFunctionChecks(fn irFunction, modulePath string) []string { +func buildFunctionChecks(fn irFunction, modulePath string, generalizer *irGeneralizer) []string { if len(fn.lines) == 0 { return nil } + generalizer.startFunction() lines := make([]string, 0, len(fn.lines)) - lines = append(lines, "// CHECK-LABEL: "+generalizeDefineLine(fn.lines[0], modulePath)) + define := generalizeDefineLine(fn.lines[0], modulePath) + lines = append(lines, generalizeFunctionHeader(define, generalizer)...) for _, line := range fn.lines[1:] { if strings.TrimSpace(line) == "" { lines = append(lines, "// CHECK-EMPTY:") continue } - lines = append(lines, "// CHECK-NEXT: "+generalizeIRLine(line, modulePath)) + line = generalizeIRLine(line, modulePath) + line = predsCommentRE.ReplaceAllString(line, "") + lines = append(lines, "// CHECK-NEXT: "+generalizer.generalizeFunctionLine(line)) } return lines } +// FileCheck forbids variable definitions and uses in CHECK-LABEL directives. +// Keep the function identity in CHECK-LABEL, capture numbered parameters in a +// following CHECK-SAME, and reuse those captures throughout the body. This is +// the same shape used by LLVM's update_*_test_checks.py scripts and preserves +// argument-to-body relationships in an autogenerated full-function snapshot. +func generalizeFunctionHeader(line string, generalizer *irGeneralizer) []string { + if !numericLocalRE.MatchString(line) { + return []string{"// CHECK-LABEL: " + generalizeFunctionLabel(line)} + } + open := functionArgsOpen(line) + if open < 0 { + return []string{"// CHECK-LABEL: " + generalizeFunctionLabel(line)} + } + label := generalizeFunctionLabel(line[:open+1]) + signature := generalizer.generalizeFunctionLine(line[open+1:]) + return []string{ + "// CHECK-LABEL: " + label, + "// CHECK-SAME: " + signature, + } +} + +func functionArgsOpen(line string) int { + if loc := defineQuotedRE.FindStringIndex(line); loc != nil { + return loc[1] - 1 + } + if loc := definePlainRE.FindStringIndex(line); loc != nil { + return loc[1] - 1 + } + return -1 +} + +func generalizeFunctionLabel(line string) string { + return rewriteOutsideQuotes(line, func(segment string) string { + segment = numericGlobalRE.ReplaceAllString(segment, `@{{[0-9]+}}`) + segment = numericBlockRE.ReplaceAllString(segment, `%_llgo_{{[0-9]+}}`) + return numericLocalRE.ReplaceAllString(segment, `%{{[0-9]+}}`) + }) +} + +type irGeneralizer struct { + globals map[string]string + locals map[string]string + blocks map[string]string +} + +func newIRGeneralizer() *irGeneralizer { + return &irGeneralizer{globals: make(map[string]string)} +} + +func (g *irGeneralizer) startFunction() { + g.locals = make(map[string]string) + g.blocks = make(map[string]string) +} + +func (g *irGeneralizer) generalizeGlobal(line string) string { + return rewriteOutsideQuotes(line, func(segment string) string { + return replaceNumberedIRValues(segment, numericGlobalRE, "GLOB", "[0-9]+", g.globals) + }) +} + +func (g *irGeneralizer) generalizeFunctionLine(line string) string { + return rewriteOutsideQuotes(line, func(segment string) string { + segment = replaceNumberedIRValues(segment, numericGlobalRE, "GLOB", "[0-9]+", g.globals) + segment = replaceNumberedIRValues(segment, numericBlockRE, "BB", "[0-9]+", g.blocks) + return replaceNumberedIRValues(segment, numericLocalRE, "TMP", "[0-9]+", g.locals) + }) +} + +func replaceNumberedIRValues(segment string, re *regexp.Regexp, prefix, valueRE string, seen map[string]string) string { + return re.ReplaceAllStringFunc(segment, func(token string) string { + match := re.FindStringSubmatch(token) + if len(match) != 2 { + return token + } + number := match[1] + name, ok := seen[number] + if !ok { + name = prefix + number + seen[number] = name + return strings.Replace(token, number, "[["+name+":"+valueRE+"]]", 1) + } + return strings.Replace(token, number, "[["+name+"]]", 1) + }) +} + +func rewriteOutsideQuotes(line string, rewrite func(string) string) string { + var out strings.Builder + start := 0 + inQuote := false + for i := 0; i < len(line); i++ { + if line[i] != '"' || isEscapedQuote(line, i) { + continue + } + if !inQuote { + out.WriteString(rewrite(line[start:i])) + out.WriteByte('"') + start = i + 1 + inQuote = true + continue + } + out.WriteString(line[start : i+1]) + start = i + 1 + inQuote = false + } + if inQuote { + out.WriteString(line[start:]) + } else { + out.WriteString(rewrite(line[start:])) + } + return out.String() +} + func generalizeDefineLine(line, modulePath string) string { line = scrubIRLine(line) if idx := strings.LastIndex(line, " {"); idx >= 0 { @@ -477,6 +847,8 @@ func generalizeIRLine(line, modulePath string) string { func scrubIRLine(line string) string { line = debugMetaRE.ReplaceAllString(line, "") line = generalizeClosureEnvAttrs(line) + line = cgoSymbolHashRE.ReplaceAllString(line, `_cgo_{{[0-9a-f]+}}_`) + line = strings.ReplaceAll(line, `[[`, `{{\[\[}}`) return strings.TrimRight(line, " \t") } @@ -589,11 +961,26 @@ func applyInjections(src string, injections map[int][]string) string { out := src for _, offset := range offsets { block := strings.Join(injections[offset], "") + if checkDirectiveImmediatelyPrecedes(src, offset) { + block = "\n" + block + } out = out[:offset] + block + out[offset:] } return out } +func checkDirectiveImmediatelyPrecedes(src string, offset int) bool { + if offset <= 0 || offset > len(src) || strings.HasSuffix(src[:offset], "\n\n") { + return false + } + end := offset + if src[end-1] == '\n' { + end-- + } + start := strings.LastIndexByte(src[:end], '\n') + 1 + return checkDirectiveRE.MatchString(strings.TrimSpace(src[start:end])) +} + func formatDirectiveBlock(indent string, lines []string) string { var b strings.Builder for _, line := range lines { @@ -605,7 +992,339 @@ func formatDirectiveBlock(indent string, lines []string) string { return b.String() } -func stripCheckDirectives(src string) string { +func withCheckPrefix(lines []string, prefix string) []string { + if prefix == "" || prefix == "CHECK" { + return lines + } + out := make([]string, len(lines)) + for i, line := range lines { + out[i] = strings.Replace(line, "// CHECK", "// "+prefix, 1) + } + return out +} + +func expandTargetSnapshots(src string, targets []string) string { + if len(targets) == 0 { + return src + } + return rewriteDirectiveRegions(src, func(lines []string) []string { + sequences := directiveSequences(lines, targets) + var out []string + for _, target := range targets { + sequence := sequences[target] + if len(sequence) == 0 { + continue + } + if len(out) != 0 { + out = append(out, "") + } + for _, line := range sequence { + out = append(out, targetDirective(line, target)) + } + } + return out + }) +} + +func mergeTargetSnapshots(src string, targets []string) string { + if len(targets) == 0 { + return src + } + type snapshotSection struct { + position int + indent string + order int + byTarget map[string][]string + } + sections := make(map[string]*snapshotSection) + current := make(map[string]string, len(targets)) + var targetSet = make(map[string]bool, len(targets)) + for _, target := range targets { + targetSet[target] = true + current[target] = "@globals" + } + lines := strings.Split(strings.ReplaceAll(src, "\r\n", "\n"), "\n") + base := make([]string, 0, len(lines)) + sectionOrder := 0 + for _, line := range lines { + prefix, canonical, ok := splitCheckDirective(strings.TrimSpace(line)) + if !ok || (!targetSet[prefix] && prefix != "CHECK") { + base = append(base, line) + continue + } + indent := line[:len(line)-len(strings.TrimLeft(line, " \t"))] + activeTargets := targets + if prefix != "CHECK" { + activeTargets = []string{prefix} + } + for _, target := range activeTargets { + key := current[target] + if strings.HasPrefix(canonical, "// CHECK-LABEL:") { + key = directiveFunctionIdentity(canonical) + current[target] = key + } + section := sections[key] + if section == nil { + section = &snapshotSection{ + position: len(base), + indent: indent, + order: sectionOrder, + byTarget: make(map[string][]string, len(targets)), + } + sectionOrder++ + sections[key] = section + } else if len(base) < section.position { + section.position = len(base) + section.indent = indent + } + section.byTarget[target] = append(section.byTarget[target], canonical) + } + } + + ordered := make([]*snapshotSection, 0, len(sections)) + for _, section := range sections { + ordered = append(ordered, section) + } + sort.SliceStable(ordered, func(i, j int) bool { + if ordered[i].position != ordered[j].position { + return ordered[i].position < ordered[j].position + } + return ordered[i].order < ordered[j].order + }) + offset := 0 + for _, section := range ordered { + merged := mergeSnapshotSection(section.byTarget, targets) + if len(merged) == 0 { + continue + } + block := make([]string, 0, len(merged)+1) + for _, line := range merged { + if line == "" { + block = append(block, "") + } else { + block = append(block, section.indent+line) + } + } + block = append(block, "") + at := section.position + offset + base = append(base, make([]string, len(block))...) + copy(base[at+len(block):], base[at:len(base)-len(block)]) + copy(base[at:], block) + offset += len(block) + } + return strings.Join(collapseBlankLines(base), "\n") +} + +func directiveFunctionIdentity(label string) string { + line := strings.TrimSpace(strings.TrimPrefix(label, "// CHECK-LABEL:")) + if symbol := extractDefineSymbol(line); symbol != "" { + return "@function:" + symbol + } + return "@label:" + line +} + +func mergeSnapshotSection(sequences map[string][]string, targets []string) []string { + active := make([]string, 0, len(targets)) + for _, target := range targets { + if len(sequences[target]) != 0 { + active = append(active, target) + } + } + switch len(active) { + case 0: + return nil + case 1: + out := make([]string, len(sequences[active[0]])) + for i, line := range sequences[active[0]] { + out[i] = targetDirective(line, active[0]) + } + return out + case 2: + return mergeDirectiveSequences(sequences[active[0]], active[0], sequences[active[1]], active[1]) + default: + var out []string + for _, target := range active { + if len(out) != 0 { + out = append(out, "") + } + for _, line := range sequences[target] { + out = append(out, targetDirective(line, target)) + } + } + return out + } +} + +func collapseBlankLines(lines []string) []string { + out := lines[:0] + for _, line := range lines { + if line == "" && len(out) != 0 && out[len(out)-1] == "" { + continue + } + out = append(out, line) + } + return out +} + +func rewriteDirectiveRegions(src string, rewrite func([]string) []string) string { + newline := "\n" + if strings.Contains(src, "\r\n") { + newline = "\r\n" + } + lines := strings.Split(strings.ReplaceAll(src, "\r\n", "\n"), "\n") + out := make([]string, 0, len(lines)) + for i := 0; i < len(lines); { + if _, _, ok := splitCheckDirective(strings.TrimSpace(lines[i])); !ok { + out = append(out, lines[i]) + i++ + continue + } + start := i + indent := lines[i][:len(lines[i])-len(strings.TrimLeft(lines[i], " \t"))] + for i < len(lines) { + trimmed := strings.TrimSpace(lines[i]) + if trimmed == "" { + i++ + continue + } + if _, _, ok := splitCheckDirective(trimmed); !ok { + break + } + i++ + } + rewritten := rewrite(lines[start:i]) + for _, line := range rewritten { + if line == "" { + out = append(out, "") + } else { + out = append(out, indent+line) + } + } + if i < len(lines) && (len(out) == 0 || out[len(out)-1] != "") { + out = append(out, "") + } + } + return strings.Join(out, newline) +} + +func directiveSequences(lines, targets []string) map[string][]string { + sequences := make(map[string][]string, len(targets)) + for _, line := range lines { + prefix, canonical, ok := splitCheckDirective(strings.TrimSpace(line)) + if !ok { + continue + } + if prefix == "CHECK" { + for _, target := range targets { + sequences[target] = append(sequences[target], canonical) + } + continue + } + for _, target := range targets { + if prefix == target { + sequences[target] = append(sequences[target], canonical) + break + } + } + } + return sequences +} + +func splitCheckDirective(line string) (prefix, canonical string, ok bool) { + if !strings.HasPrefix(line, "// ") { + return "", "", false + } + colon := strings.IndexByte(line, ':') + if colon < 0 { + return "", "", false + } + head := strings.TrimPrefix(line[:colon], "// ") + suffix := "" + for _, candidate := range []string{"-EMPTY", "-LABEL", "-NEXT", "-SAME", "-DAG", "-NOT"} { + if strings.HasSuffix(head, candidate) { + suffix = candidate + head = strings.TrimSuffix(head, candidate) + break + } + } + if head == "NOTE" || !checkPrefixRE.MatchString(head) { + return "", "", false + } + return head, "// CHECK" + suffix + line[colon:], true +} + +func targetDirective(line, target string) string { + if target == "CHECK" { + return line + } + return strings.Replace(line, "// CHECK", "// "+target, 1) +} + +func mergeDirectiveSequences(a []string, aTarget string, b []string, bTarget string) []string { + matches := longestCommonDirectiveSubsequence(a, b) + var out []string + ai, bi := 0, 0 + emitVariant := func(lines []string, target string) { + for _, line := range lines { + out = append(out, targetDirective(line, target)) + } + } + for _, match := range matches { + emitVariant(a[ai:match[0]], aTarget) + emitVariant(b[bi:match[1]], bTarget) + out = append(out, a[match[0]]) + ai, bi = match[0]+1, match[1]+1 + } + emitVariant(a[ai:], aTarget) + emitVariant(b[bi:], bTarget) + return out +} + +func longestCommonDirectiveSubsequence(a, b []string) [][2]int { + dp := make([][]int, len(a)+1) + for i := range dp { + dp[i] = make([]int, len(b)+1) + } + for i := len(a) - 1; i >= 0; i-- { + for j := len(b) - 1; j >= 0; j-- { + if a[i] == b[j] { + dp[i][j] = dp[i+1][j+1] + 1 + } else if dp[i+1][j] >= dp[i][j+1] { + dp[i][j] = dp[i+1][j] + } else { + dp[i][j] = dp[i][j+1] + } + } + } + matches := make([][2]int, 0, dp[0][0]) + for i, j := 0, 0; i < len(a) && j < len(b); { + switch { + case a[i] == b[j]: + matches = append(matches, [2]int{i, j}) + i++ + j++ + case dp[i+1][j] >= dp[i][j+1]: + i++ + default: + j++ + } + } + return matches +} + +func separateDirectiveLabels(lines []string) []string { + out := make([]string, 0, len(lines)+8) + for _, line := range lines { + _, canonical, ok := splitCheckDirective(line) + if ok && strings.HasPrefix(canonical, "// CHECK-LABEL:") && len(out) != 0 && out[len(out)-1] != "" { + out = append(out, "") + } + out = append(out, line) + } + return out +} + +func stripCheckDirectives(src, prefix string) string { src = strings.ReplaceAll(src, "\r\n", "\n") lines := strings.SplitAfter(src, "\n") if len(lines) == 0 { @@ -613,8 +1332,8 @@ func stripCheckDirectives(src string) string { } out := make([]string, 0, len(lines)) for _, line := range lines { - trimmed := strings.TrimRight(line, "\n") - if checkLineRE.MatchString(trimmed) { + trimmed := strings.TrimSpace(strings.TrimRight(line, "\n")) + if isGeneratedDirective(trimmed, "CHECK") || isGeneratedDirective(trimmed, prefix) { continue } out = append(out, line) @@ -622,6 +1341,18 @@ func stripCheckDirectives(src string) string { return strings.Join(out, "") } +func isGeneratedDirective(line, prefix string) bool { + if prefix == "" { + return false + } + for _, suffix := range []string{"", "-EMPTY", "-LABEL", "-NEXT", "-SAME"} { + if strings.HasPrefix(line, "// "+prefix+suffix+":") { + return true + } + } + return false +} + func lineStart(src string, offset int) int { if offset < 0 { return 0 diff --git a/chore/litgen/rewrite_test.go b/chore/litgen/rewrite_test.go index c81afe563a..fc23a950ea 100644 --- a/chore/litgen/rewrite_test.go +++ b/chore/litgen/rewrite_test.go @@ -1,10 +1,13 @@ package main import ( + "go/format" "strings" "testing" ) +var testGenerationConfig = generationConfig{allFunctions: true, checkGlobals: "smart"} + func TestRewriteSource_InsertsMainAndClosure(t *testing.T) { const src = `// LITTEST package main @@ -26,7 +29,7 @@ _llgo_0: } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } @@ -77,7 +80,7 @@ _llgo_0: ret void } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } @@ -124,13 +127,14 @@ _llgo_0: ret void } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } - addCheck := `// CHECK-LABEL: define i64 @"{{.*}}/p.add"(i64 %0, i64 %1){{.*}} {` + addCheck := `// CHECK-LABEL: define i64 @"{{.*}}/p.add"(` + addSame := `// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} {` initCheck := `// CHECK-LABEL: define void @"{{.*}}/p.init"(){{.*}} {` - if strings.Index(got, addCheck) < 0 || strings.Index(got, initCheck) < 0 { + if strings.Index(got, addCheck) < 0 || strings.Index(got, addSame) < 0 || strings.Index(got, initCheck) < 0 { t.Fatalf("missing checks:\n%s", got) } if strings.Index(got, addCheck) > strings.Index(got, initCheck) { @@ -155,20 +159,20 @@ _llgo_0: ret void } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } - if !strings.Contains(got, `// CHECK: {{^}}@0 = private unnamed_addr constant [4 x i8] c"Hi\0A\00", align 1{{$}}`) { + if !strings.Contains(got, `// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"Hi\0A\00", align 1{{$}}`) { t.Fatalf("missing numeric global @0:\n%s", got) } - if !strings.Contains(got, `// CHECK: {{^}}@1 = private unnamed_addr constant [3 x i8] c"%s\00", align 1{{$}}`) { + if !strings.Contains(got, `// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [3 x i8] c"%s\00", align 1{{$}}`) { t.Fatalf("missing numeric global @1:\n%s", got) } if strings.Contains(got, `// CHECK: {{^}}@"{{.*}}/p.named" = global i64 1{{$}}`) { t.Fatalf("named globals should not be emitted by default:\n%s", got) } - if strings.Index(got, `// CHECK: {{^}}@0 = private unnamed_addr constant [4 x i8] c"Hi\0A\00", align 1{{$}}`) > strings.Index(got, "func main()") { + if strings.Index(got, `// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"Hi\0A\00", align 1{{$}}`) > strings.Index(got, "func main()") { t.Fatalf("global checks should be placed before first declaration:\n%s", got) } } @@ -198,7 +202,7 @@ _llgo_0: ret double %1 } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } @@ -207,16 +211,17 @@ package main import _ "unsafe" -// CHECK: {{^}}@0 = private unnamed_addr constant [4 x i8] c"sqrt"{{$}} +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"sqrt"{{$}} //go:linkname cSqrt C.sqrt func cSqrt(float64) float64 -// CHECK-LABEL: define double @"{{.*}}/p.callSqrt"(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr @0) -// CHECK-NEXT: %1 = call double @sqrt(double %0) -// CHECK-NEXT: ret double %1 +// CHECK-LABEL: define double @"{{.*}}/p.callSqrt"( +// CHECK-SAME: double %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr @[[GLOB0]]) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call double @sqrt(double %[[TMP0]]) +// CHECK-NEXT: ret double %[[TMP1]] // CHECK-NEXT: } func callSqrt(x float64) float64 { @@ -297,7 +302,7 @@ var ( } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := rewriteSource(test.src, "in.go", "example.com/p", "example.com", test.ir) + got, err := rewriteSource(test.src, "in.go", "example.com/p", "example.com", test.ir, testGenerationConfig) if err != nil { t.Fatal(err) } @@ -335,7 +340,7 @@ _llgo_0: ret i64 2 } ` - got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir) + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, testGenerationConfig) if err != nil { t.Fatal(err) } @@ -389,6 +394,24 @@ func TestGeneralizeClosureEnvAttrs(t *testing.T) { } } +func TestScrubIRLineGeneralizesCgoSymbolHash(t *testing.T) { + line := ` %0 = load ptr, ptr @main._cgo_96608f8de8c8_Cfunc__Cmalloc, align 8` + got := scrubIRLine(line) + want := ` %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc__Cmalloc, align 8` + if got != want { + t.Fatalf("scrubIRLine = %q, want %q", got, want) + } +} + +func TestScrubIRLineEscapesFileCheckVariableSyntax(t *testing.T) { + line := ` call void @"main.(*Slice[[]int,int]).Append"()` + got := scrubIRLine(line) + want := ` call void @"main.(*Slice{{\[\[}}]int,int]).Append"()` + if got != want { + t.Fatalf("scrubIRLine = %q, want %q", got, want) + } +} + func TestGeneralizeModulePath_ReplacesOnlyQuotedSegments(t *testing.T) { line := ` %0 = getelementptr inbounds %"go/example.Type", ptr @"go/example.fn"` got := generalizeModulePath(line, "go") @@ -406,3 +429,255 @@ func TestGeneralizeModulePath_IgnoresEscapedQuotes(t *testing.T) { t.Fatalf("generalizeModulePath = %q, want %q", got, want) } } + +func TestGenerationConfigForSourceProtectsManualChecks(t *testing.T) { + _, autogenerated, err := generationConfigForSource("// LITTEST\npackage main\n", commandOptions{globals: "smart"}) + if autogenerated { + t.Fatal("manual source reported as autogenerated") + } + if err == nil || !strings.Contains(err.Error(), "refusing to replace manual CHECK lines") { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestGenerationConfigForSourceUsesEmbeddedArguments(t *testing.T) { + src := `// LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run(?:\$[0-9]+)? --check-globals=none +package main +` + cfg, autogenerated, err := generationConfigForSource(src, commandOptions{globals: "smart"}) + if err != nil { + t.Fatal(err) + } + if !autogenerated { + t.Fatal("autogenerated note was not detected") + } + if cfg.allFunctions || len(cfg.functions) != 1 || cfg.functions[0] != `run(?:\$[0-9]+)?` { + t.Fatalf("unexpected function config: %+v", cfg) + } + if cfg.checkGlobals != "none" { + t.Fatalf("checkGlobals = %q, want none", cfg.checkGlobals) + } + if !cfg.matchesFunction("main.run$1", "example.com/p") || cfg.matchesFunction("main.main", "example.com/p") { + t.Fatalf("embedded function filter does not select only run closures") + } +} + +func TestSetAutogeneratedNoteIsCanonicalAndIdempotent(t *testing.T) { + cfg := generationConfig{functions: []string{"run", `run\$1`}, checkGlobals: "smart"} + src := "// LITTEST\n// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --all-functions --check-globals=all\npackage main\n" + wantNote := "// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --function=run\\$1 --check-globals=smart" + got := setAutogeneratedNote(src, cfg) + if strings.Count(got, autogeneratedNote) != 1 || !strings.Contains(got, wantNote) { + t.Fatalf("unexpected autogenerated note:\n%s", got) + } + if again := setAutogeneratedNote(got, cfg); again != got { + t.Fatalf("setAutogeneratedNote is not idempotent:\n--- first ---\n%s--- second ---\n%s", got, again) + } +} + +func TestStripCheckDirectivesPreservesOtherTargetSnapshots(t *testing.T) { + src := `// LITTEST +// CHECK-LABEL: legacy +// DARWIN-ARM64-LABEL: darwin +// DARWIN-ARM64-NEXT: darwin body +// LINUX-AMD64-LABEL: linux +// LINUX-AMD64-NEXT: linux body +package main +` + got := stripCheckDirectives(src, "DARWIN-ARM64") + if strings.Contains(got, "legacy") || strings.Contains(got, "darwin") { + t.Fatalf("active or legacy directives were preserved:\n%s", got) + } + if !strings.Contains(got, "LINUX-AMD64-LABEL: linux") || !strings.Contains(got, "LINUX-AMD64-NEXT: linux body") { + t.Fatalf("other target snapshot was removed:\n%s", got) + } +} + +func TestRewriteSourceUsesConfiguredPrefix(t *testing.T) { + const src = "// LITTEST\npackage main\n\nfunc main() {}\n" + const ir = "define void @main.main() {\n_llgo_0:\n ret void\n}\n" + cfg := testGenerationConfig + cfg.checkPrefix = "LINUX-AMD64" + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, cfg) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(got, "// LINUX-AMD64-LABEL:") || strings.Contains(got, "// CHECK-LABEL:") { + t.Fatalf("configured prefix was not applied:\n%s", got) + } +} + +func TestRewriteSourceTargetSnapshotsAreIdempotent(t *testing.T) { + const src = `// LITTEST +package main + +// DARWIN-ARM64-LABEL: define void @main.main(){{.*}} { +// DARWIN-ARM64-NEXT: entry: +// DARWIN-ARM64-NEXT: ret void +// DARWIN-ARM64-NEXT: } + +func main() {} +` + const ir = `define void @"example.com/p.main"() { +entry: + ret void +} +` + cfg := testGenerationConfig + cfg.checkPrefix = "LINUX-AMD64" + rewrite := func(input string) string { + t.Helper() + cleaned := stripCheckDirectives(input, cfg.checkPrefix) + got, err := rewriteSource(cleaned, "in.go", "example.com/p", "example.com", ir, cfg) + if err != nil { + t.Fatal(err) + } + formatted, err := format.Source([]byte(got)) + if err != nil { + t.Fatal(err) + } + return string(formatted) + } + first := rewrite(src) + if !strings.Contains(first, "// DARWIN-ARM64-NEXT: }\n\n// LINUX-AMD64-LABEL:") { + t.Fatalf("target snapshots are not separated:\n%s", first) + } + if second := rewrite(first); second != first { + t.Fatalf("target rewrite is not idempotent:\n--- first ---\n%s--- second ---\n%s", first, second) + } +} + +func TestMergeTargetSnapshotsKeepsOnlyDifferencesTargetSpecific(t *testing.T) { + const src = `// LITTEST +// DARWIN-ARM64-LABEL: define void @main.f( +// DARWIN-ARM64-SAME: [2 x i64] %[[TMP0:[0-9]+]]){{.*}} { +// DARWIN-ARM64-NEXT: entry: +// DARWIN-ARM64-NEXT: call void @common() +// DARWIN-ARM64-NEXT: ret void +// DARWIN-ARM64-NEXT: } + +// LINUX-AMD64-LABEL: define void @main.f( +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-NEXT: entry: +// LINUX-AMD64-NEXT: call void @common() +// LINUX-AMD64-NEXT: ret void +// LINUX-AMD64-NEXT: } + +package main +` + got := mergeTargetSnapshots(src, []string{"DARWIN-ARM64", "LINUX-AMD64"}) + for _, common := range []string{ + "// CHECK-LABEL: define void @main.f(", + "// CHECK-NEXT: entry:", + "// CHECK-NEXT: call void @common()", + "// CHECK-NEXT: ret void", + "// CHECK-NEXT: }", + } { + if !strings.Contains(got, common) { + t.Fatalf("missing common directive %q:\n%s", common, got) + } + } + if !strings.Contains(got, "// DARWIN-ARM64-SAME: [2 x i64]") || + !strings.Contains(got, "// LINUX-AMD64-SAME: ptr") { + t.Fatalf("target-specific signatures were not preserved:\n%s", got) + } + expanded := expandTargetSnapshots(got, []string{"DARWIN-ARM64", "LINUX-AMD64"}) + if remixed := mergeTargetSnapshots(expanded, []string{"DARWIN-ARM64", "LINUX-AMD64"}); remixed != got { + t.Fatalf("merged snapshots are not idempotent:\n--- first ---\n%s--- second ---\n%s", got, remixed) + } +} + +func TestRewriteSourceFiltersFunctions(t *testing.T) { + const src = `// LITTEST +package main + +func keep() {} +func drop() {} +` + const ir = `define void @main.keep() { +_llgo_0: + ret void +} +define void @main.drop() { +_llgo_0: + ret void +} +` + cfg := generationConfig{functions: []string{"keep"}, checkGlobals: "none"} + if err := cfg.compile(); err != nil { + t.Fatal(err) + } + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, cfg) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(got, "@main.keep") || strings.Contains(got, "@main.drop") { + t.Fatalf("function filter mismatch:\n%s", got) + } +} + +func TestRewriteSourceSmartGlobalsFollowSelectedFunctions(t *testing.T) { + const src = `// LITTEST +package main + +func keep() {} +func drop() {} +` + const ir = `@0 = private unnamed_addr constant [4 x i8] c"keep" +@1 = private unnamed_addr constant [4 x i8] c"drop" + +define void @main.keep() { +_llgo_0: + call void @print(ptr @0) + ret void +} + +define void @main.drop() { +_llgo_0: + call void @print(ptr @1) + ret void +} +` + cfg := generationConfig{functions: []string{"keep"}, checkGlobals: "smart"} + if err := cfg.compile(); err != nil { + t.Fatal(err) + } + got, err := rewriteSource(src, "in.go", "example.com/p", "example.com", ir, cfg) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(got, `c"keep"`) { + t.Fatalf("selected function global is missing:\n%s", got) + } + if strings.Contains(got, `c"drop"`) { + t.Fatalf("unselected function global leaked into smart checks:\n%s", got) + } +} + +func TestIRGeneralizerAbstractsNumberingButNotStrings(t *testing.T) { + g := newIRGeneralizer() + g.startFunction() + lines := []string{ + `define void @main.f(i64 %0) {`, + `_llgo_0:`, + ` %1 = call ptr @use(i64 %0, ptr @12)`, + ` call void @print(ptr @12) ; text "%0 @12 _llgo_0"`, + ` br label %_llgo_0`, + } + var got []string + for _, line := range lines { + got = append(got, g.generalizeFunctionLine(line)) + } + joined := strings.Join(got, "\n") + for _, want := range []string{ + `%[[TMP0:[0-9]+]]`, `%[[TMP1:[0-9]+]]`, `%[[TMP0]]`, + `@[[GLOB12:[0-9]+]]`, `@[[GLOB12]]`, + `_llgo_[[BB0:[0-9]+]]`, `%_llgo_[[BB0]]`, + `"%0 @12 _llgo_0"`, + } { + if !strings.Contains(joined, want) { + t.Fatalf("generalized output missing %q:\n%s", want, joined) + } + } +} diff --git a/cl/_testdata/apkg/in.go b/cl/_testdata/apkg/in.go index f58cd7b276..b757c941a7 100644 --- a/cl/_testdata/apkg/in.go +++ b/cl/_testdata/apkg/in.go @@ -2,16 +2,10 @@ package apkg // CHECK-LABEL: define double @"{{.*}}.Max"(double %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp ogt double %0, %1 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1:{{.*}} -// CHECK-NEXT: ret double %0 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2:{{.*}} -// CHECK-NEXT: ret double %1 -// CHECK-NEXT: } +// CHECK: [[MAX_CHOOSE_A:%[0-9]+]] = fcmp ogt double %0, %1 +// CHECK-NEXT: br i1 [[MAX_CHOOSE_A]], label %{{.*}}, label %{{.*}} +// CHECK: ret double %0 +// CHECK: ret double %1 func Max(a, b float64) float64 { if a > b { return a diff --git a/cl/_testdata/cpkg/in.go b/cl/_testdata/cpkg/in.go index e0bfc6a625..fcd8a21af1 100644 --- a/cl/_testdata/cpkg/in.go +++ b/cl/_testdata/cpkg/in.go @@ -4,28 +4,22 @@ package C // CHECK: {{^}}@llvm.compiler.used = appending global [2 x ptr] [ptr @Double, ptr @add], section "llvm.metadata"{{$}} // CHECK-LABEL: define double @Double(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = fmul double 2.000000e+00, %0 -// CHECK-NEXT: ret double %1 -// CHECK-NEXT: } +// CHECK: [[DOUBLE_RESULT:%[0-9]+]] = fmul double 2.000000e+00, %0 +// CHECK-NEXT: ret double [[DOUBLE_RESULT]] func Double(x float64) float64 { return 2 * x } // CHECK-LABEL: define i64 @add(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call i64 @"{{.*}}.add"(i64 %0, i64 %1) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[XADD_RESULT:%[0-9]+]] = call i64 @"{{.*}}.add"(i64 %0, i64 %1) +// CHECK-NEXT: ret i64 [[XADD_RESULT]] func Xadd(a, b int) int { return add(a, b) } // CHECK-LABEL: define i64 @"{{.*}}.add"(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[ADD_RESULT:%[0-9]+]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[ADD_RESULT]] func add(a, b int) int { return a + b } diff --git a/cl/_testdata/cpkgimp/in.go b/cl/_testdata/cpkgimp/in.go index 0ccc1d1421..38aa203864 100644 --- a/cl/_testdata/cpkgimp/in.go +++ b/cl/_testdata/cpkgimp/in.go @@ -6,15 +6,10 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @add(i64 1, i64 2) -// CHECK-NEXT: %1 = call double @Double(double 3.140000e+00) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[SUM:%[0-9]+]] = call i64 @add(i64 1, i64 2) +// CHECK-NEXT: [[DOUBLE:%[0-9]+]] = call double @Double(double 3.140000e+00) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[SUM]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double [[DOUBLE]]) func main() { println(c.Xadd(1, 2), c.Double(3.14)) } diff --git a/cl/_testdata/debug/in.go b/cl/_testdata/debug/in.go index b91d822089..e790efe1eb 100644 --- a/cl/_testdata/debug/in.go +++ b/cl/_testdata/debug/in.go @@ -3,27 +3,52 @@ package main import "errors" -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"done", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"some error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"i is 0", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"i:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"a:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"i is 1", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"i is", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"b:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"i is 2", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"c:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"d:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [1 x i8] c"a", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [1 x i8] c"b", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"Test error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"globalInt:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"s:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [27 x i8] c"called function with struct", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"fn:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"fn error", align 1{{$}} +// This fixture protects debug-info relationships rather than metadata volume: +// representative rich fields must belong to the same composite type, function +// parameters to the same DISubprogram, and lexical variables to the correct +// nested scope. +// CHECK: ![[RICH:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "struct{i8 int8; i16 int16; i32 int32; i64 int64; i int;{{.*}}",{{.*}}elements: ![[RICH_FIELDS:[0-9]+]]) +// CHECK: ![[RICH_FIELDS]] = !{!{{[0-9]+}}{{.*}}} +// CHECK: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member, name: "i8", scope: ![[RICH]], +// CHECK: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member, name: "slice", scope: ![[RICH]], +// CHECK: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member, name: "fn", scope: ![[RICH]], +// CHECK: !{{[0-9]+}} = !DIDerivedType(tag: DW_TAG_member, name: "pad2", scope: ![[RICH]], + +// CHECK: ![[ALL_PARAMS:[0-9]+]] = distinct !DISubprogram(name: "main.FuncWithAllTypeParams", +// CHECK-DAG: !{{[0-9]+}} = !DILocalVariable(name: "i8", arg: 1, scope: ![[ALL_PARAMS]], +// CHECK-DAG: !{{[0-9]+}} = !DILocalVariable(name: "slice", arg: 16, scope: ![[ALL_PARAMS]], +// CHECK-DAG: !{{[0-9]+}} = !DILocalVariable(name: "arr", arg: 17, scope: ![[ALL_PARAMS]], +// CHECK-DAG: !{{[0-9]+}} = !DILocalVariable(name: "fn", arg: 28, scope: ![[ALL_PARAMS]], + +// A for-loop variable lives in the loop block, while a switch case nested in +// the loop has a three-level lexical chain back to the function. +// CHECK: ![[SCOPE_FOR:[0-9]+]] = distinct !DISubprogram(name: "main.ScopeFor", +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "i", scope: ![[FOR_LOOP:[0-9]+]], +// CHECK: ![[FOR_LOOP]] = distinct !DILexicalBlock(scope: ![[SCOPE_FOR]], +// CHECK: ![[CASE_ZERO:[0-9]+]] = distinct !DILexicalBlock(scope: ![[FOR_SWITCH:[0-9]+]], +// CHECK: ![[FOR_SWITCH]] = distinct !DILexicalBlock(scope: ![[FOR_BODY:[0-9]+]], +// CHECK: ![[FOR_BODY]] = distinct !DILexicalBlock(scope: ![[FOR_LOOP]], + +// The if/else branches share the condition scope but own distinct lexical +// blocks; same-named c variables must therefore have different scopes. +// CHECK: ![[SCOPE_IF:[0-9]+]] = distinct !DISubprogram(name: "main.ScopeIf", +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "b", scope: ![[IF_THEN:[0-9]+]], +// CHECK: ![[IF_THEN]] = distinct !DILexicalBlock(scope: ![[IF_CHAIN:[0-9]+]], +// CHECK: ![[IF_CHAIN]] = distinct !DILexicalBlock(scope: ![[SCOPE_IF]], +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "c", scope: ![[IF_THEN]], +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "c", scope: ![[IF_ELSE:[0-9]+]], +// CHECK: ![[IF_ELSE]] = distinct !DILexicalBlock(scope: ![[IF_CHAIN]], +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "d", scope: ![[IF_ELSE]], + +// Every switch arm has its own scope under one switch lexical block. +// CHECK: ![[SCOPE_SWITCH:[0-9]+]] = distinct !DISubprogram(name: "main.ScopeSwitch", +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "b", scope: ![[SWITCH_ONE:[0-9]+]], +// CHECK: ![[SWITCH_ONE]] = distinct !DILexicalBlock(scope: ![[SWITCH_BODY:[0-9]+]], +// CHECK: ![[SWITCH_BODY]] = distinct !DILexicalBlock(scope: ![[SCOPE_SWITCH]], +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "c", scope: ![[SWITCH_TWO:[0-9]+]], +// CHECK: ![[SWITCH_TWO]] = distinct !DILexicalBlock(scope: ![[SWITCH_BODY]], +// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "d", scope: ![[SWITCH_DEFAULT:[0-9]+]], +// CHECK: ![[SWITCH_DEFAULT]] = distinct !DILexicalBlock(scope: ![[SWITCH_BODY]], type Base struct { name string @@ -590,1332 +615,3 @@ func main() { var globalInt int = 301 var globalStruct StructWithAllTypeFields var globalStructPtr *StructWithAllTypeFields - -// CHECK-LABEL: define void @main.FuncStructParams(%main.TinyStruct %0, %main.SmallStruct %1, %main.MidStruct %2, %main.BigStruct %3){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %4 = alloca %main.TinyStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %4, i8 0, i64 8, i1 false) -// CHECK-NEXT: #dbg_declare(ptr %4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.TinyStruct %0, ptr %4, align 8 -// CHECK-NEXT: %5 = alloca %main.SmallStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 16, i1 false) -// CHECK-NEXT: #dbg_declare(ptr %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.SmallStruct %1, ptr %5, align 8 -// CHECK-NEXT: %6 = alloca %main.MidStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %6, i8 0, i64 24, i1 false) -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.MidStruct %2, ptr %6, align 8 -// CHECK-NEXT: %7 = alloca %main.BigStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %7, i8 0, i64 80, i1 false) -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.BigStruct %3, ptr %7, align 8 -// CHECK-NEXT: #dbg_declare(ptr %4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %8 = getelementptr inbounds %main.TinyStruct, ptr %4, i32 0, i32 0 -// CHECK-NEXT: %9 = load i64, ptr %8, align 8 -// CHECK-NEXT: #dbg_declare(ptr %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %10 = getelementptr inbounds %main.SmallStruct, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %11 = load i64, ptr %10, align 8 -// CHECK-NEXT: #dbg_declare(ptr %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %12 = getelementptr inbounds %main.SmallStruct, ptr %5, i32 0, i32 1 -// CHECK-NEXT: %13 = load i64, ptr %12, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %14 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 0 -// CHECK-NEXT: %15 = load i64, ptr %14, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %16 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 1 -// CHECK-NEXT: %17 = load i64, ptr %16, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %18 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 2 -// CHECK-NEXT: %19 = load i64, ptr %18, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %20 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 0 -// CHECK-NEXT: %21 = load i64, ptr %20, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %22 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 1 -// CHECK-NEXT: %23 = load i64, ptr %22, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %24 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 2 -// CHECK-NEXT: %25 = load i64, ptr %24, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %26 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 3 -// CHECK-NEXT: %27 = load i64, ptr %26, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %28 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 4 -// CHECK-NEXT: %29 = load i64, ptr %28, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %30 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 5 -// CHECK-NEXT: %31 = load i64, ptr %30, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %32 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 6 -// CHECK-NEXT: %33 = load i64, ptr %32, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %34 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 7 -// CHECK-NEXT: %35 = load i64, ptr %34, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %36 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 8 -// CHECK-NEXT: %37 = load i64, ptr %36, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %38 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 9 -// CHECK-NEXT: %39 = load i64, ptr %38, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %19) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %21) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %23) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %25) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %27) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %31) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %39) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %40 = getelementptr inbounds %main.TinyStruct, ptr %4, i32 0, i32 0 -// CHECK-NEXT: store i64 10, ptr %40, align 8 -// CHECK-NEXT: #dbg_declare(ptr %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %41 = getelementptr inbounds %main.SmallStruct, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store i64 20, ptr %41, align 8 -// CHECK-NEXT: #dbg_declare(ptr %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %42 = getelementptr inbounds %main.SmallStruct, ptr %5, i32 0, i32 1 -// CHECK-NEXT: store i64 21, ptr %42, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %43 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 0 -// CHECK-NEXT: store i64 40, ptr %43, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %44 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 1 -// CHECK-NEXT: store i64 41, ptr %44, align 8 -// CHECK-NEXT: #dbg_declare(ptr %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %45 = getelementptr inbounds %main.MidStruct, ptr %6, i32 0, i32 2 -// CHECK-NEXT: store i64 42, ptr %45, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %46 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 0 -// CHECK-NEXT: store i64 70, ptr %46, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %47 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 1 -// CHECK-NEXT: store i64 71, ptr %47, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %48 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 2 -// CHECK-NEXT: store i64 72, ptr %48, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %49 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 3 -// CHECK-NEXT: store i64 73, ptr %49, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %50 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 4 -// CHECK-NEXT: store i64 74, ptr %50, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %51 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 5 -// CHECK-NEXT: store i64 75, ptr %51, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %52 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 6 -// CHECK-NEXT: store i64 76, ptr %52, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %53 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 7 -// CHECK-NEXT: store i64 77, ptr %53, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %54 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 8 -// CHECK-NEXT: store i64 78, ptr %54, align 8 -// CHECK-NEXT: #dbg_declare(ptr %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %55 = getelementptr inbounds %main.BigStruct, ptr %7, i32 0, i32 9 -// CHECK-NEXT: store i64 79, ptr %55, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.FuncStructPtrParams(ptr %0, ptr %1, ptr %2, ptr %3){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(ptr %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(ptr %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %4 = getelementptr inbounds %main.TinyStruct, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 10, ptr %4, align 8 -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %5 = getelementptr inbounds %main.SmallStruct, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store i64 20, ptr %5, align 8 -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %6 = getelementptr inbounds %main.SmallStruct, ptr %1, i32 0, i32 1 -// CHECK-NEXT: store i64 21, ptr %6, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %7 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store i64 40, ptr %7, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %8 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 41, ptr %8, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %9 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 2 -// CHECK-NEXT: store i64 42, ptr %9, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %10 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 70, ptr %10, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %11 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 1 -// CHECK-NEXT: store i64 71, ptr %11, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %12 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 2 -// CHECK-NEXT: store i64 72, ptr %12, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %13 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 3 -// CHECK-NEXT: store i64 73, ptr %13, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %14 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 4 -// CHECK-NEXT: store i64 74, ptr %14, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %15 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 5 -// CHECK-NEXT: store i64 75, ptr %15, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %16 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 6 -// CHECK-NEXT: store i64 76, ptr %16, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %17 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 7 -// CHECK-NEXT: store i64 77, ptr %17, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %18 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 8 -// CHECK-NEXT: store i64 78, ptr %18, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %19 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 9 -// CHECK-NEXT: store i64 79, ptr %19, align 8 -// CHECK-NEXT: #dbg_value(ptr %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %20 = getelementptr inbounds %main.TinyStruct, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %21 = load i64, ptr %20, align 8 -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %22 = getelementptr inbounds %main.SmallStruct, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %23 = load i64, ptr %22, align 8 -// CHECK-NEXT: #dbg_value(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %24 = getelementptr inbounds %main.SmallStruct, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %25 = load i64, ptr %24, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %26 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %27 = load i64, ptr %26, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %28 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %29 = load i64, ptr %28, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %30 = getelementptr inbounds %main.MidStruct, ptr %2, i32 0, i32 2 -// CHECK-NEXT: %31 = load i64, ptr %30, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %32 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %33 = load i64, ptr %32, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %34 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 1 -// CHECK-NEXT: %35 = load i64, ptr %34, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %36 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 2 -// CHECK-NEXT: %37 = load i64, ptr %36, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %38 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 3 -// CHECK-NEXT: %39 = load i64, ptr %38, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %40 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 4 -// CHECK-NEXT: %41 = load i64, ptr %40, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %42 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 5 -// CHECK-NEXT: %43 = load i64, ptr %42, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %44 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 6 -// CHECK-NEXT: %45 = load i64, ptr %44, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %46 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 7 -// CHECK-NEXT: %47 = load i64, ptr %46, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %48 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 8 -// CHECK-NEXT: %49 = load i64, ptr %48, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %50 = getelementptr inbounds %main.BigStruct, ptr %3, i32 0, i32 9 -// CHECK-NEXT: %51 = load i64, ptr %50, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %21) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %23) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %25) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %27) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %31) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %39) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %41) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %43) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %51) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.FuncWithAllTypeParams(i8 %0, i16 %1, i32 %2, i64 %3, i64 %4, i8 %5, i16 %6, i32 %7, i64 %8, i64 %9, float %10, double %11, i1 %12, { float, float } %13, { double, double } %14, %"{{.*}}/runtime/internal/runtime.Slice" %15, [3 x i64] %16, [3 x %main.E] %17, %"{{.*}}/runtime/internal/runtime.String" %18, %main.E %19, %main.StructWithAllTypeFields %20, ptr %21, ptr %22, %"{{.*}}/runtime/internal/runtime.iface" %23, ptr %24, ptr %25, %"{{.*}}/runtime/internal/runtime.iface" %26, { ptr, ptr } %27){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(i8 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i8 %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %8, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %9, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(float %10, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(double %11, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i1 %12, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %28 = alloca { float, float }, align 8 -// CHECK-NEXT: store { float, float } %13, ptr %28, align 4 -// CHECK-NEXT: %29 = load { float, float }, ptr %28, align 4 -// CHECK-NEXT: #dbg_value(ptr %28, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %30 = alloca { double, double }, align 8 -// CHECK-NEXT: store { double, double } %14, ptr %30, align 8 -// CHECK-NEXT: %31 = load { double, double }, ptr %30, align 8 -// CHECK-NEXT: #dbg_value(ptr %30, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %32 = alloca { ptr, i64, i64 }, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %15, ptr %32, align 8 -// CHECK-NEXT: %33 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %32, align 8 -// CHECK-NEXT: #dbg_value(ptr %32, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %34 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %18, ptr %34, align 8 -// CHECK-NEXT: %35 = load %"{{.*}}/runtime/internal/runtime.String", ptr %34, align 8 -// CHECK-NEXT: #dbg_value(ptr %34, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %21, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %22, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %36 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %23, ptr %36, align 8 -// CHECK-NEXT: %37 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %36, align 8 -// CHECK-NEXT: #dbg_value(ptr %36, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %38 = alloca { i64, i8, i8, i16, i32, ptr, ptr, i64, ptr }, align 8 -// CHECK-NEXT: store ptr %24, ptr %38, align 8 -// CHECK-NEXT: %39 = load ptr, ptr %38, align 8 -// CHECK-NEXT: #dbg_value(ptr %38, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %40 = alloca ptr, align 8 -// CHECK-NEXT: store ptr %25, ptr %40, align 8 -// CHECK-NEXT: %41 = load ptr, ptr %40, align 8 -// CHECK-NEXT: #dbg_value(ptr %40, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %42 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %26, ptr %42, align 8 -// CHECK-NEXT: %43 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %42, align 8 -// CHECK-NEXT: #dbg_value(ptr %42, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %44 = alloca { ptr, ptr }, align 8 -// CHECK-NEXT: store { ptr, ptr } %27, ptr %44, align 8 -// CHECK-NEXT: %45 = load { ptr, ptr }, ptr %44, align 8 -// CHECK-NEXT: #dbg_value(ptr %44, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: #dbg_declare(ptr %46, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store [3 x i64] %16, ptr %46, align 8 -// CHECK-NEXT: %47 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: #dbg_declare(ptr %47, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store [3 x %main.E] %17, ptr %47, align 8 -// CHECK-NEXT: %48 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: #dbg_declare(ptr %48, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.E %19, ptr %48, align 8 -// CHECK-NEXT: %49 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 288) -// CHECK-NEXT: #dbg_declare(ptr %49, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.StructWithAllTypeFields %20, ptr %49, align 8 -// CHECK-NEXT: #dbg_value(i8 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 %2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i8 %5, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 %6, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 %7, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %8, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %9, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(float %10, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(double %11, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i1 %12, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %50 = alloca { float, float }, align 8 -// CHECK-NEXT: store { float, float } %13, ptr %50, align 4 -// CHECK-NEXT: %51 = load { float, float }, ptr %50, align 4 -// CHECK-NEXT: #dbg_value(ptr %50, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %52 = alloca { double, double }, align 8 -// CHECK-NEXT: store { double, double } %14, ptr %52, align 8 -// CHECK-NEXT: %53 = load { double, double }, ptr %52, align 8 -// CHECK-NEXT: #dbg_value(ptr %52, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %54 = alloca { ptr, i64, i64 }, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %15, ptr %54, align 8 -// CHECK-NEXT: %55 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %54, align 8 -// CHECK-NEXT: #dbg_value(ptr %54, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %46, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %46, i64 8, i64 3, i64 0, i64 3, i1 true, i1 true, i1 true) -// CHECK-NEXT: %57 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %18, ptr %57, align 8 -// CHECK-NEXT: %58 = load %"{{.*}}/runtime/internal/runtime.String", ptr %57, align 8 -// CHECK-NEXT: #dbg_value(ptr %57, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %48, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %49, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %21, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %22, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %59 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %23, ptr %59, align 8 -// CHECK-NEXT: %60 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %59, align 8 -// CHECK-NEXT: #dbg_value(ptr %59, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %61 = alloca { i64, i8, i8, i16, i32, ptr, ptr, i64, ptr }, align 8 -// CHECK-NEXT: store ptr %24, ptr %61, align 8 -// CHECK-NEXT: %62 = load ptr, ptr %61, align 8 -// CHECK-NEXT: #dbg_value(ptr %61, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %63 = alloca ptr, align 8 -// CHECK-NEXT: store ptr %25, ptr %63, align 8 -// CHECK-NEXT: %64 = load ptr, ptr %63, align 8 -// CHECK-NEXT: #dbg_value(ptr %63, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %65 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %26, ptr %65, align 8 -// CHECK-NEXT: %66 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %65, align 8 -// CHECK-NEXT: #dbg_value(ptr %65, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %67 = alloca { ptr, ptr }, align 8 -// CHECK-NEXT: store { ptr, ptr } %27, ptr %67, align 8 -// CHECK-NEXT: %68 = load { ptr, ptr }, ptr %67, align 8 -// CHECK-NEXT: #dbg_value(ptr %67, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %69 = sext i8 %0 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %69) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %70 = sext i16 %1 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %70) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %71 = sext i32 %2 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %71) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %72 = zext i8 %5 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %72) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %73 = zext i16 %6 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %73) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %74 = zext i32 %7 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %74) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %75 = fpext float %10 to double -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %75) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %76 = extractvalue { float, float } %13, 0 -// CHECK-NEXT: %77 = extractvalue { float, float } %13, 1 -// CHECK-NEXT: %78 = fpext float %76 to double -// CHECK-NEXT: %79 = fpext float %77 to double -// CHECK-NEXT: %80 = insertvalue { double, double } undef, double %78, 0 -// CHECK-NEXT: %81 = insertvalue { double, double } %80, double %79, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } %81) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } %14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %56) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %48) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %21) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %22) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %23) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %24) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %25) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %26) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %82 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %82) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i8 9, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 10, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 11, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 12, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 13, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i8 14, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 15, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 16, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 17, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 18, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(float 1.900000e+01, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(double 2.000000e+01, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i1 false, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %83 = alloca { float, float }, align 8 -// CHECK-NEXT: store { float, float } { float 2.100000e+01, float 2.200000e+01 }, ptr %83, align 4 -// CHECK-NEXT: %84 = load { float, float }, ptr %83, align 4 -// CHECK-NEXT: #dbg_value(ptr %83, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %85 = alloca { double, double }, align 8 -// CHECK-NEXT: store { double, double } { double 2.300000e+01, double 2.400000e+01 }, ptr %85, align 8 -// CHECK-NEXT: %86 = load { double, double }, ptr %85, align 8 -// CHECK-NEXT: #dbg_value(ptr %85, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %87 = alloca { ptr, i64, i64 }, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %15, ptr %87, align 8 -// CHECK-NEXT: %88 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %87, align 8 -// CHECK-NEXT: #dbg_value(ptr %87, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %89 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %90 = getelementptr inbounds i64, ptr %89, i64 0 -// CHECK-NEXT: store i64 31, ptr %90, align 8 -// CHECK-NEXT: %91 = getelementptr inbounds i64, ptr %89, i64 1 -// CHECK-NEXT: store i64 32, ptr %91, align 8 -// CHECK-NEXT: %92 = getelementptr inbounds i64, ptr %89, i64 2 -// CHECK-NEXT: store i64 33, ptr %92, align 8 -// CHECK-NEXT: %93 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %89, 0 -// CHECK-NEXT: %94 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %93, i64 3, 1 -// CHECK-NEXT: %95 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %94, i64 3, 2 -// CHECK-NEXT: #dbg_declare(ptr %46, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %96 = getelementptr inbounds i64, ptr %46, i64 0 -// CHECK-NEXT: %97 = getelementptr inbounds i64, ptr %46, i64 1 -// CHECK-NEXT: %98 = getelementptr inbounds i64, ptr %46, i64 2 -// CHECK-NEXT: store i64 34, ptr %96, align 8 -// CHECK-NEXT: store i64 35, ptr %97, align 8 -// CHECK-NEXT: store i64 36, ptr %98, align 8 -// CHECK-NEXT: #dbg_declare(ptr %47, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %99 = getelementptr inbounds %main.E, ptr %47, i64 0 -// CHECK-NEXT: %100 = getelementptr inbounds %main.E, ptr %99, i32 0, i32 0 -// CHECK-NEXT: %101 = getelementptr inbounds %main.E, ptr %47, i64 1 -// CHECK-NEXT: %102 = getelementptr inbounds %main.E, ptr %101, i32 0, i32 0 -// CHECK-NEXT: %103 = getelementptr inbounds %main.E, ptr %47, i64 2 -// CHECK-NEXT: %104 = getelementptr inbounds %main.E, ptr %103, i32 0, i32 0 -// CHECK-NEXT: store i64 37, ptr %100, align 8 -// CHECK-NEXT: store i64 38, ptr %102, align 8 -// CHECK-NEXT: store i64 39, ptr %104, align 8 -// CHECK-NEXT: %105 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %105, align 8 -// CHECK-NEXT: %106 = load %"{{.*}}/runtime/internal/runtime.String", ptr %105, align 8 -// CHECK-NEXT: #dbg_value(ptr %105, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %48, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %107 = getelementptr inbounds %main.E, ptr %48, i32 0, i32 0 -// CHECK-NEXT: store i64 40, ptr %107, align 8 -// CHECK-NEXT: #dbg_value(i8 9, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 10, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 11, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 12, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 13, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i8 14, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i16 15, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i32 16, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 17, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 18, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(float 1.900000e+01, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(double 2.000000e+01, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i1 false, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %108 = alloca { float, float }, align 8 -// CHECK-NEXT: store { float, float } { float 2.100000e+01, float 2.200000e+01 }, ptr %108, align 4 -// CHECK-NEXT: %109 = load { float, float }, ptr %108, align 4 -// CHECK-NEXT: #dbg_value(ptr %108, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %110 = alloca { double, double }, align 8 -// CHECK-NEXT: store { double, double } { double 2.300000e+01, double 2.400000e+01 }, ptr %110, align 8 -// CHECK-NEXT: %111 = load { double, double }, ptr %110, align 8 -// CHECK-NEXT: #dbg_value(ptr %110, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %112 = alloca { ptr, i64, i64 }, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %95, ptr %112, align 8 -// CHECK-NEXT: %113 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %112, align 8 -// CHECK-NEXT: #dbg_value(ptr %112, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %46, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %114 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %46, i64 8, i64 3, i64 0, i64 3, i1 true, i1 true, i1 true) -// CHECK-NEXT: #dbg_declare(ptr %47, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %115 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %115, align 8 -// CHECK-NEXT: %116 = load %"{{.*}}/runtime/internal/runtime.String", ptr %115, align 8 -// CHECK-NEXT: #dbg_value(ptr %115, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %48, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %49, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %21, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(ptr %22, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %117 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %23, ptr %117, align 8 -// CHECK-NEXT: %118 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %117, align 8 -// CHECK-NEXT: #dbg_value(ptr %117, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %119 = alloca { i64, i8, i8, i16, i32, ptr, ptr, i64, ptr }, align 8 -// CHECK-NEXT: store ptr %24, ptr %119, align 8 -// CHECK-NEXT: %120 = load ptr, ptr %119, align 8 -// CHECK-NEXT: #dbg_value(ptr %119, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %121 = alloca ptr, align 8 -// CHECK-NEXT: store ptr %25, ptr %121, align 8 -// CHECK-NEXT: %122 = load ptr, ptr %121, align 8 -// CHECK-NEXT: #dbg_value(ptr %121, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %123 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %26, ptr %123, align 8 -// CHECK-NEXT: %124 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %123, align 8 -// CHECK-NEXT: #dbg_value(ptr %123, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %125 = alloca { ptr, ptr }, align 8 -// CHECK-NEXT: store { ptr, ptr } %27, ptr %125, align 8 -// CHECK-NEXT: %126 = load { ptr, ptr }, ptr %125, align 8 -// CHECK-NEXT: #dbg_value(ptr %125, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 1.900000e+01) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 2.000000e+01) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double 2.100000e+01, double 2.200000e+01 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double 2.300000e+01, double 2.400000e+01 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %95) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %114) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %48) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %21) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %22) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %23) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %24) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %25) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %26) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %127 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %127) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %128 = call %"{{.*}}/runtime/internal/runtime.iface" @errors.New(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: %129 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 1, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %128, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %129 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.FuncWithAllTypeStructParam(%main.StructWithAllTypeFields %0){{.*}} !dbg !{{[0-9]+}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 288) -// CHECK-NEXT: #dbg_declare(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store %main.StructWithAllTypeFields %0, ptr %1, align 8 -// CHECK-NEXT: #dbg_declare(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %2 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store i8 8, ptr %2, align 1 -// CHECK-NEXT: #dbg_declare(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %3 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %1, i32 0, i32 18 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.String", ptr %3, align 8 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %4, 1 -// CHECK-NEXT: #dbg_declare(ptr %1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %6 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %7 = load i8, ptr %6, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %8 = sext i8 %7 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.ScopeFor(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %0 = phi i64 [ 0, %_llgo_0 ], [ %3, %_llgo_4 ] -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %1 = icmp slt i64 %0, 10 -// CHECK-NEXT: br i1 %1, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %2 = icmp eq i64 %0, 0 -// CHECK-NEXT: br i1 %2, label %_llgo_5, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_8, %_llgo_6, %_llgo_5 -// CHECK-NEXT: %3 = add i64 %0, 1 -// CHECK-NEXT: #dbg_value(i64 %3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %4 = icmp eq i64 %0, 1 -// CHECK-NEXT: br i1 %4, label %_llgo_6, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.ScopeIf(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %1 = icmp eq i64 %0, 1 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: #dbg_value(i64 2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_1 -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 4, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.ScopeSwitch(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %1 = icmp eq i64 %0, 1 -// CHECK-NEXT: br i1 %1, label %_llgo_2, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 1, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4 -// CHECK-NEXT: #dbg_value(i64 2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 2, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %2 = icmp eq i64 %0, 2 -// CHECK-NEXT: br i1 %2, label %_llgo_3, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_value(i64 %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_value(i64 3, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.(*Struct).Foo"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1, %"{{.*}}/runtime/internal/runtime.String" %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: #dbg_value(ptr %0, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %3 = alloca { ptr, i64, i64 }, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %1, ptr %3, align 8 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %3, align 8 -// CHECK-NEXT: #dbg_value(ptr %3, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %5 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %2, ptr %5, align 8 -// CHECK-NEXT: %6 = load %"{{.*}}/runtime/internal/runtime.String", ptr %5, align 8 -// CHECK-NEXT: #dbg_value(ptr %5, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: ret i64 1 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @errors.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.TinyStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %main.TinyStruct, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = load %main.TinyStruct, ptr %0, align 8 -// CHECK-NEXT: %3 = alloca %main.SmallStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3, i8 0, i64 16, i1 false) -// CHECK-NEXT: %4 = getelementptr inbounds %main.SmallStruct, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.SmallStruct, ptr %3, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %4, align 8 -// CHECK-NEXT: store i64 3, ptr %5, align 8 -// CHECK-NEXT: %6 = load %main.SmallStruct, ptr %3, align 8 -// CHECK-NEXT: %7 = alloca %main.MidStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %7, i8 0, i64 24, i1 false) -// CHECK-NEXT: %8 = getelementptr inbounds %main.MidStruct, ptr %7, i32 0, i32 0 -// CHECK-NEXT: %9 = getelementptr inbounds %main.MidStruct, ptr %7, i32 0, i32 1 -// CHECK-NEXT: %10 = getelementptr inbounds %main.MidStruct, ptr %7, i32 0, i32 2 -// CHECK-NEXT: store i64 4, ptr %8, align 8 -// CHECK-NEXT: store i64 5, ptr %9, align 8 -// CHECK-NEXT: store i64 6, ptr %10, align 8 -// CHECK-NEXT: %11 = load %main.MidStruct, ptr %7, align 8 -// CHECK-NEXT: %12 = alloca %main.BigStruct, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %12, i8 0, i64 80, i1 false) -// CHECK-NEXT: %13 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 0 -// CHECK-NEXT: %14 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 1 -// CHECK-NEXT: %15 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 2 -// CHECK-NEXT: %16 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 3 -// CHECK-NEXT: %17 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 4 -// CHECK-NEXT: %18 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 5 -// CHECK-NEXT: %19 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 6 -// CHECK-NEXT: %20 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 7 -// CHECK-NEXT: %21 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 8 -// CHECK-NEXT: %22 = getelementptr inbounds %main.BigStruct, ptr %12, i32 0, i32 9 -// CHECK-NEXT: store i64 7, ptr %13, align 8 -// CHECK-NEXT: store i64 8, ptr %14, align 8 -// CHECK-NEXT: store i64 9, ptr %15, align 8 -// CHECK-NEXT: store i64 10, ptr %16, align 8 -// CHECK-NEXT: store i64 11, ptr %17, align 8 -// CHECK-NEXT: store i64 12, ptr %18, align 8 -// CHECK-NEXT: store i64 13, ptr %19, align 8 -// CHECK-NEXT: store i64 14, ptr %20, align 8 -// CHECK-NEXT: store i64 15, ptr %21, align 8 -// CHECK-NEXT: store i64 16, ptr %22, align 8 -// CHECK-NEXT: %23 = load %main.BigStruct, ptr %12, align 8 -// CHECK-NEXT: call void @main.FuncStructParams(%main.TinyStruct %2, %main.SmallStruct %6, %main.MidStruct %11, %main.BigStruct %23) -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %25 = getelementptr inbounds %main.TinyStruct, ptr %24, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %25, align 8 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %27 = getelementptr inbounds %main.SmallStruct, ptr %26, i32 0, i32 0 -// CHECK-NEXT: %28 = getelementptr inbounds %main.SmallStruct, ptr %26, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %27, align 8 -// CHECK-NEXT: store i64 3, ptr %28, align 8 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %30 = getelementptr inbounds %main.MidStruct, ptr %29, i32 0, i32 0 -// CHECK-NEXT: %31 = getelementptr inbounds %main.MidStruct, ptr %29, i32 0, i32 1 -// CHECK-NEXT: %32 = getelementptr inbounds %main.MidStruct, ptr %29, i32 0, i32 2 -// CHECK-NEXT: store i64 4, ptr %30, align 8 -// CHECK-NEXT: store i64 5, ptr %31, align 8 -// CHECK-NEXT: store i64 6, ptr %32, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 80) -// CHECK-NEXT: %34 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 0 -// CHECK-NEXT: %35 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 1 -// CHECK-NEXT: %36 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 2 -// CHECK-NEXT: %37 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 3 -// CHECK-NEXT: %38 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 4 -// CHECK-NEXT: %39 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 5 -// CHECK-NEXT: %40 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 6 -// CHECK-NEXT: %41 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 7 -// CHECK-NEXT: %42 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 8 -// CHECK-NEXT: %43 = getelementptr inbounds %main.BigStruct, ptr %33, i32 0, i32 9 -// CHECK-NEXT: store i64 7, ptr %34, align 8 -// CHECK-NEXT: store i64 8, ptr %35, align 8 -// CHECK-NEXT: store i64 9, ptr %36, align 8 -// CHECK-NEXT: store i64 10, ptr %37, align 8 -// CHECK-NEXT: store i64 11, ptr %38, align 8 -// CHECK-NEXT: store i64 12, ptr %39, align 8 -// CHECK-NEXT: store i64 13, ptr %40, align 8 -// CHECK-NEXT: store i64 14, ptr %41, align 8 -// CHECK-NEXT: store i64 15, ptr %42, align 8 -// CHECK-NEXT: store i64 16, ptr %43, align 8 -// CHECK-NEXT: call void @main.FuncStructPtrParams(ptr %24, ptr %26, ptr %29, ptr %33) -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: #dbg_declare(ptr %44, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store i64 100, ptr %44, align 8 -// CHECK-NEXT: #dbg_value(i64 100, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %45 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 288) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %46 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 0 -// CHECK-NEXT: %47 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 1 -// CHECK-NEXT: %48 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 2 -// CHECK-NEXT: %49 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 3 -// CHECK-NEXT: %50 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 4 -// CHECK-NEXT: %51 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 5 -// CHECK-NEXT: %52 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 6 -// CHECK-NEXT: %53 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 7 -// CHECK-NEXT: %54 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 8 -// CHECK-NEXT: %55 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 9 -// CHECK-NEXT: %56 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 10 -// CHECK-NEXT: %57 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 11 -// CHECK-NEXT: %58 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 12 -// CHECK-NEXT: %59 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 13 -// CHECK-NEXT: %60 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 14 -// CHECK-NEXT: %61 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 15 -// CHECK-NEXT: %62 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %63 = getelementptr inbounds i64, ptr %62, i64 0 -// CHECK-NEXT: store i64 21, ptr %63, align 8 -// CHECK-NEXT: %64 = getelementptr inbounds i64, ptr %62, i64 1 -// CHECK-NEXT: store i64 22, ptr %64, align 8 -// CHECK-NEXT: %65 = getelementptr inbounds i64, ptr %62, i64 2 -// CHECK-NEXT: store i64 23, ptr %65, align 8 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %62, 0 -// CHECK-NEXT: %67 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %66, i64 3, 1 -// CHECK-NEXT: %68 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %67, i64 3, 2 -// CHECK-NEXT: %69 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 16 -// CHECK-NEXT: %70 = icmp eq ptr %69, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %70) -// CHECK-NEXT: %71 = getelementptr inbounds i64, ptr %69, i64 0 -// CHECK-NEXT: %72 = icmp eq ptr %69, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %72) -// CHECK-NEXT: %73 = getelementptr inbounds i64, ptr %69, i64 1 -// CHECK-NEXT: %74 = icmp eq ptr %69, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %74) -// CHECK-NEXT: %75 = getelementptr inbounds i64, ptr %69, i64 2 -// CHECK-NEXT: %76 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 17 -// CHECK-NEXT: %77 = icmp eq ptr %76, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %77) -// CHECK-NEXT: %78 = getelementptr inbounds %main.E, ptr %76, i64 0 -// CHECK-NEXT: %79 = getelementptr inbounds %main.E, ptr %78, i32 0, i32 0 -// CHECK-NEXT: %80 = icmp eq ptr %76, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %80) -// CHECK-NEXT: %81 = getelementptr inbounds %main.E, ptr %76, i64 1 -// CHECK-NEXT: %82 = getelementptr inbounds %main.E, ptr %81, i32 0, i32 0 -// CHECK-NEXT: %83 = icmp eq ptr %76, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %83) -// CHECK-NEXT: %84 = getelementptr inbounds %main.E, ptr %76, i64 2 -// CHECK-NEXT: %85 = getelementptr inbounds %main.E, ptr %84, i32 0, i32 0 -// CHECK-NEXT: %86 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 18 -// CHECK-NEXT: %87 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 19 -// CHECK-NEXT: %88 = getelementptr inbounds %main.E, ptr %87, i32 0, i32 0 -// CHECK-NEXT: %89 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 20 -// CHECK-NEXT: %90 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 288) -// CHECK-NEXT: %91 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %90, i32 0, i32 1 -// CHECK-NEXT: store i16 100, ptr %91, align 2 -// CHECK-NEXT: %92 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 21 -// CHECK-NEXT: #dbg_declare(ptr %44, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %93 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 22 -// CHECK-NEXT: %94 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 23 -// CHECK-NEXT: %95 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_uint64", i64 2) -// CHECK-NEXT: %96 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }, ptr %96, align 8 -// CHECK-NEXT: %97 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_uint64", ptr %95, ptr %96) -// CHECK-NEXT: store i64 31, ptr %97, align 8 -// CHECK-NEXT: %98 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }, ptr %98, align 8 -// CHECK-NEXT: %99 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_uint64", ptr %95, ptr %98) -// CHECK-NEXT: store i64 32, ptr %99, align 8 -// CHECK-NEXT: %100 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 24 -// CHECK-NEXT: %101 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: %102 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 25 -// CHECK-NEXT: %103 = call %"{{.*}}/runtime/internal/runtime.iface" @errors.New(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: %104 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 26 -// CHECK-NEXT: %105 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %106 = getelementptr inbounds { ptr }, ptr %105, i32 0, i32 0 -// CHECK-NEXT: store ptr %44, ptr %106, align 8 -// CHECK-NEXT: %107 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %105, 1 -// CHECK-NEXT: %108 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 27 -// CHECK-NEXT: %109 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 28 -// CHECK-NEXT: store i8 1, ptr %46, align 1 -// CHECK-NEXT: store i16 2, ptr %47, align 2 -// CHECK-NEXT: store i32 3, ptr %48, align 4 -// CHECK-NEXT: store i64 4, ptr %49, align 8 -// CHECK-NEXT: store i64 5, ptr %50, align 8 -// CHECK-NEXT: store i8 6, ptr %51, align 1 -// CHECK-NEXT: store i16 7, ptr %52, align 2 -// CHECK-NEXT: store i32 8, ptr %53, align 4 -// CHECK-NEXT: store i64 9, ptr %54, align 8 -// CHECK-NEXT: store i64 10, ptr %55, align 8 -// CHECK-NEXT: store float 1.100000e+01, ptr %56, align 4 -// CHECK-NEXT: store double 1.200000e+01, ptr %57, align 8 -// CHECK-NEXT: store i1 true, ptr %58, align 1 -// CHECK-NEXT: store { float, float } { float 1.300000e+01, float 1.400000e+01 }, ptr %59, align 4 -// CHECK-NEXT: store { double, double } { double 1.500000e+01, double 1.600000e+01 }, ptr %60, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %68, ptr %61, align 8 -// CHECK-NEXT: store i64 24, ptr %71, align 8 -// CHECK-NEXT: store i64 25, ptr %73, align 8 -// CHECK-NEXT: store i64 26, ptr %75, align 8 -// CHECK-NEXT: store i64 27, ptr %79, align 8 -// CHECK-NEXT: store i64 28, ptr %82, align 8 -// CHECK-NEXT: store i64 29, ptr %85, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %86, align 8 -// CHECK-NEXT: store i64 30, ptr %88, align 8 -// CHECK-NEXT: store ptr %90, ptr %89, align 8 -// CHECK-NEXT: store ptr %44, ptr %92, align 8 -// CHECK-NEXT: %110 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$opv3stH14p-JT6UN0WEYD-Tr6bHK3MHpC4KSk10pjNU", ptr @"*_llgo_main.Struct") -// CHECK-NEXT: %111 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %110, 0 -// CHECK-NEXT: %112 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %111, ptr @"__llgo.moduleZeroSizedAlloc$", 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %112, ptr %93, align 8 -// CHECK-NEXT: store ptr %95, ptr %94, align 8 -// CHECK-NEXT: store ptr %101, ptr %100, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %103, ptr %102, align 8 -// CHECK-NEXT: store { ptr, ptr } %107, ptr %104, align 8 -// CHECK-NEXT: store i64 100, ptr %108, align 8 -// CHECK-NEXT: store i64 200, ptr %109, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: store ptr %45, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: %113 = load %main.StructWithAllTypeFields, ptr %45, align 8 -// CHECK-NEXT: %114 = alloca %main.StructWithAllTypeFields, align 8 -// CHECK-NEXT: store %main.StructWithAllTypeFields %113, ptr %114, align 8 -// CHECK-NEXT: %115 = load %main.StructWithAllTypeFields, ptr %114, align 8 -// CHECK-NEXT: #dbg_value(ptr %114, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: store %main.StructWithAllTypeFields %113, ptr @main.globalStruct, align 8 -// CHECK-NEXT: %116 = load i64, ptr @main.globalInt, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %116) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %117 = load %main.StructWithAllTypeFields, ptr %45, align 8 -// CHECK-NEXT: %118 = alloca %main.StructWithAllTypeFields, align 8 -// CHECK-NEXT: store %main.StructWithAllTypeFields %117, ptr %118, align 8 -// CHECK-NEXT: %119 = load %main.StructWithAllTypeFields, ptr %118, align 8 -// CHECK-NEXT: #dbg_value(ptr %118, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: call void @main.FuncWithAllTypeStructParam(%main.StructWithAllTypeFields %117) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 27 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %120 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 0 -// CHECK-NEXT: %121 = load i8, ptr %120, align 1 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %122 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 1 -// CHECK-NEXT: %123 = load i16, ptr %122, align 2 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %124 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 2 -// CHECK-NEXT: %125 = load i32, ptr %124, align 4 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %126 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 3 -// CHECK-NEXT: %127 = load i64, ptr %126, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %128 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 4 -// CHECK-NEXT: %129 = load i64, ptr %128, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %130 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 5 -// CHECK-NEXT: %131 = load i8, ptr %130, align 1 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %132 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 6 -// CHECK-NEXT: %133 = load i16, ptr %132, align 2 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %134 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 7 -// CHECK-NEXT: %135 = load i32, ptr %134, align 4 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %136 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 8 -// CHECK-NEXT: %137 = load i64, ptr %136, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %138 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 9 -// CHECK-NEXT: %139 = load i64, ptr %138, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %140 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 10 -// CHECK-NEXT: %141 = load float, ptr %140, align 4 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %142 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 11 -// CHECK-NEXT: %143 = load double, ptr %142, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %144 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 12 -// CHECK-NEXT: %145 = load i1, ptr %144, align 1 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %146 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 13 -// CHECK-NEXT: %147 = load { float, float }, ptr %146, align 4 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %148 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 14 -// CHECK-NEXT: %149 = load { double, double }, ptr %148, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %150 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 15 -// CHECK-NEXT: %151 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %150, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %152 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 16 -// CHECK-NEXT: %153 = load [3 x i64], ptr %152, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %154 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 17 -// CHECK-NEXT: %155 = load [3 x %main.E], ptr %154, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %156 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 18 -// CHECK-NEXT: %157 = load %"{{.*}}/runtime/internal/runtime.String", ptr %156, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %158 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 19 -// CHECK-NEXT: %159 = load %main.E, ptr %158, align 8 -// CHECK-NEXT: %160 = load %main.StructWithAllTypeFields, ptr %45, align 8 -// CHECK-NEXT: %161 = alloca %main.StructWithAllTypeFields, align 8 -// CHECK-NEXT: store %main.StructWithAllTypeFields %160, ptr %161, align 8 -// CHECK-NEXT: %162 = load %main.StructWithAllTypeFields, ptr %161, align 8 -// CHECK-NEXT: #dbg_value(ptr %161, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %163 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 20 -// CHECK-NEXT: %164 = load ptr, ptr %163, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %165 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 21 -// CHECK-NEXT: %166 = load ptr, ptr %165, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %167 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 22 -// CHECK-NEXT: %168 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %167, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %169 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 23 -// CHECK-NEXT: %170 = load ptr, ptr %169, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %171 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 24 -// CHECK-NEXT: %172 = load ptr, ptr %171, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %173 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 25 -// CHECK-NEXT: %174 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %173, align 8 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %175 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 26 -// CHECK-NEXT: %176 = load { ptr, ptr }, ptr %175, align 8 -// CHECK-NEXT: %177 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.FuncWithAllTypeParams(i8 %121, i16 %123, i32 %125, i64 %127, i64 %129, i8 %131, i16 %133, i32 %135, i64 %137, i64 %139, float %141, double %143, i1 %145, { float, float } %147, { double, double } %149, %"{{.*}}/runtime/internal/runtime.Slice" %151, [3 x i64] %153, [3 x %main.E] %155, %"{{.*}}/runtime/internal/runtime.String" %157, %main.E %159, %main.StructWithAllTypeFields %160, ptr %164, ptr %166, %"{{.*}}/runtime/internal/runtime.iface" %168, ptr %170, ptr %172, %"{{.*}}/runtime/internal/runtime.iface" %174, { ptr, ptr } %176) -// CHECK-NEXT: %178 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %177, 0 -// CHECK-NEXT: store i64 %178, ptr %44, align 8 -// CHECK-NEXT: #dbg_value(i64 %178, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %179 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %177, 1 -// CHECK-NEXT: %180 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %179, ptr %180, align 8 -// CHECK-NEXT: %181 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %180, align 8 -// CHECK-NEXT: #dbg_value(ptr %180, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %182 = load i64, ptr %44, align 8 -// CHECK-NEXT: #dbg_value(i64 %182, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %183 = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %179, ptr %183, align 8 -// CHECK-NEXT: %184 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %183, align 8 -// CHECK-NEXT: #dbg_value(ptr %183, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %182) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %179) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @main.ScopeIf(i64 1) -// CHECK-NEXT: call void @main.ScopeIf(i64 0) -// CHECK-NEXT: call void @main.ScopeFor() -// CHECK-NEXT: call void @main.ScopeSwitch(i64 1) -// CHECK-NEXT: call void @main.ScopeSwitch(i64 2) -// CHECK-NEXT: call void @main.ScopeSwitch(i64 3) -// CHECK-NEXT: %185 = load ptr, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %185) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @main.globalStruct) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %186 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 0 -// CHECK-NEXT: store i8 18, ptr %186, align 1 -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %187 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %45, i32 0, i32 0 -// CHECK-NEXT: %188 = load i8, ptr %187, align 1 -// CHECK-NEXT: %189 = sext i8 %188 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %189) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %190 = load ptr, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: %191 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %190, i32 0, i32 0 -// CHECK-NEXT: %192 = load i8, ptr %191, align 1 -// CHECK-NEXT: %193 = sext i8 %192 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %193) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" zeroinitializer) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: #dbg_declare(ptr %45, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %194 = load ptr, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: %195 = getelementptr inbounds %main.StructWithAllTypeFields, ptr %194, i32 0, i32 1 -// CHECK-NEXT: %196 = load i16, ptr %195, align 2 -// CHECK-NEXT: %197 = load ptr, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @main.globalStruct) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %198 = sext i16 %196 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %198) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %197) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr null, ptr @main.globalStructPtr, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.main$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %1, ptr %2, align 8 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.String", ptr %2, align 8 -// CHECK-NEXT: #dbg_value(ptr %2, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: %4 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %1, ptr %4, align 8 -// CHECK-NEXT: %5 = load %"{{.*}}/runtime/internal/runtime.String", ptr %4, align 8 -// CHECK-NEXT: #dbg_value(ptr %4, !{{[0-9]+}}, !DIExpression(DW_OP_deref), !{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %6 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %7 = extractvalue { ptr } %6, 0 -// CHECK-NEXT: store i64 201, ptr %7, align 8 -// CHECK-NEXT: #dbg_value(i64 201, !{{[0-9]+}}, !DIExpression(), !{{[0-9]+}}) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.iface" @errors.New(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }) -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 1, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %8, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK: !llvm.dbg.cu = !{!{{[0-9]+}}} -// CHECK: !{{[0-9]+}} = distinct !DICompileUnit({{.*}}producer: "LLGo"{{.*}}emissionKind: FullDebug{{.*}}) -// CHECK: !{{[0-9]+}} = !DILocalVariable(name: "s", arg: 1, {{.*}}) diff --git a/cl/_testdata/embedunexport/embedunexport.go b/cl/_testdata/embedunexport/embedunexport.go index 71badffee3..c89d0991d6 100644 --- a/cl/_testdata/embedunexport/embedunexport.go +++ b/cl/_testdata/embedunexport/embedunexport.go @@ -8,57 +8,40 @@ type Object interface { } // Base implements Object -// CHECK: %"{{.*}}.Base" = type { %"{{.*}}.String" } type Base struct { name string } -// CHECK: @0 = private unnamed_addr constant [8 x i8] c"modified", align 1 -// CHECK: define %"{{.*}}.String" @"{{.*}}.(*Base).Name"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}.Base", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}.String", ptr %1, align 8 -// CHECK-NEXT: ret %"{{.*}}.String" %2 -// CHECK-NEXT: } +// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}.(*Base).Name"(ptr %0){{.*}} { +// CHECK: [[NAME_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Base", ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[NAME_VALUE:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr [[NAME_FIELD]] +// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" [[NAME_VALUE]] + func (b *Base) Name() string { return b.name } -// CHECK: define void @"{{.*}}.(*Base).setName"(ptr %0, %"{{.*}}.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}.Base", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}.String" %1, ptr %2, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK-LABEL: define void @"{{.*}}.(*Base).setName"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { +// CHECK: [[SET_NAME_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Base", ptr %0, i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %1, ptr [[SET_NAME_FIELD]] + func (b *Base) setName(name string) { b.name = name } -// CHECK: define ptr @"{{.*}}.NewBase"(%"{{.*}}.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}.Base", ptr %1, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}.String" %0, ptr %2, align 8 -// CHECK-NEXT: ret ptr %1 -// CHECK-NEXT: } +// CHECK-LABEL: define ptr @"{{.*}}.NewBase"(%"{{.*}}.String" %0){{.*}} { +// CHECK: [[NEW_BASE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: [[NEW_BASE_NAME:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Base", ptr [[NEW_BASE]], i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr [[NEW_BASE_NAME]] +// CHECK-NEXT: ret ptr [[NEW_BASE]] func NewBase(name string) *Base { return &Base{name: name} } // Use calls the unexported method through interface -// CHECK: define void @"{{.*}}.Use"(%"{{.*}}.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}.IfacePtrData"(%"{{.*}}.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 4 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %6, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %6, 0 -// CHECK-NEXT: call void %8(ptr %7, %"{{.*}}.String" { ptr @0, i64 8 }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK-LABEL: define void @"{{.*}}.Use"(%"{{.*}}.iface" %0){{.*}} { +// CHECK: %[[OBJ_DATA:[0-9]+]] = call ptr @"{{.*}}.IfacePtrData"(%"{{.*}}.iface" %0) +// CHECK: insertvalue { ptr, ptr } %{{[0-9]+}}, ptr %[[OBJ_DATA]], 1 func Use(obj Object) { obj.setName("modified") } diff --git a/cl/_testdata/fncall/in.go b/cl/_testdata/fncall/in.go index ba67507540..7cb2142373 100644 --- a/cl/_testdata/fncall/in.go +++ b/cl/_testdata/fncall/in.go @@ -2,25 +2,17 @@ package main // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @main.max(i64 1, i64 2) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call i64 @main.max(i64 1, i64 2) +// CHECK-NEXT: ret void func main() { _ = max(1, 2) } // CHECK-LABEL: define i64 @main.max(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp sgt i64 %0, %1 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1:{{.*}} -// CHECK-NEXT: ret i64 %0 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2:{{.*}} -// CHECK-NEXT: ret i64 %1 -// CHECK-NEXT: } +// CHECK: [[GREATER:%[0-9]+]] = icmp sgt i64 %0, %1 +// CHECK-NEXT: br i1 [[GREATER]], label %{{[^,]+}}, label %{{[^ ]+}} +// CHECK: ret i64 %0 +// CHECK: ret i64 %1 func max(a, b int) int { if a > b { return a diff --git a/cl/_testdata/foo/foo.go b/cl/_testdata/foo/foo.go index a76da65cd9..b510646129 100644 --- a/cl/_testdata/foo/foo.go +++ b/cl/_testdata/foo/foo.go @@ -1,38 +1,49 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\QBar\E|\QF\E|\QFoo.Pb\E|\Q(*Foo).Pb\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package foo -// CHECK: {{^}}@6 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testdata/foo.Foo", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [2 x i8] c"Pb", align 1{{$}} -// CHECK: {{^}}@8 = private unnamed_addr constant [4 x i8] c"load", align 1{{$}} - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.Bar"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64 }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = load { i64 }, ptr %0, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } %2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %3, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %4 +// CHECK: {{^}}@[[GLOB6:[0-9]+]] = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testdata/foo.Foo", align 1{{$}} +// CHECK: {{^}}@[[GLOB7:[0-9]+]] = private unnamed_addr constant [2 x i8] c"Pb", align 1{{$}} + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.Bar"(){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, ptr } @"{{.*}}/cl/_testdata/foo.Bar"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca { i64 }, align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP0]], i8 0, i64 8, i1 false) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds { i64 }, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store i64 1, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load { i64 }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store { i64 } %[[TMP2]], ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", ptr undef }, ptr %[[TMP3]], 1 +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]] +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP6]] // CHECK-NEXT: } func Bar() any { return struct{ V int }{1} } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.F"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64 }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = load { i64 }, ptr %0, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } %2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %3, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %4 +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/cl/_testdata/foo.F"(){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, ptr } @"{{.*}}/cl/_testdata/foo.F"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca { i64 }, align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP0]], i8 0, i64 8, i1 false) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds { i64 }, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store i64 1, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load { i64 }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store { i64 } %[[TMP2]], ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testdata/foo.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", ptr undef }, ptr %[[TMP3]], 1 +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]] +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP6]] // CHECK-NEXT: } func F() any { @@ -44,16 +55,6 @@ type Foo struct { F float32 } -// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(%"{{.*}}/cl/_testdata/foo.Foo" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: ret ptr %3 -// CHECK-NEXT: } - func (v Foo) Pb() *byte { return v.pb } @@ -73,36 +74,64 @@ func (g *Game) Load() { println("load") } -// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.(*Foo).Pb"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 2 }) -// CHECK-NEXT: %2 = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %0, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(%"{{.*}}/cl/_testdata/foo.Foo" %2) -// CHECK-NEXT: ret ptr %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.(*Game).Load"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.(*Game).initGame"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void +// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.(*Foo).Pb"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP2]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB6]], i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB7]], i64 2 }) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP3]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load [2 x i64], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"([2 x i64] %[[TMP4]]) +// DARWIN-ARM64-NEXT: ret ptr %[[TMP5]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB6]], i64 43 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load i64, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB7]], i64 2 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load i64, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP4]], ptr %[[TMP6]], i64 %[[TMP8]], ptr %[[TMP10]], i64 %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP13]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load float, ptr %[[TMP16]], align 4 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(ptr %[[TMP15]], float %[[TMP17]]) +// LINUX-AMD64-NEXT: ret ptr %[[TMP18]] // CHECK-NEXT: } -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/foo.init"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testdata/foo.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testdata/foo.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void +// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"( +// DARWIN-ARM64-SAME: [2 x i64] %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], float %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca [2 x i64], align 8 +// DARWIN-ARM64-NEXT: store [2 x i64] %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP2]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: ret ptr %[[TMP5]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, float }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store float %[[TMP1]], ptr %[[TMP4]], align 4 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP6]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP5]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: ret ptr %[[TMP8]] // CHECK-NEXT: } diff --git a/cl/_testdata/geometry1370/geometry.go b/cl/_testdata/geometry1370/geometry.go index 9e7faa334e..3788dd4027 100644 --- a/cl/_testdata/geometry1370/geometry.go +++ b/cl/_testdata/geometry1370/geometry.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\QNewRectangle\E|\Q(*Rectangle).Area\E|\Q(*Rectangle).GetID\E|\Q(*Rectangle).setID\E|\Q(*Rectangle).validate\E|\QRegisterShape\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package geometry1370 type Shape interface { @@ -12,94 +14,109 @@ type Rectangle struct { id int } -// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/geometry1370.NewRectangle"(double %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store double %0, ptr %3, align 8 -// CHECK-NEXT: store double %1, ptr %4, align 8 -// CHECK-NEXT: ret ptr %2 +// CHECK-LABEL: define ptr @"{{.*}}/cl/_testdata/geometry1370.NewRectangle"( +// CHECK-SAME: double %[[TMP0:[0-9]+]], double %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP2]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP2]], i32 0, i32 1 +// CHECK-NEXT: store double %[[TMP0]], ptr %[[TMP3]], align 8 +// CHECK-NEXT: store double %[[TMP1]], ptr %[[TMP4]], align 8 +// CHECK-NEXT: ret ptr %[[TMP2]] // CHECK-NEXT: } func NewRectangle(width, height float64) *Rectangle { return &Rectangle{Width: width, Height: height} } -// CHECK-LABEL: define double @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).Area"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load double, ptr %1, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %4 = load double, ptr %3, align 8 -// CHECK-NEXT: %5 = fmul double %2, %4 -// CHECK-NEXT: ret double %5 +// CHECK-LABEL: define double @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).Area"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load double, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load double, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = fmul double %[[TMP2]], %[[TMP4]] +// CHECK-NEXT: ret double %[[TMP5]] // CHECK-NEXT: } func (r *Rectangle) Area() float64 { return r.Width * r.Height } -// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).GetID"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).GetID"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load i64, ptr %[[TMP1]], align 8 +// CHECK-NEXT: ret i64 %[[TMP2]] // CHECK-NEXT: } func (r *Rectangle) GetID() int { return r.id } -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).setID"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 %1, ptr %2, align 8 +// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).setID"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 2 +// CHECK-NEXT: store i64 %[[TMP1]], ptr %[[TMP2]], align 8 // CHECK-NEXT: ret void // CHECK-NEXT: } func (r *Rectangle) setID(id int) { r.id = id } -// CHECK-LABEL: define i1 @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).validate"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load double, ptr %1, align 8 -// CHECK-NEXT: %3 = fcmp ogt double %2, 0.000000e+00 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 +// CHECK-LABEL: define i1 @"{{.*}}/cl/_testdata/geometry1370.(*Rectangle).validate"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load double, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = fcmp ogt double %[[TMP2]], 0.000000e+00 +// CHECK-NEXT: br i1 %[[TMP3]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %5 = load double, ptr %4, align 8 -// CHECK-NEXT: %6 = fcmp ogt double %5, 0.000000e+00 -// CHECK-NEXT: br label %_llgo_2 +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/geometry1370.Rectangle", ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = load double, ptr %[[TMP4]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = fcmp ogt double %[[TMP5]], 0.000000e+00 +// CHECK-NEXT: br label %_llgo_[[BB2]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %7 = phi i1 [ false, %_llgo_0 ], [ %6, %_llgo_1 ] -// CHECK-NEXT: ret i1 %7 +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: %[[TMP7:[0-9]+]] = phi i1 [ false, %_llgo_[[BB0]] ], [ %[[TMP6]], %_llgo_[[BB1]] ] +// CHECK-NEXT: ret i1 %[[TMP7]] // CHECK-NEXT: } func (r *Rectangle) validate() bool { return r.Width > 0 && r.Height > 0 } -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/geometry1370.RegisterShape"(%"{{.*}}/runtime/internal/runtime.iface" %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %4 = getelementptr ptr, ptr %3, i64 4 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } undef, ptr %5, 0 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } %6, ptr %2, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %7, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %7, 0 -// CHECK-NEXT: call void %9(ptr %8, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/geometry1370.init"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testdata/geometry1370.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testdata/geometry1370.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 +// CHECK-LABEL: define void @"{{.*}}/cl/_testdata/geometry1370.RegisterShape"( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.iface" %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], i64 %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr ptr, ptr %[[TMP3]], i64 4 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP6]], ptr %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP7]], 0 +// DARWIN-ARM64-NEXT: call void %[[TMP9]](ptr %[[TMP8]], i64 %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(ptr %[[TMP9]], ptr %[[TMP11]]) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP6]], 0 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr ptr, ptr %[[TMP13]], i64 4 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP15]], 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP16]], ptr %[[TMP12]], 1 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP17]], 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP17]], 0 +// LINUX-AMD64-NEXT: call void %[[TMP19]](ptr %[[TMP18]], i64 %[[TMP2]]) // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testdata/importpkg/in.go b/cl/_testdata/importpkg/in.go index 6ee14f49f5..d8338547a7 100644 --- a/cl/_testdata/importpkg/in.go +++ b/cl/_testdata/importpkg/in.go @@ -3,25 +3,15 @@ package main import "github.com/goplus/llgo/cl/_testdata/importpkg/stdio" -// CHECK: @main.hello = global [7 x i8] c"Hello\0A\00", align 1 +// CHECK: @main.hello = global [7 x i8] c"Hello\0A\00" // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1:{{.*}} -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"{{.*}}/stdio.init"() -// CHECK-NEXT: br label %_llgo_2 +// CHECK: call void @"{{.*}}/stdio.init"() var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"{{.*}}/stdio.Max"(i64 2, i64 100) -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.hello) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call i64 @"{{.*}}/stdio.Max"(i64 2, i64 100) +// CHECK: call void (ptr, ...) @printf(ptr @main.hello) func main() { _ = stdio.Max(2, 100) stdio.Printf(&hello[0]) diff --git a/cl/_testdata/llgointrinsics/in.go b/cl/_testdata/llgointrinsics/in.go index 75971309d1..98ac0c0098 100644 --- a/cl/_testdata/llgointrinsics/in.go +++ b/cl/_testdata/llgointrinsics/in.go @@ -5,6 +5,42 @@ import ( "unsafe" ) +// llgo.funcPCABI0 resolves declarations and non-capturing functions directly, +// and returns the code pointer (not the environment) for a closure. +// CHECK-LABEL: define i64 @"{{.*}}.UseBare"(){{.*}} { +// CHECK: ret i64 ptrtoint (ptr @bar to i64) +// CHECK-LABEL: define i64 @"{{.*}}.UseC"(){{.*}} { +// CHECK: ret i64 ptrtoint (ptr @write to i64) +// CHECK-LABEL: define i64 @"{{.*}}.UseCTrampoline"(){{.*}} { +// CHECK: ret i64 ptrtoint (ptr @write to i64) +// CHECK-LABEL: define i64 @"{{.*}}.UseClosure"(){{.*}} { +// CHECK: [[UC_X:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: [[UC_ENV:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: [[UC_X_SLOT:%[0-9]+]] = getelementptr inbounds { ptr }, ptr [[UC_ENV]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[UC_X]], ptr [[UC_X_SLOT]] +// CHECK-NEXT: [[UC_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"{{.*}}.UseClosure$1", ptr undef }, ptr [[UC_ENV]], 1 +// CHECK-NEXT: ret i64 ptrtoint (ptr @"{{.*}}.UseClosure$1" to i64) +// CHECK-LABEL: define void @"{{.*}}.UseClosure$1"(ptr {{(nest|swiftself)}} +// CHECK: [[UC_ENV_VALUE:%[0-9]+]] = load { ptr }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[UC_X_PTR:%[0-9]+]] = extractvalue { ptr } [[UC_ENV_VALUE]], 0 +// CHECK-NEXT: [[UC_OLD_X:%[0-9]+]] = load i64, ptr [[UC_X_PTR]] +// CHECK-NEXT: [[UC_NEW_X:%[0-9]+]] = add i64 [[UC_OLD_X]], 1 +// CHECK-NEXT: [[UC_X_PTR_AGAIN:%[0-9]+]] = extractvalue { ptr } [[UC_ENV_VALUE]], 0 +// CHECK-NEXT: store i64 [[UC_NEW_X]], ptr [[UC_X_PTR_AGAIN]] +// CHECK-NEXT: ret void +// CHECK-LABEL: define i64 @"{{.*}}.UseFunc"(){{.*}} { +// CHECK: ret i64 ptrtoint (ptr @"{{.*}}.UseFunc$1" to i64) +// CHECK-LABEL: define void @"{{.*}}.UseFunc$1"(){{.*}} { +// CHECK: ret void +// CHECK-LABEL: define i64 @"{{.*}}.UseLibc"(){{.*}} { +// CHECK: ret i64 ptrtoint (ptr @foo to i64) +// CHECK-LABEL: define void @"{{.*}}.UseSkip"(){{.*}} { +// CHECK-NOT: call {{.*}}skip +// CHECK: call void @"{{.*}}.PrintUint"(i64 0) +// CHECK-NEXT: call void @"{{.*}}.PrintUint"(i64 0) +// CHECK-NEXT: call void @"{{.*}}.PrintUint"(i64 0) +// CHECK-NEXT: ret void + //go:linkname funcPCABI0 llgo.funcPCABI0 func funcPCABI0(fn interface{}) uintptr @@ -29,40 +65,18 @@ func write(fd int, buf unsafe.Pointer, count int) int //go:linkname write_trampoline C.write func write_trampoline() -// CHECK-LABEL: define i64 @"{{.*}}.UseBare"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 ptrtoint (ptr @bar to i64) -// CHECK-NEXT: } func UseBare() uintptr { return funcPCABI0(bar_trampoline) } -// CHECK-LABEL: define i64 @"{{.*}}.UseC"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 ptrtoint (ptr @write to i64) -// CHECK-NEXT: } func UseC() uintptr { return funcPCABI0(write) } -// CHECK-LABEL: define i64 @"{{.*}}.UseCTrampoline"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 ptrtoint (ptr @write to i64) -// CHECK-NEXT: } func UseCTrampoline() uintptr { return funcPCABI0(write_trampoline) } -// CHECK-LABEL: define i64 @"{{.*}}.UseClosure"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}.AllocU"(i64 8) -// CHECK: ret i64 ptrtoint (ptr @"{{.*}}.UseClosure$1" to i64) -// CHECK-LABEL: define void @"{{.*}}.UseClosure$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK: %4 = add i64 %3, 1 -// CHECK: ret void -// CHECK-NEXT: } func UseClosure() uintptr { var x int return funcPCABI0(func() { @@ -70,33 +84,14 @@ func UseClosure() uintptr { }) } -// CHECK-LABEL: define i64 @"{{.*}}.UseFunc"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 ptrtoint (ptr @"{{.*}}.UseFunc$1" to i64) -// CHECK-NEXT: } -// CHECK-LABEL: define void @"{{.*}}.UseFunc$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } func UseFunc() uintptr { return funcPCABI0(func() {}) } -// CHECK-LABEL: define i64 @"{{.*}}.UseLibc"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 ptrtoint (ptr @foo to i64) -// CHECK-NEXT: } func UseLibc() uintptr { return funcPCABI0(libc_foo_trampoline) } -// CHECK-LABEL: define void @"{{.*}}.UseSkip"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}.PrintUint"(i64 0) -// CHECK-NEXT: call void @"{{.*}}.PrintUint"(i64 0) -// CHECK-NEXT: call void @"{{.*}}.PrintUint"(i64 0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func UseSkip() { skip() i := skipWithRet() diff --git a/cl/_testdata/llgosyscall/in.go b/cl/_testdata/llgosyscall/in.go index ccb613354b..7468614cee 100644 --- a/cl/_testdata/llgosyscall/in.go +++ b/cl/_testdata/llgosyscall/in.go @@ -1,8 +1,13 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\QUse\E|\QUse5F64\E|\QUse6\E|\QUse6X\E|\QUsePtr\E|\QUseRaw\E|\QUseRaw6\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package llgosyscall import _ "unsafe" +// llgo.syscall lowers to a typed indirect call and translates -1 through +// errno. Cover the ordinary, six-argument, floating-point, and raw forms. + //go:linkname syscall llgo.syscall func syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) @@ -24,105 +29,150 @@ func rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) //go:linkname rawSyscall6 llgo.syscall func rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) -// CHECK-LABEL: define i64 @"{{.*}}.Use"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.Use"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] +// CHECK-NEXT: } + func Use() uintptr { r1, _, _ := syscall(0, 1, 2, 3) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}/llgosyscall.Use5F64"(i64 %0, double %1){{.*}} { -// CHECK: %{{[0-9]+}} = inttoptr i64 %0 to ptr -// CHECK: %{{[0-9]+}} = call i64 %{{[0-9]+}}(i64 1, i64 2, i64 3, i64 4, i64 5, double %1) +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.Use5F64"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], double %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = inttoptr i64 %[[TMP0]] to ptr +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call i64 %[[TMP2]](i64 1, i64 2, i64 3, i64 4, i64 5, double %[[TMP1]]) +// CHECK-NEXT: %[[TMP4:[0-9]+]] = icmp eq i64 %[[TMP3]], -1 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP6:[0-9]+]] = sext i32 %[[TMP5]] to i64 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = select i1 %[[TMP4]], i64 %[[TMP6]], i64 0 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP3]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP8]], i64 0, 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP9]], i64 %[[TMP7]], 2 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP10]], 0 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP10]], 1 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP10]], 2 +// CHECK-NEXT: ret i64 %[[TMP11]] +// CHECK-NEXT: } + func Use5F64(fn uintptr, f float64) uintptr { r1, _, _ := syscall5f64(fn, 1, 2, 3, 4, 5, f) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}.Use6"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.Use6"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] +// CHECK-NEXT: } + func Use6() uintptr { r1, _, _ := syscall6(0, 1, 2, 3, 4, 5, 6) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}/llgosyscall.Use6X"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK-NEXT: %4 = select i1 %1, i64 %3, i64 0 -// CHECK-NEXT: %5 = insertvalue { i64, i64, i64 } undef, i64 %0, 0 -// CHECK-NEXT: %6 = insertvalue { i64, i64, i64 } %5, i64 0, 1 -// CHECK-NEXT: %7 = insertvalue { i64, i64, i64 } %6, i64 %4, 2 -// CHECK-NEXT: %8 = extractvalue { i64, i64, i64 } %7, 0 -// CHECK-NEXT: %9 = extractvalue { i64, i64, i64 } %7, 1 -// CHECK-NEXT: %10 = extractvalue { i64, i64, i64 } %7, 2 -// CHECK-NEXT: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.Use6X"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] // CHECK-NEXT: } + func Use6X() uintptr { r1, _, _ := syscall6X(0, 1, 2, 3, 4, 5, 6) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}/llgosyscall.UsePtr"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK-NEXT: %4 = select i1 %1, i64 %3, i64 0 -// CHECK-NEXT: %5 = insertvalue { i64, i64, i64 } undef, i64 %0, 0 -// CHECK-NEXT: %6 = insertvalue { i64, i64, i64 } %5, i64 0, 1 -// CHECK-NEXT: %7 = insertvalue { i64, i64, i64 } %6, i64 %4, 2 -// CHECK-NEXT: %8 = extractvalue { i64, i64, i64 } %7, 0 -// CHECK-NEXT: %9 = extractvalue { i64, i64, i64 } %7, 1 -// CHECK-NEXT: %10 = extractvalue { i64, i64, i64 } %7, 2 -// CHECK-NEXT: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.UsePtr"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] // CHECK-NEXT: } + func UsePtr() uintptr { r1, _, _ := syscallPtr(0, 1, 2, 3) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}/llgosyscall.UseRaw"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK-NEXT: %4 = select i1 %1, i64 %3, i64 0 -// CHECK-NEXT: %5 = insertvalue { i64, i64, i64 } undef, i64 %0, 0 -// CHECK-NEXT: %6 = insertvalue { i64, i64, i64 } %5, i64 0, 1 -// CHECK-NEXT: %7 = insertvalue { i64, i64, i64 } %6, i64 %4, 2 -// CHECK-NEXT: %8 = extractvalue { i64, i64, i64 } %7, 0 -// CHECK-NEXT: %9 = extractvalue { i64, i64, i64 } %7, 1 -// CHECK-NEXT: %10 = extractvalue { i64, i64, i64 } %7, 2 -// CHECK-NEXT: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.UseRaw"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] // CHECK-NEXT: } + func UseRaw() uintptr { r1, _, _ := rawSyscall(0, 1, 2, 3) return r1 } -// CHECK-LABEL: define i64 @"{{.*}}.UseRaw6"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) -// CHECK-NEXT: %1 = icmp eq i64 %0, -1 -// CHECK-NEXT: %2 = call i32 @cliteErrno() -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK: ret i64 %8 +// CHECK-LABEL: define i64 @"{{.*}}/cl/_testdata/llgosyscall.UseRaw6"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call i64 null(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], -1 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @cliteErrno() +// CHECK-NEXT: %[[TMP3:[0-9]+]] = sext i32 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP1]], i64 %[[TMP3]], i64 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = insertvalue { i64, i64, i64 } undef, i64 %[[TMP0]], 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP5]], i64 0, 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue { i64, i64, i64 } %[[TMP6]], i64 %[[TMP4]], 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = extractvalue { i64, i64, i64 } %[[TMP7]], 2 +// CHECK-NEXT: ret i64 %[[TMP8]] +// CHECK-NEXT: } + func UseRaw6() uintptr { r1, _, _ := rawSyscall6(0, 1, 2, 3, 4, 5, 6) return r1 diff --git a/cl/_testdata/llgotag/in.go b/cl/_testdata/llgotag/in.go index 02adc630e2..6a7cdc25fe 100644 --- a/cl/_testdata/llgotag/in.go +++ b/cl/_testdata/llgotag/in.go @@ -5,8 +5,6 @@ package llgotag // CHECK-LABEL: define void @"{{.*}}.Foo"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: ret void func Foo() { } diff --git a/cl/_testdata/method/in.go b/cl/_testdata/method/in.go index de8b09f495..70e2d04416 100644 --- a/cl/_testdata/method/in.go +++ b/cl/_testdata/method/in.go @@ -3,17 +3,11 @@ package main import _ "unsafe" -// CHECK-DAG: {{^}}@0 = private unnamed_addr constant [44 x i8] c"{{.*}}/cl/_testdata/method.T", align 1{{$}} -// CHECK-DAG: {{^}}@1 = private unnamed_addr constant [3 x i8] c"Add", align 1{{$}} -// CHECK-DAG: @main.format = global [10 x i8] c"Hello %d\0A\00", align 1 - type T int // CHECK-LABEL: define i64 @main.T.Add(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[SUM:%[0-9]+]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[SUM]] func (a T) Add(b T) T { return a + b @@ -30,30 +24,12 @@ func main() { } // CHECK-LABEL: define i64 @"main.(*T).Add"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 44 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 3 }) -// CHECK-NEXT: %3 = load i64, ptr %0, align 8 -// CHECK-NEXT: %4 = call i64 @main.T.Add(i64 %3, i64 %1) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK-NEXT: call void @"{{.*}}PanicWrapNilPointer"(i1 [[NIL]], %"{{.*}}String" { ptr @{{[0-9]+}}, i64 44 }, %"{{.*}}String" { ptr @{{[0-9]+}}, i64 3 }) +// CHECK-NEXT: [[RECEIVER:%[0-9]+]] = load i64, ptr %0 +// CHECK-NEXT: [[WRAPPED_SUM:%[0-9]+]] = call i64 @main.T.Add(i64 [[RECEIVER]], i64 %1) +// CHECK-NEXT: ret i64 [[WRAPPED_SUM]] // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @main.T.Add(i64 1, i64 2) -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i64 %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MAIN_SUM:%[0-9]+]] = call i64 @main.T.Add(i64 1, i64 2) +// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i64 [[MAIN_SUM]]) diff --git a/cl/_testdata/print/in.go b/cl/_testdata/print/in.go index 4d2f80ace1..61f9294e22 100644 --- a/cl/_testdata/print/in.go +++ b/cl/_testdata/print/in.go @@ -7,22 +7,6 @@ import ( "github.com/goplus/lib/c" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [3 x i8] c"%c\00", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [4 x i8] c"llgo", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [10 x i8] c"check bool", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [8 x i8] c"check &^", align 1{{$}} -// CHECK: {{^}}@21 = private unnamed_addr constant [1 x i8] c"(", align 1{{$}} -// CHECK: {{^}}@22 = private unnamed_addr constant [2 x i8] c"i)", align 1{{$}} -// CHECK: {{^}}@23 = private unnamed_addr constant [4 x i8] c"true", align 1{{$}} -// CHECK: {{^}}@24 = private unnamed_addr constant [5 x i8] c"false", align 1{{$}} -// CHECK: {{^}}@25 = private unnamed_addr constant [3 x i8] c"NaN", align 1{{$}} -// CHECK: {{^}}@26 = private unnamed_addr constant [4 x i8] c"+Inf", align 1{{$}} -// CHECK: {{^}}@27 = private unnamed_addr constant [4 x i8] c"-Inf", align 1{{$}} -// CHECK: {{^}}@28 = private unnamed_addr constant [16 x i8] c"0123456789abcdef", align 1{{$}} -// CHECK: {{^}}@29 = private unnamed_addr constant [1 x i8] c"-", align 1{{$}} -// CHECK: {{^}}@30 = private unnamed_addr constant [1 x i8] c" ", align 1{{$}} -// CHECK: {{^}}@31 = private unnamed_addr constant [1 x i8] c"\0A", align 1{{$}} - var minhexdigits = 0 type slice struct { @@ -36,27 +20,38 @@ type stringStruct struct { len int } +// Keep the output literals tied to the helpers that select them without +// depending on the compiler-assigned numeric global names. +// CHECK-DAG: [[FMT_CHAR:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"%c\00" +// CHECK-DAG: [[STR_LPAREN:@[0-9]+]] = private unnamed_addr constant [1 x i8] c"(" +// CHECK-DAG: [[STR_ICLOSE:@[0-9]+]] = private unnamed_addr constant [2 x i8] c"i)" +// CHECK-DAG: [[STR_TRUE:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"true" +// CHECK-DAG: [[STR_FALSE:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"false" +// CHECK-DAG: [[STR_NAN:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"NaN" +// CHECK-DAG: [[STR_PINF:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"+Inf" +// CHECK-DAG: [[STR_NINF:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"-Inf" +// CHECK-DAG: [[HEX_DIGITS:@[0-9]+]] = private unnamed_addr constant [16 x i8] c"0123456789abcdef" +// CHECK-DAG: [[STR_MINUS:@[0-9]+]] = private unnamed_addr constant [1 x i8] c"-" +// CHECK-DAG: [[STR_SPACE:@[0-9]+]] = private unnamed_addr constant [1 x i8] c" " +// CHECK-DAG: [[STR_NL:@[0-9]+]] = private unnamed_addr constant [1 x i8] c"\0A" + // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @main.bytes(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %3 = call ptr @main.stringStructOf(ptr %1) -// CHECK-NEXT: %4 = getelementptr inbounds %main.stringStruct, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.slice, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %5, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %main.stringStruct, ptr %3, i32 0, i32 1 -// CHECK-NEXT: %8 = load i64, ptr %7, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %main.slice, ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 %8, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %main.stringStruct, ptr %3, i32 0, i32 1 -// CHECK-NEXT: %11 = load i64, ptr %10, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.slice, ptr %2, i32 0, i32 2 -// CHECK-NEXT: store i64 %11, ptr %12, align 8 -// CHECK-NEXT: %13 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %13 -// CHECK-NEXT: } +// CHECK: [[BYTES_STRING_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr [[BYTES_STRING_ADDR]] +// CHECK: [[BYTES_SLICE_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK: [[BYTES_STRING_STRUCT:%[0-9]+]] = call ptr @main.stringStructOf(ptr [[BYTES_STRING_ADDR]]) +// CHECK: [[BYTES_DATA_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringStruct, ptr [[BYTES_STRING_STRUCT]], i32 0, i32 0 +// CHECK-NEXT: [[BYTES_DATA:%[0-9]+]] = load ptr, ptr [[BYTES_DATA_FIELD]] +// CHECK: [[BYTES_SLICE_DATA:%[0-9]+]] = getelementptr inbounds %main.slice, ptr [[BYTES_SLICE_ADDR]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[BYTES_DATA]], ptr [[BYTES_SLICE_DATA]] +// CHECK: [[BYTES_LEN_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringStruct, ptr [[BYTES_STRING_STRUCT]], i32 0, i32 1 +// CHECK-NEXT: [[BYTES_LEN:%[0-9]+]] = load i64, ptr [[BYTES_LEN_FIELD]] +// CHECK: store i64 [[BYTES_LEN]], ptr %{{[0-9]+}} +// CHECK: [[BYTES_CAP_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringStruct, ptr [[BYTES_STRING_STRUCT]], i32 0, i32 1 +// CHECK-NEXT: [[BYTES_CAP:%[0-9]+]] = load i64, ptr [[BYTES_CAP_FIELD]] +// CHECK: store i64 [[BYTES_CAP]], ptr %{{[0-9]+}} +// CHECK: [[BYTES_RESULT:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr [[BYTES_SLICE_ADDR]] +// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" [[BYTES_RESULT]] func bytes(s string) (ret []byte) { rp := (*slice)(unsafe.Pointer(&ret)) @@ -68,52 +63,18 @@ func bytes(s string) (ret []byte) { } // CHECK-LABEL: define void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %2 = icmp eq i64 %1, 0 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: %4 = phi i64 [ -1, %_llgo_2 ], [ %5, %_llgo_4 ] -// CHECK-NEXT: %5 = add i64 %4, 1 -// CHECK-NEXT: %6 = icmp slt i64 %5, %3 -// CHECK-NEXT: br i1 %6, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %9 = icmp slt i64 %5, 0 -// CHECK-NEXT: %10 = icmp uge i64 %5, %8 -// CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, i64 %5, i1 true, i64 %8) -// CHECK-NEXT: %12 = getelementptr inbounds i8, ptr %7, i64 %5 -// CHECK-NEXT: %13 = load i8, ptr %12, align 1 -// CHECK-NEXT: %14 = call i32 (ptr, ...) @printf(ptr @0, i8 %13) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[GWRITE_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK-NEXT: [[GWRITE_EMPTY:%[0-9]+]] = icmp eq i64 [[GWRITE_LEN]], 0 +// CHECK-NEXT: br i1 [[GWRITE_EMPTY]], label %{{.*}}, label %{{.*}} +// CHECK: [[GWRITE_RANGE_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: [[GWRITE_INDEX:%[0-9]+]] = add i64 %{{[0-9]+}}, 1 +// CHECK-NEXT: [[GWRITE_MORE:%[0-9]+]] = icmp slt i64 [[GWRITE_INDEX]], [[GWRITE_RANGE_LEN]] +// CHECK: [[GWRITE_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 +// CHECK: [[GWRITE_BOUND:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 [[GWRITE_INDEX]], i1 true, i64 [[GWRITE_BOUND]]) +// CHECK-NEXT: [[GWRITE_BYTE_PTR:%[0-9]+]] = getelementptr inbounds i8, ptr [[GWRITE_DATA]], i64 [[GWRITE_INDEX]] +// CHECK-NEXT: [[GWRITE_BYTE:%[0-9]+]] = load i8, ptr [[GWRITE_BYTE_PTR]] +// CHECK-NEXT: {{%[0-9]+}} = call i32 (ptr, ...) @printf(ptr [[FMT_CHAR]], i8 [[GWRITE_BYTE]]) func gwrite(b []byte) { if len(b) == 0 { @@ -124,173 +85,24 @@ func gwrite(b []byte) { } } +// The driver only checks that representative source constants reach the +// helpers. The helper checks below own the printing and boxing contracts. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.printuint(i64 1024) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.printhex(i64 305441743) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.prinxor(i64 1) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.prinsub(i64 100) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.prinusub(i64 -1) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: call void @main.prinfsub(double 1.001000e+02) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.000000e+09, ptr %0, align 4 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %0, 1 -// CHECK-NEXT: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 2.000000e+09, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2, 1 -// CHECK-NEXT: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: br i1 true, label %_llgo_3, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %4, i64 0 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 10 }, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %7, ptr %5, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %4, i64 1 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 true, ptr %9, align 1 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %9, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %10, ptr %8, align 8 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4, 0 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %11, i64 2, 1 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %12, i64 2, 2 -// CHECK-NEXT: call void @main.println(%"{{.*}}/runtime/internal/runtime.Slice" %13) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_3, %_llgo_0 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %14, i64 0 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 8 }, ptr %16, align 8 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %17, ptr %15, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %14, i64 1 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 true, ptr %19, align 1 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %19, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %20, ptr %18, align 8 -// CHECK-NEXT: %21 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %14, i64 2 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 true, ptr %22, align 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %22, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %23, ptr %21, align 8 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %14, 0 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, i64 3, 1 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %25, i64 3, 2 -// CHECK-NEXT: call void @main.println(%"{{.*}}/runtime/internal/runtime.Slice" %26) -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 256) -// CHECK-NEXT: %28 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 0 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 true, ptr %29, align 1 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %29, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %30, ptr %28, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 1 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 false, ptr %32, align 1 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %32, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %33, ptr %31, align 8 -// CHECK-NEXT: %34 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 2 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %35, align 4 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %35, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %36, ptr %34, align 8 -// CHECK-NEXT: %37 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 3 -// CHECK-NEXT: %38 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 65, ptr %38, align 4 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %38, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %39, ptr %37, align 8 -// CHECK-NEXT: %40 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 4 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 20013, ptr %41, align 4 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %41, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %42, ptr %40, align 8 -// CHECK-NEXT: %43 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 5 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 1, ptr %44, align 1 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %44, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %45, ptr %43, align 8 -// CHECK-NEXT: %46 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 6 -// CHECK-NEXT: %47 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 2, ptr %47, align 2 -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %47, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %48, ptr %46, align 8 -// CHECK-NEXT: %49 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 7 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 3, ptr %50, align 4 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %50, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %51, ptr %49, align 8 -// CHECK-NEXT: %52 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 8 -// CHECK-NEXT: %53 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 4, ptr %53, align 8 -// CHECK-NEXT: %54 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %53, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %54, ptr %52, align 8 -// CHECK-NEXT: %55 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 9 -// CHECK-NEXT: %56 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 5, ptr %56, align 8 -// CHECK-NEXT: %57 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %56, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %57, ptr %55, align 8 -// CHECK-NEXT: %58 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 10 -// CHECK-NEXT: %59 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 1, ptr %59, align 1 -// CHECK-NEXT: %60 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %59, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %60, ptr %58, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 11 -// CHECK-NEXT: %62 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 2, ptr %62, align 2 -// CHECK-NEXT: %63 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %62, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %63, ptr %61, align 8 -// CHECK-NEXT: %64 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 12 -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 3, ptr %65, align 4 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %65, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %66, ptr %64, align 8 -// CHECK-NEXT: %67 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 13 -// CHECK-NEXT: %68 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 4, ptr %68, align 8 -// CHECK-NEXT: %69 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %68, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %69, ptr %67, align 8 -// CHECK-NEXT: %70 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 14 -// CHECK-NEXT: %71 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 5, ptr %71, align 8 -// CHECK-NEXT: %72 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %71, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %72, ptr %70, align 8 -// CHECK-NEXT: %73 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 15 -// CHECK-NEXT: %74 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }, ptr %74, align 8 -// CHECK-NEXT: %75 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %74, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %75, ptr %73, align 8 -// CHECK-NEXT: %76 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %27, 0 -// CHECK-NEXT: %77 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, i64 16, 1 -// CHECK-NEXT: %78 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %77, i64 16, 2 -// CHECK-NEXT: call void @main.println(%"{{.*}}/runtime/internal/runtime.Slice" %78) -// CHECK-NEXT: %79 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %80 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %79, i64 0 -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %81, align 8 -// CHECK-NEXT: %82 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %81, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %82, ptr %80, align 8 -// CHECK-NEXT: %83 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %79, 0 -// CHECK-NEXT: %84 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %83, i64 1, 1 -// CHECK-NEXT: %85 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %84, i64 1, 2 -// CHECK-NEXT: call void @main.println(%"{{.*}}/runtime/internal/runtime.Slice" %85) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: br i1 true, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) +// CHECK: call void @main.printuint(i64 1024) +// CHECK: call void @main.printhex(i64 305441743) +// CHECK: call void @main.prinxor(i64 1) +// CHECK: call void @main.prinsub(i64 100) +// CHECK: call void @main.prinusub(i64 -1) +// CHECK: call void @main.prinfsub(double 1.001000e+02) +// CHECK: [[MAIN_F32_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) +// CHECK-NEXT: store float 1.000000e+09, ptr [[MAIN_F32_ADDR]] +// CHECK-NEXT: [[MAIN_F32_BOX:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr [[MAIN_F32_ADDR]], 1 +// CHECK-NEXT: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" [[MAIN_F32_BOX]]) +// CHECK: [[MAIN_F64_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store double 2.000000e+09, ptr [[MAIN_F64_ADDR]] +// CHECK-NEXT: [[MAIN_F64_BOX:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr [[MAIN_F64_ADDR]], 1 +// CHECK-NEXT: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" [[MAIN_F64_BOX]]) func main() { printstring("llgo") @@ -326,475 +138,104 @@ func main() { } // CHECK-LABEL: define void @main.prinfsub(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = fneg double %0 -// CHECK-NEXT: call void @main.printfloat(double %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PRINFSUB_NEG:%[0-9]+]] = fneg double %0 +// CHECK-NEXT: call void @main.printfloat(double [[PRINFSUB_NEG]]) func prinfsub(n float64) { printfloat(-n) } // CHECK-LABEL: define void @main.prinsub(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = sub i64 0, %0 -// CHECK-NEXT: call void @main.printint(i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PRINSUB_NEG:%[0-9]+]] = sub i64 0, %0 +// CHECK-NEXT: call void @main.printint(i64 [[PRINSUB_NEG]]) func prinsub(n int64) { printint(-n) } // CHECK-LABEL: define void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %2 = icmp eq ptr %1, @_llgo_bool -// CHECK-NEXT: br i1 %2, label %_llgo_35, label %_llgo_36 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_34, %_llgo_85, %_llgo_32, %_llgo_30, %_llgo_28, %_llgo_26, %_llgo_24, %_llgo_22, %_llgo_20, %_llgo_18, %_llgo_16, %_llgo_14, %_llgo_12, %_llgo_10, %_llgo_8, %_llgo_6, %_llgo_4, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_37 -// CHECK-NEXT: call void @main.printbool(i1 %53) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_37 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %4 = icmp eq ptr %3, @_llgo_int -// CHECK-NEXT: br i1 %4, label %_llgo_38, label %_llgo_39 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_40 -// CHECK-NEXT: call void @main.printint(i64 %60) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_40 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %6 = icmp eq ptr %5, @_llgo_int8 -// CHECK-NEXT: br i1 %6, label %_llgo_41, label %_llgo_42 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_43 -// CHECK-NEXT: %7 = sext i8 %67 to i64 -// CHECK-NEXT: call void @main.printint(i64 %7) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_43 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %9 = icmp eq ptr %8, @_llgo_int16 -// CHECK-NEXT: br i1 %9, label %_llgo_44, label %_llgo_45 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_46 -// CHECK-NEXT: %10 = sext i16 %74 to i64 -// CHECK-NEXT: call void @main.printint(i64 %10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_46 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %12 = icmp eq ptr %11, @_llgo_int32 -// CHECK-NEXT: br i1 %12, label %_llgo_47, label %_llgo_48 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_49 -// CHECK-NEXT: %13 = sext i32 %81 to i64 -// CHECK-NEXT: call void @main.printint(i64 %13) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_49 -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %15 = icmp eq ptr %14, @_llgo_int64 -// CHECK-NEXT: br i1 %15, label %_llgo_50, label %_llgo_51 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_52 -// CHECK-NEXT: call void @main.printint(i64 %88) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_52 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %17 = icmp eq ptr %16, @_llgo_uint -// CHECK-NEXT: br i1 %17, label %_llgo_53, label %_llgo_54 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_55 -// CHECK-NEXT: call void @main.printuint(i64 %95) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_55 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %19 = icmp eq ptr %18, @_llgo_uint8 -// CHECK-NEXT: br i1 %19, label %_llgo_56, label %_llgo_57 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_58 -// CHECK-NEXT: %20 = zext i8 %102 to i64 -// CHECK-NEXT: call void @main.printuint(i64 %20) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_58 -// CHECK-NEXT: %21 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %22 = icmp eq ptr %21, @_llgo_uint16 -// CHECK-NEXT: br i1 %22, label %_llgo_59, label %_llgo_60 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_61 -// CHECK-NEXT: %23 = zext i16 %109 to i64 -// CHECK-NEXT: call void @main.printuint(i64 %23) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_61 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %25 = icmp eq ptr %24, @_llgo_uint32 -// CHECK-NEXT: br i1 %25, label %_llgo_62, label %_llgo_63 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_64 -// CHECK-NEXT: %26 = zext i32 %116 to i64 -// CHECK-NEXT: call void @main.printuint(i64 %26) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_64 -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %28 = icmp eq ptr %27, @_llgo_uint64 -// CHECK-NEXT: br i1 %28, label %_llgo_65, label %_llgo_66 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_67 -// CHECK-NEXT: call void @main.printuint(i64 %123) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_67 -// CHECK-NEXT: %29 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %30 = icmp eq ptr %29, @_llgo_uintptr -// CHECK-NEXT: br i1 %30, label %_llgo_68, label %_llgo_69 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_70 -// CHECK-NEXT: call void @main.printuint(i64 %130) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_70 -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %32 = icmp eq ptr %31, @_llgo_float32 -// CHECK-NEXT: br i1 %32, label %_llgo_71, label %_llgo_72 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_73 -// CHECK-NEXT: %33 = fpext float %137 to double -// CHECK-NEXT: call void @main.printfloat(double %33) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_73 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %35 = icmp eq ptr %34, @_llgo_float64 -// CHECK-NEXT: br i1 %35, label %_llgo_74, label %_llgo_75 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_76 -// CHECK-NEXT: call void @main.printfloat(double %144) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_76 -// CHECK-NEXT: %36 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %37 = icmp eq ptr %36, @_llgo_complex64 -// CHECK-NEXT: br i1 %37, label %_llgo_77, label %_llgo_78 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_79 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @21, i64 1 }) -// CHECK-NEXT: %38 = extractvalue { float, float } %151, 0 -// CHECK-NEXT: %39 = fpext float %38 to double -// CHECK-NEXT: call void @main.printfloat(double %39) -// CHECK-NEXT: %40 = extractvalue { float, float } %151, 1 -// CHECK-NEXT: %41 = fpext float %40 to double -// CHECK-NEXT: call void @main.printfloat(double %41) -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 2 }) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_79 -// CHECK-NEXT: %42 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %43 = icmp eq ptr %42, @_llgo_complex128 -// CHECK-NEXT: br i1 %43, label %_llgo_80, label %_llgo_81 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_82 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @21, i64 1 }) -// CHECK-NEXT: %44 = extractvalue { double, double } %158, 0 -// CHECK-NEXT: call void @main.printfloat(double %44) -// CHECK-NEXT: %45 = extractvalue { double, double } %158, 1 -// CHECK-NEXT: call void @main.printfloat(double %45) -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 2 }) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_82 -// CHECK-NEXT: %46 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %47 = icmp eq ptr %46, @_llgo_string -// CHECK-NEXT: br i1 %47, label %_llgo_83, label %_llgo_84 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_34: ; preds = %_llgo_85 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" %165) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_35: ; preds = %_llgo_0 -// CHECK-NEXT: %48 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %49 = load i1, ptr %48, align 1 -// CHECK-NEXT: %50 = insertvalue { i1, i1 } undef, i1 %49, 0 -// CHECK-NEXT: %51 = insertvalue { i1, i1 } %50, i1 true, 1 -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_36: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_37: ; preds = %_llgo_36, %_llgo_35 -// CHECK-NEXT: %52 = phi { i1, i1 } [ %51, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] -// CHECK-NEXT: %53 = extractvalue { i1, i1 } %52, 0 -// CHECK-NEXT: %54 = extractvalue { i1, i1 } %52, 1 -// CHECK-NEXT: br i1 %54, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_38: ; preds = %_llgo_3 -// CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %56 = load i64, ptr %55, align 8 -// CHECK-NEXT: %57 = insertvalue { i64, i1 } undef, i64 %56, 0 -// CHECK-NEXT: %58 = insertvalue { i64, i1 } %57, i1 true, 1 -// CHECK-NEXT: br label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_39: ; preds = %_llgo_3 -// CHECK-NEXT: br label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_40: ; preds = %_llgo_39, %_llgo_38 -// CHECK-NEXT: %59 = phi { i64, i1 } [ %58, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] -// CHECK-NEXT: %60 = extractvalue { i64, i1 } %59, 0 -// CHECK-NEXT: %61 = extractvalue { i64, i1 } %59, 1 -// CHECK-NEXT: br i1 %61, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_41: ; preds = %_llgo_5 -// CHECK-NEXT: %62 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %63 = load i8, ptr %62, align 1 -// CHECK-NEXT: %64 = insertvalue { i8, i1 } undef, i8 %63, 0 -// CHECK-NEXT: %65 = insertvalue { i8, i1 } %64, i1 true, 1 -// CHECK-NEXT: br label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_42: ; preds = %_llgo_5 -// CHECK-NEXT: br label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_43: ; preds = %_llgo_42, %_llgo_41 -// CHECK-NEXT: %66 = phi { i8, i1 } [ %65, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] -// CHECK-NEXT: %67 = extractvalue { i8, i1 } %66, 0 -// CHECK-NEXT: %68 = extractvalue { i8, i1 } %66, 1 -// CHECK-NEXT: br i1 %68, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_44: ; preds = %_llgo_7 -// CHECK-NEXT: %69 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %70 = load i16, ptr %69, align 2 -// CHECK-NEXT: %71 = insertvalue { i16, i1 } undef, i16 %70, 0 -// CHECK-NEXT: %72 = insertvalue { i16, i1 } %71, i1 true, 1 -// CHECK-NEXT: br label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_45: ; preds = %_llgo_7 -// CHECK-NEXT: br label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_46: ; preds = %_llgo_45, %_llgo_44 -// CHECK-NEXT: %73 = phi { i16, i1 } [ %72, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] -// CHECK-NEXT: %74 = extractvalue { i16, i1 } %73, 0 -// CHECK-NEXT: %75 = extractvalue { i16, i1 } %73, 1 -// CHECK-NEXT: br i1 %75, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_47: ; preds = %_llgo_9 -// CHECK-NEXT: %76 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %77 = load i32, ptr %76, align 4 -// CHECK-NEXT: %78 = insertvalue { i32, i1 } undef, i32 %77, 0 -// CHECK-NEXT: %79 = insertvalue { i32, i1 } %78, i1 true, 1 -// CHECK-NEXT: br label %_llgo_49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_48: ; preds = %_llgo_9 -// CHECK-NEXT: br label %_llgo_49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_49: ; preds = %_llgo_48, %_llgo_47 -// CHECK-NEXT: %80 = phi { i32, i1 } [ %79, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] -// CHECK-NEXT: %81 = extractvalue { i32, i1 } %80, 0 -// CHECK-NEXT: %82 = extractvalue { i32, i1 } %80, 1 -// CHECK-NEXT: br i1 %82, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_50: ; preds = %_llgo_11 -// CHECK-NEXT: %83 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %84 = load i64, ptr %83, align 8 -// CHECK-NEXT: %85 = insertvalue { i64, i1 } undef, i64 %84, 0 -// CHECK-NEXT: %86 = insertvalue { i64, i1 } %85, i1 true, 1 -// CHECK-NEXT: br label %_llgo_52 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_51: ; preds = %_llgo_11 -// CHECK-NEXT: br label %_llgo_52 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_52: ; preds = %_llgo_51, %_llgo_50 -// CHECK-NEXT: %87 = phi { i64, i1 } [ %86, %_llgo_50 ], [ zeroinitializer, %_llgo_51 ] -// CHECK-NEXT: %88 = extractvalue { i64, i1 } %87, 0 -// CHECK-NEXT: %89 = extractvalue { i64, i1 } %87, 1 -// CHECK-NEXT: br i1 %89, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_53: ; preds = %_llgo_13 -// CHECK-NEXT: %90 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %91 = load i64, ptr %90, align 8 -// CHECK-NEXT: %92 = insertvalue { i64, i1 } undef, i64 %91, 0 -// CHECK-NEXT: %93 = insertvalue { i64, i1 } %92, i1 true, 1 -// CHECK-NEXT: br label %_llgo_55 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_54: ; preds = %_llgo_13 -// CHECK-NEXT: br label %_llgo_55 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_55: ; preds = %_llgo_54, %_llgo_53 -// CHECK-NEXT: %94 = phi { i64, i1 } [ %93, %_llgo_53 ], [ zeroinitializer, %_llgo_54 ] -// CHECK-NEXT: %95 = extractvalue { i64, i1 } %94, 0 -// CHECK-NEXT: %96 = extractvalue { i64, i1 } %94, 1 -// CHECK-NEXT: br i1 %96, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_56: ; preds = %_llgo_15 -// CHECK-NEXT: %97 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %98 = load i8, ptr %97, align 1 -// CHECK-NEXT: %99 = insertvalue { i8, i1 } undef, i8 %98, 0 -// CHECK-NEXT: %100 = insertvalue { i8, i1 } %99, i1 true, 1 -// CHECK-NEXT: br label %_llgo_58 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_57: ; preds = %_llgo_15 -// CHECK-NEXT: br label %_llgo_58 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_58: ; preds = %_llgo_57, %_llgo_56 -// CHECK-NEXT: %101 = phi { i8, i1 } [ %100, %_llgo_56 ], [ zeroinitializer, %_llgo_57 ] -// CHECK-NEXT: %102 = extractvalue { i8, i1 } %101, 0 -// CHECK-NEXT: %103 = extractvalue { i8, i1 } %101, 1 -// CHECK-NEXT: br i1 %103, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_59: ; preds = %_llgo_17 -// CHECK-NEXT: %104 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %105 = load i16, ptr %104, align 2 -// CHECK-NEXT: %106 = insertvalue { i16, i1 } undef, i16 %105, 0 -// CHECK-NEXT: %107 = insertvalue { i16, i1 } %106, i1 true, 1 -// CHECK-NEXT: br label %_llgo_61 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_60: ; preds = %_llgo_17 -// CHECK-NEXT: br label %_llgo_61 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_61: ; preds = %_llgo_60, %_llgo_59 -// CHECK-NEXT: %108 = phi { i16, i1 } [ %107, %_llgo_59 ], [ zeroinitializer, %_llgo_60 ] -// CHECK-NEXT: %109 = extractvalue { i16, i1 } %108, 0 -// CHECK-NEXT: %110 = extractvalue { i16, i1 } %108, 1 -// CHECK-NEXT: br i1 %110, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_62: ; preds = %_llgo_19 -// CHECK-NEXT: %111 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %112 = load i32, ptr %111, align 4 -// CHECK-NEXT: %113 = insertvalue { i32, i1 } undef, i32 %112, 0 -// CHECK-NEXT: %114 = insertvalue { i32, i1 } %113, i1 true, 1 -// CHECK-NEXT: br label %_llgo_64 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_63: ; preds = %_llgo_19 -// CHECK-NEXT: br label %_llgo_64 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_64: ; preds = %_llgo_63, %_llgo_62 -// CHECK-NEXT: %115 = phi { i32, i1 } [ %114, %_llgo_62 ], [ zeroinitializer, %_llgo_63 ] -// CHECK-NEXT: %116 = extractvalue { i32, i1 } %115, 0 -// CHECK-NEXT: %117 = extractvalue { i32, i1 } %115, 1 -// CHECK-NEXT: br i1 %117, label %_llgo_20, label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_65: ; preds = %_llgo_21 -// CHECK-NEXT: %118 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %119 = load i64, ptr %118, align 8 -// CHECK-NEXT: %120 = insertvalue { i64, i1 } undef, i64 %119, 0 -// CHECK-NEXT: %121 = insertvalue { i64, i1 } %120, i1 true, 1 -// CHECK-NEXT: br label %_llgo_67 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_66: ; preds = %_llgo_21 -// CHECK-NEXT: br label %_llgo_67 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_67: ; preds = %_llgo_66, %_llgo_65 -// CHECK-NEXT: %122 = phi { i64, i1 } [ %121, %_llgo_65 ], [ zeroinitializer, %_llgo_66 ] -// CHECK-NEXT: %123 = extractvalue { i64, i1 } %122, 0 -// CHECK-NEXT: %124 = extractvalue { i64, i1 } %122, 1 -// CHECK-NEXT: br i1 %124, label %_llgo_22, label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_68: ; preds = %_llgo_23 -// CHECK-NEXT: %125 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %126 = load i64, ptr %125, align 8 -// CHECK-NEXT: %127 = insertvalue { i64, i1 } undef, i64 %126, 0 -// CHECK-NEXT: %128 = insertvalue { i64, i1 } %127, i1 true, 1 -// CHECK-NEXT: br label %_llgo_70 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_69: ; preds = %_llgo_23 -// CHECK-NEXT: br label %_llgo_70 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_70: ; preds = %_llgo_69, %_llgo_68 -// CHECK-NEXT: %129 = phi { i64, i1 } [ %128, %_llgo_68 ], [ zeroinitializer, %_llgo_69 ] -// CHECK-NEXT: %130 = extractvalue { i64, i1 } %129, 0 -// CHECK-NEXT: %131 = extractvalue { i64, i1 } %129, 1 -// CHECK-NEXT: br i1 %131, label %_llgo_24, label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_71: ; preds = %_llgo_25 -// CHECK-NEXT: %132 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %133 = load float, ptr %132, align 4 -// CHECK-NEXT: %134 = insertvalue { float, i1 } undef, float %133, 0 -// CHECK-NEXT: %135 = insertvalue { float, i1 } %134, i1 true, 1 -// CHECK-NEXT: br label %_llgo_73 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_72: ; preds = %_llgo_25 -// CHECK-NEXT: br label %_llgo_73 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_73: ; preds = %_llgo_72, %_llgo_71 -// CHECK-NEXT: %136 = phi { float, i1 } [ %135, %_llgo_71 ], [ zeroinitializer, %_llgo_72 ] -// CHECK-NEXT: %137 = extractvalue { float, i1 } %136, 0 -// CHECK-NEXT: %138 = extractvalue { float, i1 } %136, 1 -// CHECK-NEXT: br i1 %138, label %_llgo_26, label %_llgo_27 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_74: ; preds = %_llgo_27 -// CHECK-NEXT: %139 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %140 = load double, ptr %139, align 8 -// CHECK-NEXT: %141 = insertvalue { double, i1 } undef, double %140, 0 -// CHECK-NEXT: %142 = insertvalue { double, i1 } %141, i1 true, 1 -// CHECK-NEXT: br label %_llgo_76 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_75: ; preds = %_llgo_27 -// CHECK-NEXT: br label %_llgo_76 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_76: ; preds = %_llgo_75, %_llgo_74 -// CHECK-NEXT: %143 = phi { double, i1 } [ %142, %_llgo_74 ], [ zeroinitializer, %_llgo_75 ] -// CHECK-NEXT: %144 = extractvalue { double, i1 } %143, 0 -// CHECK-NEXT: %145 = extractvalue { double, i1 } %143, 1 -// CHECK-NEXT: br i1 %145, label %_llgo_28, label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_77: ; preds = %_llgo_29 -// CHECK-NEXT: %146 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %147 = load { float, float }, ptr %146, align 4 -// CHECK-NEXT: %148 = insertvalue { { float, float }, i1 } undef, { float, float } %147, 0 -// CHECK-NEXT: %149 = insertvalue { { float, float }, i1 } %148, i1 true, 1 -// CHECK-NEXT: br label %_llgo_79 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_78: ; preds = %_llgo_29 -// CHECK-NEXT: br label %_llgo_79 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_79: ; preds = %_llgo_78, %_llgo_77 -// CHECK-NEXT: %150 = phi { { float, float }, i1 } [ %149, %_llgo_77 ], [ zeroinitializer, %_llgo_78 ] -// CHECK-NEXT: %151 = extractvalue { { float, float }, i1 } %150, 0 -// CHECK-NEXT: %152 = extractvalue { { float, float }, i1 } %150, 1 -// CHECK-NEXT: br i1 %152, label %_llgo_30, label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_80: ; preds = %_llgo_31 -// CHECK-NEXT: %153 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %154 = load { double, double }, ptr %153, align 8 -// CHECK-NEXT: %155 = insertvalue { { double, double }, i1 } undef, { double, double } %154, 0 -// CHECK-NEXT: %156 = insertvalue { { double, double }, i1 } %155, i1 true, 1 -// CHECK-NEXT: br label %_llgo_82 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_81: ; preds = %_llgo_31 -// CHECK-NEXT: br label %_llgo_82 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_82: ; preds = %_llgo_81, %_llgo_80 -// CHECK-NEXT: %157 = phi { { double, double }, i1 } [ %156, %_llgo_80 ], [ zeroinitializer, %_llgo_81 ] -// CHECK-NEXT: %158 = extractvalue { { double, double }, i1 } %157, 0 -// CHECK-NEXT: %159 = extractvalue { { double, double }, i1 } %157, 1 -// CHECK-NEXT: br i1 %159, label %_llgo_32, label %_llgo_33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_83: ; preds = %_llgo_33 -// CHECK-NEXT: %160 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %161 = load %"{{.*}}/runtime/internal/runtime.String", ptr %160, align 8 -// CHECK-NEXT: %162 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %161, 0 -// CHECK-NEXT: %163 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %162, i1 true, 1 -// CHECK-NEXT: br label %_llgo_85 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_84: ; preds = %_llgo_33 -// CHECK-NEXT: br label %_llgo_85 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_85: ; preds = %_llgo_84, %_llgo_83 -// CHECK-NEXT: %164 = phi { %"{{.*}}/runtime/internal/runtime.String", i1 } [ %163, %_llgo_83 ], [ zeroinitializer, %_llgo_84 ] -// CHECK-NEXT: %165 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %164, 0 -// CHECK-NEXT: %166 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %164, 1 -// CHECK-NEXT: br i1 %166, label %_llgo_34, label %_llgo_1 -// CHECK-NEXT: } +// CHECK: [[PA_TYPE0:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: [[PA_IS_BOOL:%[0-9]+]] = icmp eq ptr [[PA_TYPE0]], @_llgo_bool +// CHECK: call void @main.printbool(i1 [[PA_BOOL:%[0-9]+]]) +// CHECK: [[PA_TYPE1:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: {{%[0-9]+}} = icmp eq ptr [[PA_TYPE1]], @_llgo_int +// CHECK: call void @main.printint(i64 [[PA_INT:%[0-9]+]]) +// CHECK: [[PA_TYPE2:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: {{%[0-9]+}} = icmp eq ptr [[PA_TYPE2]], @_llgo_int8 +// CHECK: [[PA_INT8_EXT:%[0-9]+]] = sext i8 [[PA_INT8:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printint(i64 [[PA_INT8_EXT]]) +// CHECK: [[PA_TYPE3:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE3]], @_llgo_int16 +// CHECK: [[PA_INT16_EXT:%[0-9]+]] = sext i16 [[PA_INT16:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printint(i64 [[PA_INT16_EXT]]) +// CHECK: [[PA_TYPE4:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE4]], @_llgo_int32 +// CHECK: [[PA_INT32_EXT:%[0-9]+]] = sext i32 [[PA_INT32:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printint(i64 [[PA_INT32_EXT]]) +// CHECK: [[PA_TYPE5:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE5]], @_llgo_int64 +// CHECK: call void @main.printint(i64 [[PA_INT64:%[0-9]+]]) +// CHECK: [[PA_TYPE6:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE6]], @_llgo_uint +// CHECK: call void @main.printuint(i64 [[PA_UINT:%[0-9]+]]) +// CHECK: [[PA_TYPE7:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE7]], @_llgo_uint8 +// CHECK: [[PA_UINT8_EXT:%[0-9]+]] = zext i8 [[PA_UINT8:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printuint(i64 [[PA_UINT8_EXT]]) +// CHECK: [[PA_TYPE8:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE8]], @_llgo_uint16 +// CHECK: [[PA_UINT16_EXT:%[0-9]+]] = zext i16 [[PA_UINT16:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printuint(i64 [[PA_UINT16_EXT]]) +// CHECK: [[PA_TYPE9:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE9]], @_llgo_uint32 +// CHECK: [[PA_UINT32_EXT:%[0-9]+]] = zext i32 [[PA_UINT32:%[0-9]+]] to i64 +// CHECK-NEXT: call void @main.printuint(i64 [[PA_UINT32_EXT]]) +// CHECK: [[PA_TYPE10:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE10]], @_llgo_uint64 +// CHECK: call void @main.printuint(i64 [[PA_UINT64:%[0-9]+]]) +// CHECK: [[PA_TYPE11:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE11]], @_llgo_uintptr +// CHECK: call void @main.printuint(i64 [[PA_UINTPTR:%[0-9]+]]) +// CHECK: [[PA_TYPE12:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE12]], @_llgo_float32 +// CHECK: [[PA_FLOAT32_EXT:%[0-9]+]] = fpext float [[PA_FLOAT32:%[0-9]+]] to double +// CHECK-NEXT: call void @main.printfloat(double [[PA_FLOAT32_EXT]]) +// CHECK: [[PA_TYPE13:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE13]], @_llgo_float64 +// CHECK: call void @main.printfloat(double [[PA_FLOAT64:%[0-9]+]]) +// CHECK: [[PA_TYPE14:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE14]], @_llgo_complex64 +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_LPAREN]], i64 1 }) +// CHECK-NEXT: [[PA_COMPLEX64_REAL:%[0-9]+]] = extractvalue { float, float } [[PA_COMPLEX64:%[0-9]+]], 0 +// CHECK-NEXT: [[PA_COMPLEX64_REAL_EXT:%[0-9]+]] = fpext float [[PA_COMPLEX64_REAL]] to double +// CHECK-NEXT: call void @main.printfloat(double [[PA_COMPLEX64_REAL_EXT]]) +// CHECK-NEXT: [[PA_COMPLEX64_IMAG:%[0-9]+]] = extractvalue { float, float } [[PA_COMPLEX64]], 1 +// CHECK-NEXT: [[PA_COMPLEX64_IMAG_EXT:%[0-9]+]] = fpext float [[PA_COMPLEX64_IMAG]] to double +// CHECK-NEXT: call void @main.printfloat(double [[PA_COMPLEX64_IMAG_EXT]]) +// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_ICLOSE]], i64 2 }) +// CHECK: [[PA_TYPE15:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE15]], @_llgo_complex128 +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_LPAREN]], i64 1 }) +// CHECK-NEXT: [[PA_COMPLEX128_REAL:%[0-9]+]] = extractvalue { double, double } [[PA_COMPLEX128:%[0-9]+]], 0 +// CHECK-NEXT: call void @main.printfloat(double [[PA_COMPLEX128_REAL]]) +// CHECK-NEXT: [[PA_COMPLEX128_IMAG:%[0-9]+]] = extractvalue { double, double } [[PA_COMPLEX128]], 1 +// CHECK-NEXT: call void @main.printfloat(double [[PA_COMPLEX128_IMAG]]) +// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_ICLOSE]], i64 2 }) +// CHECK: [[PA_TYPE16:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 +// CHECK-NEXT: icmp eq ptr [[PA_TYPE16]], @_llgo_string +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" [[PA_STRING:%[0-9]+]]) +// Tie representative result values back to the payload loads in the delayed +// type-assertion blocks. This covers scalar, widened, aggregate, and string +// payloads without snapshotting every compiler-generated block. +// CHECK: [[PA_BOOL_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 +// CHECK-NEXT: [[PA_BOOL_LOAD:%[0-9]+]] = load i1, ptr [[PA_BOOL_DATA]] +// CHECK: [[PA_BOOL_PAIR:%[0-9]+]] = phi { i1, i1 } +// CHECK-NEXT: [[PA_BOOL]] = extractvalue { i1, i1 } [[PA_BOOL_PAIR]], 0 +// CHECK: [[PA_INT8]] = extractvalue { i8, i1 } [[PA_INT8_PAIR:%[0-9]+]], 0 +// CHECK: [[PA_UINT32]] = extractvalue { i32, i1 } [[PA_UINT32_PAIR:%[0-9]+]], 0 +// CHECK: [[PA_FLOAT32]] = extractvalue { float, i1 } [[PA_FLOAT32_PAIR:%[0-9]+]], 0 +// CHECK: [[PA_COMPLEX128]] = extractvalue { { double, double }, i1 } [[PA_COMPLEX128_PAIR:%[0-9]+]], 0 +// CHECK: [[PA_STRING]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } [[PA_STRING_PAIR:%[0-9]+]], 0 func printany(v any) { switch v := v.(type) { @@ -842,20 +283,9 @@ func printany(v any) { } // CHECK-LABEL: define void @main.printbool(i1 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 %0, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 4 }) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @24, i64 5 }) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-NEXT: } +// CHECK: br i1 %0, label %{{.*}}, label %{{.*}} +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_TRUE]], i64 4 }) +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_FALSE]], i64 5 }) func printbool(v bool) { if v { @@ -866,202 +296,45 @@ func printbool(v bool) { } // CHECK-LABEL: define void @main.printfloat(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = fcmp une double %0, %0 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 3 }) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_7 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @26, i64 4 }) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %2 = fadd double %0, %0 -// CHECK-NEXT: %3 = fcmp oeq double %2, %0 -// CHECK-NEXT: br i1 %3, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_10 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @27, i64 4 }) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7 -// CHECK-NEXT: %4 = fadd double %0, %0 -// CHECK-NEXT: %5 = fcmp oeq double %4, %0 -// CHECK-NEXT: br i1 %5, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_3 -// CHECK-NEXT: %6 = fcmp ogt double %0, 0.000000e+00 -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6, %_llgo_3 -// CHECK-NEXT: %7 = phi i1 [ false, %_llgo_3 ], [ %6, %_llgo_6 ] -// CHECK-NEXT: br i1 %7, label %_llgo_2, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 14) -// CHECK-NEXT: %9 = getelementptr inbounds i8, ptr %8, i64 0 -// CHECK-NEXT: store i8 43, ptr %9, align 1 -// CHECK-NEXT: %10 = fcmp oeq double %0, 0.000000e+00 -// CHECK-NEXT: br i1 %10, label %_llgo_11, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_5 -// CHECK-NEXT: %11 = fcmp olt double %0, 0.000000e+00 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_9, %_llgo_5 -// CHECK-NEXT: %12 = phi i1 [ false, %_llgo_5 ], [ %11, %_llgo_9 ] -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_8 -// CHECK-NEXT: %13 = fdiv double 1.000000e+00, %0 -// CHECK-NEXT: %14 = fcmp olt double %13, 0.000000e+00 -// CHECK-NEXT: br i1 %14, label %_llgo_14, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_24, %_llgo_23, %_llgo_14, %_llgo_11 -// CHECK-NEXT: %15 = phi double [ %0, %_llgo_11 ], [ %36, %_llgo_23 ], [ %0, %_llgo_14 ], [ %39, %_llgo_24 ] -// CHECK-NEXT: %16 = phi i64 [ 0, %_llgo_11 ], [ %29, %_llgo_23 ], [ 0, %_llgo_14 ], [ %38, %_llgo_24 ] -// CHECK-NEXT: br label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_8 -// CHECK-NEXT: %17 = fcmp olt double %0, 0.000000e+00 -// CHECK-NEXT: br i1 %17, label %_llgo_15, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_11 -// CHECK-NEXT: %18 = getelementptr inbounds i8, ptr %8, i64 0 -// CHECK-NEXT: store i8 45, ptr %18, align 1 -// CHECK-NEXT: br label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_13 -// CHECK-NEXT: %19 = fneg double %0 -// CHECK-NEXT: %20 = getelementptr inbounds i8, ptr %8, i64 0 -// CHECK-NEXT: store i8 45, ptr %20, align 1 -// CHECK-NEXT: br label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_17 -// CHECK-NEXT: %21 = add i64 %24, 1 -// CHECK-NEXT: %22 = fdiv double %23, 1.000000e+01 -// CHECK-NEXT: br label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_16, %_llgo_15, %_llgo_13 -// CHECK-NEXT: %23 = phi double [ %0, %_llgo_13 ], [ %22, %_llgo_16 ], [ %19, %_llgo_15 ] -// CHECK-NEXT: %24 = phi i64 [ 0, %_llgo_13 ], [ %21, %_llgo_16 ], [ 0, %_llgo_15 ] -// CHECK-NEXT: %25 = fcmp oge double %23, 1.000000e+01 -// CHECK-NEXT: br i1 %25, label %_llgo_16, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_20 -// CHECK-NEXT: %26 = sub i64 %29, 1 -// CHECK-NEXT: %27 = fmul double %28, 1.000000e+01 -// CHECK-NEXT: br label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_20 -// CHECK-NEXT: br label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_18, %_llgo_17 -// CHECK-NEXT: %28 = phi double [ %23, %_llgo_17 ], [ %27, %_llgo_18 ] -// CHECK-NEXT: %29 = phi i64 [ %24, %_llgo_17 ], [ %26, %_llgo_18 ] -// CHECK-NEXT: %30 = fcmp olt double %28, 1.000000e+00 -// CHECK-NEXT: br i1 %30, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_22, %_llgo_19 -// CHECK-NEXT: %31 = phi double [ 5.000000e+00, %_llgo_19 ], [ %34, %_llgo_22 ] -// CHECK-NEXT: %32 = phi i64 [ 0, %_llgo_19 ], [ %35, %_llgo_22 ] -// CHECK-NEXT: %33 = icmp slt i64 %32, 7 -// CHECK-NEXT: br i1 %33, label %_llgo_22, label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_21 -// CHECK-NEXT: %34 = fdiv double %31, 1.000000e+01 -// CHECK-NEXT: %35 = add i64 %32, 1 -// CHECK-NEXT: br label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_21 -// CHECK-NEXT: %36 = fadd double %28, %31 -// CHECK-NEXT: %37 = fcmp oge double %36, 1.000000e+01 -// CHECK-NEXT: br i1 %37, label %_llgo_24, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_23 -// CHECK-NEXT: %38 = add i64 %29, 1 -// CHECK-NEXT: %39 = fdiv double %36, 1.000000e+01 -// CHECK-NEXT: br label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_26, %_llgo_12 -// CHECK-NEXT: %40 = phi double [ %15, %_llgo_12 ], [ %62, %_llgo_26 ] -// CHECK-NEXT: %41 = phi i64 [ 0, %_llgo_12 ], [ %63, %_llgo_26 ] -// CHECK-NEXT: %42 = icmp slt i64 %41, 7 -// CHECK-NEXT: br i1 %42, label %_llgo_26, label %_llgo_27 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_25 -// CHECK-NEXT: %43 = fcmp ole double %40, 0xC3E0000000000000 -// CHECK-NEXT: %44 = fcmp oge double %40, 0x43E0000000000000 -// CHECK-NEXT: %45 = fcmp uno double %40, %40 -// CHECK-NEXT: %46 = select i1 %43, double 0.000000e+00, double %40 -// CHECK-NEXT: %47 = select i1 %44, double 0.000000e+00, double %46 -// CHECK-NEXT: %48 = select i1 %45, double 0.000000e+00, double %47 -// CHECK-NEXT: %49 = fptosi double %48 to i64 -// CHECK-NEXT: %50 = select i1 %43, i64 -9223372036854775808, i64 %49 -// CHECK-NEXT: %51 = select i1 %44, i64 9223372036854775807, i64 %50 -// CHECK-NEXT: %52 = select i1 %45, i64 0, i64 %51 -// CHECK-NEXT: %53 = add i64 %41, 2 -// CHECK-NEXT: %54 = add i64 %52, 48 -// CHECK-NEXT: %55 = trunc i64 %54 to i8 -// CHECK-NEXT: %56 = icmp slt i64 %53, 0 -// CHECK-NEXT: %57 = icmp uge i64 %53, 14 -// CHECK-NEXT: %58 = or i1 %57, %56 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %58, i64 %53, i1 true, i64 14) -// CHECK-NEXT: %59 = getelementptr inbounds i8, ptr %8, i64 %53 -// CHECK-NEXT: store i8 %55, ptr %59, align 1 -// CHECK-NEXT: %60 = sitofp i64 %52 to double -// CHECK-NEXT: %61 = fsub double %40, %60 -// CHECK-NEXT: %62 = fmul double %61, 1.000000e+01 -// CHECK-NEXT: %63 = add i64 %41, 1 -// CHECK-NEXT: br label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_25 -// CHECK-NEXT: %64 = getelementptr inbounds i8, ptr %8, i64 2 -// CHECK-NEXT: %65 = load i8, ptr %64, align 1 -// CHECK-NEXT: %66 = getelementptr inbounds i8, ptr %8, i64 1 -// CHECK-NEXT: store i8 %65, ptr %66, align 1 -// CHECK-NEXT: %67 = getelementptr inbounds i8, ptr %8, i64 2 -// CHECK-NEXT: store i8 46, ptr %67, align 1 -// CHECK-NEXT: %68 = getelementptr inbounds i8, ptr %8, i64 9 -// CHECK-NEXT: store i8 101, ptr %68, align 1 -// CHECK-NEXT: %69 = getelementptr inbounds i8, ptr %8, i64 10 -// CHECK-NEXT: store i8 43, ptr %69, align 1 -// CHECK-NEXT: %70 = icmp slt i64 %16, 0 -// CHECK-NEXT: br i1 %70, label %_llgo_28, label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_27 -// CHECK-NEXT: %71 = sub i64 0, %16 -// CHECK-NEXT: %72 = getelementptr inbounds i8, ptr %8, i64 10 -// CHECK-NEXT: store i8 45, ptr %72, align 1 -// CHECK-NEXT: br label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_28, %_llgo_27 -// CHECK-NEXT: %73 = phi i64 [ %16, %_llgo_27 ], [ %71, %_llgo_28 ] -// CHECK-NEXT: %74 = sdiv i64 %73, 100 -// CHECK-NEXT: %75 = trunc i64 %74 to i8 -// CHECK-NEXT: %76 = add i8 %75, 48 -// CHECK-NEXT: %77 = getelementptr inbounds i8, ptr %8, i64 11 -// CHECK-NEXT: store i8 %76, ptr %77, align 1 -// CHECK-NEXT: %78 = sdiv i64 %73, 10 -// CHECK-NEXT: %79 = trunc i64 %78 to i8 -// CHECK-NEXT: %80 = urem i8 %79, 10 -// CHECK-NEXT: %81 = add i8 %80, 48 -// CHECK-NEXT: %82 = getelementptr inbounds i8, ptr %8, i64 12 -// CHECK-NEXT: store i8 %81, ptr %82, align 1 -// CHECK-NEXT: %83 = srem i64 %73, 10 -// CHECK-NEXT: %84 = trunc i64 %83 to i8 -// CHECK-NEXT: %85 = add i8 %84, 48 -// CHECK-NEXT: %86 = getelementptr inbounds i8, ptr %8, i64 13 -// CHECK-NEXT: store i8 %85, ptr %86, align 1 -// CHECK-NEXT: %87 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %8, 0 -// CHECK-NEXT: %88 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %87, i64 14, 1 -// CHECK-NEXT: %89 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %88, i64 14, 2 -// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" %89) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PF_NAN:%[0-9]+]] = fcmp une double %0, %0 +// CHECK-NEXT: br i1 [[PF_NAN]], label %{{.*}}, label %{{.*}} +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_NAN]], i64 3 }) +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_PINF]], i64 4 }) +// CHECK: [[PF_INF_SUM:%[0-9]+]] = fadd double %0, %0 +// CHECK-NEXT: [[PF_IS_INF:%[0-9]+]] = fcmp oeq double [[PF_INF_SUM]], %0 +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_NINF]], i64 4 }) +// CHECK: [[PF_NINF_SUM:%[0-9]+]] = fadd double %0, %0 +// CHECK-NEXT: [[PF_IS_NINF:%[0-9]+]] = fcmp oeq double [[PF_NINF_SUM]], %0 +// CHECK: [[PF_BUFFER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 14) +// CHECK: [[PF_IS_ZERO:%[0-9]+]] = fcmp oeq double %0, 0.000000e+00 +// CHECK: [[PF_ZERO_SIGN:%[0-9]+]] = fdiv double 1.000000e+00, %0 +// CHECK-NEXT: {{%[0-9]+}} = fcmp olt double [[PF_ZERO_SIGN]], 0.000000e+00 +// CHECK: [[PF_NEGATED:%[0-9]+]] = fneg double %0 +// CHECK: [[PF_SCALE_DOWN:%[0-9]+]] = fdiv double [[PF_NORMAL:%[0-9]+]], 1.000000e+01 +// CHECK: [[PF_NORMAL]] = phi double [ %0, %{{.*}} ], [ [[PF_SCALE_DOWN]], %{{.*}} ], [ [[PF_NEGATED]], %{{.*}} ] +// CHECK: [[PF_TOO_LARGE:%[0-9]+]] = fcmp oge double [[PF_NORMAL]], 1.000000e+01 +// CHECK: [[PF_SCALE_UP:%[0-9]+]] = fmul double [[PF_SMALL_VALUE:%[0-9]+]], 1.000000e+01 +// CHECK: [[PF_SMALL_VALUE]] = phi double [ [[PF_NORMAL]], %{{.*}} ], [ [[PF_SCALE_UP]], %{{.*}} ] +// CHECK: [[PF_TOO_SMALL:%[0-9]+]] = fcmp olt double [[PF_SMALL_VALUE]], 1.000000e+00 +// CHECK: [[PF_ROUND_COUNT:%[0-9]+]] = phi i64 [ 0, %{{.*}} ], [ %{{[0-9]+}}, %{{.*}} ] +// CHECK-NEXT: [[PF_ROUND_MORE:%[0-9]+]] = icmp slt i64 [[PF_ROUND_COUNT]], 7 +// CHECK: [[PF_ROUNDED:%[0-9]+]] = fadd double %{{[0-9]+}}, %{{[0-9]+}} +// CHECK-NEXT: [[PF_ROUND_OVERFLOW:%[0-9]+]] = fcmp oge double [[PF_ROUNDED]], 1.000000e+01 +// CHECK: [[PF_DIGIT_INDEX:%[0-9]+]] = phi i64 [ 0, %{{.*}} ], [ %{{[0-9]+}}, %{{.*}} ] +// CHECK-NEXT: [[PF_MORE_DIGITS:%[0-9]+]] = icmp slt i64 [[PF_DIGIT_INDEX]], 7 +// CHECK: [[PF_DIGIT:%[0-9]+]] = fptosi double %{{[0-9]+}} to i64 +// CHECK: [[PF_DIGIT_CHAR:%[0-9]+]] = trunc i64 %{{[0-9]+}} to i8 +// CHECK: store i8 [[PF_DIGIT_CHAR]], ptr %{{[0-9]+}} +// CHECK: [[PF_REMAINDER:%[0-9]+]] = fsub double %{{[0-9]+}}, %{{[0-9]+}} +// CHECK-NEXT: [[PF_NEXT_DIGIT:%[0-9]+]] = fmul double [[PF_REMAINDER]], 1.000000e+01 +// CHECK: store i8 46, ptr %{{[0-9]+}} +// CHECK: store i8 101, ptr %{{[0-9]+}} +// CHECK: [[PF_EXP_NEG:%[0-9]+]] = icmp slt i64 [[PF_EXP:%[0-9]+]], 0 +// CHECK: [[PF_EXP_ABS:%[0-9]+]] = phi i64 [ [[PF_EXP]], %{{.*}} ], [ %{{[0-9]+}}, %{{.*}} ] +// CHECK: [[PF_SLICE0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr [[PF_BUFFER]], 0 +// CHECK-NEXT: [[PF_SLICE1:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" [[PF_SLICE0]], i64 14, 1 +// CHECK-NEXT: [[PF_SLICE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" [[PF_SLICE1]], i64 14, 2 +// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" [[PF_SLICE]]) func printfloat(v float64) { switch { @@ -1136,61 +409,24 @@ func printfloat(v float64) { } // CHECK-LABEL: define void @main.printhex(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 100) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: %2 = urem i64 %22, 16 -// CHECK-NEXT: %3 = icmp uge i64 %2, 16 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %3, i64 %2, i1 false, i64 16) -// CHECK-NEXT: %4 = getelementptr inbounds i8, ptr @28, i64 %2 -// CHECK-NEXT: %5 = load i8, ptr %4, align 1 -// CHECK-NEXT: %6 = icmp slt i64 %23, 0 -// CHECK-NEXT: %7 = icmp uge i64 %23, 100 -// CHECK-NEXT: %8 = or i1 %7, %6 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %8, i64 %23, i1 true, i64 100) -// CHECK-NEXT: %9 = getelementptr inbounds i8, ptr %1, i64 %23 -// CHECK-NEXT: store i8 %5, ptr %9, align 1 -// CHECK-NEXT: %10 = icmp ult i64 %22, 16 -// CHECK-NEXT: br i1 %10, label %_llgo_5, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_3 -// CHECK-NEXT: %11 = sub i64 %23, 1 -// CHECK-NEXT: %12 = icmp slt i64 %11, 0 -// CHECK-NEXT: %13 = icmp uge i64 %11, 100 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, i64 %11, i1 true, i64 100) -// CHECK-NEXT: %15 = getelementptr inbounds i8, ptr %1, i64 %11 -// CHECK-NEXT: store i8 120, ptr %15, align 1 -// CHECK-NEXT: %16 = sub i64 %11, 1 -// CHECK-NEXT: %17 = icmp slt i64 %16, 0 -// CHECK-NEXT: %18 = icmp uge i64 %16, 100 -// CHECK-NEXT: %19 = or i1 %18, %17 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %19, i64 %16, i1 true, i64 100) -// CHECK-NEXT: %20 = getelementptr inbounds i8, ptr %1, i64 %16 -// CHECK-NEXT: store i8 48, ptr %20, align 1 -// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %1, i64 1, i64 100, i64 %16, i64 100, i1 true, i1 true, i1 true) -// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" %21) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %22 = phi i64 [ %0, %_llgo_0 ], [ %25, %_llgo_4 ] -// CHECK-NEXT: %23 = phi i64 [ 99, %_llgo_0 ], [ %26, %_llgo_4 ] -// CHECK-NEXT: %24 = icmp sgt i64 %23, 0 -// CHECK-NEXT: br i1 %24, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_1 -// CHECK-NEXT: %25 = udiv i64 %22, 16 -// CHECK-NEXT: %26 = sub i64 %23, 1 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: %27 = sub i64 100, %23 -// CHECK-NEXT: %28 = load i64, ptr @main.minhexdigits, align 8 -// CHECK-NEXT: %29 = icmp sge i64 %27, %28 -// CHECK-NEXT: br i1 %29, label %_llgo_2, label %_llgo_4 -// CHECK-NEXT: } +// CHECK: [[PH_BUFFER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 100) +// CHECK: [[PH_DIGIT:%[0-9]+]] = urem i64 [[PH_VALUE:%[0-9]+]], 16 +// CHECK: [[PH_DIGIT_PTR:%[0-9]+]] = getelementptr inbounds i8, ptr [[HEX_DIGITS]], i64 [[PH_DIGIT]] +// CHECK-NEXT: [[PH_DIGIT_CHAR:%[0-9]+]] = load i8, ptr [[PH_DIGIT_PTR]] +// CHECK: [[PH_BUFFER_PTR:%[0-9]+]] = getelementptr inbounds i8, ptr [[PH_BUFFER]], i64 [[PH_INDEX:%[0-9]+]] +// CHECK-NEXT: store i8 [[PH_DIGIT_CHAR]], ptr [[PH_BUFFER_PTR]] +// CHECK: [[PH_LAST_DIGIT:%[0-9]+]] = icmp ult i64 [[PH_VALUE]], 16 +// CHECK: store i8 120, ptr %{{[0-9]+}} +// CHECK: store i8 48, ptr %{{[0-9]+}} +// CHECK: [[PH_SLICE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr [[PH_BUFFER]], i64 1, i64 100, i64 %{{[0-9]+}}, i64 100, i1 true, i1 true, i1 true) +// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" [[PH_SLICE]]) +// CHECK: [[PH_VALUE]] = phi i64 [ %0, %{{.*}} ], [ [[PH_QUOTIENT:%[0-9]+]], %{{.*}} ] +// CHECK-NEXT: [[PH_INDEX]] = phi i64 [ 99, %{{.*}} ], [ [[PH_PREV_INDEX:%[0-9]+]], %{{.*}} ] +// CHECK: [[PH_QUOTIENT]] = udiv i64 [[PH_VALUE]], 16 +// CHECK-NEXT: [[PH_PREV_INDEX]] = sub i64 [[PH_INDEX]], 1 +// CHECK: [[PH_WIDTH:%[0-9]+]] = sub i64 100, [[PH_INDEX]] +// CHECK-NEXT: [[PH_MIN_WIDTH:%[0-9]+]] = load i64, ptr @main.minhexdigits +// CHECK-NEXT: [[PH_WIDE_ENOUGH:%[0-9]+]] = icmp sge i64 [[PH_WIDTH]], [[PH_MIN_WIDTH]] func printhex(v uint64) { const dig = "0123456789abcdef" @@ -1211,20 +447,12 @@ func printhex(v uint64) { } // CHECK-LABEL: define void @main.printint(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp slt i64 %0, 0 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @29, i64 1 }) -// CHECK-NEXT: %2 = sub i64 0, %0 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %3 = phi i64 [ %0, %_llgo_0 ], [ %2, %_llgo_1 ] -// CHECK-NEXT: call void @main.printuint(i64 %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PI_NEGATIVE:%[0-9]+]] = icmp slt i64 %0, 0 +// CHECK-NEXT: br i1 [[PI_NEGATIVE]], label %{{.*}}, label %{{.*}} +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_MINUS]], i64 1 }) +// CHECK-NEXT: [[PI_ABS:%[0-9]+]] = sub i64 0, %0 +// CHECK: [[PI_MAGNITUDE:%[0-9]+]] = phi i64 [ %0, %{{.*}} ], [ [[PI_ABS]], %{{.*}} ] +// CHECK-NEXT: call void @main.printuint(i64 [[PI_MAGNITUDE]]) func printint(v int64) { if v < 0 { @@ -1235,40 +463,18 @@ func printint(v int64) { } // CHECK-LABEL: define void @main.println(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5, %_llgo_0 -// CHECK-NEXT: %2 = phi i64 [ -1, %_llgo_0 ], [ %3, %_llgo_5 ] -// CHECK-NEXT: %3 = add i64 %2, 1 -// CHECK-NEXT: %4 = icmp slt i64 %3, %1 -// CHECK-NEXT: br i1 %4, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %7 = icmp slt i64 %3, 0 -// CHECK-NEXT: %8 = icmp uge i64 %3, %6 -// CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, i64 %3, i1 true, i64 %6) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %5, i64 %3 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %10, align 8 -// CHECK-NEXT: %12 = icmp ne i64 %3, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: call void @main.printnl() -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @30, i64 1 }) -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" %11) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-NEXT: } +// CHECK: [[PL_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: [[PL_INDEX:%[0-9]+]] = add i64 %{{[0-9]+}}, 1 +// CHECK-NEXT: [[PL_MORE:%[0-9]+]] = icmp slt i64 [[PL_INDEX]], [[PL_LEN]] +// CHECK: [[PL_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 +// CHECK: [[PL_BOUND:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 [[PL_INDEX]], i1 true, i64 [[PL_BOUND]]) +// CHECK-NEXT: [[PL_ITEM_PTR:%[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr [[PL_DATA]], i64 [[PL_INDEX]] +// CHECK-NEXT: [[PL_ITEM:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr [[PL_ITEM_PTR]] +// CHECK: [[PL_NEEDS_SPACE:%[0-9]+]] = icmp ne i64 [[PL_INDEX]], 0 +// CHECK: call void @main.printnl() +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_SPACE]], i64 1 }) +// CHECK: call void @main.printany(%"{{.*}}/runtime/internal/runtime.eface" [[PL_ITEM]]) func println(args ...any) { for i, v := range args { @@ -1281,70 +487,41 @@ func println(args ...any) { } // CHECK-LABEL: define void @main.printnl(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @31, i64 1 }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_NL]], i64 1 }) func printnl() { printstring("\n") } // CHECK-LABEL: define void @main.printsp(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr @30, i64 1 }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" { ptr [[STR_SPACE]], i64 1 }) func printsp() { printstring(" ") } // CHECK-LABEL: define void @main.printstring(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.Slice" @main.bytes(%"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PS_BYTES:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @main.bytes(%"{{.*}}/runtime/internal/runtime.String" %0) +// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" [[PS_BYTES]]) func printstring(s string) { gwrite(bytes(s)) } // CHECK-LABEL: define void @main.printuint(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 100) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: %2 = urem i64 %11, 10 -// CHECK-NEXT: %3 = add i64 %2, 48 -// CHECK-NEXT: %4 = trunc i64 %3 to i8 -// CHECK-NEXT: %5 = icmp slt i64 %12, 0 -// CHECK-NEXT: %6 = icmp uge i64 %12, 100 -// CHECK-NEXT: %7 = or i1 %6, %5 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %7, i64 %12, i1 true, i64 100) -// CHECK-NEXT: %8 = getelementptr inbounds i8, ptr %1, i64 %12 -// CHECK-NEXT: store i8 %4, ptr %8, align 1 -// CHECK-NEXT: %9 = icmp ult i64 %11, 10 -// CHECK-NEXT: br i1 %9, label %_llgo_2, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_3 -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %1, i64 1, i64 100, i64 %12, i64 100, i1 true, i1 true, i1 true) -// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" %10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %11 = phi i64 [ %0, %_llgo_0 ], [ %14, %_llgo_4 ] -// CHECK-NEXT: %12 = phi i64 [ 99, %_llgo_0 ], [ %15, %_llgo_4 ] -// CHECK-NEXT: %13 = icmp sgt i64 %12, 0 -// CHECK-NEXT: br i1 %13, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %14 = udiv i64 %11, 10 -// CHECK-NEXT: %15 = sub i64 %12, 1 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-NEXT: } +// CHECK: [[PU_BUFFER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 100) +// CHECK: [[PU_DIGIT:%[0-9]+]] = urem i64 [[PU_VALUE:%[0-9]+]], 10 +// CHECK-NEXT: [[PU_ASCII:%[0-9]+]] = add i64 [[PU_DIGIT]], 48 +// CHECK-NEXT: [[PU_CHAR:%[0-9]+]] = trunc i64 [[PU_ASCII]] to i8 +// CHECK: [[PU_CHAR_PTR:%[0-9]+]] = getelementptr inbounds i8, ptr [[PU_BUFFER]], i64 [[PU_INDEX:%[0-9]+]] +// CHECK-NEXT: store i8 [[PU_CHAR]], ptr [[PU_CHAR_PTR]] +// CHECK-NEXT: [[PU_LAST_DIGIT:%[0-9]+]] = icmp ult i64 [[PU_VALUE]], 10 +// CHECK: [[PU_SLICE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr [[PU_BUFFER]], i64 1, i64 100, i64 [[PU_INDEX]], i64 100, i1 true, i1 true, i1 true) +// CHECK-NEXT: call void @main.gwrite(%"{{.*}}/runtime/internal/runtime.Slice" [[PU_SLICE]]) +// CHECK: [[PU_VALUE]] = phi i64 [ %0, %{{.*}} ], [ [[PU_QUOTIENT:%[0-9]+]], %{{.*}} ] +// CHECK-NEXT: [[PU_INDEX]] = phi i64 [ 99, %{{.*}} ], [ [[PU_PREV_INDEX:%[0-9]+]], %{{.*}} ] +// CHECK: [[PU_QUOTIENT]] = udiv i64 [[PU_VALUE]], 10 +// CHECK-NEXT: [[PU_PREV_INDEX]] = sub i64 [[PU_INDEX]], 1 func printuint(v uint64) { var buf [100]byte @@ -1360,31 +537,23 @@ func printuint(v uint64) { } // CHECK-LABEL: define void @main.prinusub(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = sub i64 0, %0 -// CHECK-NEXT: call void @main.printuint(i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PRINUSUB_NEG:%[0-9]+]] = sub i64 0, %0 +// CHECK-NEXT: call void @main.printuint(i64 [[PRINUSUB_NEG]]) func prinusub(n uint64) { printuint(-n) } // CHECK-LABEL: define void @main.prinxor(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = xor i64 %0, -1 -// CHECK-NEXT: call void @main.printint(i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PRINXOR_NOT:%[0-9]+]] = xor i64 %0, -1 +// CHECK-NEXT: call void @main.printint(i64 [[PRINXOR_NOT]]) func prinxor(n int64) { printint(^n) } // CHECK-LABEL: define ptr @main.stringStructOf(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret ptr %0 -// CHECK-NEXT: } +// CHECK: ret ptr %0 func stringStructOf(sp *string) *stringStruct { return (*stringStruct)(unsafe.Pointer(sp)) diff --git a/cl/_testdata/printf/in.go b/cl/_testdata/printf/in.go index 672bd2fae5..aae37b2889 100644 --- a/cl/_testdata/printf/in.go +++ b/cl/_testdata/printf/in.go @@ -9,10 +9,7 @@ func printf(format *int8, __llgo_va_list ...any) var hello = [...]int8{'H', 'e', 'l', 'l', 'o', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.hello) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void (ptr, ...) @printf(ptr @main.hello) func main() { printf(&hello[0]) } diff --git a/cl/_testdata/printval/in.go b/cl/_testdata/printval/in.go index a0c7efe82e..d9f9410e52 100644 --- a/cl/_testdata/printval/in.go +++ b/cl/_testdata/printval/in.go @@ -9,10 +9,7 @@ func printf(format *int8, __llgo_va_list ...any) var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i64 100) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void (ptr, ...) @printf(ptr @main.format, i64 100) func main() { printf(&format[0], 100) } diff --git a/cl/_testdata/ptrmthd/in.go b/cl/_testdata/ptrmthd/in.go index 138257a723..b1083184b4 100644 --- a/cl/_testdata/ptrmthd/in.go +++ b/cl/_testdata/ptrmthd/in.go @@ -9,10 +9,8 @@ func printf(format *int8, __llgo_va_list ...any) type T int8 // CHECK-LABEL: define void @"main.(*T).Print"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void (ptr, ...) @printf(ptr %0, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void (ptr, ...) @printf(ptr %0, i64 %1) +// CHECK-NEXT: ret void func (f *T) Print(v int) { printf((*int8)(f), v) } @@ -20,10 +18,7 @@ func (f *T) Print(v int) { var format = [...]T{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"main.(*T).Print"(ptr @main.format, i64 100) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"main.(*T).Print"(ptr @main.format, i64 100) func main() { f := &format[0] f.Print(100) diff --git a/cl/_testdata/uint/in.go b/cl/_testdata/uint/in.go index 2dd5e18aa3..e7f8bac0b2 100644 --- a/cl/_testdata/uint/in.go +++ b/cl/_testdata/uint/in.go @@ -3,25 +3,17 @@ package main import "github.com/goplus/lib/c" -// CHECK: @"main.init$guard" = global i1 false, align 1 -// CHECK: @0 = private unnamed_addr constant [11 x i8] c"Hello, %u\0A\00", align 1 - // CHECK-LABEL: define i32 @main.f(i32 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = add i32 %0, 1 -// CHECK-NEXT: ret i32 %1 -// CHECK-NEXT: } +// CHECK: [[UINT_NEXT:%[0-9]+]] = add i32 %0, 1 +// CHECK-NEXT: ret i32 [[UINT_NEXT]] func f(a c.Uint) c.Uint { a++ return a } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 @main.f(i32 100) -// CHECK-NEXT: %1 = call i32 (ptr, ...) @printf(ptr @0, i32 %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[UINT_RESULT:%[0-9]+]] = call i32 @main.f(i32 100) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i32 [[UINT_RESULT]]) func main() { var a c.Uint = 100 c.Printf(c.Str("Hello, %u\n"), f(a)) diff --git a/cl/_testdata/untyped/in.go b/cl/_testdata/untyped/in.go index fcf8fc9088..74f57e135e 100644 --- a/cl/_testdata/untyped/in.go +++ b/cl/_testdata/untyped/in.go @@ -5,19 +5,10 @@ const c = 100 var a float64 = 1 -// CHECK: @main.a = global double 1.000000e+00, align 8 +// CHECK: @main.a = global double 1.000000e+00 // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 false, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1:{{.*}} -// CHECK-NEXT: store double 0.000000e+00, ptr @main.a, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2:{{.*}} -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store double 0.000000e+00, ptr @main.a func main() { if c > 100 { a = 0 diff --git a/cl/_testdata/utf8/in.go b/cl/_testdata/utf8/in.go index a3abd57e15..dfd5bed8c2 100644 --- a/cl/_testdata/utf8/in.go +++ b/cl/_testdata/utf8/in.go @@ -1,60 +1,22 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.index\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "unicode/utf8" ) -// CHECK: @main.array = global [8 x i8] c"\01\02\03\04\05\06\07\08", align 1 +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [7 x i8] c"\E4\B8\ADabcd", align 1{{$}} -// CHECK-LABEL: define i8 @main.index(i8 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = sext i8 %0 to i64 -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: %3 = icmp uge i64 %1, 8 -// CHECK-NEXT: %4 = or i1 %3, %2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %4, {{.*}}) -// CHECK-NEXT: %5 = getelementptr inbounds i8, ptr @main.array, i64 %1 -// CHECK-NEXT: %6 = load i8, ptr %5, align 1 -// CHECK-NEXT: ret i8 %6 -// CHECK-NEXT: } func index(n int8) uint8 { return array[n] } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK: call void @"unicode/utf8.init"() var array = [...]uint8{ 1, 2, 3, 4, 5, 6, 7, 8, } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %0 = phi i64 [ 0, %_llgo_0 ], [ %6, %_llgo_2 ] -// CHECK-NEXT: %1 = icmp slt i64 %0, 7 -// CHECK-NEXT: br i1 %1, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %2 = call %"{{.*}}runtime/internal/runtime.String" @"{{.*}}runtime/internal/runtime.StringSlice2"({{.*}}) -// CHECK-NEXT: %3 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"{{.*}}runtime/internal/runtime.String" %2) -// CHECK-NEXT: %4 = extractvalue { i32, i64 } %3, 0 -// CHECK-NEXT: %5 = extractvalue { i32, i64 } %3, 1 -// CHECK-NEXT: %6 = add i64 %0, %5 -// CHECK-NEXT: %7 = sext i32 %4 to i64 -// CHECK-NEXT: call void @"{{.*}}runtime/internal/runtime.PrintInt"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %8 = call i8 @main.index(i8 2) -// CHECK-NEXT: %9 = icmp eq i8 %8, 3 -// CHECK-NEXT: call void @"{{.*}}runtime/internal/runtime.PrintBool"(i1 %9) -// CHECK-NEXT: call void @"{{.*}}runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { var str = "中abcd" for i := 0; i < len(str); { @@ -64,3 +26,78 @@ func main() { } println(index(2) == 3) } + +// CHECK-LABEL: define i8 @main.index( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = sext i8 %[[TMP0]] to i64 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = icmp uge i64 %[[TMP1]], 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = or i1 %[[TMP3]], %[[TMP2]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP4]], i64 %[[TMP1]], i1 true, i64 8) +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i8, ptr @main.array, i64 %[[TMP1]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load i8, ptr %[[TMP5]], align 1 +// CHECK-NEXT: ret i8 %[[TMP6]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca [2 x i64], align 8 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { i32, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, i64 }, align 8 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB0]] ], [ %[[TMP8:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 7 +// DARWIN-ARM64-NEXT: br i1 %[[TMP2]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB0]] ], [ %[[TMP20:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = icmp slt i64 %[[TMP4]], 7 +// LINUX-AMD64-NEXT: br i1 %[[TMP5]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 7 }, i64 %[[TMP1]], i64 7, i1 true, i1 true) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call [2 x i64] @"unicode/utf8.DecodeRuneInString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP3]]) +// DARWIN-ARM64-NEXT: store [2 x i64] %[[TMP4]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load { i32, i64 }, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue { i32, i64 } %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue { i32, i64 } %[[TMP5]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8]] = add i64 %[[TMP1]], %[[TMP7]] +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = sext i32 %[[TMP6]] to i64 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP9]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 7 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load ptr, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load i64, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = call { ptr, i64 } @"{{.*}}/runtime/internal/runtime.StringSlice2"(ptr %[[TMP7]], i64 %[[TMP9]], i64 %[[TMP4]], i64 7, i1 true, i1 true) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP10]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP11]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load i64, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(ptr %[[TMP13]], i64 %[[TMP15]]) +// LINUX-AMD64-NEXT: store { i32, i64 } %[[TMP16]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load { i32, i64 }, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { i32, i64 } %[[TMP17]], 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { i32, i64 } %[[TMP17]], 1 +// LINUX-AMD64-NEXT: %[[TMP20]] = add i64 %[[TMP4]], %[[TMP19]] +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = sext i32 %[[TMP18]] to i64 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP21]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call i8 @main.index(i8 2) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = icmp eq i8 %[[TMP10]], 3 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP11]]) +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = call i8 @main.index(i8 2) +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = icmp eq i8 %[[TMP22]], 3 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP23]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testdata/vargs/in.go b/cl/_testdata/vargs/in.go index 482b98ce24..56a398f214 100644 --- a/cl/_testdata/vargs/in.go +++ b/cl/_testdata/vargs/in.go @@ -1,9 +1,11 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.test\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/lib/c" -// CHECK: {{^}}@1 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} func main() { test(1, 2, 3) @@ -15,78 +17,71 @@ func test(a ...any) { } } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %0, i64 0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %3, ptr %1, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %0, i64 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %5, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %6, ptr %4, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %0, i64 2 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 3, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %8, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %9, ptr %7, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %10, i64 3, 1 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %11, i64 3, 2 -// CHECK-NEXT: call void @main.test(%"{{.*}}/runtime/internal/runtime.Slice" %12) +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP1]], i64 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store i64 1, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP3]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP1]], i64 1 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store i64 2, ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP6]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]], ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP1]], i64 2 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store i64 3, ptr %[[TMP9]], align 8 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP9]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP10]], ptr %[[TMP8]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP11]], i64 3, 1 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP12]], i64 3, 2 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP13]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: call void @main.test(ptr %[[TMP0]]) +// LINUX-AMD64-NEXT: call void @main.test(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0]]) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define void @main.test(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 +// CHECK-LABEL: define void @main.test( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %2 = phi i64 [ -1, %_llgo_0 ], [ %3, %_llgo_4 ] -// CHECK-NEXT: %3 = add i64 %2, 1 -// CHECK-NEXT: %4 = icmp slt i64 %3, %1 -// CHECK-NEXT: br i1 %4, label %_llgo_2, label %_llgo_3 +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP4:[0-9]+]], %_llgo_[[BB4:[0-9]+]] ] +// CHECK-NEXT: %[[TMP4]] = add i64 %[[TMP3]], 1 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = icmp slt i64 %[[TMP4]], %[[TMP2]] +// CHECK-NEXT: br i1 %[[TMP5]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB3:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %7 = icmp slt i64 %3, 0 -// CHECK-NEXT: %8 = icmp uge i64 %3, %6 -// CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, i64 %3, i1 true, i64 %6) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %5, i64 %3 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %10, align 8 -// CHECK-NEXT: %12 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %11, 0 -// CHECK-NEXT: %13 = icmp eq ptr %12, @_llgo_int -// CHECK-NEXT: br i1 %13, label %_llgo_4, label %_llgo_5 +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: %[[TMP6:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = icmp slt i64 %[[TMP4]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = icmp uge i64 %[[TMP4]], %[[TMP7]] +// CHECK-NEXT: %[[TMP10:[0-9]+]] = or i1 %[[TMP9]], %[[TMP8]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP10]], i64 %[[TMP4]], i1 true, i64 %[[TMP7]]) +// CHECK-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP6]], i64 %[[TMP4]] +// CHECK-NEXT: %[[TMP12:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP11]], align 8 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP12]], 0 +// CHECK-NEXT: %[[TMP14:[0-9]+]] = icmp eq ptr %[[TMP13]], @_llgo_int +// CHECK-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB4]], label %_llgo_[[BB5:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 +// CHECK-NEXT: _llgo_[[BB3]]: // CHECK-NEXT: ret void // CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %11, 1 -// CHECK-NEXT: %15 = load i64, ptr %14, align 8 -// CHECK-NEXT: %16 = call i32 (ptr, ...) @printf(ptr @1, i64 %15) -// CHECK-NEXT: br label %_llgo_1 +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: %[[TMP15:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP12]], 1 +// CHECK-NEXT: %[[TMP16:[0-9]+]] = load i64, ptr %[[TMP15]], align 8 +// CHECK-NEXT: %[[TMP17:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i64 %[[TMP16]]) +// CHECK-NEXT: br label %_llgo_[[BB1]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %12, ptr @_llgo_int) +// CHECK-NEXT: _llgo_[[BB5]]: +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP13]], ptr @_llgo_int) // CHECK-NEXT: unreachable // CHECK-NEXT: } diff --git a/cl/_testdata/varinit/in.go b/cl/_testdata/varinit/in.go index 15b17d7ebd..03baa48f94 100644 --- a/cl/_testdata/varinit/in.go +++ b/cl/_testdata/varinit/in.go @@ -4,13 +4,9 @@ package main var a = 100 // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i64, ptr @main.a, align 8 -// CHECK-NEXT: %1 = add i64 %0, 1 -// CHECK-NEXT: store i64 %1, ptr @main.a, align 8 -// CHECK-NEXT: %2 = load i64, ptr @main.a, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[OLD_A:%[0-9]+]] = load i64, ptr @main.a +// CHECK-NEXT: [[NEW_A:%[0-9]+]] = add i64 [[OLD_A]], 1 +// CHECK-NEXT: store i64 [[NEW_A]], ptr @main.a func main() { a++ _ = a diff --git a/cl/_testdrop/reflect_field_addr_iface/in.go b/cl/_testdrop/reflect_field_addr_iface/in.go index b55c8388ae..b40dacff0e 100644 --- a/cl/_testdrop/reflect_field_addr_iface/in.go +++ b/cl/_testdrop/reflect_field_addr_iface/in.go @@ -3,6 +3,7 @@ package main import "reflect" +// SYMBOL-NOT: main{{.*}}RawMessage{{.*}}drop // SYMBOL-DAG: main{{.*}}RawMessage{{.*}}UnmarshalJSON // SYMBOL-NOT: main{{.*}}RawMessage{{.*}}drop diff --git a/cl/_testgo/abimethod/in.go b/cl/_testgo/abimethod/in.go index 8667548cf7..ea4a518070 100644 --- a/cl/_testgo/abimethod/in.go +++ b/cl/_testgo/abimethod/in.go @@ -8,23 +8,6 @@ import ( "unsafe" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [45 x i8] c"{{.*}}/cl/_testgo/abimethod.T", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [5 x i8] c"Demo1", align 1{{$}} -// CHECK: {{^}}@13 = private unnamed_addr constant [20 x i8] c"testAnonymous1 error", align 1{{$}} -// CHECK: {{^}}@15 = private unnamed_addr constant [20 x i8] c"testAnonymous2 error", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [20 x i8] c"testAnonymous3 error", align 1{{$}} -// CHECK: {{^}}@18 = private unnamed_addr constant [20 x i8] c"testAnonymous4 error", align 1{{$}} -// CHECK: {{^}}@20 = private unnamed_addr constant [20 x i8] c"testAnonymous5 error", align 1{{$}} -// CHECK: {{^}}@21 = private unnamed_addr constant [20 x i8] c"testAnonymous6 error", align 1{{$}} -// CHECK: {{^}}@23 = private unnamed_addr constant [20 x i8] c"testAnonymous7 error", align 1{{$}} -// CHECK: {{^}}@25 = private unnamed_addr constant [20 x i8] c"testAnonymous8 error", align 1{{$}} -// CHECK: {{^}}@26 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@94 = private unnamed_addr constant [25 x i8] c"testAnonymousBuffer error", align 1{{$}} -// CHECK: {{^}}@107 = private unnamed_addr constant [17 x i8] c"testGeneric error", align 1{{$}} -// CHECK: {{^}}@108 = private unnamed_addr constant [16 x i8] c"testNamed1 error", align 1{{$}} -// CHECK: {{^}}@109 = private unnamed_addr constant [16 x i8] c"testNamed2 error", align 1{{$}} -// CHECK: {{^}}@110 = private unnamed_addr constant [16 x i8] c"testNamed4 error", align 1{{$}} - type T struct { n int } @@ -222,1383 +205,405 @@ type I2 interface { Demo2() int } +// The declared value method and its pointer wrapper must both return T.n. // CHECK-LABEL: define i64 @main.T.Demo1(%main.T %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.T, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.T %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: [[T_ADDR:%[0-9]+]] = alloca %main.T +// CHECK: store %main.T %0, ptr [[T_ADDR]] +// CHECK-NEXT: [[T_N_PTR:%[0-9]+]] = getelementptr inbounds %main.T, ptr [[T_ADDR]], i32 0, i32 0 +// CHECK: [[T_N:%[0-9]+]] = load i64, ptr [[T_N_PTR]] +// CHECK: ret i64 [[T_N]] // CHECK-LABEL: define i64 @"main.(*T).Demo1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 45 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 5 }) -// CHECK-NEXT: %2 = load %main.T, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T.Demo1(%main.T %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: [[T_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[T_NIL]], +// CHECK: [[T_VALUE:%[0-9]+]] = load %main.T, ptr %0 +// CHECK: [[T_VALUE_RES:%[0-9]+]] = call i64 @main.T.Demo1(%main.T [[T_VALUE]]) +// CHECK: ret i64 [[T_VALUE_RES]] // CHECK-LABEL: define i64 @"main.(*T).Demo2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[T2_N_PTR:%[0-9]+]] = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 +// CHECK: [[T2_N:%[0-9]+]] = load i64, ptr [[T2_N_PTR]] +// CHECK: ret i64 [[T2_N]] // CHECK-LABEL: define i64 @"main.(*T).demo3"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @bytes.init() -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @"sync/atomic.init"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.testGeneric() -// CHECK-NEXT: call void @main.testNamed1() -// CHECK-NEXT: call void @main.testNamed2() -// CHECK-NEXT: call void @main.testNamed3() -// CHECK-NEXT: call void @main.testAnonymous1() -// CHECK-NEXT: call void @main.testAnonymous2() -// CHECK-NEXT: call void @main.testAnonymous3() -// CHECK-NEXT: call void @main.testAnonymous4() -// CHECK-NEXT: call void @main.testAnonymous5() -// CHECK-NEXT: call void @main.testAnonymous6() -// CHECK-NEXT: call void @main.testAnonymous7() -// CHECK-NEXT: call void @main.testAnonymous8() -// CHECK-NEXT: call void @main.testAnonymousBuffer() -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[T3_N_PTR:%[0-9]+]] = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 +// CHECK: [[T3_N:%[0-9]+]] = load i64, ptr [[T3_N_PTR]] +// CHECK: ret i64 [[T3_N]] +// Pointer-to-anonymous-struct embedding *T: form I, dispatch Demo1, and test its result. // CHECK-LABEL: define void @main.testAnonymous1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds %main.T, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %4, align 8 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5, 0 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %6, ptr %0, 1 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %7) -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %7, 0 -// CHECK-NEXT: %10 = getelementptr ptr, ptr %9, i64 3 -// CHECK-NEXT: %11 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %13, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 -// CHECK-NEXT: %16 = call i64 %15(ptr %14) -// CHECK-NEXT: %17 = icmp ne i64 %16, 100 -// CHECK-NEXT: br i1 %17, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @13, i64 20 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A1_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK: [[A1_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A1_ITAB]], 0 +// CHECK: [[A1_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A1_I0]], ptr %{{[0-9]+}}, 1 +// CHECK: [[A1_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A1_IFACE]]) +// CHECK: [[A1_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A1_IFACE]], 0 +// CHECK-NEXT: [[A1_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A1_TABLE]], i64 3 +// CHECK-NEXT: [[A1_METHOD:%[0-9]+]] = load ptr, ptr [[A1_SLOT]] +// CHECK-NEXT: [[A1_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A1_METHOD]], 0 +// CHECK-NEXT: [[A1_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A1_PAIR0]], ptr [[A1_DATA]], 1 +// CHECK: [[A1_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A1_PAIR]], 1 +// CHECK: [[A1_FN:%[0-9]+]] = extractvalue { ptr, ptr } [[A1_PAIR]], 0 +// CHECK: [[A1_RES:%[0-9]+]] = call i64 [[A1_FN]](ptr [[A1_RECV]]) +// CHECK: [[A1_BAD:%[0-9]+]] = icmp ne i64 [[A1_RES]], 100 +// CHECK: br i1 [[A1_BAD]], + +// Value anonymous struct embedding *T uses the value descriptor, but the same promoted method. // CHECK-LABEL: define void @main.testAnonymous2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds %main.T, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %4, align 8 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %5 = load { i64, ptr }, ptr %0, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { i64, ptr } %5, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %8, ptr %6, 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %12 = getelementptr ptr, ptr %11, i64 3 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %15, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %15, 0 -// CHECK-NEXT: %18 = call i64 %17(ptr %16) -// CHECK-NEXT: %19 = icmp ne i64 %18, 100 -// CHECK-NEXT: br i1 %19, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @15, i64 20 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A2_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A2_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A2_ITAB]], 0 +// CHECK-NEXT: [[A2_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A2_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A2_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A2_IFACE]]) +// CHECK-NEXT: [[A2_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A2_IFACE]], 0 +// CHECK-NEXT: [[A2_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A2_TABLE]], i64 3 +// CHECK-NEXT: [[A2_METHOD:%[0-9]+]] = load ptr, ptr [[A2_SLOT]] +// CHECK-NEXT: [[A2_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A2_METHOD]], 0 +// CHECK-NEXT: [[A2_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A2_PAIR0]], ptr [[A2_DATA]], 1 +// CHECK-NEXT: [[A2_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A2_PAIR]], 1 +// CHECK-NEXT: [[A2_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[A2_PAIR]], 0 +// CHECK-NEXT: [[A2_RES:%[0-9]+]] = call i64 [[A2_CODE]](ptr [[A2_RECV]]) +// CHECK: [[A2_BAD:%[0-9]+]] = icmp ne i64 [[A2_RES]], 100 +// CHECK: br i1 [[A2_BAD]], + +// Value and pointer anonymous structs embedding T select distinct concrete descriptors. // CHECK-LABEL: define void @main.testAnonymous3(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64, %main.T }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = getelementptr inbounds %main.T, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store i64 100, ptr %3, align 8 -// CHECK-NEXT: %4 = load { i64, %main.T }, ptr %0, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { i64, %main.T } %4, ptr %5, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %7, ptr %5, 1 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %8) -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %8, 0 -// CHECK-NEXT: %11 = getelementptr ptr, ptr %10, i64 3 -// CHECK-NEXT: %12 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %14, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %14, 0 -// CHECK-NEXT: %17 = call i64 %16(ptr %15) -// CHECK-NEXT: %18 = icmp ne i64 %17, 100 -// CHECK-NEXT: br i1 %18, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 20 }, ptr %19, align 8 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %20) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[A3_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A3_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A3_ITAB]], 0 +// CHECK-NEXT: [[A3_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A3_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A3_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A3_IFACE]]) +// CHECK-NEXT: [[A3_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A3_IFACE]], 0 +// CHECK-NEXT: [[A3_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A3_TABLE]], i64 3 +// CHECK-NEXT: [[A3_METHOD:%[0-9]+]] = load ptr, ptr [[A3_SLOT]] +// CHECK-NEXT: [[A3_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A3_METHOD]], 0 +// CHECK-NEXT: [[A3_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A3_PAIR0]], ptr [[A3_DATA]], 1 +// CHECK-NEXT: [[A3_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A3_PAIR]], 1 +// CHECK-NEXT: [[A3_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[A3_PAIR]], 0 +// CHECK-NEXT: [[A3_RES:%[0-9]+]] = call i64 [[A3_CODE]](ptr [[A3_RECV]]) +// CHECK: [[A3_BAD:%[0-9]+]] = icmp ne i64 [[A3_RES]], 100 +// CHECK-NEXT: br i1 [[A3_BAD]], // CHECK-LABEL: define void @main.testAnonymous4(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = getelementptr inbounds %main.T, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store i64 100, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5, ptr %0, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 3 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call i64 %14(ptr %13) -// CHECK-NEXT: %16 = icmp ne i64 %15, 100 -// CHECK-NEXT: br i1 %16, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 20 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A4_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A4_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A4_ITAB]], 0 +// CHECK-NEXT: [[A4_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A4_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A4_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A4_IFACE]]) +// CHECK-NEXT: [[A4_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A4_IFACE]], 0 +// CHECK-NEXT: [[A4_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A4_TABLE]], i64 3 +// CHECK-NEXT: [[A4_METHOD:%[0-9]+]] = load ptr, ptr [[A4_SLOT]] +// CHECK-NEXT: [[A4_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A4_METHOD]], 0 +// CHECK-NEXT: [[A4_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A4_PAIR0]], ptr [[A4_DATA]], 1 +// CHECK-NEXT: [[A4_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A4_PAIR]], 1 +// CHECK-NEXT: [[A4_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[A4_PAIR]], 0 +// CHECK-NEXT: [[A4_RES:%[0-9]+]] = call i64 [[A4_CODE]](ptr [[A4_RECV]]) +// CHECK: [[A4_BAD:%[0-9]+]] = icmp ne i64 [[A4_RES]], 100 +// CHECK-NEXT: br i1 [[A4_BAD]], + +// Demo2 requires the pointer method set, for both embedding T and embedding *T. // CHECK-LABEL: define void @main.testAnonymous5(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = getelementptr inbounds %main.T, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store i64 100, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5, ptr %0, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 3 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call i64 %14(ptr %13) -// CHECK-NEXT: %16 = icmp ne i64 %15, 100 -// CHECK-NEXT: br i1 %16, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 20 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[A5_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A5_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A5_ITAB]], 0 +// CHECK-NEXT: [[A5_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A5_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A5_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A5_IFACE]]) +// CHECK-NEXT: [[A5_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A5_IFACE]], 0 +// CHECK-NEXT: [[A5_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A5_TABLE]], i64 3 +// CHECK-NEXT: [[A5_METHOD:%[0-9]+]] = load ptr, ptr [[A5_SLOT]] +// CHECK-NEXT: [[A5_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A5_METHOD]], 0 +// CHECK-NEXT: [[A5_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A5_PAIR0]], ptr [[A5_DATA]], 1 +// CHECK-NEXT: [[A5_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A5_PAIR]], 1 +// CHECK-NEXT: [[A5_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[A5_PAIR]], 0 +// CHECK-NEXT: [[A5_RES:%[0-9]+]] = call i64 [[A5_CODE]](ptr [[A5_RECV]]) +// CHECK: [[A5_BAD:%[0-9]+]] = icmp ne i64 [[A5_RES]], 100 +// CHECK-NEXT: br i1 [[A5_BAD]], // CHECK-LABEL: define void @main.testAnonymous6(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds %main.T, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %4, align 8 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %5 = load { i64, ptr }, ptr %0, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { i64, ptr } %5, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %8, ptr %6, 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %12 = getelementptr ptr, ptr %11, i64 3 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %15, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %15, 0 -// CHECK-NEXT: %18 = call i64 %17(ptr %16) -// CHECK-NEXT: %19 = icmp ne i64 %18, 100 -// CHECK-NEXT: br i1 %19, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @21, i64 20 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A6_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A6_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A6_ITAB]], 0 +// CHECK-NEXT: [[A6_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A6_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A6_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A6_IFACE]]) +// CHECK-NEXT: [[A6_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A6_IFACE]], 0 +// CHECK-NEXT: [[A6_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[A6_TABLE]], i64 3 +// CHECK-NEXT: [[A6_METHOD:%[0-9]+]] = load ptr, ptr [[A6_SLOT]] +// CHECK-NEXT: [[A6_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A6_METHOD]], 0 +// CHECK-NEXT: [[A6_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[A6_PAIR0]], ptr [[A6_DATA]], 1 +// CHECK-NEXT: [[A6_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[A6_PAIR]], 1 +// CHECK-NEXT: [[A6_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[A6_PAIR]], 0 +// CHECK-NEXT: [[A6_RES:%[0-9]+]] = call i64 [[A6_CODE]](ptr [[A6_RECV]]) +// CHECK: [[A6_BAD:%[0-9]+]] = icmp ne i64 [[A6_RES]], 100 +// CHECK-NEXT: br i1 [[A6_BAD]], + +// A two-method anonymous interface must dispatch two different itab slots on one interface value. // CHECK-LABEL: define void @main.testAnonymous7(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds %main.T, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %4, align 8 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %5 = load { i64, ptr }, ptr %0, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { i64, ptr } %5, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %8, ptr %6, 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %12 = getelementptr ptr, ptr %11, i64 3 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %15, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %15, 0 -// CHECK-NEXT: %18 = call i64 %17(ptr %16) -// CHECK-NEXT: %19 = icmp ne i64 %18, 100 -// CHECK-NEXT: br i1 %19, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %24 = getelementptr ptr, ptr %23, i64 4 -// CHECK-NEXT: %25 = load ptr, ptr %24, align 8 -// CHECK-NEXT: %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 -// CHECK-NEXT: %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %27, 1 -// CHECK-NEXT: %29 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: %30 = call i64 %29(ptr %28) -// CHECK-NEXT: %31 = icmp ne i64 %30, 100 -// CHECK-NEXT: br i1 %31, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 20 }, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %33) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A7_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A7_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A7_ITAB]], 0 +// CHECK-NEXT: [[A7_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A7_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A7_DATA1:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A7_IFACE]]) +// CHECK-NEXT: [[A7_TAB1:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A7_IFACE]], 0 +// CHECK-NEXT: [[A7_SLOT1:%[0-9]+]] = getelementptr ptr, ptr [[A7_TAB1]], i64 3 +// CHECK-NEXT: [[A7_METHOD1:%[0-9]+]] = load ptr, ptr [[A7_SLOT1]] +// CHECK-NEXT: [[A7_PAIR10:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A7_METHOD1]], 0 +// CHECK-NEXT: [[A7_PAIR1:%[0-9]+]] = insertvalue { ptr, ptr } [[A7_PAIR10]], ptr [[A7_DATA1]], 1 +// CHECK-NEXT: [[A7_RECV1:%[0-9]+]] = extractvalue { ptr, ptr } [[A7_PAIR1]], 1 +// CHECK-NEXT: [[A7_CODE1:%[0-9]+]] = extractvalue { ptr, ptr } [[A7_PAIR1]], 0 +// CHECK-NEXT: [[A7_RES1:%[0-9]+]] = call i64 [[A7_CODE1]](ptr [[A7_RECV1]]) +// CHECK: [[A7_BAD1:%[0-9]+]] = icmp ne i64 [[A7_RES1]], 100 +// CHECK-NEXT: br i1 [[A7_BAD1]], +// CHECK: [[A7_DATA2:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A7_IFACE]]) +// CHECK-NEXT: [[A7_TAB2:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A7_IFACE]], 0 +// CHECK-NEXT: [[A7_SLOT2:%[0-9]+]] = getelementptr ptr, ptr [[A7_TAB2]], i64 4 +// CHECK-NEXT: [[A7_METHOD2:%[0-9]+]] = load ptr, ptr [[A7_SLOT2]] +// CHECK-NEXT: [[A7_PAIR20:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A7_METHOD2]], 0 +// CHECK-NEXT: [[A7_PAIR2:%[0-9]+]] = insertvalue { ptr, ptr } [[A7_PAIR20]], ptr [[A7_DATA2]], 1 +// CHECK-NEXT: [[A7_RECV2:%[0-9]+]] = extractvalue { ptr, ptr } [[A7_PAIR2]], 1 +// CHECK-NEXT: [[A7_CODE2:%[0-9]+]] = extractvalue { ptr, ptr } [[A7_PAIR2]], 0 +// CHECK-NEXT: [[A7_RES2:%[0-9]+]] = call i64 [[A7_CODE2]](ptr [[A7_RECV2]]) +// CHECK: [[A7_BAD2:%[0-9]+]] = icmp ne i64 [[A7_RES2]], 100 +// CHECK-NEXT: br i1 [[A7_BAD2]], + +// The package-local interface adds the unexported demo3 slot after Demo1 and Demo2. // CHECK-LABEL: define void @main.testAnonymous8(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds %main.T, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %4, align 8 -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %5 = load { i64, ptr }, ptr %0, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { i64, ptr } %5, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/abimethod.iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %8, ptr %6, 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %12 = getelementptr ptr, ptr %11, i64 3 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } undef, ptr %13, 0 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } %14, ptr %10, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %15, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %15, 0 -// CHECK-NEXT: %18 = call i64 %17(ptr %16) -// CHECK-NEXT: %19 = icmp ne i64 %18, 100 -// CHECK-NEXT: br i1 %19, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %24 = getelementptr ptr, ptr %23, i64 4 -// CHECK-NEXT: %25 = load ptr, ptr %24, align 8 -// CHECK-NEXT: %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 -// CHECK-NEXT: %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %27, 1 -// CHECK-NEXT: %29 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: %30 = call i64 %29(ptr %28) -// CHECK-NEXT: %31 = icmp ne i64 %30, 100 -// CHECK-NEXT: br i1 %31, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %33) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %36 = getelementptr ptr, ptr %35, i64 5 -// CHECK-NEXT: %37 = load ptr, ptr %36, align 8 -// CHECK-NEXT: %38 = insertvalue { ptr, ptr } undef, ptr %37, 0 -// CHECK-NEXT: %39 = insertvalue { ptr, ptr } %38, ptr %34, 1 -// CHECK-NEXT: %40 = extractvalue { ptr, ptr } %39, 1 -// CHECK-NEXT: %41 = extractvalue { ptr, ptr } %39, 0 -// CHECK-NEXT: %42 = call i64 %41(ptr %40) -// CHECK-NEXT: %43 = icmp ne i64 %42, 100 -// CHECK-NEXT: br i1 %43, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 20 }, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %45) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[A8_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/abimethod.iface${{[-A-Za-z0-9_]+}}", ptr @"{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[A8_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[A8_ITAB]], 0 +// CHECK-NEXT: [[A8_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[A8_I0]], ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: [[A8_DATA1:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]]) +// CHECK-NEXT: [[A8_TAB1:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]], 0 +// CHECK-NEXT: [[A8_SLOT1:%[0-9]+]] = getelementptr ptr, ptr [[A8_TAB1]], i64 3 +// CHECK-NEXT: [[A8_METHOD1:%[0-9]+]] = load ptr, ptr [[A8_SLOT1]] +// CHECK-NEXT: [[A8_PAIR10:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A8_METHOD1]], 0 +// CHECK-NEXT: [[A8_PAIR1:%[0-9]+]] = insertvalue { ptr, ptr } [[A8_PAIR10]], ptr [[A8_DATA1]], 1 +// CHECK-NEXT: [[A8_RECV1:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR1]], 1 +// CHECK-NEXT: [[A8_CODE1:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR1]], 0 +// CHECK-NEXT: [[A8_RES1:%[0-9]+]] = call i64 [[A8_CODE1]](ptr [[A8_RECV1]]) +// CHECK-NEXT: [[A8_BAD1:%[0-9]+]] = icmp ne i64 [[A8_RES1]], 100 +// CHECK-NEXT: br i1 [[A8_BAD1]], +// CHECK: [[A8_DATA2:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]]) +// CHECK-NEXT: [[A8_TAB2:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]], 0 +// CHECK-NEXT: [[A8_SLOT2:%[0-9]+]] = getelementptr ptr, ptr [[A8_TAB2]], i64 4 +// CHECK-NEXT: [[A8_METHOD2:%[0-9]+]] = load ptr, ptr [[A8_SLOT2]] +// CHECK-NEXT: [[A8_PAIR20:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A8_METHOD2]], 0 +// CHECK-NEXT: [[A8_PAIR2:%[0-9]+]] = insertvalue { ptr, ptr } [[A8_PAIR20]], ptr [[A8_DATA2]], 1 +// CHECK-NEXT: [[A8_RECV2:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR2]], 1 +// CHECK-NEXT: [[A8_CODE2:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR2]], 0 +// CHECK-NEXT: [[A8_RES2:%[0-9]+]] = call i64 [[A8_CODE2]](ptr [[A8_RECV2]]) +// CHECK-NEXT: [[A8_BAD2:%[0-9]+]] = icmp ne i64 [[A8_RES2]], 100 +// CHECK-NEXT: br i1 [[A8_BAD2]], +// CHECK: [[A8_DATA3:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]]) +// CHECK-NEXT: [[A8_TAB3:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[A8_IFACE]], 0 +// CHECK-NEXT: [[A8_SLOT3:%[0-9]+]] = getelementptr ptr, ptr [[A8_TAB3]], i64 5 +// CHECK-NEXT: [[A8_METHOD3:%[0-9]+]] = load ptr, ptr [[A8_SLOT3]] +// CHECK-NEXT: [[A8_PAIR30:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[A8_METHOD3]], 0 +// CHECK-NEXT: [[A8_PAIR3:%[0-9]+]] = insertvalue { ptr, ptr } [[A8_PAIR30]], ptr [[A8_DATA3]], 1 +// CHECK-NEXT: [[A8_RECV3:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR3]], 1 +// CHECK-NEXT: [[A8_CODE3:%[0-9]+]] = extractvalue { ptr, ptr } [[A8_PAIR3]], 0 +// CHECK-NEXT: [[A8_RES3:%[0-9]+]] = call i64 [[A8_CODE3]](ptr [[A8_RECV3]]) +// CHECK-NEXT: [[A8_BAD3:%[0-9]+]] = icmp ne i64 [[A8_RES3]], 100 +// CHECK-NEXT: br i1 [[A8_BAD3]], + +// The promoted bytes.Buffer.String method remains the implementation behind fmt.Stringer. // CHECK-LABEL: define void @main.testAnonymousBuffer(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = call ptr @bytes.NewBufferString(%"{{.*}}/runtime/internal/runtime.String" { ptr @26, i64 5 }) -// CHECK-NEXT: store i64 10, ptr %1, align 8 -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/cl/_testgo/abimethod.struct${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5, ptr %0, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 3 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" %14(ptr %13) -// CHECK-NEXT: %16 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %15, %"{{.*}}/runtime/internal/runtime.String" { ptr @26, i64 5 }) -// CHECK-NEXT: %17 = xor i1 %16, true -// CHECK-NEXT: br i1 %17, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @94, i64 25 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[BUF_OWNER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: [[BUF_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr [[BUF_OWNER]], i32 0, i32 1 +// CHECK-NEXT: [[BUF:%[0-9]+]] = call ptr @bytes.NewBufferString( +// CHECK: store ptr [[BUF]], ptr [[BUF_FIELD]] +// CHECK-NEXT: [[BUF_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*{{.*}}/abimethod.struct${{[-A-Za-z0-9_]+}}") +// CHECK-NEXT: [[BUF_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[BUF_ITAB]], 0 +// CHECK-NEXT: [[BUF_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[BUF_I0]], ptr [[BUF_OWNER]], 1 +// CHECK-NEXT: [[BUF_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[BUF_IFACE]]) +// CHECK-NEXT: [[BUF_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[BUF_IFACE]], 0 +// CHECK-NEXT: [[BUF_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[BUF_TABLE]], i64 3 +// CHECK-NEXT: [[BUF_METHOD:%[0-9]+]] = load ptr, ptr [[BUF_SLOT]] +// CHECK-NEXT: [[BUF_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[BUF_METHOD]], 0 +// CHECK-NEXT: [[BUF_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[BUF_PAIR0]], ptr [[BUF_DATA]], 1 +// CHECK-NEXT: [[BUF_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[BUF_PAIR]], 1 +// CHECK-NEXT: [[BUF_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[BUF_PAIR]], 0 +// CHECK-NEXT: [[BUF_STR:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" [[BUF_CODE]](ptr [[BUF_RECV]]) +// CHECK: [[BUF_EQ:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" [[BUF_STR]], +// CHECK: [[BUF_BAD:%[0-9]+]] = xor i1 [[BUF_EQ]], true +// CHECK: br i1 [[BUF_BAD]], + +// IP.Store and IP.Load must operate on the same Pointer[any] interface value. // CHECK-LABEL: define void @main.testGeneric(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.Pointer[any]") -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %1, 0 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %2, ptr %0, 1 -// CHECK-NEXT: %4 = call ptr @"main.testGeneric$1"() -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 4 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: call void %12(ptr %11, ptr %4) -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %15 = getelementptr ptr, ptr %14, i64 3 -// CHECK-NEXT: %16 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 -// CHECK-NEXT: %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 -// CHECK-NEXT: %19 = extractvalue { ptr, ptr } %18, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %18, 0 -// CHECK-NEXT: %21 = call ptr %20(ptr %19) -// CHECK-NEXT: %22 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %21, align 8 -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %22, 0 -// CHECK-NEXT: %24 = icmp eq ptr %23, @_llgo_int -// CHECK-NEXT: br i1 %24, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @107, i64 17 }, ptr %25, align 8 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %25, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %26) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %22, 1 -// CHECK-NEXT: %28 = load i64, ptr %27, align 8 -// CHECK-NEXT: %29 = icmp ne i64 %28, 100 -// CHECK-NEXT: br i1 %29, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %23, ptr @_llgo_int) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// CHECK: [[P_OBJECT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: [[P_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.Pointer[any]") +// CHECK: [[P_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[P_ITAB]], 0 +// CHECK-NEXT: [[P_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[P_I0]], ptr [[P_OBJECT]], 1 +// CHECK: [[P_VALUE:%[0-9]+]] = call ptr @"main.testGeneric$1"() +// CHECK-NEXT: [[P_SDATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[P_IFACE]]) +// CHECK-NEXT: [[P_STAB:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[P_IFACE]], 0 +// CHECK-NEXT: [[P_STORE_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[P_STAB]], i64 4 +// CHECK-NEXT: [[P_STORE_METHOD:%[0-9]+]] = load ptr, ptr [[P_STORE_SLOT]] +// CHECK-NEXT: [[P_STORE_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[P_STORE_METHOD]], 0 +// CHECK-NEXT: [[P_STORE_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[P_STORE_PAIR0]], ptr [[P_SDATA]], 1 +// CHECK-NEXT: [[P_STORE_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[P_STORE_PAIR]], 1 +// CHECK-NEXT: [[P_STORE_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[P_STORE_PAIR]], 0 +// CHECK-NEXT: call void [[P_STORE_CODE]](ptr [[P_STORE_RECV]], ptr [[P_VALUE]]) +// CHECK-NEXT: [[P_LDATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[P_IFACE]]) +// CHECK-NEXT: [[P_LTAB:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[P_IFACE]], 0 +// CHECK-NEXT: [[P_LOAD_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[P_LTAB]], i64 3 +// CHECK-NEXT: [[P_LOAD_METHOD:%[0-9]+]] = load ptr, ptr [[P_LOAD_SLOT]] +// CHECK-NEXT: [[P_LOAD_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[P_LOAD_METHOD]], 0 +// CHECK-NEXT: [[P_LOAD_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[P_LOAD_PAIR0]], ptr [[P_LDATA]], 1 +// CHECK-NEXT: [[P_LOAD_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[P_LOAD_PAIR]], 1 +// CHECK-NEXT: [[P_LOAD_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[P_LOAD_PAIR]], 0 +// CHECK-NEXT: [[P_LOADED:%[0-9]+]] = call ptr [[P_LOAD_CODE]](ptr [[P_LOAD_RECV]]) +// CHECK: [[P_ANY:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr [[P_LOADED]] +// CHECK: [[P_TYPE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[P_ANY]], 0 +// CHECK: [[P_IS_INT:%[0-9]+]] = icmp eq ptr [[P_TYPE]], @_llgo_int +// CHECK: br i1 [[P_IS_INT]], +// CHECK: [[P_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[P_ANY]], 1 +// CHECK: [[P_INT:%[0-9]+]] = load i64, ptr [[P_DATA]] +// CHECK: [[P_BAD:%[0-9]+]] = icmp ne i64 [[P_INT]], 100 // CHECK-LABEL: define ptr @"main.testGeneric$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %2, ptr %0, align 8 -// CHECK-NEXT: ret ptr %0 -// CHECK-NEXT: } +// CHECK: store i64 100, ptr [[P_BOX:%[0-9]+]] +// CHECK: [[P_EFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr [[P_BOX]], 1 +// CHECK: store %"{{.*}}/runtime/internal/runtime.eface" [[P_EFACE]], ptr [[P_RESULT:%[0-9]+]] +// CHECK: ret ptr [[P_RESULT]] +// Named T and *T select the proper descriptor and dispatch through the requested interface method. // CHECK-LABEL: define void @main.testNamed1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 3 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %13 = call i64 %12(ptr %11) -// CHECK-NEXT: %14 = icmp ne i64 %13, 100 -// CHECK-NEXT: br i1 %14, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @108, i64 16 }, ptr %15, align 8 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %16) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[N1_OBJECT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: [[N1_FIELD:%[0-9]+]] = getelementptr inbounds %main.T, ptr [[N1_OBJECT]], i32 0, i32 0 +// CHECK-NEXT: store i64 100, ptr [[N1_FIELD]] +// CHECK-NEXT: [[N1_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") +// CHECK-NEXT: [[N1_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[N1_ITAB]], 0 +// CHECK-NEXT: [[N1_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[N1_I0]], ptr [[N1_OBJECT]], 1 +// CHECK-NEXT: [[N1_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[N1_IFACE]]) +// CHECK-NEXT: [[N1_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[N1_IFACE]], 0 +// CHECK-NEXT: [[N1_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[N1_TABLE]], i64 3 +// CHECK-NEXT: [[N1_METHOD:%[0-9]+]] = load ptr, ptr [[N1_SLOT]] +// CHECK-NEXT: [[N1_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[N1_METHOD]], 0 +// CHECK-NEXT: [[N1_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[N1_PAIR0]], ptr [[N1_DATA]], 1 +// CHECK-NEXT: [[N1_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[N1_PAIR]], 1 +// CHECK-NEXT: [[N1_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[N1_PAIR]], 0 +// CHECK-NEXT: [[N1_RES:%[0-9]+]] = call i64 [[N1_CODE]](ptr [[N1_RECV]]) +// CHECK-NEXT: [[N1_BAD:%[0-9]+]] = icmp ne i64 [[N1_RES]], 100 +// CHECK-NEXT: br i1 [[N1_BAD]], // CHECK-LABEL: define void @main.testNamed2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.T, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = load %main.T, ptr %0, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.T %2, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T) -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5, ptr %3, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 3 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call i64 %14(ptr %13) -// CHECK-NEXT: %16 = icmp ne i64 %15, 100 -// CHECK-NEXT: br i1 %16, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @109, i64 16 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[N2_VALUE:%[0-9]+]] = load %main.T, ptr %{{[0-9]+}} +// CHECK-NEXT: [[N2_OBJECT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store %main.T [[N2_VALUE]], ptr [[N2_OBJECT]] +// CHECK-NEXT: [[N2_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T) +// CHECK-NEXT: [[N2_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[N2_ITAB]], 0 +// CHECK-NEXT: [[N2_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[N2_I0]], ptr [[N2_OBJECT]], 1 +// CHECK-NEXT: [[N2_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[N2_IFACE]]) +// CHECK-NEXT: [[N2_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[N2_IFACE]], 0 +// CHECK-NEXT: [[N2_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[N2_TABLE]], i64 3 +// CHECK-NEXT: [[N2_METHOD:%[0-9]+]] = load ptr, ptr [[N2_SLOT]] +// CHECK-NEXT: [[N2_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[N2_METHOD]], 0 +// CHECK-NEXT: [[N2_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[N2_PAIR0]], ptr [[N2_DATA]], 1 +// CHECK-NEXT: [[N2_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[N2_PAIR]], 1 +// CHECK-NEXT: [[N2_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[N2_PAIR]], 0 +// CHECK-NEXT: [[N2_RES:%[0-9]+]] = call i64 [[N2_CODE]](ptr [[N2_RECV]]) +// CHECK-NEXT: [[N2_BAD:%[0-9]+]] = icmp ne i64 [[N2_RES]], 100 +// CHECK-NEXT: br i1 [[N2_BAD]], // CHECK-LABEL: define void @main.testNamed3(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 3 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %13 = call i64 %12(ptr %11) -// CHECK-NEXT: %14 = icmp ne i64 %13, 100 -// CHECK-NEXT: br i1 %14, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @110, i64 16 }, ptr %15, align 8 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %16) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[N3_OBJECT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: [[N3_FIELD:%[0-9]+]] = getelementptr inbounds %main.T, ptr [[N3_OBJECT]], i32 0, i32 0 +// CHECK-NEXT: store i64 100, ptr [[N3_FIELD]] +// CHECK-NEXT: [[N3_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") +// CHECK-NEXT: [[N3_I0:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr [[N3_ITAB]], 0 +// CHECK-NEXT: [[N3_IFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" [[N3_I0]], ptr [[N3_OBJECT]], 1 +// CHECK-NEXT: [[N3_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[N3_IFACE]]) +// CHECK-NEXT: [[N3_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[N3_IFACE]], 0 +// CHECK-NEXT: [[N3_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[N3_TABLE]], i64 3 +// CHECK-NEXT: [[N3_METHOD:%[0-9]+]] = load ptr, ptr [[N3_SLOT]] +// CHECK-NEXT: [[N3_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[N3_METHOD]], 0 +// CHECK-NEXT: [[N3_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[N3_PAIR0]], ptr [[N3_DATA]], 1 +// CHECK-NEXT: [[N3_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[N3_PAIR]], 1 +// CHECK-NEXT: [[N3_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[N3_PAIR]], 0 +// CHECK-NEXT: [[N3_RES:%[0-9]+]] = call i64 [[N3_CODE]](ptr [[N3_RECV]]) +// CHECK-NEXT: [[N3_BAD:%[0-9]+]] = icmp ne i64 [[N3_RES]], 100 +// CHECK-NEXT: br i1 [[N3_BAD]], + +// Promoted methods must address the embedded field, call the underlying method, and return it. // CHECK-LABEL: define i64 @"main.*struct{m int; *main.T}.Demo1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %3) -// CHECK-NEXT: %4 = icmp eq ptr %1, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %4) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %2) -// CHECK-NEXT: %6 = load %main.T, ptr %5, align 8 -// CHECK-NEXT: %7 = call i64 @main.T.Demo1(%main.T %6) -// CHECK-NEXT: ret i64 %7 -// CHECK-NEXT: } +// CHECK: [[SPP1_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 +// CHECK: [[SPP1_T:%[0-9]+]] = load ptr, ptr [[SPP1_FIELD]] +// CHECK: [[SPP1_SAFE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[SPP1_T]]) +// CHECK: [[SPP1_VALUE:%[0-9]+]] = load %main.T, ptr [[SPP1_SAFE]] +// CHECK: [[SPP1_RES:%[0-9]+]] = call i64 @main.T.Demo1(%main.T [[SPP1_VALUE]]) +// CHECK: ret i64 [[SPP1_RES]] // CHECK-LABEL: define i64 @"main.*struct{m int; *main.T}.Demo2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i64 @"main.(*T).Demo2"(ptr %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: [[SPP2_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 +// CHECK: [[SPP2_T:%[0-9]+]] = load ptr, ptr [[SPP2_FIELD]] +// CHECK: [[SPP2_RES:%[0-9]+]] = call i64 @"main.(*T).Demo2"(ptr [[SPP2_T]]) +// CHECK: ret i64 [[SPP2_RES]] // CHECK-LABEL: define i64 @"main.*struct{m int; *main.T}.demo3"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i64 @"main.(*T).demo3"(ptr %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: [[SPP3_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 +// CHECK: [[SPP3_T:%[0-9]+]] = load ptr, ptr [[SPP3_FIELD]] +// CHECK: [[SPP3_RES:%[0-9]+]] = call i64 @"main.(*T).demo3"(ptr [[SPP3_T]]) +// CHECK: ret i64 [[SPP3_RES]] // CHECK-LABEL: define i64 @"main.struct{m int; *main.T}.Demo1"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %3) -// CHECK-NEXT: %5 = load %main.T, ptr %4, align 8 -// CHECK-NEXT: %6 = call i64 @main.T.Demo1(%main.T %5) -// CHECK-NEXT: ret i64 %6 -// CHECK-NEXT: } +// CHECK: [[SVP1_ADDR:%[0-9]+]] = alloca { i64, ptr } +// CHECK: store { i64, ptr } %0, ptr [[SVP1_ADDR]] +// CHECK-NEXT: [[SVP1_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr [[SVP1_ADDR]], i32 0, i32 1 +// CHECK: [[SVP1_T:%[0-9]+]] = load ptr, ptr [[SVP1_FIELD]] +// CHECK: [[SVP1_SAFE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[SVP1_T]]) +// CHECK: [[SVP1_VALUE:%[0-9]+]] = load %main.T, ptr [[SVP1_SAFE]] +// CHECK: [[SVP1_RES:%[0-9]+]] = call i64 @main.T.Demo1(%main.T [[SVP1_VALUE]]) +// CHECK: ret i64 [[SVP1_RES]] // CHECK-LABEL: define i64 @"main.struct{m int; *main.T}.Demo2"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"main.(*T).Demo2"(ptr %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } +// CHECK: [[SVP2_ADDR:%[0-9]+]] = alloca { i64, ptr } +// CHECK: store { i64, ptr } %0, ptr [[SVP2_ADDR]] +// CHECK-NEXT: [[SVP2_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr [[SVP2_ADDR]], i32 0, i32 1 +// CHECK: [[SVP2_T:%[0-9]+]] = load ptr, ptr [[SVP2_FIELD]] +// CHECK: [[SVP2_RES:%[0-9]+]] = call i64 @"main.(*T).Demo2"(ptr [[SVP2_T]]) +// CHECK: ret i64 [[SVP2_RES]] // CHECK-LABEL: define i64 @"main.struct{m int; *main.T}.demo3"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"main.(*T).demo3"(ptr %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } +// CHECK: [[SVP3_ADDR:%[0-9]+]] = alloca { i64, ptr } +// CHECK: store { i64, ptr } %0, ptr [[SVP3_ADDR]] +// CHECK-NEXT: [[SVP3_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr [[SVP3_ADDR]], i32 0, i32 1 +// CHECK: [[SVP3_T:%[0-9]+]] = load ptr, ptr [[SVP3_FIELD]] +// CHECK: [[SVP3_RES:%[0-9]+]] = call i64 @"main.(*T).demo3"(ptr [[SVP3_T]]) +// CHECK: ret i64 [[SVP3_RES]] // CHECK-LABEL: define i64 @"main.struct{m int; main.T}.Demo1"({ i64, %main.T } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, %main.T }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, %main.T } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, %main.T }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load %main.T, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @main.T.Demo1(%main.T %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } +// CHECK: [[SVV_ADDR:%[0-9]+]] = alloca { i64, %main.T } +// CHECK: store { i64, %main.T } %0, ptr [[SVV_ADDR]] +// CHECK-NEXT: [[SVV_FIELD:%[0-9]+]] = getelementptr inbounds { i64, %main.T }, ptr [[SVV_ADDR]], i32 0, i32 1 +// CHECK: [[SVV_T:%[0-9]+]] = load %main.T, ptr [[SVV_FIELD]] +// CHECK: [[SVV_RES:%[0-9]+]] = call i64 @main.T.Demo1(%main.T [[SVV_T]]) +// CHECK: ret i64 [[SVV_RES]] // CHECK-LABEL: define i64 @"main.*struct{m int; main.T}.Demo1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %1) -// CHECK-NEXT: %4 = load %main.T, ptr %3, align 8 -// CHECK-NEXT: %5 = call i64 @main.T.Demo1(%main.T %4) -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } +// CHECK: [[SPV1_FIELD:%[0-9]+]] = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 +// CHECK: [[SPV1_SAFE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[SPV1_FIELD]]) +// CHECK: [[SPV1_T:%[0-9]+]] = load %main.T, ptr [[SPV1_SAFE]] +// CHECK: [[SPV1_RES:%[0-9]+]] = call i64 @main.T.Demo1(%main.T [[SPV1_T]]) +// CHECK: ret i64 [[SPV1_RES]] // CHECK-LABEL: define i64 @"main.*struct{m int; main.T}.Demo2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = call i64 @"main.(*T).Demo2"(ptr %1) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[SPV2_FIELD:%[0-9]+]] = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 +// CHECK: [[SPV2_RES:%[0-9]+]] = call i64 @"main.(*T).Demo2"(ptr [[SPV2_FIELD]]) +// CHECK: ret i64 [[SPV2_RES]] // CHECK-LABEL: define i64 @"main.*struct{m int; main.T}.demo3"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = call i64 @"main.(*T).demo3"(ptr %1) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.*struct{m int; *bytes.Buffer}.Available"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i64 @"bytes.(*Buffer).Available"(ptr %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.*struct{m int; *bytes.Buffer}.AvailableBuffer"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.*struct{m int; *bytes.Buffer}.Bytes"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.*struct{m int; *bytes.Buffer}.Cap"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i64 @"bytes.(*Buffer).Cap"(ptr %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.*struct{m int; *bytes.Buffer}.Grow"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Grow"(ptr %3, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.*struct{m int; *bytes.Buffer}.Len"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i64 @"bytes.(*Buffer).Len"(ptr %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.*struct{m int; *bytes.Buffer}.Next"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %3, i64 %1) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.Peek"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Peek"(ptr %3, i64 %1) -// CHECK-NEXT: %5 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %5, 0 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.Read"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %3, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i8, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.ReadByte"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call { i8, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %2) -// CHECK-NEXT: %4 = extractvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %3, 0 -// CHECK-NEXT: %5 = extractvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %3, 1 -// CHECK-NEXT: %6 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } undef, i8 %4, 0 -// CHECK-NEXT: %7 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %6, %"{{.*}}/runtime/internal/runtime.iface" %5, 1 -// CHECK-NEXT: ret { i8, %"{{.*}}/runtime/internal/runtime.iface" } %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.ReadBytes"(ptr %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %3, i8 %1) -// CHECK-NEXT: %5 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %5, 0 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.ReadFrom"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %3, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.ReadRune"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %2) -// CHECK-NEXT: %4 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %3, 0 -// CHECK-NEXT: %5 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %3, 1 -// CHECK-NEXT: %6 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %3, 2 -// CHECK-NEXT: %7 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %4, 0 -// CHECK-NEXT: %8 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, i64 %5, 1 -// CHECK-NEXT: %9 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %6, 2 -// CHECK-NEXT: ret { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.ReadString"(ptr %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %3, i8 %1) -// CHECK-NEXT: %5 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.String" %5, 0 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.*struct{m int; *bytes.Buffer}.Reset"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Reset"(ptr %2) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[SPV3_FIELD:%[0-9]+]] = getelementptr inbounds { i64, %main.T }, ptr %0, i32 0, i32 1 +// CHECK: [[SPV3_RES:%[0-9]+]] = call i64 @"main.(*T).demo3"(ptr [[SPV3_FIELD]]) +// CHECK: ret i64 [[SPV3_RES]] // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.*struct{m int; *bytes.Buffer}.String"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.*struct{m int; *bytes.Buffer}.Truncate"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Truncate"(ptr %3, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.*struct{m int; *bytes.Buffer}.UnreadByte"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.*struct{m int; *bytes.Buffer}.UnreadRune"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.Write"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %3, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.*struct{m int; *bytes.Buffer}.WriteByte"(ptr %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %3, i8 %1) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.WriteRune"(ptr %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %3, i32 %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.WriteString"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %3, %"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.WriteTo"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %3, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.*struct{m int; *bytes.Buffer}.bytes.empty"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i1 @"bytes.(*Buffer).empty"(ptr %2) -// CHECK-NEXT: ret i1 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.*struct{m int; *bytes.Buffer}.bytes.grow"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"bytes.(*Buffer).grow"(ptr %3, i64 %1) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.*struct{m int; *bytes.Buffer}.bytes.readSlice"(ptr %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %3, i8 %1) -// CHECK-NEXT: %5 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %5, 0 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, i1 } @"main.*struct{m int; *bytes.Buffer}.bytes.tryGrowByReslice"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %3, i64 %1) -// CHECK-NEXT: %5 = extractvalue { i64, i1 } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, i1 } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, i1 } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, i1 } %7, i1 %6, 1 -// CHECK-NEXT: ret { i64, i1 } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.struct{m int; *bytes.Buffer}.Available"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"bytes.(*Buffer).Available"(ptr %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.struct{m int; *bytes.Buffer}.AvailableBuffer"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).AvailableBuffer"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.struct{m int; *bytes.Buffer}.Bytes"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.struct{m int; *bytes.Buffer}.Cap"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"bytes.(*Buffer).Cap"(ptr %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.struct{m int; *bytes.Buffer}.Grow"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Grow"(ptr %4, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.struct{m int; *bytes.Buffer}.Len"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i64 @"bytes.(*Buffer).Len"(ptr %3) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.struct{m int; *bytes.Buffer}.Next"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Next"(ptr %4, i64 %1) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.Peek"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Peek"(ptr %4, i64 %1) -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %9 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.Read"({ i64, ptr } %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Read"(ptr %4, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i8, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.ReadByte"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i8, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadByte"(ptr %3) -// CHECK-NEXT: %5 = extractvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } undef, i8 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i8, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.ReadBytes"({ i64, ptr } %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadBytes"(ptr %4, i8 %1) -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %9 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.ReadFrom"({ i64, ptr } %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadFrom"(ptr %4, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.ReadRune"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadRune"(ptr %3) -// CHECK-NEXT: %5 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = extractvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 2 -// CHECK-NEXT: %8 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %5, 0 -// CHECK-NEXT: %9 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, i64 %6, 1 -// CHECK-NEXT: %10 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %9, %"{{.*}}/runtime/internal/runtime.iface" %7, 2 -// CHECK-NEXT: ret { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %10 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.ReadString"({ i64, ptr } %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).ReadString"(ptr %4, i8 %1) -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.String" %6, 0 -// CHECK-NEXT: %9 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.struct{m int; *bytes.Buffer}.Reset"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Reset"(ptr %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.struct{m int; *bytes.Buffer}.String"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.struct{m int; *bytes.Buffer}.Truncate"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: call void @"bytes.(*Buffer).Truncate"(ptr %4, i64 %1) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.struct{m int; *bytes.Buffer}.UnreadByte"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadByte"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.struct{m int; *bytes.Buffer}.UnreadRune"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).UnreadRune"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.Write"({ i64, ptr } %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %4, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.struct{m int; *bytes.Buffer}.WriteByte"({ i64, ptr } %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.iface" @"bytes.(*Buffer).WriteByte"(ptr %4, i8 %1) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.WriteRune"({ i64, ptr } %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteRune"(ptr %4, i32 %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.WriteString"({ i64, ptr } %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %4, %"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.WriteTo"({ i64, ptr } %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteTo"(ptr %4, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.struct{m int; *bytes.Buffer}.bytes.empty"({ i64, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds { i64, ptr }, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i1 @"bytes.(*Buffer).empty"(ptr %3) -// CHECK-NEXT: ret i1 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.struct{m int; *bytes.Buffer}.bytes.grow"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call i64 @"bytes.(*Buffer).grow"(ptr %4, i64 %1) -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"main.struct{m int; *bytes.Buffer}.bytes.readSlice"({ i64, ptr } %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).readSlice"(ptr %4, i8 %1) -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %9 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %8, %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, i1 } @"main.struct{m int; *bytes.Buffer}.bytes.tryGrowByReslice"({ i64, ptr } %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca { i64, ptr }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store { i64, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds { i64, ptr }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call { i64, i1 } @"bytes.(*Buffer).tryGrowByReslice"(ptr %4, i64 %1) -// CHECK-NEXT: %6 = extractvalue { i64, i1 } %5, 0 -// CHECK-NEXT: %7 = extractvalue { i64, i1 } %5, 1 -// CHECK-NEXT: %8 = insertvalue { i64, i1 } undef, i64 %6, 0 -// CHECK-NEXT: %9 = insertvalue { i64, i1 } %8, i1 %7, 1 -// CHECK-NEXT: ret { i64, i1 } %9 -// CHECK-NEXT: } +// CHECK: [[BSP_FIELD:%[0-9]+]] = getelementptr inbounds { i64, ptr }, ptr %0, i32 0, i32 1 +// CHECK: [[BSP_BUFFER:%[0-9]+]] = load ptr, ptr [[BSP_FIELD]] +// CHECK: [[BSP_STRING:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr [[BSP_BUFFER]]) +// CHECK: ret %"{{.*}}/runtime/internal/runtime.String" [[BSP_STRING]] +// Atomic Load and Store must address Pointer[any].v and preserve seq_cst ordering. // CHECK-LABEL: define linkonce ptr @"main.(*Pointer[any]).Load"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) -// CHECK-NEXT: %2 = getelementptr inbounds %"main.Pointer[any]", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load atomic ptr, ptr %2 seq_cst, align 8 -// CHECK-NEXT: ret ptr %3 -// CHECK-NEXT: } +// CHECK: [[LOAD_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[LOAD_NIL]]) +// CHECK: [[LOAD_V:%[0-9]+]] = getelementptr inbounds %"main.Pointer[any]", ptr %0, i32 0, i32 1 +// CHECK: [[LOAD_VALUE:%[0-9]+]] = load atomic ptr, ptr [[LOAD_V]] seq_cst +// CHECK: ret ptr [[LOAD_VALUE]] // CHECK-LABEL: define linkonce void @"main.(*Pointer[any]).Store"(ptr %0, ptr %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = getelementptr inbounds %"main.Pointer[any]", ptr %0, i32 0, i32 1 -// CHECK-NEXT: store atomic ptr %1, ptr %3 seq_cst, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[STORE_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[STORE_NIL]]) +// CHECK: [[STORE_V:%[0-9]+]] = getelementptr inbounds %"main.Pointer[any]", ptr %0, i32 0, i32 1 +// CHECK: store atomic ptr %1, ptr [[STORE_V]] seq_cst diff --git a/cl/_testgo/alias/in.go b/cl/_testgo/alias/in.go index 20d91abba6..aea5c0eb3b 100644 --- a/cl/_testgo/alias/in.go +++ b/cl/_testgo/alias/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.(*Point).Move\E|\Qmain.(*Point).Scale\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main type Point struct { @@ -8,54 +10,71 @@ type Point struct { type MyPoint = Point -// CHECK-LABEL: define void @"main.(*Point).Move"(ptr %0, double %1, double %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load double, ptr %3, align 8 -// CHECK-NEXT: %5 = fadd double %4, %1 -// CHECK-NEXT: %6 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store double %5, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %8 = load double, ptr %7, align 8 -// CHECK-NEXT: %9 = fadd double %8, %2 -// CHECK-NEXT: %10 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store double %9, ptr %10, align 8 -// CHECK-NEXT: ret void func (p *MyPoint) Move(dx, dy float64) { p.x += dx p.y += dy } -// CHECK-LABEL: define void @"main.(*Point).Scale"(ptr %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load double, ptr %2, align 8 -// CHECK-NEXT: %4 = fmul double %3, %1 -// CHECK-NEXT: %5 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store double %4, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %7 = load double, ptr %6, align 8 -// CHECK-NEXT: %8 = fmul double %7, %1 -// CHECK-NEXT: %9 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store double %8, ptr %9, align 8 -// CHECK-NEXT: ret void func (p *Point) Scale(factor float64) { p.x *= factor p.y *= factor } -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 16) - // CHECK: call void @"main.(*Point).Scale"(ptr %0, double 2.000000e+00) - // CHECK: call void @"main.(*Point).Move"(ptr %0, double 3.000000e+00, double 4.000000e+00) - // CHECK: call void @"{{.*}}PrintFloat"(double %4) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double %6) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void pt := &MyPoint{1, 2} pt.Scale(2) pt.Move(3, 4) println(pt.x, pt.y) } + +// CHECK-LABEL: define void @"main.(*Point).Move"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], double %[[TMP1:[0-9]+]], double %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load double, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = fadd double %[[TMP4]], %[[TMP1]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store double %[[TMP5]], ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = load double, ptr %[[TMP7]], align 8 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = fadd double %[[TMP8]], %[[TMP2]] +// CHECK-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: store double %[[TMP9]], ptr %[[TMP10]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.(*Point).Scale"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], double %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load double, ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = fmul double %[[TMP3]], %[[TMP1]] +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store double %[[TMP4]], ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load double, ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = fmul double %[[TMP7]], %[[TMP1]] +// CHECK-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: store double %[[TMP8]], ptr %[[TMP9]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: store double 1.000000e+00, ptr %[[TMP1]], align 8 +// CHECK-NEXT: store double 2.000000e+00, ptr %[[TMP2]], align 8 +// CHECK-NEXT: call void @"main.(*Point).Scale"(ptr %[[TMP0]], double 2.000000e+00) +// CHECK-NEXT: call void @"main.(*Point).Move"(ptr %[[TMP0]], double 3.000000e+00, double 4.000000e+00) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load double, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.Point, ptr %[[TMP0]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load double, ptr %[[TMP5]], align 8 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP4]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP6]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testgo/allocinloop/in.go b/cl/_testgo/allocinloop/in.go index 53612cf457..e19ba3e9cd 100644 --- a/cl/_testgo/allocinloop/in.go +++ b/cl/_testgo/allocinloop/in.go @@ -1,34 +1,23 @@ // LITTEST package main -// CHECK-LABEL: define i64 @main.Foo(%"{{.*}}String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}String" %0, 1 -// CHECK-NEXT: ret i64 %1 +// The string literal passed in the loop must not introduce a per-iteration +// allocation. +// CHECK-LABEL: define void @main.Test(){{.*}} { +// CHECK-NOT: Alloc +// CHECK: [[TOTAL:%[0-9]+]] = phi i64 [ 0, %{{.*}} ], [ [[NEXT_TOTAL:%[0-9]+]], %{{.*}} ] +// CHECK-NEXT: [[ITER:%[0-9]+]] = phi i64 [ 0, %{{.*}} ], [ [[NEXT_ITER:%[0-9]+]], %{{.*}} ] +// CHECK: [[VALUE:%[0-9]+]] = call i64 @main.Foo(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[NEXT_TOTAL]] = add i64 [[TOTAL]], [[VALUE]] +// CHECK-NEXT: [[NEXT_ITER]] = add i64 [[ITER]], 1 +// CHECK-NOT: Alloc +// CHECK: call void @"{{.*}}PrintInt"(i64 [[TOTAL]]) +// CHECK: ret void + func Foo(s string) int { return len(s) } -// CHECK-LABEL: define void @main.Test(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: -// CHECK-NEXT: %0 = phi i64 [ 0, %_llgo_0 ], [ %4, %_llgo_2 ] -// CHECK-NEXT: %1 = phi i64 [ 0, %_llgo_0 ], [ %5, %_llgo_2 ] -// CHECK-NEXT: %2 = icmp slt i64 %1, 10000000 -// CHECK-NEXT: br i1 %2, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: -// CHECK-NEXT: %3 = call i64 @main.Foo(%"{{.*}}String" { ptr @0, i64 5 }) -// CHECK-NEXT: %4 = add i64 %0, %3 -// CHECK-NEXT: %5 = add i64 %1, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: -// CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) -// CHECK-NEXT: ret void func Test() { j := 0 for i := 0; i < 10000000; i++ { @@ -37,10 +26,6 @@ func Test() { println(j) } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.Test() -// CHECK-NEXT: ret void func main() { Test() } diff --git a/cl/_testgo/cgobasic/cgobasic.go b/cl/_testgo/cgobasic/cgobasic.go index d7fef6b914..438942e668 100644 --- a/cl/_testgo/cgobasic/cgobasic.go +++ b/cl/_testgo/cgobasic/cgobasic.go @@ -12,90 +12,125 @@ import ( "unsafe" ) +// Check the Go/C conversion helpers and generated wrappers without depending +// on fmt's internal lowering. +// CHECK: [[HELLO_WORLD:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"Hello, World!" + +// Every generated wrapper forwards its argument through its initialized cgo +// symbol slot and returns the foreign call result unchanged. // CHECK-LABEL: define double @main._Cfunc_cos(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_cos, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call double %3(double %0) -// CHECK-NEXT: ret double %4 -// CHECK-NEXT: } +// CHECK: [[COS_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_cos +// CHECK-NEXT: [[COS_FN:%.*]] = load ptr, ptr [[COS_SLOT]] +// CHECK-NEXT: [[COS_RESULT:%.*]] = call double [[COS_FN]](double %0) +// CHECK-NEXT: ret double [[COS_RESULT]] // CHECK-LABEL: define [0 x i8] @main._Cfunc_free(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_free, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0) -// CHECK-NEXT: ret [0 x i8] %4 -// CHECK-NEXT: } +// CHECK: [[FREE_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_free +// CHECK-NEXT: [[FREE_FN:%.*]] = load ptr, ptr [[FREE_SLOT]] +// CHECK-NEXT: [[FREE_RESULT:%.*]] = call [0 x i8] [[FREE_FN]](ptr %0) +// CHECK-NEXT: ret [0 x i8] [[FREE_RESULT]] // CHECK-LABEL: define double @main._Cfunc_log(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_log, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call double %3(double %0) -// CHECK-NEXT: ret double %4 -// CHECK-NEXT: } +// CHECK: [[LOG_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_log +// CHECK-NEXT: [[LOG_FN:%.*]] = load ptr, ptr [[LOG_SLOT]] +// CHECK-NEXT: [[LOG_RESULT:%.*]] = call double [[LOG_FN]](double %0) +// CHECK-NEXT: ret double [[LOG_RESULT]] // CHECK-LABEL: define i32 @main._Cfunc_puts(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_puts, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i32 %3(ptr %0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } +// CHECK: [[PUTS_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_puts +// CHECK-NEXT: [[PUTS_FN:%.*]] = load ptr, ptr [[PUTS_SLOT]] +// CHECK-NEXT: [[PUTS_RESULT:%.*]] = call i32 [[PUTS_FN]](ptr %0) +// CHECK-NEXT: ret i32 [[PUTS_RESULT]] // CHECK-LABEL: define double @main._Cfunc_sin(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_sin, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call double %3(double %0) -// CHECK-NEXT: ret double %4 -// CHECK-NEXT: } +// CHECK: [[SIN_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_sin +// CHECK-NEXT: [[SIN_FN:%.*]] = load ptr, ptr [[SIN_SLOT]] +// CHECK-NEXT: [[SIN_RESULT:%.*]] = call double [[SIN_FN]](double %0) +// CHECK-NEXT: ret double [[SIN_RESULT]] // CHECK-LABEL: define double @main._Cfunc_sqrt(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_sqrt, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call double %3(double %0) -// CHECK-NEXT: ret double %4 -// CHECK-NEXT: } +// CHECK: [[SQRT_SLOT:%.*]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_sqrt +// CHECK-NEXT: [[SQRT_FN:%.*]] = load ptr, ptr [[SQRT_SLOT]] +// CHECK-NEXT: [[SQRT_RESULT:%.*]] = call double [[SQRT_FN]](double %0) +// CHECK-NEXT: ret double [[SQRT_RESULT]] // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_cos, ptr @main._cgo_{{.*}}_Cfunc_cos, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_free, ptr @main._cgo_{{.*}}_Cfunc_free, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_log, ptr @main._cgo_{{.*}}_Cfunc_log, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_puts, ptr @main._cgo_{{.*}}_Cfunc_puts, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_sin, ptr @main._cgo_{{.*}}_Cfunc_sin, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_sqrt, ptr @main._cgo_{{.*}}_Cfunc_sqrt, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc__Cmalloc, ptr @main._cgo_{{.*}}_Cfunc__Cmalloc, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_cos, ptr @main._cgo_{{.*}}_Cfunc_cos +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_free, ptr @main._cgo_{{.*}}_Cfunc_free +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_log, ptr @main._cgo_{{.*}}_Cfunc_log +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_puts, ptr @main._cgo_{{.*}}_Cfunc_puts +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_sin, ptr @main._cgo_{{.*}}_Cfunc_sin +// CHECK: store ptr @_cgo_{{.*}}_Cfunc_sqrt, ptr @main._cgo_{{.*}}_Cfunc_sqrt // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK: %{{.*}} = call i32 @main._Cfunc_puts(ptr %{{.*}}) -// CHECK: %{{.*}} = call double @main._Cfunc_sqrt(double 2.000000e+00) -// CHECK: %{{.*}} = call double @main._Cfunc_sin(double 2.000000e+00) -// CHECK: %{{.*}} = call double @main._Cfunc_cos(double 2.000000e+00) -// CHECK: %{{.*}} = call double @main._Cfunc_log(double 2.000000e+00) -// CHECK: %{{.*}} = insertvalue { ptr, ptr } { ptr @"main.main$3", ptr undef }, ptr %{{.*}}, 1 -// CHECK: %{{.*}} = insertvalue { ptr, ptr } { ptr @"main.main$4", ptr undef }, ptr %{{.*}}, 1 +// CString is stored once, reused by puts/GoString/GoStringN, and later freed. +// CHECK: [[CSTR_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK-NEXT: [[CSTR:%.*]] = call ptr @"{{.*}}CString"(%"{{.*}}String" { ptr [[HELLO_WORLD]], i64 13 }) +// CHECK-NEXT: store ptr [[CSTR]], ptr [[CSTR_SLOT]] +// CHECK-NEXT: [[CSTR_FOR_PUTS:%.*]] = load ptr, ptr [[CSTR_SLOT]] +// CHECK-NEXT: call i32 @main._Cfunc_puts(ptr [[CSTR_FOR_PUTS]]) +// The ABCD []byte is passed through the captured CBytes helper and stored. +// CHECK: [[BYTES_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 24) +// CHECK: [[CBYTES_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[CBYTES_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[BYTES_SLOT]], ptr {{%.*}} +// CHECK: [[CBYTES_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr [[CBYTES_ENV]], 1 +// CHECK: [[CBYTES_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[CBYTES_CLOSURE]], 1 +// CHECK: [[CBYTES_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[CBYTES_CLOSURE]], 0 +// CHECK: [[CBYTES_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[CBYTES_CALL_FN]]) +// CHECK-NEXT: [[CBYTES:%.*]] = call ptr [[CBYTES_CODE]](ptr {{(nest|swiftself)}} [[CBYTES_CALL_ENV]]) +// CHECK-NEXT: store ptr [[CBYTES]], ptr [[CBYTES_SLOT]] +// CHECK: [[CSTR_FOR_GO:%.*]] = load ptr, ptr [[CSTR_SLOT]] +// CHECK-NEXT: [[GO_STRING:%.*]] = call %"{{.*}}String" @"{{.*}}GoString"(ptr [[CSTR_FOR_GO]]) +// CHECK: [[CSTR_FOR_GON:%.*]] = load ptr, ptr [[CSTR_SLOT]] +// CHECK-NEXT: [[GO_STRING_N:%.*]] = call %"{{.*}}String" @"{{.*}}GoStringN"(ptr [[CSTR_FOR_GON]], i64 5) +// CHECK: [[GOBYTES_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[CBYTES_SLOT]], ptr {{%.*}} +// CHECK: [[GOBYTES_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr [[GOBYTES_ENV]], 1 +// CHECK: [[GOBYTES_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[GOBYTES_CLOSURE]], 1 +// CHECK: [[GOBYTES_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[GOBYTES_CLOSURE]], 0 +// CHECK: [[GOBYTES_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[GOBYTES_CALL_FN]]) +// CHECK-NEXT: [[GO_BYTES:%.*]] = call %"{{.*}}Slice" [[GOBYTES_CODE]](ptr {{(nest|swiftself)}} [[GOBYTES_CALL_ENV]]) +// One libm result is followed through boxing into fmt.Printf; the other +// wrappers already prove their own argument/result forwarding above. +// CHECK: [[SQRT_CALL:%.*]] = call double @main._Cfunc_sqrt(double 2.000000e+00) +// CHECK: [[SQRT_ARGS:%.*]] = call ptr @"{{.*}}AllocZ"(i64 32) +// CHECK: [[SQRT_X_BOX:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store double 2.000000e+00, ptr [[SQRT_X_BOX]] +// CHECK: [[SQRT_RESULT_SLOT:%.*]] = getelementptr inbounds %"{{.*}}eface", ptr [[SQRT_ARGS]], i64 1 +// CHECK-NEXT: [[SQRT_RESULT_BOX:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK-NEXT: store double [[SQRT_CALL]], ptr [[SQRT_RESULT_BOX]] +// CHECK: call { i64, %"{{.*}}iface" } @fmt.Printf +// CHECK: call double @main._Cfunc_sin(double 2.000000e+00) +// CHECK: call double @main._Cfunc_cos(double 2.000000e+00) +// CHECK: call double @main._Cfunc_log(double 2.000000e+00) + +// CHECK-LABEL: define ptr @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[CB_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[CB_SLOT:%.*]] = extractvalue { ptr } [[CB_CAPTURE]], 0 +// CHECK-NEXT: [[CB_SLICE:%.*]] = load %"{{.*}}Slice", ptr [[CB_SLOT]] +// CHECK: [[CB_RESULT:%.*]] = call ptr @"{{.*}}CBytes"(%"{{.*}}Slice" [[CB_SLICE]]) +// CHECK-NEXT: ret ptr [[CB_RESULT]] + +// CHECK-LABEL: define %"{{.*}}Slice" @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[GB_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[GB_SLOT:%.*]] = extractvalue { ptr } [[GB_CAPTURE]], 0 +// CHECK-NEXT: [[GB_PTR:%.*]] = load ptr, ptr [[GB_SLOT]] +// CHECK: [[GB_RESULT:%.*]] = call %"{{.*}}Slice" @"{{.*}}GoBytes"(ptr [[GB_PTR]], i64 4) +// CHECK-NEXT: ret %"{{.*}}Slice" [[GB_RESULT]] + +// CHECK-LABEL: define void @"main.main$3"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[FC_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[FC_SLOT:%.*]] = extractvalue { ptr } [[FC_CAPTURE]], 0 +// CHECK-NEXT: [[FC_PTR:%.*]] = load ptr, ptr [[FC_SLOT]] +// CHECK: call [0 x i8] @main._Cfunc_free(ptr [[FC_PTR]]) + +// CHECK-LABEL: define void @"main.main$4"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[FB_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[FB_SLOT:%.*]] = extractvalue { ptr } [[FB_CAPTURE]], 0 +// CHECK-NEXT: [[FB_PTR:%.*]] = load ptr, ptr [[FB_SLOT]] +// CHECK: call [0 x i8] @main._Cfunc_free(ptr [[FB_PTR]]) + func main() { // C.CString example cstr := C.CString("Hello, World!") @@ -138,45 +173,3 @@ func main() { C.free(unsafe.Pointer(cstr)) C.free(cbytes) } - -// CHECK-LABEL: define ptr @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.CBytes"(%"{{.*}}/runtime/internal/runtime.Slice" %3) -// CHECK-NEXT: ret ptr %6 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.GoBytes"(ptr %3, i64 4) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$3"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call [0 x i8] @main._Cfunc_free(ptr %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$4"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call [0 x i8] @main._Cfunc_free(ptr %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/cgocfiles/cgocfiles.go b/cl/_testgo/cgocfiles/cgocfiles.go index 51d85ab1e8..4d571c5820 100644 --- a/cl/_testgo/cgocfiles/cgocfiles.go +++ b/cl/_testgo/cgocfiles/cgocfiles.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain._Cfunc_test_structs\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main /* @@ -7,53 +9,11 @@ package main import "C" import "fmt" -// CHECK-LABEL: define i32 @main._Cfunc_test_structs(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %6 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_test_structs, align 8 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = call i32 %7(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) -// CHECK-NEXT: ret i32 %8 -// CHECK-NEXT: } +// Check the C aggregate ABI boundary: all five differently sized structs are +// passed by pointer through one generated C wrapper. + +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [19 x i8] c"test_structs failed", align 1{{$}} -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %1 = getelementptr inbounds %main._Ctype_struct___3, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i32 1, ptr %1, align 4 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds %main._Ctype_struct___4, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = getelementptr inbounds %main._Ctype_struct___4, ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i32 1, ptr %3, align 4 -// CHECK-NEXT: store i32 2, ptr %4, align 4 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) -// CHECK-NEXT: %6 = getelementptr inbounds %main._Ctype_struct___0, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = getelementptr inbounds %main._Ctype_struct___0, ptr %5, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %main._Ctype_struct___0, ptr %5, i32 0, i32 2 -// CHECK-NEXT: store i32 1, ptr %6, align 4 -// CHECK-NEXT: store i32 2, ptr %7, align 4 -// CHECK-NEXT: store i32 3, ptr %8, align 4 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %10 = getelementptr inbounds %main._Ctype_struct___1, ptr %9, i32 0, i32 0 -// CHECK-NEXT: %11 = getelementptr inbounds %main._Ctype_struct___1, ptr %9, i32 0, i32 1 -// CHECK-NEXT: %12 = getelementptr inbounds %main._Ctype_struct___1, ptr %9, i32 0, i32 2 -// CHECK-NEXT: %13 = getelementptr inbounds %main._Ctype_struct___1, ptr %9, i32 0, i32 3 -// CHECK-NEXT: store i32 1, ptr %10, align 4 -// CHECK-NEXT: store i32 2, ptr %11, align 4 -// CHECK-NEXT: store i32 3, ptr %12, align 4 -// CHECK-NEXT: store i32 4, ptr %13, align 4 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20) -// CHECK-NEXT: %15 = getelementptr inbounds %main._Ctype_struct___2, ptr %14, i32 0, i32 0 -// CHECK-NEXT: %16 = getelementptr inbounds %main._Ctype_struct___2, ptr %14, i32 0, i32 1 -// CHECK-NEXT: %17 = getelementptr inbounds %main._Ctype_struct___2, ptr %14, i32 0, i32 2 -// CHECK-NEXT: %18 = getelementptr inbounds %main._Ctype_struct___2, ptr %14, i32 0, i32 3 -// CHECK-NEXT: %19 = getelementptr inbounds %main._Ctype_struct___2, ptr %14, i32 0, i32 4 -// CHECK-NEXT: store i32 1, ptr %15, align 4 -// CHECK-NEXT: store i32 2, ptr %16, align 4 -// CHECK-NEXT: store i32 3, ptr %17, align 4 -// CHECK-NEXT: store i32 4, ptr %18, align 4 -// CHECK-NEXT: store i32 5, ptr %19, align 4 -// CHECK-NEXT: %20 = call i32 @main._Cfunc_test_structs(ptr %0, ptr %2, ptr %5, ptr %9, ptr %14) func main() { r := C.test_structs(&C.s4{a: 1}, &C.s8{a: 1, b: 2}, &C.s12{a: 1, b: 2, c: 3}, &C.s16{a: 1, b: 2, c: 3, d: 4}, &C.s20{a: 1, b: 2, c: 3, d: 4, e: 5}) fmt.Println(r) @@ -61,3 +21,141 @@ func main() { panic("test_structs failed") } } + +// CHECK-LABEL: define i32 @main._Cfunc_test_structs( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]], ptr %[[TMP3:[0-9]+]], ptr %[[TMP4:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP5:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_structs, align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load ptr, ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = call i32 %[[TMP7]](ptr %[[TMP0]], ptr %[[TMP1]], ptr %[[TMP2]], ptr %[[TMP3]], ptr %[[TMP4]]) +// CHECK-NEXT: ret i32 %[[TMP8]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___3, ptr %[[TMP2]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP3]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___4, ptr %[[TMP4]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___4, ptr %[[TMP4]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP5]], align 4 +// DARWIN-ARM64-NEXT: store i32 2, ptr %[[TMP6]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP7]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP7]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP7]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP8]], align 4 +// DARWIN-ARM64-NEXT: store i32 2, ptr %[[TMP9]], align 4 +// DARWIN-ARM64-NEXT: store i32 3, ptr %[[TMP10]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP11]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP11]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP11]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP11]], i32 0, i32 3 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP12]], align 4 +// DARWIN-ARM64-NEXT: store i32 2, ptr %[[TMP13]], align 4 +// DARWIN-ARM64-NEXT: store i32 3, ptr %[[TMP14]], align 4 +// DARWIN-ARM64-NEXT: store i32 4, ptr %[[TMP15]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20) +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP16]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP16]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP16]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP16]], i32 0, i32 3 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP16]], i32 0, i32 4 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP17]], align 4 +// DARWIN-ARM64-NEXT: store i32 2, ptr %[[TMP18]], align 4 +// DARWIN-ARM64-NEXT: store i32 3, ptr %[[TMP19]], align 4 +// DARWIN-ARM64-NEXT: store i32 4, ptr %[[TMP20]], align 4 +// DARWIN-ARM64-NEXT: store i32 5, ptr %[[TMP21]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = call i32 @main._Cfunc_test_structs(ptr %[[TMP2]], ptr %[[TMP4]], ptr %[[TMP7]], ptr %[[TMP11]], ptr %[[TMP16]]) +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP23]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) +// DARWIN-ARM64-NEXT: store i32 %[[TMP22]], ptr %[[TMP25]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main._Ctype_int, ptr undef }, ptr %[[TMP25]], 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP26]], ptr %[[TMP24]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP23]], 0 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP27]], i64 1, 1 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP28]], i64 1, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP29]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: call void @fmt.Println(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP1]], ptr %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = icmp ne i32 %[[TMP22]], 35 +// DARWIN-ARM64-NEXT: br i1 %[[TMP31]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___3, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP4]], align 4 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___4, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___4, ptr %[[TMP5]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP6]], align 4 +// LINUX-AMD64-NEXT: store i32 2, ptr %[[TMP7]], align 4 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___0, ptr %[[TMP8]], i32 0, i32 2 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP9]], align 4 +// LINUX-AMD64-NEXT: store i32 2, ptr %[[TMP10]], align 4 +// LINUX-AMD64-NEXT: store i32 3, ptr %[[TMP11]], align 4 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP12]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___1, ptr %[[TMP12]], i32 0, i32 3 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP13]], align 4 +// LINUX-AMD64-NEXT: store i32 2, ptr %[[TMP14]], align 4 +// LINUX-AMD64-NEXT: store i32 3, ptr %[[TMP15]], align 4 +// LINUX-AMD64-NEXT: store i32 4, ptr %[[TMP16]], align 4 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20) +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP17]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP17]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP17]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP17]], i32 0, i32 3 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %main._Ctype_struct___2, ptr %[[TMP17]], i32 0, i32 4 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP18]], align 4 +// LINUX-AMD64-NEXT: store i32 2, ptr %[[TMP19]], align 4 +// LINUX-AMD64-NEXT: store i32 3, ptr %[[TMP20]], align 4 +// LINUX-AMD64-NEXT: store i32 4, ptr %[[TMP21]], align 4 +// LINUX-AMD64-NEXT: store i32 5, ptr %[[TMP22]], align 4 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = call i32 @main._Cfunc_test_structs(ptr %[[TMP3]], ptr %[[TMP5]], ptr %[[TMP8]], ptr %[[TMP12]], ptr %[[TMP17]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP24]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) +// LINUX-AMD64-NEXT: store i32 %[[TMP23]], ptr %[[TMP26]], align 4 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main._Ctype_int, ptr undef }, ptr %[[TMP26]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP27]], ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP24]], 0 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP28]], i64 1, 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP29]], i64 1, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP30]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: call void @fmt.Println(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP2]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = icmp ne i32 %[[TMP23]], 35 +// LINUX-AMD64-NEXT: br i1 %[[TMP32]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 19 }, ptr %[[TMP32]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP32]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP33]]) +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 19 }, ptr %[[TMP33]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP33]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP34]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = load ptr, ptr %[[TMP35]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = load ptr, ptr %[[TMP37]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP36]], ptr %[[TMP38]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testgo/cgodefer/cgodefer.go b/cl/_testgo/cgodefer/cgodefer.go index 1a4aeb3c8d..e6682f2a27 100644 --- a/cl/_testgo/cgodefer/cgodefer.go +++ b/cl/_testgo/cgodefer/cgodefer.go @@ -6,156 +6,25 @@ package main */ import "C" +// CHECK-LABEL: define {{.*}} @main._Cfunc_free(ptr %0){{.*}} { +// CHECK: [[FREE_SLOT:%[0-9]+]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_free +// CHECK-NEXT: [[FREE_FN:%[0-9]+]] = load ptr, ptr [[FREE_SLOT]] +// CHECK-NEXT: [[FREE_RESULT:%[0-9]+]] = call [0 x i8] [[FREE_FN]](ptr %0) +// CHECK-NEXT: ret [0 x i8] [[FREE_RESULT]] +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call ptr @malloc(i64 1024) +// CHECK: call ptr @"{{.*}}GetThreadDefer"() +// CHECK: call void @"{{.*}}FreeDeferNode" +// CHECK-LABEL: define void @"main.main$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[DEFER_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK: [[DEFER_KEEPALIVE_SLOT:%[0-9]+]] = extractvalue { ptr } [[DEFER_ENV]], 0 +// CHECK-NEXT: [[DEFER_KEEPALIVE:%[0-9]+]] = load ptr, ptr [[DEFER_KEEPALIVE_SLOT]] +// CHECK-NEXT: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr [[DEFER_KEEPALIVE]], 1 +// CHECK-NEXT: [[DEFER_ARG_SLOT:%[0-9]+]] = extractvalue { ptr } [[DEFER_ENV]], 0 +// CHECK-NEXT: [[DEFER_ARG:%[0-9]+]] = load ptr, ptr [[DEFER_ARG_SLOT]] +// CHECK-NEXT: call [0 x i8] @main._Cfunc_free(ptr [[DEFER_ARG]]) + func main() { p := C.malloc(1024) defer C.free(p) } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_free(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_free, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0) -// CHECK-NEXT: ret [0 x i8] %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cgo_ptr(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret ptr %0 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_free, ptr @main._cgo_{{.*}}_Cfunc_free, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc__Cmalloc, ptr @main._cgo_{{.*}}_Cfunc__Cmalloc, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @malloc(i64 1024) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: %7 = call { ptr, ptr } %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %9 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 0 -// CHECK-NEXT: store ptr %9, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %12, align 8 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 2 -// CHECK-NEXT: store ptr %8, ptr %13, align 8 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_2), ptr %14, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %10) -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 1 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 3 -// CHECK-NEXT: %17 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 4 -// CHECK-NEXT: %18 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %18, align 8 -// CHECK-NEXT: %19 = call i32 @{{(__)?}}sigsetjmp(ptr %9, i32 0) -// CHECK-NEXT: %20 = icmp eq i32 %19, 0 -// CHECK-NEXT: br i1 %20, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %16, align 8 -// CHECK-NEXT: %21 = load i64, ptr %15, align 8 -// CHECK-NEXT: %22 = load ptr, ptr %18, align 8 -// CHECK-NEXT: %23 = icmp ne ptr %22, null -// CHECK-NEXT: br i1 %23, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %8) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %24 = load ptr, ptr %18, align 8 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 0 -// CHECK-NEXT: store ptr %24, ptr %26, align 8 -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %27, align 8 -// CHECK-NEXT: %28 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %25, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %7, ptr %28, align 8 -// CHECK-NEXT: store ptr %25, ptr %18, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %17, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %17, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %16, align 8 -// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %30 = load ptr, ptr %18, align 8 -// CHECK-NEXT: %31 = load { ptr, i64, { ptr, ptr } }, ptr %30, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, { ptr, ptr } } %31, 0 -// CHECK-NEXT: store ptr %32, ptr %18, align 8 -// CHECK-NEXT: %33 = extractvalue { ptr, i64, { ptr, ptr } } %31, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %30) -// CHECK-NEXT: %34 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %35 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %34) -// CHECK-NEXT: %36 = extractvalue { ptr, ptr } %33, 1 -// CHECK-NEXT: %37 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %37) -// CHECK-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %35) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %38 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %10, align 8 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %38, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %39) -// CHECK-NEXT: %40 = load ptr, ptr %17, align 8 -// CHECK-NEXT: indirectbr ptr %40, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define { ptr, ptr } @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: store ptr %4, ptr %1, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %6 = getelementptr inbounds { ptr }, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr %5, 1 -// CHECK-NEXT: ret { ptr, ptr } %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = call [0 x i8] @main._Cfunc_free(ptr %6) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/cgofull/cgofull.go b/cl/_testgo/cgofull/cgofull.go index 91818705da..f174cfbacc 100644 --- a/cl/_testgo/cgofull/cgofull.go +++ b/cl/_testgo/cgofull/cgofull.go @@ -111,15 +111,112 @@ import ( "github.com/goplus/llgo/cl/_testgo/cgofull/pymod2" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [18 x i8] c"failed to run code", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"test_structs failed", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"1.0.0", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [17 x i8] c"call run_callback", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [21 x i8] c"call with go_callback", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [20 x i8] c"call with c_callback", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [23 x i8] c"print('Hello, Python!')", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [26 x i8] c"C2func test_structs failed", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"c2func ok", align 1{{$}} +// This is the broad CGo integration case. Check each boundary kind once: +// C2func errno result, exported Go callbacks, plain C wrappers, and macros. +// CHECK-LABEL: define { i32, %"{{.*}}iface" } @main._C2func_test_structs(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4){{.*}} { +// CHECK: [[C2_SLOT:%.*]] = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_C2func_test_structs +// CHECK: [[C2_FN:%.*]] = load ptr, ptr [[C2_SLOT]] +// CHECK: [[C2_RESULT:%.*]] = call i32 [[C2_FN]](ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) +// CHECK: [[C2_ERRNO:%.*]] = call i32 @cliteErrno() +// CHECK: [[C2_HAS_ERR:%.*]] = icmp ne i32 [[C2_ERRNO]], 0 +// CHECK: [[C2_ERRNO64:%.*]] = sext i32 [[C2_ERRNO]] to i64 +// CHECK: store i64 [[C2_ERRNO64]], ptr %{{.*}} +// CHECK: call ptr @"github.com/goplus/llgo/runtime/internal/runtime.NewItab"(ptr {{.*}}, ptr @_llgo_syscall.Errno) +// CHECK: br i1 [[C2_HAS_ERR]], label %{{.*}}, label %{{.*}} +// CHECK: insertvalue { i32, %"{{.*}}iface" } undef, i32 [[C2_RESULT]], 0 +// CHECK: insertvalue { i32, %"{{.*}}iface" } undef, i32 [[C2_RESULT]], 0 + +// CHECK-LABEL: define ptr @main._Cgo_ptr(ptr %0){{.*}} { +// CHECK-NEXT: _llgo_0: +// CHECK-NEXT: ret ptr %0 + +// CHECK-LABEL: define i32 @go_callback(i32 %0){{.*}} { +// CHECK: [[GO_CTX:%.*]] = alloca %"{{.*}}LocalContext" +// CHECK: [[GO_TOKEN:%.*]] = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.EnterLocalContext"(ptr [[GO_CTX]]) +// CHECK: [[GO_RESULT:%.*]] = add i32 %0, 1 +// CHECK: call void @"github.com/goplus/llgo/runtime/internal/runtime.LeaveLocalContext"(ptr [[GO_CTX]], i64 [[GO_TOKEN]]) +// CHECK: ret i32 [[GO_RESULT]] + +// CHECK-LABEL: define i32 @go_callback_not_use_in_go(i32 %0){{.*}} { +// CHECK: [[UNUSED_CTX:%.*]] = alloca %"{{.*}}LocalContext" +// CHECK: [[UNUSED_TOKEN:%.*]] = call i64 @"github.com/goplus/llgo/runtime/internal/runtime.EnterLocalContext"(ptr [[UNUSED_CTX]]) +// CHECK: [[UNUSED_RESULT:%.*]] = add i32 %0, 1 +// CHECK: call void @"github.com/goplus/llgo/runtime/internal/runtime.LeaveLocalContext"(ptr [[UNUSED_CTX]], i64 [[UNUSED_TOKEN]]) +// CHECK: ret i32 [[UNUSED_RESULT]] + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.runPy() +// CHECK: call void @main.triggerC2func() +// CHECK: [[FOO:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) +// CHECK: [[FOO_A:%.*]] = getelementptr inbounds %{{.*}}, ptr [[FOO]], i32 0, i32 0 +// CHECK: store i32 1, ptr [[FOO_A]] +// CHECK: call void @main.Foo(ptr [[FOO]]) +// CHECK: call void @main.Bar(ptr [[FOO]]) +// CHECK: call [0 x i8] @main._Cfunc_test_macros() +// CHECK: [[MAIN_S4:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) +// CHECK: store i32 1, ptr %{{.*}} +// CHECK: [[MAIN_S8:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: store i32 2, ptr %{{.*}} +// CHECK: [[MAIN_S12:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 12) +// CHECK: store i32 3, ptr %{{.*}} +// CHECK: [[MAIN_S16:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: store i32 4, ptr %{{.*}} +// CHECK: [[MAIN_S20:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 20) +// CHECK: store i32 5, ptr %{{.*}} +// CHECK: [[MAIN_RESULT:%.*]] = call i32 @main._Cfunc_test_structs(ptr [[MAIN_S4]], ptr [[MAIN_S8]], ptr [[MAIN_S12]], ptr [[MAIN_S16]], ptr [[MAIN_S20]]) +// CHECK: store i32 [[MAIN_RESULT]], ptr %{{.*}} +// CHECK: [[MAIN_BAD:%.*]] = icmp ne i32 [[MAIN_RESULT]], 35 +// CHECK: br i1 [[MAIN_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: store %"{{.*}}String" { ptr {{.*}}, i64 5 }, ptr %{{.*}} +// CHECK: store i64 305419896, ptr %{{.*}} +// CHECK: call [0 x i8] @main._Cfunc_test_void() +// CHECK: call [0 x i8] @main._Cfunc_run_callback() +// CHECK: [[GO_CB:%.*]] = load ptr, ptr @main._Cfpvar_fp_go_callback +// CHECK: [[GO_CB_PTR:%.*]] = call ptr @main._Cgo_ptr(ptr [[GO_CB]]) +// CHECK: call [0 x i8] @main._Cfunc_test_callback(ptr [[GO_CB_PTR]]) +// CHECK: [[C_CB:%.*]] = load ptr, ptr @main._Cfpvar_fp_c_callback +// CHECK: [[C_CB_PTR:%.*]] = call ptr @main._Cgo_ptr(ptr [[C_CB]]) +// CHECK: call [0 x i8] @main._Cfunc_test_callback(ptr [[C_CB_PTR]]) + +// CHECK-LABEL: define i32 @"main.runPy$1"(){{.*}} { +// CHECK: [[FLOAT:%.*]] = call ptr @"github.com/goplus/llgo/cl/_testgo/cgofull/pymod1.Float"(double 1.230000e+00) +// CHECK: [[STDERR:%.*]] = call ptr @main._Cmacro_stderr() +// CHECK: [[FLOAT_RESULT:%.*]] = call i32 @main._Cfunc_PyObject_Print(ptr [[FLOAT]], ptr [[STDERR]], i32 0) +// CHECK: ret i32 [[FLOAT_RESULT]] + +// CHECK-LABEL: define i32 @"main.runPy$2"(){{.*}} { +// CHECK: [[LONG:%.*]] = call ptr @"github.com/goplus/llgo/cl/_testgo/cgofull/pymod2.Long"(i64 123) +// CHECK: [[LONG_STDOUT:%.*]] = call ptr @main._Cmacro_stdout() +// CHECK: [[LONG_RESULT:%.*]] = call i32 @main._Cfunc_PyObject_Print(ptr [[LONG]], ptr [[LONG_STDOUT]], i32 0) +// CHECK: ret i32 [[LONG_RESULT]] + +// CHECK-LABEL: define i32 @"main.runPy$3"(){{.*}} { +// CHECK: [[COMPLEX:%.*]] = call ptr @main._Cfunc_PyComplex_FromDoubles(double 1.230000e+00, double 4.560000e+00) +// CHECK: [[COMPLEX_STDOUT:%.*]] = call ptr @main._Cmacro_stdout() +// CHECK: [[COMPLEX_RESULT:%.*]] = call i32 @main._Cfunc_PyObject_Print(ptr [[COMPLEX]], ptr [[COMPLEX_STDOUT]], i32 0) +// CHECK: ret i32 [[COMPLEX_RESULT]] + +// CHECK-LABEL: define void @main.triggerC2func(){{.*}} { +// CHECK: [[TRIGGER_S4:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 4) +// CHECK: store i32 1, ptr %{{.*}} +// CHECK: [[TRIGGER_S8:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: store i32 2, ptr %{{.*}} +// CHECK: [[TRIGGER_S12:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 12) +// CHECK: store i32 3, ptr %{{.*}} +// CHECK: [[TRIGGER_S16:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: store i32 4, ptr %{{.*}} +// CHECK: [[TRIGGER_S20:%.*]] = call ptr @"github.com/goplus/llgo/runtime/internal/runtime.AllocZ"(i64 20) +// CHECK: store i32 5, ptr %{{.*}} +// CHECK: [[TRIGGER_PAIR:%.*]] = call { i32, %"{{.*}}iface" } @main._C2func_test_structs(ptr [[TRIGGER_S4]], ptr [[TRIGGER_S8]], ptr [[TRIGGER_S12]], ptr [[TRIGGER_S16]], ptr [[TRIGGER_S20]]) +// CHECK: [[TRIGGER_RESULT:%.*]] = extractvalue { i32, %"{{.*}}iface" } [[TRIGGER_PAIR]], 0 +// CHECK: [[TRIGGER_ERR:%.*]] = extractvalue { i32, %"{{.*}}iface" } [[TRIGGER_PAIR]], 1 +// CHECK: call ptr @"github.com/goplus/llgo/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[TRIGGER_ERR]]) +// CHECK: [[ERR_IS_NIL:%.*]] = call i1 @"github.com/goplus/llgo/runtime/internal/runtime.EfaceEqual" +// CHECK: [[HAS_ERROR:%.*]] = xor i1 [[ERR_IS_NIL]], true +// CHECK: br i1 [[HAS_ERROR]], label %{{.*}}, label %{{.*}} +// CHECK: call void @"github.com/goplus/llgo/runtime/internal/runtime.Panic" +// CHECK: [[TRIGGER_BAD:%.*]] = icmp ne i32 [[TRIGGER_RESULT]], 35 +// CHECK: br i1 [[TRIGGER_BAD]], label %{{.*}}, label %{{.*}} //export go_callback_not_use_in_go func go_callback_not_use_in_go(i C.int) C.int { @@ -183,539 +280,3 @@ func runPy() { // test _Cgo_use C.PyObject_Print((*C.PyObject)(unsafe.Pointer(C.PyComplex_FromDoubles(C.double(1.23), C.double(4.56)))), C.stdout, 0) } - -// CHECK-LABEL: define void @main.Bar(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call [0 x i8] @main._Cfunc_print_foo(ptr %0) -// CHECK-NEXT: %2 = call [0 x i8] @main._Cfunc_foo(ptr %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.Finalize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call [0 x i8] @main._Cfunc_Py_Finalize() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.Foo(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call [0 x i8] @main._Cfunc_print_foo(ptr %0) -// CHECK-NEXT: %2 = call [0 x i8] @main._Cfunc_foo(ptr %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.Initialize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call [0 x i8] @main._Cfunc_Py_Initialize() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.Run(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.CString"(%"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: %2 = call i32 @main._Cfunc_PyRun_SimpleString(ptr %1) -// CHECK-NEXT: %3 = icmp ne i32 %2, 0 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call [0 x i8] @main._Cfunc_PyErr_Print() -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.iface" @fmt.Errorf(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 18 }, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } - -// CHECK-LABEL: define { i32, %"{{.*}}/runtime/internal/runtime.iface" } @main._C2func_test_structs(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %6 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_C2func_test_structs, align 8 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = call i32 %7(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) -// CHECK-NEXT: %9 = call i32 @cliteErrno() -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %10, align 8 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %10, align 8 -// CHECK-NEXT: %12 = icmp ne i32 %9, 0 -// CHECK-NEXT: %13 = sext i32 %9 to i64 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %13, ptr %14, align 8 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", ptr @_llgo_syscall.Errno) -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %15, 0 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %16, ptr %14, 1 -// CHECK-NEXT: br i1 %12, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = insertvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %8, 0 -// CHECK-NEXT: %19 = insertvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } %18, %"{{.*}}/runtime/internal/runtime.iface" %17, 1 -// CHECK-NEXT: ret { i32, %"{{.*}}/runtime/internal/runtime.iface" } %19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = insertvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %8, 0 -// CHECK-NEXT: %21 = insertvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } %20, %"{{.*}}/runtime/internal/runtime.iface" %11, 1 -// CHECK-NEXT: ret { i32, %"{{.*}}/runtime/internal/runtime.iface" } %21 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cfunc_PyComplex_FromDoubles(double %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyComplex_FromDoubles, align 8 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr %4(double %0, double %1) -// CHECK-NEXT: ret ptr %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_PyErr_Print(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyErr_Print, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyObject_Print, align 8 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = call i32 %5(ptr %0, ptr %1, i32 %2) -// CHECK-NEXT: ret i32 %6 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @main._Cfunc_PyRun_SimpleString(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyRun_SimpleString, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i32 %3(ptr %0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Finalize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Initialize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_foo(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_foo, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0) -// CHECK-NEXT: ret [0 x i8] %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_print_foo(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_print_foo, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0) -// CHECK-NEXT: ret [0 x i8] %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_run_callback(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_run_callback, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_test_callback(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_callback, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call [0 x i8] %3(ptr %0) -// CHECK-NEXT: ret [0 x i8] %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_test_macros(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_macros, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @main._Cfunc_test_structs(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %6 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_structs, align 8 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = call i32 %7(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) -// CHECK-NEXT: ret i32 %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_test_void(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_void, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cgo_ptr(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret ptr %0 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_stderr(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cmacro_stderr, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_stdout(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{[0-9a-f]+}}_Cmacro_stdout, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @go_callback(i32 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = add i32 %0, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret i32 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @go_callback_not_use_in_go(i32 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = add i32 %0, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret i32 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/cgofull/pymod1.init"() -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/cgofull/pymod2.init"() -// CHECK-NEXT: store ptr @main.__cgo_c_callback, ptr @main._Cfpvar_fp_c_callback, align 8 -// CHECK-NEXT: store ptr @main.__cgo_go_callback, ptr @main._Cfpvar_fp_go_callback, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_C2func_test_structs, ptr @main._cgo_{{[0-9a-f]+}}_C2func_test_structs, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_PyComplex_FromDoubles, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyComplex_FromDoubles, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_PyErr_Print, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyErr_Print, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_PyObject_Print, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyObject_Print, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_PyRun_SimpleString, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_PyRun_SimpleString, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_Py_Finalize, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_Py_Initialize, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_foo, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_foo, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_print_foo, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_print_foo, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_run_callback, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_run_callback, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cmacro_stderr, ptr @main._cgo_{{[0-9a-f]+}}_Cmacro_stderr, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cmacro_stdout, ptr @main._cgo_{{[0-9a-f]+}}_Cmacro_stdout, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_test_callback, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_callback, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_test_macros, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_macros, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_test_structs, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_structs, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc_test_void, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc_test_void, align 8 -// CHECK-NEXT: store ptr @_cgo_{{[0-9a-f]+}}_Cfunc__Cmalloc, ptr @main._cgo_{{[0-9a-f]+}}_Cfunc__Cmalloc, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.runPy() -// CHECK-NEXT: call void @main.triggerC2func() -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %1 = getelementptr inbounds %main._Ctype_struct___0, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i32 1, ptr %1, align 4 -// CHECK-NEXT: call void @main.Foo(ptr %0) -// CHECK-NEXT: call void @main.Bar(ptr %0) -// CHECK-NEXT: %2 = call [0 x i8] @main._Cfunc_test_macros() -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4 = getelementptr inbounds %main._Ctype_struct___12, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store i32 1, ptr %4, align 4 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %6 = getelementptr inbounds %main._Ctype_struct___13, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = getelementptr inbounds %main._Ctype_struct___13, ptr %5, i32 0, i32 1 -// CHECK-NEXT: store i32 1, ptr %6, align 4 -// CHECK-NEXT: store i32 2, ptr %7, align 4 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) -// CHECK-NEXT: %9 = getelementptr inbounds %main._Ctype_struct___9, ptr %8, i32 0, i32 0 -// CHECK-NEXT: %10 = getelementptr inbounds %main._Ctype_struct___9, ptr %8, i32 0, i32 1 -// CHECK-NEXT: %11 = getelementptr inbounds %main._Ctype_struct___9, ptr %8, i32 0, i32 2 -// CHECK-NEXT: store i32 1, ptr %9, align 4 -// CHECK-NEXT: store i32 2, ptr %10, align 4 -// CHECK-NEXT: store i32 3, ptr %11, align 4 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds %main._Ctype_struct___10, ptr %12, i32 0, i32 0 -// CHECK-NEXT: %14 = getelementptr inbounds %main._Ctype_struct___10, ptr %12, i32 0, i32 1 -// CHECK-NEXT: %15 = getelementptr inbounds %main._Ctype_struct___10, ptr %12, i32 0, i32 2 -// CHECK-NEXT: %16 = getelementptr inbounds %main._Ctype_struct___10, ptr %12, i32 0, i32 3 -// CHECK-NEXT: store i32 1, ptr %13, align 4 -// CHECK-NEXT: store i32 2, ptr %14, align 4 -// CHECK-NEXT: store i32 3, ptr %15, align 4 -// CHECK-NEXT: store i32 4, ptr %16, align 4 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20) -// CHECK-NEXT: %18 = getelementptr inbounds %main._Ctype_struct___11, ptr %17, i32 0, i32 0 -// CHECK-NEXT: %19 = getelementptr inbounds %main._Ctype_struct___11, ptr %17, i32 0, i32 1 -// CHECK-NEXT: %20 = getelementptr inbounds %main._Ctype_struct___11, ptr %17, i32 0, i32 2 -// CHECK-NEXT: %21 = getelementptr inbounds %main._Ctype_struct___11, ptr %17, i32 0, i32 3 -// CHECK-NEXT: %22 = getelementptr inbounds %main._Ctype_struct___11, ptr %17, i32 0, i32 4 -// CHECK-NEXT: store i32 1, ptr %18, align 4 -// CHECK-NEXT: store i32 2, ptr %19, align 4 -// CHECK-NEXT: store i32 3, ptr %20, align 4 -// CHECK-NEXT: store i32 4, ptr %21, align 4 -// CHECK-NEXT: store i32 5, ptr %22, align 4 -// CHECK-NEXT: %23 = call i32 @main._Cfunc_test_structs(ptr %3, ptr %5, ptr %8, ptr %12, ptr %17) -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %25 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %24, i64 0 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 %23, ptr %26, align 4 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main._Ctype_int, ptr undef }, ptr %26, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %27, ptr %25, align 8 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %24, 0 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %28, i64 1, 1 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %29, i64 1, 2 -// CHECK-NEXT: %31 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %30) -// CHECK-NEXT: %32 = icmp ne i32 %23, 35 -// CHECK-NEXT: br i1 %32, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }, ptr %33, align 8 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %33, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %34) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %36 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %35, i64 0 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %37, align 8 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %38, ptr %36, align 8 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %35, 0 -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %39, i64 1, 1 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %40, i64 1, 2 -// CHECK-NEXT: %42 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %41) -// CHECK-NEXT: %43 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %44 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %43, i64 0 -// CHECK-NEXT: %45 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 305419896, ptr %45, align 8 -// CHECK-NEXT: %46 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %45, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %46, ptr %44, align 8 -// CHECK-NEXT: %47 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %43, 0 -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %47, i64 1, 1 -// CHECK-NEXT: %49 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %48, i64 1, 2 -// CHECK-NEXT: %50 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %49) -// CHECK-NEXT: %51 = call [0 x i8] @main._Cfunc_test_void() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 17 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %52 = call [0 x i8] @main._Cfunc_run_callback() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 21 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %53 = load ptr, ptr @main._Cfpvar_fp_go_callback, align 8 -// CHECK-NEXT: %54 = call ptr @main._Cgo_ptr(ptr %53) -// CHECK-NEXT: %55 = call [0 x i8] @main._Cfunc_test_callback(ptr %54) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 20 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %56 = load ptr, ptr @main._Cfpvar_fp_c_callback, align 8 -// CHECK-NEXT: %57 = call ptr @main._Cgo_ptr(ptr %56) -// CHECK-NEXT: %58 = call [0 x i8] @main._Cfunc_test_callback(ptr %57) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.runPy(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.Initialize() -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.runPy, %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.runPy, %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: call void @main.Finalize() -// CHECK-NEXT: %14 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %14, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %15) -// CHECK-NEXT: %16 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %16, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.iface" @main.Run(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 23 }) -// CHECK-NEXT: %18 = call i32 @"main.runPy$1"() -// CHECK-NEXT: %19 = call i32 @"main.runPy$2"() -// CHECK-NEXT: %20 = call i32 @"main.runPy$3"() -// CHECK-NEXT: store ptr blockaddress(@main.runPy, %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.runPy, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %21 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %21, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.runPy$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/cl/_testgo/cgofull/pymod1.Float"(double 1.230000e+00) -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stderr() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct_{{(__sFILE|_IO_FILE)}}", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.runPy$2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/cl/_testgo/cgofull/pymod2.Long"(i64 123) -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct_{{(__sFILE|_IO_FILE)}}", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.runPy$3"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cfunc_PyComplex_FromDoubles(double 1.230000e+00, double 4.560000e+00) -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct_{{(__sFILE|_IO_FILE)}}", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.triggerC2func(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %1 = getelementptr inbounds %main._Ctype_struct___12, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i32 1, ptr %1, align 4 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds %main._Ctype_struct___13, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = getelementptr inbounds %main._Ctype_struct___13, ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i32 1, ptr %3, align 4 -// CHECK-NEXT: store i32 2, ptr %4, align 4 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) -// CHECK-NEXT: %6 = getelementptr inbounds %main._Ctype_struct___9, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = getelementptr inbounds %main._Ctype_struct___9, ptr %5, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %main._Ctype_struct___9, ptr %5, i32 0, i32 2 -// CHECK-NEXT: store i32 1, ptr %6, align 4 -// CHECK-NEXT: store i32 2, ptr %7, align 4 -// CHECK-NEXT: store i32 3, ptr %8, align 4 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %10 = getelementptr inbounds %main._Ctype_struct___10, ptr %9, i32 0, i32 0 -// CHECK-NEXT: %11 = getelementptr inbounds %main._Ctype_struct___10, ptr %9, i32 0, i32 1 -// CHECK-NEXT: %12 = getelementptr inbounds %main._Ctype_struct___10, ptr %9, i32 0, i32 2 -// CHECK-NEXT: %13 = getelementptr inbounds %main._Ctype_struct___10, ptr %9, i32 0, i32 3 -// CHECK-NEXT: store i32 1, ptr %10, align 4 -// CHECK-NEXT: store i32 2, ptr %11, align 4 -// CHECK-NEXT: store i32 3, ptr %12, align 4 -// CHECK-NEXT: store i32 4, ptr %13, align 4 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 20) -// CHECK-NEXT: %15 = getelementptr inbounds %main._Ctype_struct___11, ptr %14, i32 0, i32 0 -// CHECK-NEXT: %16 = getelementptr inbounds %main._Ctype_struct___11, ptr %14, i32 0, i32 1 -// CHECK-NEXT: %17 = getelementptr inbounds %main._Ctype_struct___11, ptr %14, i32 0, i32 2 -// CHECK-NEXT: %18 = getelementptr inbounds %main._Ctype_struct___11, ptr %14, i32 0, i32 3 -// CHECK-NEXT: %19 = getelementptr inbounds %main._Ctype_struct___11, ptr %14, i32 0, i32 4 -// CHECK-NEXT: store i32 1, ptr %15, align 4 -// CHECK-NEXT: store i32 2, ptr %16, align 4 -// CHECK-NEXT: store i32 3, ptr %17, align 4 -// CHECK-NEXT: store i32 4, ptr %18, align 4 -// CHECK-NEXT: store i32 5, ptr %19, align 4 -// CHECK-NEXT: %20 = call { i32, %"{{.*}}/runtime/internal/runtime.iface" } @main._C2func_test_structs(ptr %0, ptr %2, ptr %5, ptr %9, ptr %14) -// CHECK-NEXT: %21 = extractvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } %20, 0 -// CHECK-NEXT: %22 = extractvalue { i32, %"{{.*}}/runtime/internal/runtime.iface" } %20, 1 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %22) -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %22, 1 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %23, 0 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %25, ptr %24, 1 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %27, 0 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %28, ptr null, 1 -// CHECK-NEXT: %30 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %26, %"{{.*}}/runtime/internal/runtime.eface" %29) -// CHECK-NEXT: %31 = xor i1 %30, true -// CHECK-NEXT: br i1 %31, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %22) -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %22, 1 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %32, 0 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %34, ptr %33, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %35) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %36 = icmp ne i32 %21, 35 -// CHECK-NEXT: br i1 %36, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 26 }, ptr %37, align 8 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %38) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %40 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %39, i64 0 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }, ptr %41, align 8 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %41, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %42, ptr %40, align 8 -// CHECK-NEXT: %43 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %39, 0 -// CHECK-NEXT: %44 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %43, i64 1, 1 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %44, i64 1, 2 -// CHECK-NEXT: %46 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %45) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/cgomacro/cgomacro.go b/cl/_testgo/cgomacro/cgomacro.go index c2c152d37d..2322bc8475 100644 --- a/cl/_testgo/cgomacro/cgomacro.go +++ b/cl/_testgo/cgomacro/cgomacro.go @@ -18,164 +18,21 @@ import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_PyObject_Print, align 8 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = call i32 %5(ptr %0, ptr %1, i32 %2) -// CHECK-NEXT: ret i32 %6 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Finalize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Initialize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @main._Cfunc_fputs(ptr %0, ptr %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_fputs, align 8 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call i32 %4(ptr %0, ptr %1) -// CHECK-NEXT: ret i32 %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define [0 x i8] @main._Cfunc_test_stdout(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_test_stdout, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_Py_False(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{.*}}_Cmacro_Py_False, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_Py_None(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{.*}}_Cmacro_Py_None, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_Py_True(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{.*}}_Cmacro_Py_True, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main._Cmacro_stdout(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = load ptr, ptr @main._cgo_{{.*}}_Cmacro_stdout, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: ret ptr %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_PyObject_Print, ptr @main._cgo_{{.*}}_Cfunc_PyObject_Print, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cmacro_Py_False, ptr @main._cgo_{{.*}}_Cmacro_Py_False, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_Py_Finalize, ptr @main._cgo_{{.*}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_Py_Initialize, ptr @main._cgo_{{.*}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cmacro_Py_None, ptr @main._cgo_{{.*}}_Cmacro_Py_None, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cmacro_Py_True, ptr @main._cgo_{{.*}}_Cmacro_Py_True, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_fputs, ptr @main._cgo_{{.*}}_Cfunc_fputs, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cmacro_stdout, ptr @main._cgo_{{.*}}_Cmacro_stdout, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_test_stdout, ptr @main._cgo_{{.*}}_Cfunc_test_stdout, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// C object-like macros are emitted as getters and then passed through the +// ordinary generated C wrappers. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call [0 x i8] @main._Cfunc_test_stdout() -// CHECK-NEXT: %1 = call i32 @"main.main$1"() -// CHECK-NEXT: %2 = call [0 x i8] @main._Cfunc_Py_Initialize() -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %4 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 0 -// CHECK-NEXT: store ptr %4, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 2 -// CHECK-NEXT: store ptr %3, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_2), ptr %9, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %5) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 4 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %13, align 8 -// CHECK-NEXT: %14 = call i32 @{{.*}}sigsetjmp(ptr %4, i32 0) -// CHECK-NEXT: %15 = icmp eq i32 %14, 0 -// CHECK-NEXT: br i1 %15, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %11, align 8 -// CHECK-NEXT: %16 = load i64, ptr %10, align 8 -// CHECK-NEXT: %17 = call [0 x i8] @main._Cfunc_Py_Finalize() -// CHECK-NEXT: %18 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, align 8 -// CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %18, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %19) -// CHECK-NEXT: %20 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %20, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %3) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %21 = call i32 @"main.main$2"() -// CHECK-NEXT: %22 = call i32 @"main.main$3"() -// CHECK-NEXT: %23 = call i32 @"main.main$4"() -// CHECK-NEXT: %24 = call i32 @"main.main$5"() -// CHECK-NEXT: %25 = call i32 @"main.main$6"() -// CHECK-NEXT: %26 = call i32 @"main.main$7"() -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %12, align 8 -// CHECK-NEXT: %27 = load ptr, ptr %11, align 8 -// CHECK-NEXT: indirectbr ptr %27, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call {{.*}} @main._Cfunc_test_stdout() +// CHECK: call {{.*}} @main._Cfunc_Py_Initialize() +// CHECK: call {{.*}} @main._Cfunc_Py_Finalize() +// CHECK-LABEL: define i32 @"main.main$2"(){{.*}} { +// CHECK: call ptr @main._Cmacro_Py_True() +// CHECK: call ptr @main._Cmacro_stdout() +// CHECK: call i32 @main._Cfunc_PyObject_Print +// CHECK-LABEL: define i32 @"main.main$4"(){{.*}} { +// CHECK: call ptr @main._Cmacro_Py_False() +// CHECK-LABEL: define i32 @"main.main$6"(){{.*}} { +// CHECK: call ptr @main._Cmacro_Py_None() + func main() { C.test_stdout() C.fputs((*C.char)(unsafe.Pointer(c.Str("hello\n"))), C.stdout) @@ -188,65 +45,3 @@ func main() { C.PyObject_Print(C.Py_None, C.stdout, 0) C.fputs((*C.char)(unsafe.Pointer(c.Str("\n"))), C.stdout) } - -// CHECK-LABEL: define i32 @"main.main$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call i32 @main._Cfunc_fputs(ptr @0, ptr %0) -// CHECK-NEXT: ret i32 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_Py_True() -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$3"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call i32 @main._Cfunc_fputs(ptr @{{.*}}, ptr %0) -// CHECK-NEXT: ret i32 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$4"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_Py_False() -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$5"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call i32 @main._Cfunc_fputs(ptr @{{.*}}, ptr %0) -// CHECK-NEXT: ret i32 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$6"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_Py_None() -// CHECK-NEXT: %1 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__object", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call i32 @main._Cfunc_PyObject_Print(ptr %0, ptr %1, i32 0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.main$7"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main._Cmacro_stdout() -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main._Ctype_struct__{{.*}}FILE", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call i32 @main._Cfunc_fputs(ptr @{{.*}}, ptr %0) -// CHECK-NEXT: ret i32 %2 -// CHECK-NEXT: } diff --git a/cl/_testgo/cgopython/cgopython.go b/cl/_testgo/cgopython/cgopython.go index aea2a0f615..4470699035 100644 --- a/cl/_testgo/cgopython/cgopython.go +++ b/cl/_testgo/cgopython/cgopython.go @@ -7,104 +7,45 @@ package main */ import "C" +// The wrappers must call the C entry points installed in their cgo slots. // CHECK-LABEL: define i32 @main._Cfunc_PyRun_SimpleString(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %2 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_PyRun_SimpleString, align 8 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i32 %3(ptr %0) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - +// CHECK: [[RUN_SLOT:%[0-9]+]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_PyRun_SimpleString +// CHECK-NEXT: [[RUN_TARGET:%[0-9]+]] = load ptr, ptr [[RUN_SLOT]] +// CHECK-NEXT: [[RUN_RESULT:%[0-9]+]] = call i32 [[RUN_TARGET]](ptr %0) +// CHECK-NEXT: ret i32 [[RUN_RESULT]] // CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Finalize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - +// CHECK: [[FINALIZE_SLOT:%[0-9]+]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Finalize +// CHECK-NEXT: [[FINALIZE_TARGET:%[0-9]+]] = load ptr, ptr [[FINALIZE_SLOT]] +// CHECK-NEXT: [[FINALIZE_RESULT:%[0-9]+]] = call [0 x i8] [[FINALIZE_TARGET]]() +// CHECK-NEXT: ret [0 x i8] [[FINALIZE_RESULT]] // CHECK-LABEL: define [0 x i8] @main._Cfunc_Py_Initialize(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: %1 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %2 = call [0 x i8] %1() -// CHECK-NEXT: ret [0 x i8] %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_PyRun_SimpleString, ptr @main._cgo_{{.*}}_Cfunc_PyRun_SimpleString, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_Py_Finalize, ptr @main._cgo_{{.*}}_Cfunc_Py_Finalize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc_Py_Initialize, ptr @main._cgo_{{.*}}_Cfunc_Py_Initialize, align 8 -// CHECK-NEXT: store ptr @_cgo_{{.*}}_Cfunc__Cmalloc, ptr @main._cgo_{{.*}}_Cfunc__Cmalloc, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[INIT_SLOT:%[0-9]+]] = load ptr, ptr @main._cgo_{{.*}}_Cfunc_Py_Initialize +// CHECK-NEXT: [[INIT_TARGET:%[0-9]+]] = load ptr, ptr [[INIT_SLOT]] +// CHECK-NEXT: [[INIT_RESULT:%[0-9]+]] = call [0 x i8] [[INIT_TARGET]]() +// CHECK-NEXT: ret [0 x i8] [[INIT_RESULT]] +// main must register Finalize as a real defer before running Python, execute it +// on both normal and panic paths, restore the previous defer chain, and rethrow. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call [0 x i8] @main._Cfunc_Py_Initialize() -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %2 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 2 -// CHECK-NEXT: store ptr %1, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_2), ptr %7, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %3) -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 4 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %11, align 8 -// CHECK-NEXT: %12 = call i32 @{{.*}}sigsetjmp(ptr %2, i32 0) -// CHECK-NEXT: %13 = icmp eq i32 %12, 0 -// CHECK-NEXT: br i1 %13, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %14 = load i64, ptr %8, align 8 -// CHECK-NEXT: %15 = call [0 x i8] @main._Cfunc_Py_Finalize() -// CHECK-NEXT: %16 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, align 8 -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %16, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %17) -// CHECK-NEXT: %18 = load ptr, ptr %10, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %1) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.CString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 23 }) -// CHECK-NEXT: %20 = call i32 @main._Cfunc_PyRun_SimpleString(ptr %19) -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %10, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %10, align 8 -// CHECK-NEXT: %21 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %21, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call [0 x i8] @main._Cfunc_Py_Initialize() +// CHECK-NEXT: [[OLD_DEFER:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[DEFER:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: [[DEFER_PREV:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[DEFER]], i32 0, i32 2 +// CHECK-NEXT: store ptr [[OLD_DEFER]], ptr [[DEFER_PREV]] +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[DEFER]]) +// CHECK: [[JMP_RESULT:%[0-9]+]] = call i32 @{{(__)?sigsetjmp}} +// CHECK-NEXT: [[JMP_NORMAL:%[0-9]+]] = icmp eq i32 [[JMP_RESULT]], 0 +// CHECK-NEXT: br i1 [[JMP_NORMAL]], label %{{[^,]+}}, label %{{[^ ]+}} +// CHECK: call [0 x i8] @main._Cfunc_Py_Finalize() +// CHECK: [[DEFER_VALUE:%[0-9]+]] = load %"{{.*}}Defer", ptr [[DEFER]] +// CHECK-NEXT: [[RESTORE:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[DEFER_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[RESTORE]]) +// CHECK: call void @"{{.*}}Rethrow"(ptr [[OLD_DEFER]]) +// CHECK: {{^_llgo_[0-9]+:}} +// CHECK-NEXT: [[CODE:%[0-9]+]] = call ptr @"{{.*}}CString"(%"{{.*}}String" { ptr {{.*}}, i64 23 }) +// CHECK-NEXT: call i32 @main._Cfunc_PyRun_SimpleString(ptr [[CODE]]) +// CHECK: {{^_llgo_[0-9]+:}} + func main() { C.Py_Initialize() defer C.Py_Finalize() diff --git a/cl/_testgo/chan/in.go b/cl/_testgo/chan/in.go index a930ace2ea..a33f1955ec 100644 --- a/cl/_testgo/chan/in.go +++ b/cl/_testgo/chan/in.go @@ -1,6 +1,67 @@ // LITTEST package main +// CHECK-LABEL: define void @main.main(){{.*}} { +// First channel: box/inspect one channel identity, capture its slot in the +// sender goroutine, then receive and print the transmitted value. +// CHECK: [[CH1_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[CH1:%.*]] = call ptr @"{{.*}}NewChan"(i64 8, i64 10) +// CHECK-NEXT: store ptr [[CH1]], ptr [[CH1_SLOT]] +// CHECK: [[CH1_BOX_DATA:%.*]] = load ptr, ptr [[CH1_SLOT]] +// CHECK-NEXT: [[CH1_EFACE:%.*]] = insertvalue %"{{.*}}eface" { ptr @"chan _llgo_int", ptr undef }, ptr [[CH1_BOX_DATA]], 1 +// CHECK: [[CH1_PRINT_DATA:%.*]] = load ptr, ptr [[CH1_SLOT]] +// CHECK-NEXT: [[CH1_LEN_DATA:%.*]] = load ptr, ptr [[CH1_SLOT]] +// CHECK-NEXT: [[CH1_LEN:%.*]] = call i64 @"{{.*}}ChanLen"(ptr [[CH1_LEN_DATA]]) +// CHECK: [[CH1_CAP_DATA:%.*]] = load ptr, ptr [[CH1_SLOT]] +// CHECK-NEXT: [[CH1_CAP:%.*]] = call i64 @"{{.*}}ChanCap"(ptr [[CH1_CAP_DATA]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[CH1_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[CH1_CAP]]) +// CHECK: call void @"{{.*}}PrintEface"(%"{{.*}}eface" [[CH1_EFACE]]) +// CHECK: [[SEND_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[CH1_SLOT]], ptr {{%.*}} +// CHECK: [[SEND_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr [[SEND_ENV]], 1 +// CHECK: store { ptr, ptr } [[SEND_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1", ptr {{%.*}}, i64 0) +// CHECK: [[CH1_RECV:%.*]] = load ptr, ptr [[CH1_SLOT]] +// CHECK: [[CH1_RECV_BUF:%.*]] = alloca i64 +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[CH1_RECV]], ptr [[CH1_RECV_BUF]], i64 8) +// CHECK-NEXT: [[CH1_VALUE:%.*]] = load i64, ptr [[CH1_RECV_BUF]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[CH1_VALUE]]) +// Second channel: capture it in a closer goroutine and preserve the receive ok +// bit alongside the zero value returned after close. +// CHECK: [[CH2_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[CH2:%.*]] = call ptr @"{{.*}}NewChan"(i64 8, i64 10) +// CHECK-NEXT: store ptr [[CH2]], ptr [[CH2_SLOT]] +// CHECK: [[CLOSE_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[CH2_SLOT]], ptr {{%.*}} +// CHECK: [[CLOSE_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr [[CLOSE_ENV]], 1 +// CHECK: store { ptr, ptr } [[CLOSE_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2", ptr {{%.*}}, i64 0) +// CHECK: [[CH2_RECV:%.*]] = load ptr, ptr [[CH2_SLOT]] +// CHECK: [[CH2_RECV_BUF:%.*]] = alloca i64 +// CHECK: [[CH2_OK:%.*]] = call i1 @"{{.*}}ChanRecv"(ptr [[CH2_RECV]], ptr [[CH2_RECV_BUF]], i64 8) +// CHECK-NEXT: [[CH2_VALUE:%.*]] = load i64, ptr [[CH2_RECV_BUF]] +// CHECK: [[CH2_PAIR0:%.*]] = insertvalue { i64, i1 } undef, i64 [[CH2_VALUE]], 0 +// CHECK-NEXT: [[CH2_PAIR:%.*]] = insertvalue { i64, i1 } [[CH2_PAIR0]], i1 [[CH2_OK]], 1 +// CHECK-NEXT: [[CH2_PRINT_VALUE:%.*]] = extractvalue { i64, i1 } [[CH2_PAIR]], 0 +// CHECK-NEXT: [[CH2_PRINT_OK:%.*]] = extractvalue { i64, i1 } [[CH2_PAIR]], 1 +// CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[CH2_PRINT_VALUE]]) +// CHECK: call void @"{{.*}}PrintBool"(i1 [[CH2_PRINT_OK]]) + +// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[SEND_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[SEND_SLOT:%.*]] = extractvalue { ptr } [[SEND_CAPTURE]], 0 +// CHECK-NEXT: [[SEND_CH:%.*]] = load ptr, ptr [[SEND_SLOT]] +// CHECK: [[SEND_BUF:%.*]] = alloca i64 +// CHECK: store i64 100, ptr [[SEND_BUF]] +// CHECK-NEXT: call i1 @"{{.*}}ChanSend"(ptr [[SEND_CH]], ptr [[SEND_BUF]], i64 8) + +// CHECK-LABEL: define void @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[CLOSE_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[CLOSE_SLOT:%.*]] = extractvalue { ptr } [[CLOSE_CAPTURE]], 0 +// CHECK-NEXT: [[CLOSE_CH:%.*]] = load ptr, ptr [[CLOSE_SLOT]] +// CHECK-NEXT: call void @"{{.*}}ChanClose"(ptr [[CLOSE_CH]]) + func main() { ch := make(chan int, 10) var v any = ch @@ -18,129 +79,3 @@ func main() { n2, ok := <-ch2 println(n2, ok) } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 10) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %4 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %5 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %6 = call i64 @"{{.*}}/runtime/internal/runtime.ChanLen"(ptr %5) -// CHECK-NEXT: %7 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %8 = call i64 @"{{.*}}/runtime/internal/runtime.ChanCap"(ptr %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintEface"(%"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %10 = getelementptr inbounds { ptr }, ptr %9, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %10, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %9, 1 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds { { ptr, ptr } }, ptr %12, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %11, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %12, i64 0) -// CHECK-NEXT: %14 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %15 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %16 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %16, i8 0, i64 8, i1 false) -// CHECK-NEXT: %17 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %14, ptr %16, i64 8) -// CHECK-NEXT: %18 = load i64, ptr %16, align 8 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 10) -// CHECK-NEXT: store ptr %20, ptr %19, align 8 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %22 = getelementptr inbounds { ptr }, ptr %21, i32 0, i32 0 -// CHECK-NEXT: store ptr %19, ptr %22, align 8 -// CHECK-NEXT: %23 = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr %21, 1 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %25 = getelementptr inbounds { { ptr, ptr } }, ptr %24, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %23, ptr %25, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$2", ptr %24, i64 0) -// CHECK-NEXT: %26 = load ptr, ptr %19, align 8 -// CHECK-NEXT: %27 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %28 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %28, i8 0, i64 8, i1 false) -// CHECK-NEXT: %29 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %26, ptr %28, i64 8) -// CHECK-NEXT: %30 = load i64, ptr %28, align 8 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %27) -// CHECK-NEXT: %31 = insertvalue { i64, i1 } undef, i64 %30, 0 -// CHECK-NEXT: %32 = insertvalue { i64, i1 } %31, i1 %29, 1 -// CHECK-NEXT: %33 = extractvalue { i64, i1 } %32, 0 -// CHECK-NEXT: %34 = extractvalue { i64, i1 } %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 8, i1 false) -// CHECK-NEXT: store i64 100, ptr %5, align 8 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %3, ptr %5, i64 8) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.ChanClose"(ptr %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } diff --git a/cl/_testgo/closure/in.go b/cl/_testgo/closure/in.go index ad7eabba2e..cfff6d22e1 100644 --- a/cl/_testgo/closure/in.go +++ b/cl/_testgo/closure/in.go @@ -5,38 +5,34 @@ type T func(n int) // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 16) - // CHECK: store %"{{.*}}String" { ptr @0, i64 3 }, ptr %0, align 8 - // CHECK: call ptr @"{{.*}}AllocU"(i64 8) - // CHECK: { ptr @"main.main$2", ptr undef } + // A closure without captures is represented by a direct code pointer, while + // the captured closure is called with its environment. + // CHECK: [[ENV_VALUE:%.*]] = call ptr @"{{.*}}AllocZ"(i64 16) + // CHECK: store %"{{.*}}String" { ptr @{{[0-9]+}}, i64 3 }, ptr [[ENV_VALUE]] + // CHECK: [[CLOSURE_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) + // CHECK: [[ENV_SLOT:%.*]] = getelementptr inbounds { ptr }, ptr [[CLOSURE_ENV]], i32 0, i32 0 + // CHECK: store ptr [[ENV_VALUE]], ptr [[ENV_SLOT]] + // CHECK: [[V2:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr [[CLOSURE_ENV]], 1 + // CHECK: store { ptr, ptr } [[V2]], ptr [[V2_SLOT:%.*]] + // CHECK: [[V2_VALUE:%.*]] = load %main.T, ptr [[V2_SLOT]] // CHECK: call void @"main.main$1"(i64 100) - // CHECK: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %7) - // CHECK: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %6, i64 200) - // CHECK: ret void + // CHECK: [[V2_CALL_ENV:%.*]] = extractvalue %main.T [[V2_VALUE]], 1 + // CHECK: [[V2_CALL_FN:%.*]] = extractvalue %main.T [[V2_VALUE]], 0 + // CHECK: [[V2_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[V2_CALL_FN]]) + // CHECK: call void [[V2_CODE]](ptr {{(nest|swiftself)}} [[V2_CALL_ENV]], i64 200) var env string = "env" var v1 T = func(i int) { // CHECK-LABEL: define void @"main.main$1"(i64 %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @1, i64 4 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %0) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) println("func", i) } var v2 T = func(i int) { // CHECK-LABEL: define void @"main.main$2"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %4 = load %"{{.*}}String", ptr %3, align 8 - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @2, i64 7 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %1) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" %4) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void + // CHECK: [[V2_ENV_VALUE:%.*]] = load { ptr }, ptr %0 + // CHECK-NEXT: [[V2_STRING_SLOT:%.*]] = extractvalue { ptr } [[V2_ENV_VALUE]], 0 + // CHECK-NEXT: [[V2_STRING:%.*]] = load %"{{.*}}String", ptr [[V2_STRING_SLOT]] + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[V2_STRING]]) println("closure", i, env) } v1(100) diff --git a/cl/_testgo/closure2/in.go b/cl/_testgo/closure2/in.go index 0e19371aa7..63a744155b 100644 --- a/cl/_testgo/closure2/in.go +++ b/cl/_testgo/closure2/in.go @@ -3,39 +3,37 @@ package main // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 8) - // CHECK: store i64 1, ptr %0, align 8 - // CHECK: call ptr @"{{.*}}AllocU"(i64 8) - // CHECK: { ptr @"main.main$1", ptr undef } - // CHECK: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) - // CHECK: call { ptr, ptr } %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, i64 1) - // CHECK: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %8) - // CHECK: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %7, i64 2) - // CHECK: ret void + // Both nested functions are invoked through function values with closure + // environments, and the inner closure keeps the original x slot alive. + // CHECK: [[X_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) + // CHECK: store i64 1, ptr [[X_SLOT]] + // CHECK: [[OUTER_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) + // CHECK: store ptr [[X_SLOT]], ptr {{%.*}} + // CHECK: [[OUTER:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr [[OUTER_ENV]], 1 + // CHECK: [[OUTER_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[OUTER]], 1 + // CHECK: [[OUTER_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[OUTER]], 0 + // CHECK: [[OUTER_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[OUTER_CALL_FN]]) + // CHECK: [[INNER:%.*]] = call { ptr, ptr } [[OUTER_CODE]](ptr {{(nest|swiftself)}} [[OUTER_CALL_ENV]], i64 1) + // CHECK: [[INNER_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[INNER]], 1 + // CHECK: [[INNER_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[INNER]], 0 + // CHECK: [[INNER_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[INNER_CALL_FN]]) + // CHECK: call void [[INNER_CODE]](ptr {{(nest|swiftself)}} [[INNER_CALL_ENV]], i64 2) x := 1 f := func(i int) func(int) { // CHECK-LABEL: define { ptr, ptr } @"main.main$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %4 = call ptr @"{{.*}}AllocU"(i64 8) - // CHECK-NEXT: %5 = getelementptr inbounds { ptr }, ptr %4, i32 0, i32 0 - // CHECK-NEXT: store ptr %3, ptr %5, align 8 - // CHECK-NEXT: %6 = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr %4, 1 - // CHECK-NEXT: ret { ptr, ptr } %6 + // CHECK: [[OUTER_CAPTURE:%.*]] = load { ptr }, ptr %0 + // CHECK-NEXT: [[CAPTURED_X_SLOT:%.*]] = extractvalue { ptr } [[OUTER_CAPTURE]], 0 + // CHECK: [[INNER_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) + // CHECK: store ptr [[CAPTURED_X_SLOT]], ptr {{%.*}} + // CHECK: [[INNER_VALUE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr [[INNER_ENV]], 1 + // CHECK-NEXT: ret { ptr, ptr } [[INNER_VALUE]] return func(i int) { // CHECK-LABEL: define void @"main.main$1$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %4 = load i64, ptr %3, align 8 - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @0, i64 7 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %1) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %4) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void + // CHECK: [[INNER_CAPTURE:%.*]] = load { ptr }, ptr %0 + // CHECK-NEXT: [[INNER_X_SLOT:%.*]] = extractvalue { ptr } [[INNER_CAPTURE]], 0 + // CHECK-NEXT: [[INNER_X:%.*]] = load i64, ptr [[INNER_X_SLOT]] + // CHECK: call void @"{{.*}}PrintInt"(i64 %1) + // CHECK: call void @"{{.*}}PrintInt"(i64 [[INNER_X]]) println("closure", i, x) } } diff --git a/cl/_testgo/closureall/in.go b/cl/_testgo/closureall/in.go index 5f2ca4304b..b908b4259a 100644 --- a/cl/_testgo/closureall/in.go +++ b/cl/_testgo/closureall/in.go @@ -5,10 +5,6 @@ import _ "unsafe" // for go:linkname import "github.com/goplus/lib/c" -// CHECK: {{^}}@0 = private unnamed_addr constant [46 x i8] c"{{.*}}/cl/_testgo/closureall.S", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [3 x i8] c"Inc", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [3 x i8] c"Add", align 1{{$}} - //go:linkname cSqrt C.sqrt func cSqrt(x c.Double) c.Double @@ -80,188 +76,117 @@ func makeWithFree(base int) Fn { return func(x int) int { return x + base } } -// CHECK-LABEL: define i64 @main.S.Inc(%main.S %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.S, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.S %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.S, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = add i64 %4, %1 -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.(*S).Add"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = add i64 %3, %1 -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.(*S).Inc"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 46 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 3 }) -// CHECK-NEXT: %3 = load %main.S, ptr %0, align 8 -// CHECK-NEXT: %4 = call i64 @main.S.Inc(%main.S %3, i64 %1) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } - // CHECK-LABEL: define i32 @main.callCInt({ ptr, ptr } %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %0, 1 -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %3) -// CHECK-NEXT: %4 = call i32 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %2, i32 %1) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } +// CHECK: [[C_ENV:%[0-9]+]] = extractvalue { ptr, ptr } %0, 1 +// CHECK-NEXT: [[C_CODE_RAW:%[0-9]+]] = extractvalue { ptr, ptr } %0, 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr [[C_CODE_RAW]]) +// CHECK-NEXT: [[C_RESULT:%[0-9]+]] = call i32 %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[C_ENV]], i32 %1) +// CHECK: ret i32 [[C_RESULT]] // CHECK-LABEL: define i32 @main.callCallback(ptr %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call i32 %0(i32 %1) -// CHECK-NEXT: ret i32 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @main.globalAdd(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[CB_RESULT:%[0-9]+]] = call i32 %0(i32 %1) +// CHECK: ret i32 [[CB_RESULT]] // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %main.Fn @main.makeNoFree() -// CHECK-NEXT: %1 = call %main.Fn @main.makeWithFree(i64 3) -// CHECK-NEXT: %2 = extractvalue %main.Fn %0, 1 -// CHECK-NEXT: %3 = extractvalue %main.Fn %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %3) -// CHECK-NEXT: %4 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %2, i64 1) -// CHECK-NEXT: %5 = extractvalue %main.Fn %1, 1 -// CHECK-NEXT: %6 = extractvalue %main.Fn %1, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: %7 = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %5, i64 2) -// CHECK-NEXT: %8 = call i64 @main.globalAdd(i64 1, i64 2) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %10 = getelementptr inbounds %main.S, ptr %9, i32 0, i32 0 -// CHECK-NEXT: store i64 5, ptr %10, align 8 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %12 = getelementptr inbounds { ptr }, ptr %11, i32 0, i32 0 -// CHECK-NEXT: store ptr %9, ptr %12, align 8 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } { ptr @"main.(*S).Add$bound", ptr undef }, ptr %11, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %13, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %15) -// CHECK-NEXT: %16 = call i64 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %14, i64 7) -// CHECK-NEXT: %17 = call i64 @"main.(*S).Add$thunk"(ptr %9, i64 8) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.S") -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %18, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %19, ptr %9, 1 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %20) -// CHECK-NEXT: %22 = icmp ne ptr %21, null -// CHECK-NEXT: br i1 %22, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %24 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %20, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue { ptr, ptr } { ptr @"main.interface{Add(int) int}.Add$bound", ptr undef }, ptr %23, 1 -// CHECK-NEXT: %26 = extractvalue { ptr, ptr } %25, 1 -// CHECK-NEXT: %27 = extractvalue { ptr, ptr } %25, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %27) -// CHECK-NEXT: %28 = call i64 %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %26, i64 9) -// CHECK-NEXT: %29 = call double @sqrt(double 4.000000e+00) -// CHECK-NEXT: %30 = call i32 @main.callCInt({ ptr, ptr } { ptr @abs, ptr null }, i32 -3) -// CHECK-NEXT: %31 = call i32 @main.callCallback(ptr @"main.main$1", i32 7) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %21, ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// A closure without free variables carries a null environment. +// CHECK: [[NO_FREE:%.*]] = call %main.Fn @main.makeNoFree() +// CHECK: [[WITH_FREE:%.*]] = call %main.Fn @main.makeWithFree(i64 3) +// CHECK: [[NO_FREE_ENV:%.*]] = extractvalue %main.Fn [[NO_FREE]], 1 +// CHECK: [[NO_FREE_CODE_RAW:%.*]] = extractvalue %main.Fn [[NO_FREE]], 0 +// CHECK: [[NO_FREE_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[NO_FREE_CODE_RAW]]) +// CHECK: call i64 [[NO_FREE_CODE]](ptr {{(nest|swiftself)}} [[NO_FREE_ENV]], i64 1) +// The free-variable closure is invoked with the environment returned by makeWithFree. +// CHECK: [[WITH_FREE_ENV:%.*]] = extractvalue %main.Fn [[WITH_FREE]], 1 +// CHECK: [[WITH_FREE_CODE_RAW:%.*]] = extractvalue %main.Fn [[WITH_FREE]], 0 +// CHECK: [[WITH_FREE_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[WITH_FREE_CODE_RAW]]) +// CHECK: call i64 [[WITH_FREE_CODE]](ptr {{(nest|swiftself)}} [[WITH_FREE_ENV]], i64 2) +// CHECK: call i64 @main.globalAdd(i64 1, i64 2) +// A bound pointer method stores the receiver in the closure environment. +// CHECK: [[S:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: [[S_FIELD:%[0-9]+]] = getelementptr inbounds %main.S, ptr [[S]], i32 0, i32 0 +// CHECK-NEXT: store i64 5, ptr [[S_FIELD]] +// CHECK: [[METHOD_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: [[METHOD_ENV_SLOT:%.*]] = getelementptr inbounds { ptr }, ptr [[METHOD_ENV]], i32 0, i32 0 +// CHECK: store ptr [[S]], ptr [[METHOD_ENV_SLOT]] +// CHECK: [[METHOD_FN:%.*]] = insertvalue { ptr, ptr } { ptr @"main.(*S).Add$bound", ptr undef }, ptr [[METHOD_ENV]], 1 +// CHECK: [[METHOD_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[METHOD_FN]], 1 +// CHECK: [[METHOD_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[METHOD_FN]], 0 +// CHECK: [[METHOD_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[METHOD_CODE_RAW]]) +// CHECK: call i64 [[METHOD_CODE]](ptr {{(nest|swiftself)}} [[METHOD_CALL_ENV]], i64 7) +// A method expression uses the receiver as an ordinary first argument. +// CHECK: call i64 @"main.(*S).Add$thunk"(ptr [[S]], i64 8) +// The interface method value keeps the same interface payload and checks it is non-nil. +// CHECK: [[ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr {{.*}}, ptr @"*_llgo_main.S") +// CHECK: [[IFACE_ITAB:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[ITAB]], 0 +// CHECK: [[IFACE:%.*]] = insertvalue %"{{.*}}iface" [[IFACE_ITAB]], ptr [[S]], 1 +// CHECK: [[IFACE_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[IFACE]]) +// CHECK: [[IFACE_OK:%.*]] = icmp ne ptr [[IFACE_TYPE]], null +// CHECK: br i1 [[IFACE_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[IFACE_METHOD_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// CHECK: [[IFACE_METHOD_SLOT:%.*]] = getelementptr inbounds { %"{{.*}}iface" }, ptr [[IFACE_METHOD_ENV]], i32 0, i32 0 +// CHECK: store %"{{.*}}iface" [[IFACE]], ptr [[IFACE_METHOD_SLOT]] +// CHECK: [[IFACE_METHOD:%.*]] = insertvalue { ptr, ptr } { ptr @"main.interface{Add(int) int}.Add$bound", ptr undef }, ptr [[IFACE_METHOD_ENV]], 1 +// CHECK: [[IFACE_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[IFACE_METHOD]], 1 +// CHECK: [[IFACE_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[IFACE_METHOD]], 0 +// CHECK: [[IFACE_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[IFACE_CODE_RAW]]) +// CHECK: call i64 [[IFACE_CODE]](ptr {{(nest|swiftself)}} [[IFACE_CALL_ENV]], i64 9) +// CHECK: call double @sqrt(double 4.000000e+00) +// CHECK: call i32 @main.callCInt({ ptr, ptr } { ptr @abs, ptr null }, i32 -3) +// CHECK: call i32 @main.callCallback(ptr @"main.main$1", i32 7) // CHECK-LABEL: define i32 @"main.main$1"(i32 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = add i32 %0, 1 -// CHECK-NEXT: ret i32 %1 -// CHECK-NEXT: } +// CHECK: [[CALLBACK_RESULT:%[0-9]+]] = add i32 %0, 1 +// CHECK: ret i32 [[CALLBACK_RESULT]] // CHECK-LABEL: define %main.Fn @main.makeNoFree(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %main.Fn { ptr @"main.makeNoFree$1", ptr null } -// CHECK-NEXT: } +// CHECK: ret %main.Fn { ptr @"main.makeNoFree$1", ptr null } // CHECK-LABEL: define i64 @"main.makeNoFree$1"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = add i64 %0, 1 -// CHECK-NEXT: ret i64 %1 -// CHECK-NEXT: } +// CHECK: [[NO_FREE_RESULT:%[0-9]+]] = add i64 %0, 1 +// CHECK: ret i64 [[NO_FREE_RESULT]] // CHECK-LABEL: define %main.Fn @main.makeWithFree(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 %0, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.makeWithFree$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = alloca %main.Fn, align 8 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %5, align 8 -// CHECK-NEXT: %6 = load %main.Fn, ptr %5, align 8 -// CHECK-NEXT: ret %main.Fn %6 -// CHECK-NEXT: } +// CHECK: [[BASE_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: store i64 %0, ptr [[BASE_ADDR]] +// CHECK-NEXT: [[WITH_FREE_ENV_OUT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: [[WITH_FREE_ENV_SLOT:%[0-9]+]] = getelementptr inbounds { ptr }, ptr [[WITH_FREE_ENV_OUT]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[BASE_ADDR]], ptr [[WITH_FREE_ENV_SLOT]] +// CHECK-NEXT: [[WITH_FREE_FN:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.makeWithFree$1", ptr undef }, ptr [[WITH_FREE_ENV_OUT]], 1 +// CHECK-NEXT: [[WITH_FREE_OUT:%[0-9]+]] = alloca %main.Fn +// CHECK-NEXT: store { ptr, ptr } [[WITH_FREE_FN]], ptr [[WITH_FREE_OUT]] +// CHECK-NEXT: [[WITH_FREE_RET:%[0-9]+]] = load %main.Fn, ptr [[WITH_FREE_OUT]] +// CHECK: ret %main.Fn [[WITH_FREE_RET]] // CHECK-LABEL: define i64 @"main.makeWithFree$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = add i64 %1, %4 -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } +// CHECK: [[FREE_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[FREE_ADDR:%[0-9]+]] = extractvalue { ptr } [[FREE_ENV]], 0 +// CHECK-NEXT: [[FREE_VALUE:%[0-9]+]] = load i64, ptr [[FREE_ADDR]] +// CHECK-NEXT: [[FREE_RESULT:%[0-9]+]] = add i64 %1, [[FREE_VALUE]] +// CHECK: ret i64 [[FREE_RESULT]] // CHECK-LABEL: define i64 @"main.(*S).Add$bound"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = call i64 @"main.(*S).Add"(ptr %3, i64 %1) -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } +// CHECK: [[BOUND_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[BOUND_RECEIVER:%[0-9]+]] = extractvalue { ptr } [[BOUND_ENV]], 0 +// CHECK-NEXT: [[BOUND_RESULT:%[0-9]+]] = call i64 @"main.(*S).Add"(ptr [[BOUND_RECEIVER]], i64 %1) +// CHECK: ret i64 [[BOUND_RESULT]] // CHECK-LABEL: define i64 @"main.(*S).Add$thunk"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call i64 @"main.(*S).Add"(ptr %0, i64 %1) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[THUNK_RESULT:%[0-9]+]] = call i64 @"main.(*S).Add"(ptr %0, i64 %1) +// CHECK: ret i64 [[THUNK_RESULT]] // CHECK-LABEL: define i64 @"main.interface{Add(int) int}.Add$bound"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface" } %2, 0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.interface{Add(int) int}.Add$bound", ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call i64 %13(ptr %12, i64 %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: ret i64 %14 -// CHECK-NEXT: } +// CHECK: [[BOUND_IFACE_ENV:%[0-9]+]] = load { %"{{.*}}iface" }, ptr %0 +// CHECK: [[BOUND_IFACE:%[0-9]+]] = extractvalue { %"{{.*}}iface" } [[BOUND_IFACE_ENV]], 0 +// CHECK: [[BOUND_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[BOUND_IFACE]]) +// CHECK: [[BOUND_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[BOUND_IFACE]], 0 +// CHECK: [[BOUND_SLOT:%.*]] = getelementptr ptr, ptr [[BOUND_ITAB]], i64 3 +// CHECK: [[BOUND_CODE:%.*]] = load ptr, ptr [[BOUND_SLOT]] +// CHECK: [[BOUND_PAIR_CODE:%.*]] = insertvalue { ptr, ptr } undef, ptr [[BOUND_CODE]], 0 +// CHECK: [[BOUND_PAIR:%.*]] = insertvalue { ptr, ptr } [[BOUND_PAIR_CODE]], ptr [[BOUND_DATA]], 1 +// CHECK: [[RECOVER_CODE:%.*]] = extractvalue { ptr, ptr } [[BOUND_PAIR]], 0 +// CHECK: [[RECOVER:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.interface{Add(int) int}.Add$bound", ptr [[RECOVER_CODE]]) +// CHECK: [[IFACE_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[BOUND_PAIR]], 1 +// CHECK: [[IFACE_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[BOUND_PAIR]], 0 +// CHECK: [[IFACE_BOUND_RESULT:%.*]] = call i64 [[IFACE_CALL_CODE]](ptr [[IFACE_CALL_DATA]], i64 %1) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr [[RECOVER]]) +// CHECK: ret i64 [[IFACE_BOUND_RESULT]] diff --git a/cl/_testgo/closureenv/in.go b/cl/_testgo/closureenv/in.go index ddea666991..db675b82d9 100644 --- a/cl/_testgo/closureenv/in.go +++ b/cl/_testgo/closureenv/in.go @@ -1,13 +1,53 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [18 x i8] c"zero-sized capture", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [26 x i8] c"zero-sized capture address", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [26 x i8] c"zero-sized pointer capture", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [5 x i8] c"IsNil", align 1{{$}} -// CHECK: {{^}}@10 = private unnamed_addr constant [25 x i8] c"nil receiver method value", align 1{{$}} -// CHECK: {{^}}@11 = private unnamed_addr constant [2 x i8] c"ok", align 1{{$}} -// CHECK: {{^}}@12 = private unnamed_addr constant [32 x i8] c"typed-nil interface method value", align 1{{$}} +// Zero-sized captures need no environment, while real captures and bound +// methods use LLVM's hidden closure-environment parameter. +// CHECK-LABEL: define i1 @"main.(*nilReceiver).IsNil"(ptr %0){{.*}} { +// CHECK: [[IS_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK-NEXT: ret i1 [[IS_NIL]] +// CHECK-LABEL: define { { ptr, ptr }, ptr } @main.zeroSizedAddressCapture(){{.*}} { +// CHECK: ret { { ptr, ptr }, ptr } { { ptr, ptr } { ptr @"main.zeroSizedAddressCapture$1", ptr null }, ptr @"__llgo.moduleZeroSizedAlloc$" } +// CHECK-LABEL: define ptr @"main.zeroSizedAddressCapture$1"(){{.*}} { +// CHECK: ret ptr @"__llgo.moduleZeroSizedAlloc$" +// CHECK-LABEL: define { ptr, ptr } @main.zeroSizedCapture(){{.*}} { +// CHECK: ret { ptr, ptr } { ptr @"main.zeroSizedCapture$1", ptr null } +// CHECK-LABEL: define i64 @"main.zeroSizedCapture$1"(){{.*}} { +// CHECK: br i1 false, label %{{.*}}, label %{{.*}} +// CHECK: ret i64 0 +// CHECK: ret i64 42 +// CHECK-LABEL: define { ptr, ptr } @main.zeroSizedPointerCapture(ptr %0){{.*}} { +// CHECK: [[ZSP_VALUE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: store ptr %0, ptr [[ZSP_VALUE]] +// CHECK-NEXT: [[ZSP_ENV:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: store ptr [[ZSP_VALUE]], ptr %{{[0-9]+}} +// CHECK: [[ZSP_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.zeroSizedPointerCapture$1", ptr undef }, ptr [[ZSP_ENV]], 1 +// CHECK-NEXT: ret { ptr, ptr } [[ZSP_CLOSURE]] +// CHECK-LABEL: define i1 @"main.zeroSizedPointerCapture$1"(ptr {{(nest|swiftself)}} +// CHECK: [[ZSP_ENV_VALUE:%[0-9]+]] = load { ptr }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[ZSP_SLOT:%[0-9]+]] = extractvalue { ptr } [[ZSP_ENV_VALUE]], 0 +// CHECK-NEXT: [[ZSP_POINTER:%[0-9]+]] = load ptr, ptr [[ZSP_SLOT]] +// CHECK-NEXT: [[ZSP_IS_NIL:%[0-9]+]] = icmp eq ptr [[ZSP_POINTER]], null +// CHECK-NEXT: ret i1 [[ZSP_IS_NIL]] +// CHECK-LABEL: define i1 @"main.(*nilReceiver).IsNil$bound"(ptr {{(nest|swiftself)}} +// CHECK: [[BOUND_ENV:%[0-9]+]] = load { ptr }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[BOUND_RECEIVER:%[0-9]+]] = extractvalue { ptr } [[BOUND_ENV]], 0 +// CHECK-NEXT: [[BOUND_RESULT:%[0-9]+]] = call i1 @"main.(*nilReceiver).IsNil"(ptr [[BOUND_RECEIVER]]) +// CHECK-NEXT: ret i1 [[BOUND_RESULT]] +// CHECK-LABEL: define i1 @"main.interface{IsNil() bool}.IsNil$bound"(ptr {{(nest|swiftself)}} +// CHECK: [[IB_ENV:%[0-9]+]] = load { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[IB_IFACE:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface" } [[IB_ENV]], 0 +// CHECK-NEXT: [[IB_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[IB_IFACE]]) +// CHECK: [[IB_METHOD:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: [[IB_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[IB_METHOD]], 0 +// CHECK-NEXT: [[IB_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[IB_PAIR0]], ptr [[IB_DATA]], 1 +// CHECK: [[IB_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[IB_PAIR]], 0 +// CHECK-NEXT: [[IB_FRAME:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.interface{IsNil() bool}.IsNil$bound", ptr [[IB_CODE]]) +// CHECK: [[IB_CALL_DATA:%[0-9]+]] = extractvalue { ptr, ptr } [[IB_PAIR]], 1 +// CHECK-NEXT: [[IB_CALL_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[IB_PAIR]], 0 +// CHECK-NEXT: [[IB_RESULT:%[0-9]+]] = call i1 [[IB_CALL_CODE]](ptr [[IB_CALL_DATA]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr [[IB_FRAME]]) +// CHECK-NEXT: ret i1 [[IB_RESULT]] type nilReceiver struct{} @@ -59,199 +99,3 @@ func main() { } println("ok") } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call { ptr, ptr } @main.zeroSizedCapture() -// CHECK-NEXT: %1 = extractvalue { ptr, ptr } %0, 1 -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %2) -// CHECK-NEXT: %3 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %1) -// CHECK-NEXT: %4 = icmp ne i64 %3, 42 -// CHECK-NEXT: br i1 %4, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 18 }, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %5, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %6) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = call { { ptr, ptr }, ptr } @main.zeroSizedAddressCapture() -// CHECK-NEXT: %8 = extractvalue { { ptr, ptr }, ptr } %7, 0 -// CHECK-NEXT: %9 = extractvalue { { ptr, ptr }, ptr } %7, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %11) -// CHECK-NEXT: %12 = call ptr %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %10) -// CHECK-NEXT: %13 = icmp ne ptr %12, %9 -// CHECK-NEXT: br i1 %13, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 26 }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %14, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %16 = call { ptr, ptr } @main.zeroSizedPointerCapture(ptr null) -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %16, 1 -// CHECK-NEXT: %18 = extractvalue { ptr, ptr } %16, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %18) -// CHECK-NEXT: %19 = call i1 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %17) -// CHECK-NEXT: br i1 %19, label %_llgo_6, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 26 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr null, ptr %23, align 8 -// CHECK-NEXT: %24 = insertvalue { ptr, ptr } { ptr @"main.(*nilReceiver).IsNil$bound", ptr undef }, ptr %22, 1 -// CHECK-NEXT: %25 = extractvalue { ptr, ptr } %24, 1 -// CHECK-NEXT: %26 = extractvalue { ptr, ptr } %24, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %26) -// CHECK-NEXT: %27 = call i1 %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %25) -// CHECK-NEXT: br i1 %27, label %_llgo_8, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @10, i64 25 }, ptr %28, align 8 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %28, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %29) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.nilReceiver") -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %30, 0 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %31, ptr null, 1 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %32) -// CHECK-NEXT: %34 = icmp ne ptr %33, null -// CHECK-NEXT: br i1 %34, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_11 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @12, i64 32 }, ptr %35, align 8 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %35, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %36) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @11, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_8 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %38 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %37, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %32, ptr %38, align 8 -// CHECK-NEXT: %39 = insertvalue { ptr, ptr } { ptr @"main.interface{IsNil() bool}.IsNil$bound", ptr undef }, ptr %37, 1 -// CHECK-NEXT: %40 = extractvalue { ptr, ptr } %39, 1 -// CHECK-NEXT: %41 = extractvalue { ptr, ptr } %39, 0 -// CHECK-NEXT: %__llgo_funcval_code4 = call ptr asm "", "=r,0"(ptr %41) -// CHECK-NEXT: %42 = call i1 %__llgo_funcval_code4(ptr {{(nest|swiftself)}} %40) -// CHECK-NEXT: br i1 %42, label %_llgo_10, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %33, ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.(*nilReceiver).IsNil"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: ret i1 %1 -// CHECK-NEXT: } - -// CHECK-LABEL: define { { ptr, ptr }, ptr } @main.zeroSizedAddressCapture(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret { { ptr, ptr }, ptr } { { ptr, ptr } { ptr @"main.zeroSizedAddressCapture$1", ptr null }, ptr @"__llgo.moduleZeroSizedAlloc$" } -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main.zeroSizedAddressCapture$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret ptr @"__llgo.moduleZeroSizedAlloc$" -// CHECK-NEXT: } - -// CHECK-LABEL: define { ptr, ptr } @main.zeroSizedCapture(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret { ptr, ptr } { ptr @"main.zeroSizedCapture$1", ptr null } -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.zeroSizedCapture$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 false, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret i64 0 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret i64 42 -// CHECK-NEXT: } - -// CHECK-LABEL: define { ptr, ptr } @main.zeroSizedPointerCapture(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store ptr %0, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.zeroSizedPointerCapture$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: ret { ptr, ptr } %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.zeroSizedPointerCapture$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = icmp eq ptr %3, null -// CHECK-NEXT: ret i1 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.(*nilReceiver).IsNil$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call i1 @"main.(*nilReceiver).IsNil"(ptr %2) -// CHECK-NEXT: ret i1 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @"main.interface{IsNil() bool}.IsNil$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface" } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 3 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.interface{IsNil() bool}.IsNil$bound", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call i1 %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret i1 %13 -// CHECK-NEXT: } diff --git a/cl/_testgo/constconv/in.go b/cl/_testgo/constconv/in.go index 0793f615e5..088d90c0d5 100644 --- a/cl/_testgo/constconv/in.go +++ b/cl/_testgo/constconv/in.go @@ -7,14 +7,10 @@ func main() { var u64 uint64 = 1 var c int64 = i64 + (1.0 / (1.0 / 10)) var d uint64 = u64 + (1.0 / (1.0 / 10)) + // The untyped floating-point expressions must be folded before conversion. // CHECK: PrintUint"(i64 1) - // CHECK-NEXT: PrintByte"(i8 32) - // CHECK-NEXT: PrintInt"(i64 1) - // CHECK-NEXT: PrintByte"(i8 32) - // CHECK-NEXT: PrintInt"(i64 11) - // CHECK-NEXT: PrintByte"(i8 32) - // CHECK-NEXT: PrintUint"(i64 11) - // CHECK-NEXT: PrintByte"(i8 10) - // CHECK-NEXT: ret void + // CHECK: PrintInt"(i64 1) + // CHECK: PrintInt"(i64 11) + // CHECK: PrintUint"(i64 11) println(u64, i64, c, d) } diff --git a/cl/_testgo/cursor/in.go b/cl/_testgo/cursor/in.go index 3fa82f1704..8858cec1a5 100644 --- a/cl/_testgo/cursor/in.go +++ b/cl/_testgo/cursor/in.go @@ -7,14 +7,6 @@ import ( "math" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [36 x i8] c"iterator call did not preserve panic", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [43 x i8] c"yield function called after range loop exit", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [47 x i8] c"{{.*}}/cl/_testgo/cursor.Cursor", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [8 x i8] c"FindNode", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [4 x i8] c"Node", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [8 x i8] c"Preorder", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [7 x i8] c"indices", align 1{{$}} - func main() { c := &Cursor{in: &Inspector{}} _ = c @@ -33,196 +25,31 @@ func (c Cursor) Node() ast.Node { } // CHECK-LABEL: define { %main.Cursor, i1 } @main.Cursor.FindNode(%main.Cursor %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.Cursor, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.Cursor %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %1, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: br i1 false, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = load %main.Cursor, ptr %2, align 8 -// CHECK-NEXT: %7 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %8, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %7, ptr %9, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %8, 0 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %10, i64 1, 1 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %11, i64 1, 2 -// CHECK-NEXT: %13 = call %"iter.Seq[main.Cursor]" @main.Cursor.Preorder(%main.Cursor %6, %"{{.*}}/runtime/internal/runtime.Slice" %12) -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %16 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: store ptr %14, ptr %16, align 8 -// CHECK-NEXT: %17 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: store ptr %3, ptr %17, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 2 -// CHECK-NEXT: store ptr %4, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, ptr, ptr, ptr }, ptr %15, i32 0, i32 3 -// CHECK-NEXT: store ptr %5, ptr %19, align 8 -// CHECK-NEXT: %20 = insertvalue { ptr, ptr } { ptr @"main.Cursor.FindNode$1", ptr undef }, ptr %15, 1 -// CHECK-NEXT: %21 = extractvalue %"iter.Seq[main.Cursor]" %13, 1 -// CHECK-NEXT: %22 = extractvalue %"iter.Seq[main.Cursor]" %13, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %22) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %21, { ptr, ptr } %20) -// CHECK-NEXT: %23 = load i64, ptr %14, align 8 -// CHECK-NEXT: %24 = icmp eq i64 %23, -1 -// CHECK-NEXT: br i1 %24, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %26 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %25, i64 0 -// CHECK-NEXT: %27 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %27, ptr %26, align 8 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %25, 0 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %28, i64 1, 1 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %29, i64 1, 2 -// CHECK-NEXT: %31 = call i64 @main.maskOf(%"{{.*}}/runtime/internal/runtime.Slice" %30) -// CHECK-NEXT: %32 = getelementptr inbounds %main.Cursor, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %33 = load ptr, ptr %32, align 8 -// CHECK-NEXT: %34 = getelementptr inbounds %main.Inspector, ptr %33, i32 0, i32 0 -// CHECK-NEXT: %35 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %34, align 8 -// CHECK-NEXT: %36 = load %main.Cursor, ptr %2, align 8 -// CHECK-NEXT: %37 = call { i32, i32 } @main.Cursor.indices(%main.Cursor %36) -// CHECK-NEXT: %38 = extractvalue { i32, i32 } %37, 0 -// CHECK-NEXT: %39 = extractvalue { i32, i32 } %37, 1 -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_7, %_llgo_6 -// CHECK-NEXT: store %main.Cursor zeroinitializer, ptr %4, align 8 -// CHECK-NEXT: store i1 false, ptr %5, align 1 -// CHECK-NEXT: %40 = load %main.Cursor, ptr %4, align 8 -// CHECK-NEXT: %41 = load i1, ptr %5, align 1 -// CHECK-NEXT: %42 = insertvalue { %main.Cursor, i1 } undef, %main.Cursor %40, 0 -// CHECK-NEXT: %43 = insertvalue { %main.Cursor, i1 } %42, i1 %41, 1 -// CHECK-NEXT: ret { %main.Cursor, i1 } %43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 36 }, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %45) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: %46 = icmp eq i64 %23, 0 -// CHECK-NEXT: br i1 %46, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: store i64 -2, ptr %14, align 8 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: %47 = icmp eq i64 %23, 1 -// CHECK-NEXT: br i1 %47, label %_llgo_8, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: %48 = load %main.Cursor, ptr %4, align 8 -// CHECK-NEXT: %49 = load i1, ptr %5, align 1 -// CHECK-NEXT: %50 = insertvalue { %main.Cursor, i1 } undef, %main.Cursor %48, 0 -// CHECK-NEXT: %51 = insertvalue { %main.Cursor, i1 } %50, i1 %49, 1 -// CHECK-NEXT: ret { %main.Cursor, i1 } %51 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_13, %_llgo_2 -// CHECK-NEXT: %52 = phi i32 [ %38, %_llgo_2 ], [ %75, %_llgo_13 ] -// CHECK-NEXT: %53 = icmp slt i32 %52, %39 -// CHECK-NEXT: br i1 %53, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_9 -// CHECK-NEXT: %54 = alloca %main.event, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %54, i8 0, i64 32, i1 false) -// CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 0 -// CHECK-NEXT: %56 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 1 -// CHECK-NEXT: %57 = sext i32 %52 to i64 -// CHECK-NEXT: %58 = icmp slt i64 %57, 0 -// CHECK-NEXT: %59 = icmp uge i64 %57, %56 -// CHECK-NEXT: %60 = or i1 %59, %58 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %60, i64 %57, i1 true, i64 %56) -// CHECK-NEXT: %61 = getelementptr inbounds %main.event, ptr %55, i64 %57 -// CHECK-NEXT: %62 = load %main.event, ptr %61, align 8 -// CHECK-NEXT: store %main.event %62, ptr %54, align 8 -// CHECK-NEXT: %63 = getelementptr inbounds %main.event, ptr %54, i32 0, i32 2 -// CHECK-NEXT: %64 = load i32, ptr %63, align 4 -// CHECK-NEXT: %65 = icmp sgt i32 %64, %52 -// CHECK-NEXT: br i1 %65, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_9 -// CHECK-NEXT: store %main.Cursor zeroinitializer, ptr %4, align 8 -// CHECK-NEXT: store i1 false, ptr %5, align 1 -// CHECK-NEXT: %66 = load %main.Cursor, ptr %4, align 8 -// CHECK-NEXT: %67 = load i1, ptr %5, align 1 -// CHECK-NEXT: %68 = insertvalue { %main.Cursor, i1 } undef, %main.Cursor %66, 0 -// CHECK-NEXT: %69 = insertvalue { %main.Cursor, i1 } %68, i1 %67, 1 -// CHECK-NEXT: ret { %main.Cursor, i1 } %69 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_10 -// CHECK-NEXT: %70 = getelementptr inbounds %main.event, ptr %54, i32 0, i32 1 -// CHECK-NEXT: %71 = load i64, ptr %70, align 8 -// CHECK-NEXT: %72 = and i64 %71, %31 -// CHECK-NEXT: %73 = icmp ne i64 %72, 0 -// CHECK-NEXT: br i1 %73, label %_llgo_16, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_17, %_llgo_15, %_llgo_10 -// CHECK-NEXT: %74 = phi i32 [ %52, %_llgo_10 ], [ %52, %_llgo_15 ], [ %87, %_llgo_17 ] -// CHECK-NEXT: %75 = add i32 %74, 1 -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_16 -// CHECK-NEXT: %76 = alloca %main.Cursor, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %76, i8 0, i64 16, i1 false) -// CHECK-NEXT: %77 = getelementptr inbounds %main.Cursor, ptr %76, i32 0, i32 0 -// CHECK-NEXT: %78 = getelementptr inbounds %main.Cursor, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %79 = load ptr, ptr %78, align 8 -// CHECK-NEXT: %80 = getelementptr inbounds %main.Cursor, ptr %76, i32 0, i32 1 -// CHECK-NEXT: store ptr %79, ptr %77, align 8 -// CHECK-NEXT: store i32 %52, ptr %80, align 4 -// CHECK-NEXT: %81 = load %main.Cursor, ptr %76, align 8 -// CHECK-NEXT: store %main.Cursor %81, ptr %4, align 8 -// CHECK-NEXT: store i1 true, ptr %5, align 1 -// CHECK-NEXT: %82 = load %main.Cursor, ptr %4, align 8 -// CHECK-NEXT: %83 = load i1, ptr %5, align 1 -// CHECK-NEXT: %84 = insertvalue { %main.Cursor, i1 } undef, %main.Cursor %82, 0 -// CHECK-NEXT: %85 = insertvalue { %main.Cursor, i1 } %84, i1 %83, 1 -// CHECK-NEXT: ret { %main.Cursor, i1 } %85 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_16, %_llgo_12 -// CHECK-NEXT: %86 = getelementptr inbounds %main.event, ptr %54, i32 0, i32 2 -// CHECK-NEXT: %87 = load i32, ptr %86, align 4 -// CHECK-NEXT: %88 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 0 -// CHECK-NEXT: %89 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 1 -// CHECK-NEXT: %90 = sext i32 %87 to i64 -// CHECK-NEXT: %91 = icmp slt i64 %90, 0 -// CHECK-NEXT: %92 = icmp uge i64 %90, %89 -// CHECK-NEXT: %93 = or i1 %92, %91 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %93, i64 %90, i1 true, i64 %89) -// CHECK-NEXT: %94 = getelementptr inbounds %main.event, ptr %88, i64 %90 -// CHECK-NEXT: %95 = getelementptr inbounds %main.event, ptr %94, i32 0, i32 1 -// CHECK-NEXT: %96 = load i64, ptr %95, align 8 -// CHECK-NEXT: %97 = and i64 %96, %31 -// CHECK-NEXT: %98 = icmp eq i64 %97, 0 -// CHECK-NEXT: br i1 %98, label %_llgo_17, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_12 -// CHECK-NEXT: %99 = getelementptr inbounds %main.event, ptr %54, i32 0, i32 0 -// CHECK-NEXT: %100 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %99, align 8 -// CHECK-NEXT: %101 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: %102 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %100) -// CHECK-NEXT: %103 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %100, 1 -// CHECK-NEXT: %104 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %102, 0 -// CHECK-NEXT: %105 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %104, ptr %103, 1 -// CHECK-NEXT: %106 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %101) -// CHECK-NEXT: %107 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %101, 1 -// CHECK-NEXT: %108 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %106, 0 -// CHECK-NEXT: %109 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %108, ptr %107, 1 -// CHECK-NEXT: %110 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %105, %"{{.*}}/runtime/internal/runtime.eface" %109) -// CHECK-NEXT: br i1 %110, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_15 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-NEXT: } +// CHECK: store %main.Cursor %0, ptr [[FN_CURSOR_SLOT:%[0-9]+]] +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %1, ptr [[FN_NODE_SLOT:%[0-9]+]] +// CHECK: br i1 false, +// CHECK: [[FN_MASK:%[0-9]+]] = call i64 @main.maskOf(%"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}) +// CHECK: [[FN_EVENTS:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %{{[0-9]+}} +// CHECK: [[FN_CURSOR_VALUE:%[0-9]+]] = load %main.Cursor, ptr [[FN_CURSOR_SLOT]] +// CHECK-NEXT: [[FN_RANGE:%[0-9]+]] = call { i32, i32 } @main.Cursor.indices(%main.Cursor [[FN_CURSOR_VALUE]]) +// CHECK: [[FN_START:%[0-9]+]] = extractvalue { i32, i32 } [[FN_RANGE]], 0 +// CHECK: [[FN_LIMIT:%[0-9]+]] = extractvalue { i32, i32 } [[FN_RANGE]], 1 +// CHECK: [[FN_I:%[0-9]+]] = phi i32 [ [[FN_START]], +// CHECK: [[FN_MORE:%[0-9]+]] = icmp slt i32 [[FN_I]], [[FN_LIMIT]] +// CHECK: [[FN_EVENT_PTR:%[0-9]+]] = getelementptr inbounds %main.event, ptr %{{[0-9]+}}, i64 %{{[0-9]+}} +// CHECK: [[FN_EVENT:%[0-9]+]] = load %main.event, ptr [[FN_EVENT_PTR]] +// CHECK: [[FN_PAIR_INDEX:%[0-9]+]] = load i32, ptr %{{[0-9]+}} +// CHECK: [[FN_PUSH:%[0-9]+]] = icmp sgt i32 [[FN_PAIR_INDEX]], [[FN_I]] +// CHECK: [[FN_EVENT_TYPE:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[FN_TYPE_MATCH:%[0-9]+]] = and i64 [[FN_EVENT_TYPE]], [[FN_MASK]] +// CHECK: [[FN_MAY_MATCH:%[0-9]+]] = icmp ne i64 [[FN_TYPE_MATCH]], 0 +// CHECK: store i32 [[FN_I]], ptr %{{[0-9]+}} +// CHECK: store i1 true, ptr %{{[0-9]+}} +// CHECK: [[FN_POP:%[0-9]+]] = load i32, ptr %{{[0-9]+}} +// CHECK: [[FN_POP_TYPE:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[FN_POP_MASK:%[0-9]+]] = and i64 [[FN_POP_TYPE]], [[FN_MASK]] +// CHECK: [[FN_SKIP:%[0-9]+]] = icmp eq i64 [[FN_POP_MASK]], 0 +// CHECK: [[FN_NODE_EQUAL:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" func (c Cursor) FindNode(n ast.Node) (Cursor, bool) { @@ -498,1664 +325,80 @@ const ( nValueSpec ) -// CHECK-LABEL: define i1 @"main.Cursor.FindNode$1"(ptr {{(nest|swiftself)}} %0, %main.Cursor %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr, ptr, ptr, ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = icmp eq i64 %4, 0 -// CHECK-NEXT: br i1 %5, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 -// CHECK-NEXT: store i64 -1, ptr %6, align 8 -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.iface" @main.Cursor.Node(%main.Cursor %1) -// CHECK-NEXT: %8 = extractvalue { ptr, ptr, ptr, ptr } %2, 1 -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %8, align 8 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %7) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %7, 1 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %10, 0 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %12, ptr %11, 1 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %14, 0 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %16, ptr %15, 1 -// CHECK-NEXT: %18 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %13, %"{{.*}}/runtime/internal/runtime.eface" %17) -// CHECK-NEXT: br i1 %18, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 43 }, ptr %19, align 8 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %19, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %20) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %21 = extractvalue { ptr, ptr, ptr, ptr } %2, 2 -// CHECK-NEXT: store %main.Cursor %1, ptr %21, align 8 -// CHECK-NEXT: %22 = extractvalue { ptr, ptr, ptr, ptr } %2, 3 -// CHECK-NEXT: store i1 true, ptr %22, align 1 -// CHECK-NEXT: %23 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 -// CHECK-NEXT: store i64 1, ptr %23, align 8 -// CHECK-NEXT: ret i1 false -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %24 = extractvalue { ptr, ptr, ptr, ptr } %2, 0 -// CHECK-NEXT: store i64 0, ptr %24, align 8 -// CHECK-NEXT: ret i1 true -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.Cursor.Node(%main.Cursor %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.Cursor, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.Cursor %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load i32, ptr %2, align 4 -// CHECK-NEXT: %4 = icmp slt i32 %3, 0 -// CHECK-NEXT: br i1 %4, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %main.Inspector, ptr %6, i32 0, i32 0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %7, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %10 = load i32, ptr %9, align 4 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, 0 -// CHECK-NEXT: %12 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, 1 -// CHECK-NEXT: %13 = sext i32 %10 to i64 -// CHECK-NEXT: %14 = icmp slt i64 %13, 0 -// CHECK-NEXT: %15 = icmp uge i64 %13, %12 -// CHECK-NEXT: %16 = or i1 %15, %14 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %16, i64 %13, i1 true, i64 %12) -// CHECK-NEXT: %17 = getelementptr inbounds %main.event, ptr %11, i64 %13 -// CHECK-NEXT: %18 = getelementptr inbounds %main.event, ptr %17, i32 0, i32 0 -// CHECK-NEXT: %19 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %18, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %19 -// CHECK-NEXT: } - // CHECK-LABEL: define %"iter.Seq[main.Cursor]" @main.Cursor.Preorder(%main.Cursor %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %main.Cursor %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = call i64 @main.maskOf(%"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: store i64 %4, ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %6 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1 -// CHECK-NEXT: store ptr %3, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } { ptr @"main.Cursor.Preorder$1", ptr undef }, ptr %5, 1 -// CHECK-NEXT: %9 = alloca %"iter.Seq[main.Cursor]", align 8 -// CHECK-NEXT: store { ptr, ptr } %8, ptr %9, align 8 -// CHECK-NEXT: %10 = load %"iter.Seq[main.Cursor]", ptr %9, align 8 -// CHECK-NEXT: ret %"iter.Seq[main.Cursor]" %10 -// CHECK-NEXT: } +// CHECK: store %main.Cursor %0, ptr [[PRE_CURSOR_SLOT:%[0-9]+]] +// CHECK: [[PRE_MASK:%[0-9]+]] = call i64 @main.maskOf(%"{{.*}}/runtime/internal/runtime.Slice" %1) +// CHECK: store i64 [[PRE_MASK]], ptr %{{[0-9]+}} +// CHECK: store ptr %{{[0-9]+}}, ptr %{{[0-9]+}} +// CHECK: store ptr %{{[0-9]+}}, ptr %{{[0-9]+}} +// CHECK: [[PRE_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.Cursor.Preorder$1", ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK: ret %"iter.Seq[main.Cursor]" %{{[0-9]+}} // CHECK-LABEL: define void @"main.Cursor.Preorder$1"(ptr {{(nest|swiftself)}} %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr, ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %4 = getelementptr inbounds %main.Cursor, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.Inspector, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %6, align 8 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %8) -// CHECK-NEXT: %10 = load %main.Cursor, ptr %9, align 8 -// CHECK-NEXT: %11 = call { i32, i32 } @main.Cursor.indices(%main.Cursor %10) -// CHECK-NEXT: %12 = extractvalue { i32, i32 } %11, 0 -// CHECK-NEXT: %13 = extractvalue { i32, i32 } %11, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5, %_llgo_8, %_llgo_0 -// CHECK-NEXT: %14 = phi i32 [ %12, %_llgo_0 ], [ %60, %_llgo_8 ], [ %34, %_llgo_5 ] -// CHECK-NEXT: %15 = icmp slt i32 %14, %13 -// CHECK-NEXT: br i1 %15, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %16 = alloca %main.event, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %16, i8 0, i64 32, i1 false) -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %19 = sext i32 %14 to i64 -// CHECK-NEXT: %20 = icmp slt i64 %19, 0 -// CHECK-NEXT: %21 = icmp uge i64 %19, %18 -// CHECK-NEXT: %22 = or i1 %21, %20 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %22, i64 %19, i1 true, i64 %18) -// CHECK-NEXT: %23 = getelementptr inbounds %main.event, ptr %17, i64 %19 -// CHECK-NEXT: %24 = load %main.event, ptr %23, align 8 -// CHECK-NEXT: store %main.event %24, ptr %16, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds %main.event, ptr %16, i32 0, i32 2 -// CHECK-NEXT: %26 = load i32, ptr %25, align 4 -// CHECK-NEXT: %27 = icmp sgt i32 %26, %14 -// CHECK-NEXT: br i1 %27, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_7, %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %28 = getelementptr inbounds %main.event, ptr %16, i32 0, i32 1 -// CHECK-NEXT: %29 = load i64, ptr %28, align 8 -// CHECK-NEXT: %30 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %31 = load i64, ptr %30, align 8 -// CHECK-NEXT: %32 = and i64 %29, %31 -// CHECK-NEXT: %33 = icmp ne i64 %32, 0 -// CHECK-NEXT: br i1 %33, label %_llgo_7, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_6, %_llgo_2 -// CHECK-NEXT: %34 = add i32 %14, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7, %_llgo_4 -// CHECK-NEXT: %35 = getelementptr inbounds %main.event, ptr %16, i32 0, i32 2 -// CHECK-NEXT: %36 = load i32, ptr %35, align 4 -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %39 = sext i32 %36 to i64 -// CHECK-NEXT: %40 = icmp slt i64 %39, 0 -// CHECK-NEXT: %41 = icmp uge i64 %39, %38 -// CHECK-NEXT: %42 = or i1 %41, %40 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %42, i64 %39, i1 true, i64 %38) -// CHECK-NEXT: %43 = getelementptr inbounds %main.event, ptr %37, i64 %39 -// CHECK-NEXT: %44 = getelementptr inbounds %main.event, ptr %43, i32 0, i32 1 -// CHECK-NEXT: %45 = load i64, ptr %44, align 8 -// CHECK-NEXT: %46 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %47 = load i64, ptr %46, align 8 -// CHECK-NEXT: %48 = and i64 %45, %47 -// CHECK-NEXT: %49 = icmp eq i64 %48, 0 -// CHECK-NEXT: br i1 %49, label %_llgo_8, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_4 -// CHECK-NEXT: %50 = alloca %main.Cursor, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %50, i8 0, i64 16, i1 false) -// CHECK-NEXT: %51 = getelementptr inbounds %main.Cursor, ptr %50, i32 0, i32 0 -// CHECK-NEXT: %52 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %53 = getelementptr inbounds %main.Cursor, ptr %52, i32 0, i32 0 -// CHECK-NEXT: %54 = load ptr, ptr %53, align 8 -// CHECK-NEXT: %55 = getelementptr inbounds %main.Cursor, ptr %50, i32 0, i32 1 -// CHECK-NEXT: store ptr %54, ptr %51, align 8 -// CHECK-NEXT: store i32 %14, ptr %55, align 4 -// CHECK-NEXT: %56 = load %main.Cursor, ptr %50, align 8 -// CHECK-NEXT: %57 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %58 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %58) -// CHECK-NEXT: %59 = call i1 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %57, %main.Cursor %56) -// CHECK-NEXT: br i1 %59, label %_llgo_6, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: %60 = add i32 %36, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-NEXT: } - +// CHECK: [[PRE_ENV:%[0-9]+]] = load { ptr, ptr }, ptr %0 +// CHECK: [[PRE_EVENTS:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %{{[0-9]+}} +// CHECK: [[PRE_CURSOR_PTR:%[0-9]+]] = extractvalue { ptr, ptr } [[PRE_ENV]], 0 +// CHECK: [[PRE_CURSOR:%[0-9]+]] = load %main.Cursor, ptr %{{[0-9]+}} +// CHECK-NEXT: [[PRE_RANGE:%[0-9]+]] = call { i32, i32 } @main.Cursor.indices(%main.Cursor [[PRE_CURSOR]]) +// CHECK: [[PRE_START:%[0-9]+]] = extractvalue { i32, i32 } [[PRE_RANGE]], 0 +// CHECK: [[PRE_LIMIT:%[0-9]+]] = extractvalue { i32, i32 } [[PRE_RANGE]], 1 +// CHECK: [[PRE_I:%[0-9]+]] = phi i32 [ [[PRE_START]], +// CHECK: [[PRE_MORE:%[0-9]+]] = icmp slt i32 [[PRE_I]], [[PRE_LIMIT]] +// CHECK: [[PRE_EVENT:%[0-9]+]] = load %main.event, ptr %{{[0-9]+}} +// CHECK: [[PRE_POP:%[0-9]+]] = load i32, ptr %{{[0-9]+}} +// CHECK: [[PRE_PUSH:%[0-9]+]] = icmp sgt i32 [[PRE_POP]], [[PRE_I]] +// CHECK: [[PRE_EVENT_TYPE:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[PRE_SAVED_MASK:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[PRE_MATCH_BITS:%[0-9]+]] = and i64 [[PRE_EVENT_TYPE]], [[PRE_SAVED_MASK]] +// CHECK: [[PRE_MATCH:%[0-9]+]] = icmp ne i64 [[PRE_MATCH_BITS]], 0 +// CHECK: [[PRE_SUBTREE_TYPE:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[PRE_SUBTREE_MASK:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[PRE_SUBTREE_BITS:%[0-9]+]] = and i64 [[PRE_SUBTREE_TYPE]], [[PRE_SUBTREE_MASK]] +// CHECK: [[PRE_SKIP:%[0-9]+]] = icmp eq i64 [[PRE_SUBTREE_BITS]], 0 +// CHECK: store i32 [[PRE_I]], ptr %{{[0-9]+}} +// CHECK: [[PRE_YIELD_ENV:%[0-9]+]] = extractvalue { ptr, ptr } %1, 1 +// CHECK-NEXT: [[PRE_YIELD_CODE:%[0-9]+]] = extractvalue { ptr, ptr } %1, 0 +// CHECK: [[PRE_YIELD:%[0-9]+]] = call i1 %{{[^ ]+}}(ptr {{(nest|swiftself)}} [[PRE_YIELD_ENV]], %main.Cursor %{{[0-9]+}}) +// CHECK: br i1 [[PRE_YIELD]], +// CHECK: [[PRE_AFTER_POP:%[0-9]+]] = add i32 [[PRE_SKIP_POP:%[0-9]+]], 1 + +// A virtual-root Cursor exposes all events; a real Cursor exposes its push/pop subtree. // CHECK-LABEL: define { i32, i32 } @main.Cursor.indices(%main.Cursor %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.Cursor, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.Cursor %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load i32, ptr %2, align 4 -// CHECK-NEXT: %4 = icmp slt i32 %3, 0 -// CHECK-NEXT: br i1 %4, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %main.Inspector, ptr %6, i32 0, i32 0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %7, align 8 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, 1 -// CHECK-NEXT: %10 = trunc i64 %9 to i32 -// CHECK-NEXT: %11 = insertvalue { i32, i32 } { i32 0, i32 undef }, i32 %10, 1 -// CHECK-NEXT: ret { i32, i32 } %11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %12 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %13 = load i32, ptr %12, align 4 -// CHECK-NEXT: %14 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %15 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds %main.Inspector, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %17 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %16, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds %main.Cursor, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %19 = load i32, ptr %18, align 4 -// CHECK-NEXT: %20 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 0 -// CHECK-NEXT: %21 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 1 -// CHECK-NEXT: %22 = sext i32 %19 to i64 -// CHECK-NEXT: %23 = icmp slt i64 %22, 0 -// CHECK-NEXT: %24 = icmp uge i64 %22, %21 -// CHECK-NEXT: %25 = or i1 %24, %23 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %25, i64 %22, i1 true, i64 %21) -// CHECK-NEXT: %26 = getelementptr inbounds %main.event, ptr %20, i64 %22 -// CHECK-NEXT: %27 = getelementptr inbounds %main.event, ptr %26, i32 0, i32 2 -// CHECK-NEXT: %28 = load i32, ptr %27, align 4 -// CHECK-NEXT: %29 = add i32 %28, 1 -// CHECK-NEXT: %30 = insertvalue { i32, i32 } undef, i32 %13, 0 -// CHECK-NEXT: %31 = insertvalue { i32, i32 } %30, i32 %29, 1 -// CHECK-NEXT: ret { i32, i32 } %31 -// CHECK-NEXT: } - -// CHECK-LABEL: define { %main.Cursor, i1 } @"main.(*Cursor).FindNode"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 47 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 8 }) -// CHECK-NEXT: %3 = load %main.Cursor, ptr %0, align 8 -// CHECK-NEXT: %4 = call { %main.Cursor, i1 } @main.Cursor.FindNode(%main.Cursor %3, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %5 = extractvalue { %main.Cursor, i1 } %4, 0 -// CHECK-NEXT: %6 = extractvalue { %main.Cursor, i1 } %4, 1 -// CHECK-NEXT: %7 = insertvalue { %main.Cursor, i1 } undef, %main.Cursor %5, 0 -// CHECK-NEXT: %8 = insertvalue { %main.Cursor, i1 } %7, i1 %6, 1 -// CHECK-NEXT: ret { %main.Cursor, i1 } %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*Cursor).Node"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 47 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 4 }) -// CHECK-NEXT: %2 = load %main.Cursor, ptr %0, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @main.Cursor.Node(%main.Cursor %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"iter.Seq[main.Cursor]" @"main.(*Cursor).Preorder"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 47 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 8 }) -// CHECK-NEXT: %3 = load %main.Cursor, ptr %0, align 8 -// CHECK-NEXT: %4 = call %"iter.Seq[main.Cursor]" @main.Cursor.Preorder(%main.Cursor %3, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: ret %"iter.Seq[main.Cursor]" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i32, i32 } @"main.(*Cursor).indices"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 47 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 7 }) -// CHECK-NEXT: %2 = load %main.Cursor, ptr %0, align 8 -// CHECK-NEXT: %3 = call { i32, i32 } @main.Cursor.indices(%main.Cursor %2) -// CHECK-NEXT: %4 = extractvalue { i32, i32 } %3, 0 -// CHECK-NEXT: %5 = extractvalue { i32, i32 } %3, 1 -// CHECK-NEXT: %6 = insertvalue { i32, i32 } undef, i32 %4, 0 -// CHECK-NEXT: %7 = insertvalue { i32, i32 } %6, i32 %5, 1 -// CHECK-NEXT: ret { i32, i32 } %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"go/ast.init"() -// CHECK-NEXT: call void @iter.init() -// CHECK-NEXT: call void @math.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds %main.Cursor, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: store ptr %2, ptr %1, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store %main.Cursor %0, ptr [[IDX_CURSOR:%[0-9]+]] +// CHECK: [[IDX_INDEX_FIELD:%[0-9]+]] = getelementptr inbounds %main.Cursor, ptr [[IDX_CURSOR]], i32 0, i32 1 +// CHECK-NEXT: [[IDX_INDEX:%[0-9]+]] = load i32, ptr [[IDX_INDEX_FIELD]] +// CHECK: [[IDX_ROOT:%[0-9]+]] = icmp slt i32 [[IDX_INDEX]], 0 +// CHECK: [[IDX_ALL_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}, 1 +// CHECK: [[IDX_ALL_END:%[0-9]+]] = trunc i64 [[IDX_ALL_LEN]] to i32 +// CHECK: insertvalue { i32, i32 } { i32 0, i32 undef }, i32 [[IDX_ALL_END]], 1 +// CHECK: [[IDX_PUSH:%[0-9]+]] = load i32, ptr %{{[0-9]+}} +// CHECK: [[IDX_EVENT:%[0-9]+]] = getelementptr inbounds %main.event, ptr %{{[0-9]+}}, i64 %{{[0-9]+}} +// CHECK: [[IDX_POP_PTR:%[0-9]+]] = getelementptr inbounds %main.event, ptr [[IDX_EVENT]], i32 0, i32 2 +// CHECK: [[IDX_POP:%[0-9]+]] = load i32, ptr [[IDX_POP_PTR]] +// CHECK: [[IDX_END:%[0-9]+]] = add i32 [[IDX_POP]], 1 +// CHECK: [[IDX_PAIR:%[0-9]+]] = insertvalue { i32, i32 } undef, i32 [[IDX_PUSH]], 0 +// CHECK: insertvalue { i32, i32 } [[IDX_PAIR]], i32 [[IDX_END]], 1 // CHECK-LABEL: define i64 @main.maskOf(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %2 = icmp eq i64 %1, 0 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret i64 -1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: %4 = phi i64 [ 0, %_llgo_2 ], [ %16, %_llgo_4 ] -// CHECK-NEXT: %5 = phi i64 [ -1, %_llgo_2 ], [ %6, %_llgo_4 ] -// CHECK-NEXT: %6 = add i64 %5, 1 -// CHECK-NEXT: %7 = icmp slt i64 %6, %3 -// CHECK-NEXT: br i1 %7, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %10 = icmp slt i64 %6, 0 -// CHECK-NEXT: %11 = icmp uge i64 %6, %9 -// CHECK-NEXT: %12 = or i1 %11, %10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %12, i64 %6, i1 true, i64 %9) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %8, i64 %6 -// CHECK-NEXT: %14 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %13, align 8 -// CHECK-NEXT: %15 = call i64 @main.typeOf(%"{{.*}}/runtime/internal/runtime.iface" %14) -// CHECK-NEXT: %16 = or i64 %4, %15 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: ret i64 %4 -// CHECK-NEXT: } +// CHECK: [[MASK_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: [[MASK_ALL:%[0-9]+]] = icmp eq i64 [[MASK_LEN]], 0 +// CHECK: ret i64 -1 +// CHECK: [[MASK_ACC:%[0-9]+]] = phi i64 [ 0, +// CHECK: [[MASK_NODE:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %{{[0-9]+}} +// CHECK: [[MASK_ONE:%[0-9]+]] = call i64 @main.typeOf(%"{{.*}}/runtime/internal/runtime.iface" [[MASK_NODE]]) +// CHECK: [[MASK_NEXT:%[0-9]+]] = or i64 [[MASK_ACC]], [[MASK_ONE]] +// CHECK: ret i64 [[MASK_ACC]] // CHECK-LABEL: define i64 @main.typeOf(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = icmp eq ptr %1, @"*_llgo_go/ast.Ident" -// CHECK-NEXT: br i1 %2, label %_llgo_115, label %_llgo_116 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_117 -// CHECK-NEXT: ret i64 1073741824 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_117 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %4 = icmp eq ptr %3, @"*_llgo_go/ast.ArrayType" -// CHECK-NEXT: br i1 %4, label %_llgo_118, label %_llgo_119 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_120 -// CHECK-NEXT: ret i64 1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_120 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %6 = icmp eq ptr %5, @"*_llgo_go/ast.AssignStmt" -// CHECK-NEXT: br i1 %6, label %_llgo_121, label %_llgo_122 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_123 -// CHECK-NEXT: ret i64 2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_123 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %8 = icmp eq ptr %7, @"*_llgo_go/ast.BadDecl" -// CHECK-NEXT: br i1 %8, label %_llgo_124, label %_llgo_125 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_126 -// CHECK-NEXT: ret i64 4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_126 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %10 = icmp eq ptr %9, @"*_llgo_go/ast.BadExpr" -// CHECK-NEXT: br i1 %10, label %_llgo_127, label %_llgo_128 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_129 -// CHECK-NEXT: ret i64 8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_129 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %12 = icmp eq ptr %11, @"*_llgo_go/ast.BadStmt" -// CHECK-NEXT: br i1 %12, label %_llgo_130, label %_llgo_131 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_132 -// CHECK-NEXT: ret i64 16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_132 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %14 = icmp eq ptr %13, @"*_llgo_go/ast.BasicLit" -// CHECK-NEXT: br i1 %14, label %_llgo_133, label %_llgo_134 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_135 -// CHECK-NEXT: ret i64 32 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_135 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %16 = icmp eq ptr %15, @"*_llgo_go/ast.BinaryExpr" -// CHECK-NEXT: br i1 %16, label %_llgo_136, label %_llgo_137 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_138 -// CHECK-NEXT: ret i64 64 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_138 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %18 = icmp eq ptr %17, @"*_llgo_go/ast.BlockStmt" -// CHECK-NEXT: br i1 %18, label %_llgo_139, label %_llgo_140 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_141 -// CHECK-NEXT: ret i64 128 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_141 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %20 = icmp eq ptr %19, @"*_llgo_go/ast.BranchStmt" -// CHECK-NEXT: br i1 %20, label %_llgo_142, label %_llgo_143 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_144 -// CHECK-NEXT: ret i64 256 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_144 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %22 = icmp eq ptr %21, @"*_llgo_go/ast.CallExpr" -// CHECK-NEXT: br i1 %22, label %_llgo_145, label %_llgo_146 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_147 -// CHECK-NEXT: ret i64 512 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_147 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %24 = icmp eq ptr %23, @"*_llgo_go/ast.CaseClause" -// CHECK-NEXT: br i1 %24, label %_llgo_148, label %_llgo_149 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_150 -// CHECK-NEXT: ret i64 1024 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_150 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %26 = icmp eq ptr %25, @"*_llgo_go/ast.ChanType" -// CHECK-NEXT: br i1 %26, label %_llgo_151, label %_llgo_152 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_153 -// CHECK-NEXT: ret i64 2048 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_153 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %28 = icmp eq ptr %27, @"*_llgo_go/ast.CommClause" -// CHECK-NEXT: br i1 %28, label %_llgo_154, label %_llgo_155 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_156 -// CHECK-NEXT: ret i64 4096 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_156 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %30 = icmp eq ptr %29, @"*_llgo_go/ast.Comment" -// CHECK-NEXT: br i1 %30, label %_llgo_157, label %_llgo_158 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_159 -// CHECK-NEXT: ret i64 8192 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_159 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %32 = icmp eq ptr %31, @"*_llgo_go/ast.CommentGroup" -// CHECK-NEXT: br i1 %32, label %_llgo_160, label %_llgo_161 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_162 -// CHECK-NEXT: ret i64 16384 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_162 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %34 = icmp eq ptr %33, @"*_llgo_go/ast.CompositeLit" -// CHECK-NEXT: br i1 %34, label %_llgo_163, label %_llgo_164 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_165 -// CHECK-NEXT: ret i64 32768 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_34: ; preds = %_llgo_165 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %36 = icmp eq ptr %35, @"*_llgo_go/ast.DeclStmt" -// CHECK-NEXT: br i1 %36, label %_llgo_166, label %_llgo_167 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_35: ; preds = %_llgo_168 -// CHECK-NEXT: ret i64 65536 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_36: ; preds = %_llgo_168 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %38 = icmp eq ptr %37, @"*_llgo_go/ast.DeferStmt" -// CHECK-NEXT: br i1 %38, label %_llgo_169, label %_llgo_170 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_37: ; preds = %_llgo_171 -// CHECK-NEXT: ret i64 131072 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_38: ; preds = %_llgo_171 -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %40 = icmp eq ptr %39, @"*_llgo_go/ast.Ellipsis" -// CHECK-NEXT: br i1 %40, label %_llgo_172, label %_llgo_173 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_39: ; preds = %_llgo_174 -// CHECK-NEXT: ret i64 262144 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_40: ; preds = %_llgo_174 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %42 = icmp eq ptr %41, @"*_llgo_go/ast.EmptyStmt" -// CHECK-NEXT: br i1 %42, label %_llgo_175, label %_llgo_176 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_41: ; preds = %_llgo_177 -// CHECK-NEXT: ret i64 524288 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_42: ; preds = %_llgo_177 -// CHECK-NEXT: %43 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %44 = icmp eq ptr %43, @"*_llgo_go/ast.ExprStmt" -// CHECK-NEXT: br i1 %44, label %_llgo_178, label %_llgo_179 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_43: ; preds = %_llgo_180 -// CHECK-NEXT: ret i64 1048576 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_44: ; preds = %_llgo_180 -// CHECK-NEXT: %45 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %46 = icmp eq ptr %45, @"*_llgo_go/ast.Field" -// CHECK-NEXT: br i1 %46, label %_llgo_181, label %_llgo_182 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_45: ; preds = %_llgo_183 -// CHECK-NEXT: ret i64 2097152 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_46: ; preds = %_llgo_183 -// CHECK-NEXT: %47 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %48 = icmp eq ptr %47, @"*_llgo_go/ast.FieldList" -// CHECK-NEXT: br i1 %48, label %_llgo_184, label %_llgo_185 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_47: ; preds = %_llgo_186 -// CHECK-NEXT: ret i64 4194304 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_48: ; preds = %_llgo_186 -// CHECK-NEXT: %49 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %50 = icmp eq ptr %49, @"*_llgo_go/ast.File" -// CHECK-NEXT: br i1 %50, label %_llgo_187, label %_llgo_188 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_49: ; preds = %_llgo_189 -// CHECK-NEXT: ret i64 8388608 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_50: ; preds = %_llgo_189 -// CHECK-NEXT: %51 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %52 = icmp eq ptr %51, @"*_llgo_go/ast.ForStmt" -// CHECK-NEXT: br i1 %52, label %_llgo_190, label %_llgo_191 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_51: ; preds = %_llgo_192 -// CHECK-NEXT: ret i64 16777216 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_52: ; preds = %_llgo_192 -// CHECK-NEXT: %53 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %54 = icmp eq ptr %53, @"*_llgo_go/ast.FuncDecl" -// CHECK-NEXT: br i1 %54, label %_llgo_193, label %_llgo_194 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_53: ; preds = %_llgo_195 -// CHECK-NEXT: ret i64 33554432 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_54: ; preds = %_llgo_195 -// CHECK-NEXT: %55 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %56 = icmp eq ptr %55, @"*_llgo_go/ast.FuncLit" -// CHECK-NEXT: br i1 %56, label %_llgo_196, label %_llgo_197 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_55: ; preds = %_llgo_198 -// CHECK-NEXT: ret i64 67108864 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_56: ; preds = %_llgo_198 -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %58 = icmp eq ptr %57, @"*_llgo_go/ast.FuncType" -// CHECK-NEXT: br i1 %58, label %_llgo_199, label %_llgo_200 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_57: ; preds = %_llgo_201 -// CHECK-NEXT: ret i64 134217728 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_58: ; preds = %_llgo_201 -// CHECK-NEXT: %59 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %60 = icmp eq ptr %59, @"*_llgo_go/ast.GenDecl" -// CHECK-NEXT: br i1 %60, label %_llgo_202, label %_llgo_203 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_59: ; preds = %_llgo_204 -// CHECK-NEXT: ret i64 268435456 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_60: ; preds = %_llgo_204 -// CHECK-NEXT: %61 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %62 = icmp eq ptr %61, @"*_llgo_go/ast.GoStmt" -// CHECK-NEXT: br i1 %62, label %_llgo_205, label %_llgo_206 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_61: ; preds = %_llgo_207 -// CHECK-NEXT: ret i64 536870912 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_62: ; preds = %_llgo_207 -// CHECK-NEXT: %63 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %64 = icmp eq ptr %63, @"*_llgo_go/ast.Ident" -// CHECK-NEXT: br i1 %64, label %_llgo_208, label %_llgo_209 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_63: ; preds = %_llgo_210 -// CHECK-NEXT: ret i64 1073741824 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_64: ; preds = %_llgo_210 -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %66 = icmp eq ptr %65, @"*_llgo_go/ast.IfStmt" -// CHECK-NEXT: br i1 %66, label %_llgo_211, label %_llgo_212 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_65: ; preds = %_llgo_213 -// CHECK-NEXT: ret i64 2147483648 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_66: ; preds = %_llgo_213 -// CHECK-NEXT: %67 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %68 = icmp eq ptr %67, @"*_llgo_go/ast.ImportSpec" -// CHECK-NEXT: br i1 %68, label %_llgo_214, label %_llgo_215 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_67: ; preds = %_llgo_216 -// CHECK-NEXT: ret i64 4294967296 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_68: ; preds = %_llgo_216 -// CHECK-NEXT: %69 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %70 = icmp eq ptr %69, @"*_llgo_go/ast.IncDecStmt" -// CHECK-NEXT: br i1 %70, label %_llgo_217, label %_llgo_218 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_69: ; preds = %_llgo_219 -// CHECK-NEXT: ret i64 8589934592 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_70: ; preds = %_llgo_219 -// CHECK-NEXT: %71 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %72 = icmp eq ptr %71, @"*_llgo_go/ast.IndexExpr" -// CHECK-NEXT: br i1 %72, label %_llgo_220, label %_llgo_221 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_71: ; preds = %_llgo_222 -// CHECK-NEXT: ret i64 17179869184 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_72: ; preds = %_llgo_222 -// CHECK-NEXT: %73 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %74 = icmp eq ptr %73, @"*_llgo_go/ast.IndexListExpr" -// CHECK-NEXT: br i1 %74, label %_llgo_223, label %_llgo_224 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_73: ; preds = %_llgo_225 -// CHECK-NEXT: ret i64 34359738368 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_74: ; preds = %_llgo_225 -// CHECK-NEXT: %75 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %76 = icmp eq ptr %75, @"*_llgo_go/ast.InterfaceType" -// CHECK-NEXT: br i1 %76, label %_llgo_226, label %_llgo_227 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_75: ; preds = %_llgo_228 -// CHECK-NEXT: ret i64 68719476736 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_76: ; preds = %_llgo_228 -// CHECK-NEXT: %77 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %78 = icmp eq ptr %77, @"*_llgo_go/ast.KeyValueExpr" -// CHECK-NEXT: br i1 %78, label %_llgo_229, label %_llgo_230 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_77: ; preds = %_llgo_231 -// CHECK-NEXT: ret i64 137438953472 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_78: ; preds = %_llgo_231 -// CHECK-NEXT: %79 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %80 = icmp eq ptr %79, @"*_llgo_go/ast.LabeledStmt" -// CHECK-NEXT: br i1 %80, label %_llgo_232, label %_llgo_233 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_79: ; preds = %_llgo_234 -// CHECK-NEXT: ret i64 274877906944 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_80: ; preds = %_llgo_234 -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %82 = icmp eq ptr %81, @"*_llgo_go/ast.MapType" -// CHECK-NEXT: br i1 %82, label %_llgo_235, label %_llgo_236 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_81: ; preds = %_llgo_237 -// CHECK-NEXT: ret i64 549755813888 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_82: ; preds = %_llgo_237 -// CHECK-NEXT: %83 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %84 = icmp eq ptr %83, @"*_llgo_go/ast.Package" -// CHECK-NEXT: br i1 %84, label %_llgo_238, label %_llgo_239 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_83: ; preds = %_llgo_240 -// CHECK-NEXT: ret i64 1099511627776 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_84: ; preds = %_llgo_240 -// CHECK-NEXT: %85 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %86 = icmp eq ptr %85, @"*_llgo_go/ast.ParenExpr" -// CHECK-NEXT: br i1 %86, label %_llgo_241, label %_llgo_242 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_85: ; preds = %_llgo_243 -// CHECK-NEXT: ret i64 2199023255552 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_86: ; preds = %_llgo_243 -// CHECK-NEXT: %87 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %88 = icmp eq ptr %87, @"*_llgo_go/ast.RangeStmt" -// CHECK-NEXT: br i1 %88, label %_llgo_244, label %_llgo_245 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_87: ; preds = %_llgo_246 -// CHECK-NEXT: ret i64 4398046511104 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_88: ; preds = %_llgo_246 -// CHECK-NEXT: %89 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %90 = icmp eq ptr %89, @"*_llgo_go/ast.ReturnStmt" -// CHECK-NEXT: br i1 %90, label %_llgo_247, label %_llgo_248 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_89: ; preds = %_llgo_249 -// CHECK-NEXT: ret i64 8796093022208 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_90: ; preds = %_llgo_249 -// CHECK-NEXT: %91 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %92 = icmp eq ptr %91, @"*_llgo_go/ast.SelectStmt" -// CHECK-NEXT: br i1 %92, label %_llgo_250, label %_llgo_251 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_91: ; preds = %_llgo_252 -// CHECK-NEXT: ret i64 17592186044416 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_92: ; preds = %_llgo_252 -// CHECK-NEXT: %93 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %94 = icmp eq ptr %93, @"*_llgo_go/ast.SelectorExpr" -// CHECK-NEXT: br i1 %94, label %_llgo_253, label %_llgo_254 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_93: ; preds = %_llgo_255 -// CHECK-NEXT: ret i64 35184372088832 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_94: ; preds = %_llgo_255 -// CHECK-NEXT: %95 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %96 = icmp eq ptr %95, @"*_llgo_go/ast.SendStmt" -// CHECK-NEXT: br i1 %96, label %_llgo_256, label %_llgo_257 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_95: ; preds = %_llgo_258 -// CHECK-NEXT: ret i64 70368744177664 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_96: ; preds = %_llgo_258 -// CHECK-NEXT: %97 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %98 = icmp eq ptr %97, @"*_llgo_go/ast.SliceExpr" -// CHECK-NEXT: br i1 %98, label %_llgo_259, label %_llgo_260 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_97: ; preds = %_llgo_261 -// CHECK-NEXT: ret i64 140737488355328 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_98: ; preds = %_llgo_261 -// CHECK-NEXT: %99 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %100 = icmp eq ptr %99, @"*_llgo_go/ast.StarExpr" -// CHECK-NEXT: br i1 %100, label %_llgo_262, label %_llgo_263 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_99: ; preds = %_llgo_264 -// CHECK-NEXT: ret i64 281474976710656 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_100: ; preds = %_llgo_264 -// CHECK-NEXT: %101 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %102 = icmp eq ptr %101, @"*_llgo_go/ast.StructType" -// CHECK-NEXT: br i1 %102, label %_llgo_265, label %_llgo_266 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_101: ; preds = %_llgo_267 -// CHECK-NEXT: ret i64 562949953421312 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_102: ; preds = %_llgo_267 -// CHECK-NEXT: %103 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %104 = icmp eq ptr %103, @"*_llgo_go/ast.SwitchStmt" -// CHECK-NEXT: br i1 %104, label %_llgo_268, label %_llgo_269 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_103: ; preds = %_llgo_270 -// CHECK-NEXT: ret i64 1125899906842624 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_104: ; preds = %_llgo_270 -// CHECK-NEXT: %105 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %106 = icmp eq ptr %105, @"*_llgo_go/ast.TypeAssertExpr" -// CHECK-NEXT: br i1 %106, label %_llgo_271, label %_llgo_272 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_105: ; preds = %_llgo_273 -// CHECK-NEXT: ret i64 2251799813685248 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_106: ; preds = %_llgo_273 -// CHECK-NEXT: %107 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %108 = icmp eq ptr %107, @"*_llgo_go/ast.TypeSpec" -// CHECK-NEXT: br i1 %108, label %_llgo_274, label %_llgo_275 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_107: ; preds = %_llgo_276 -// CHECK-NEXT: ret i64 4503599627370496 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_108: ; preds = %_llgo_276 -// CHECK-NEXT: %109 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %110 = icmp eq ptr %109, @"*_llgo_go/ast.TypeSwitchStmt" -// CHECK-NEXT: br i1 %110, label %_llgo_277, label %_llgo_278 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_109: ; preds = %_llgo_279 -// CHECK-NEXT: ret i64 9007199254740992 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_110: ; preds = %_llgo_279 -// CHECK-NEXT: %111 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %112 = icmp eq ptr %111, @"*_llgo_go/ast.UnaryExpr" -// CHECK-NEXT: br i1 %112, label %_llgo_280, label %_llgo_281 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_111: ; preds = %_llgo_282 -// CHECK-NEXT: ret i64 18014398509481984 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_112: ; preds = %_llgo_282 -// CHECK-NEXT: %113 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %114 = icmp eq ptr %113, @"*_llgo_go/ast.ValueSpec" -// CHECK-NEXT: br i1 %114, label %_llgo_283, label %_llgo_284 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_113: ; preds = %_llgo_285 -// CHECK-NEXT: ret i64 36028797018963968 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_114: ; preds = %_llgo_285 -// CHECK-NEXT: ret i64 0 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_115: ; preds = %_llgo_0 -// CHECK-NEXT: %115 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %116 = insertvalue { ptr, i1 } undef, ptr %115, 0 -// CHECK-NEXT: %117 = insertvalue { ptr, i1 } %116, i1 true, 1 -// CHECK-NEXT: br label %_llgo_117 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_116: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_117 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_117: ; preds = %_llgo_116, %_llgo_115 -// CHECK-NEXT: %118 = phi { ptr, i1 } [ %117, %_llgo_115 ], [ zeroinitializer, %_llgo_116 ] -// CHECK-NEXT: %119 = extractvalue { ptr, i1 } %118, 0 -// CHECK-NEXT: %120 = extractvalue { ptr, i1 } %118, 1 -// CHECK-NEXT: br i1 %120, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_118: ; preds = %_llgo_2 -// CHECK-NEXT: %121 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %122 = insertvalue { ptr, i1 } undef, ptr %121, 0 -// CHECK-NEXT: %123 = insertvalue { ptr, i1 } %122, i1 true, 1 -// CHECK-NEXT: br label %_llgo_120 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_119: ; preds = %_llgo_2 -// CHECK-NEXT: br label %_llgo_120 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_120: ; preds = %_llgo_119, %_llgo_118 -// CHECK-NEXT: %124 = phi { ptr, i1 } [ %123, %_llgo_118 ], [ zeroinitializer, %_llgo_119 ] -// CHECK-NEXT: %125 = extractvalue { ptr, i1 } %124, 0 -// CHECK-NEXT: %126 = extractvalue { ptr, i1 } %124, 1 -// CHECK-NEXT: br i1 %126, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_121: ; preds = %_llgo_4 -// CHECK-NEXT: %127 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %128 = insertvalue { ptr, i1 } undef, ptr %127, 0 -// CHECK-NEXT: %129 = insertvalue { ptr, i1 } %128, i1 true, 1 -// CHECK-NEXT: br label %_llgo_123 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_122: ; preds = %_llgo_4 -// CHECK-NEXT: br label %_llgo_123 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_123: ; preds = %_llgo_122, %_llgo_121 -// CHECK-NEXT: %130 = phi { ptr, i1 } [ %129, %_llgo_121 ], [ zeroinitializer, %_llgo_122 ] -// CHECK-NEXT: %131 = extractvalue { ptr, i1 } %130, 0 -// CHECK-NEXT: %132 = extractvalue { ptr, i1 } %130, 1 -// CHECK-NEXT: br i1 %132, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_124: ; preds = %_llgo_6 -// CHECK-NEXT: %133 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %134 = insertvalue { ptr, i1 } undef, ptr %133, 0 -// CHECK-NEXT: %135 = insertvalue { ptr, i1 } %134, i1 true, 1 -// CHECK-NEXT: br label %_llgo_126 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_125: ; preds = %_llgo_6 -// CHECK-NEXT: br label %_llgo_126 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_126: ; preds = %_llgo_125, %_llgo_124 -// CHECK-NEXT: %136 = phi { ptr, i1 } [ %135, %_llgo_124 ], [ zeroinitializer, %_llgo_125 ] -// CHECK-NEXT: %137 = extractvalue { ptr, i1 } %136, 0 -// CHECK-NEXT: %138 = extractvalue { ptr, i1 } %136, 1 -// CHECK-NEXT: br i1 %138, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_127: ; preds = %_llgo_8 -// CHECK-NEXT: %139 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %140 = insertvalue { ptr, i1 } undef, ptr %139, 0 -// CHECK-NEXT: %141 = insertvalue { ptr, i1 } %140, i1 true, 1 -// CHECK-NEXT: br label %_llgo_129 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_128: ; preds = %_llgo_8 -// CHECK-NEXT: br label %_llgo_129 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_129: ; preds = %_llgo_128, %_llgo_127 -// CHECK-NEXT: %142 = phi { ptr, i1 } [ %141, %_llgo_127 ], [ zeroinitializer, %_llgo_128 ] -// CHECK-NEXT: %143 = extractvalue { ptr, i1 } %142, 0 -// CHECK-NEXT: %144 = extractvalue { ptr, i1 } %142, 1 -// CHECK-NEXT: br i1 %144, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_130: ; preds = %_llgo_10 -// CHECK-NEXT: %145 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %146 = insertvalue { ptr, i1 } undef, ptr %145, 0 -// CHECK-NEXT: %147 = insertvalue { ptr, i1 } %146, i1 true, 1 -// CHECK-NEXT: br label %_llgo_132 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_131: ; preds = %_llgo_10 -// CHECK-NEXT: br label %_llgo_132 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_132: ; preds = %_llgo_131, %_llgo_130 -// CHECK-NEXT: %148 = phi { ptr, i1 } [ %147, %_llgo_130 ], [ zeroinitializer, %_llgo_131 ] -// CHECK-NEXT: %149 = extractvalue { ptr, i1 } %148, 0 -// CHECK-NEXT: %150 = extractvalue { ptr, i1 } %148, 1 -// CHECK-NEXT: br i1 %150, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_133: ; preds = %_llgo_12 -// CHECK-NEXT: %151 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %152 = insertvalue { ptr, i1 } undef, ptr %151, 0 -// CHECK-NEXT: %153 = insertvalue { ptr, i1 } %152, i1 true, 1 -// CHECK-NEXT: br label %_llgo_135 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_134: ; preds = %_llgo_12 -// CHECK-NEXT: br label %_llgo_135 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_135: ; preds = %_llgo_134, %_llgo_133 -// CHECK-NEXT: %154 = phi { ptr, i1 } [ %153, %_llgo_133 ], [ zeroinitializer, %_llgo_134 ] -// CHECK-NEXT: %155 = extractvalue { ptr, i1 } %154, 0 -// CHECK-NEXT: %156 = extractvalue { ptr, i1 } %154, 1 -// CHECK-NEXT: br i1 %156, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_136: ; preds = %_llgo_14 -// CHECK-NEXT: %157 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %158 = insertvalue { ptr, i1 } undef, ptr %157, 0 -// CHECK-NEXT: %159 = insertvalue { ptr, i1 } %158, i1 true, 1 -// CHECK-NEXT: br label %_llgo_138 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_137: ; preds = %_llgo_14 -// CHECK-NEXT: br label %_llgo_138 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_138: ; preds = %_llgo_137, %_llgo_136 -// CHECK-NEXT: %160 = phi { ptr, i1 } [ %159, %_llgo_136 ], [ zeroinitializer, %_llgo_137 ] -// CHECK-NEXT: %161 = extractvalue { ptr, i1 } %160, 0 -// CHECK-NEXT: %162 = extractvalue { ptr, i1 } %160, 1 -// CHECK-NEXT: br i1 %162, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_139: ; preds = %_llgo_16 -// CHECK-NEXT: %163 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %164 = insertvalue { ptr, i1 } undef, ptr %163, 0 -// CHECK-NEXT: %165 = insertvalue { ptr, i1 } %164, i1 true, 1 -// CHECK-NEXT: br label %_llgo_141 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_140: ; preds = %_llgo_16 -// CHECK-NEXT: br label %_llgo_141 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_141: ; preds = %_llgo_140, %_llgo_139 -// CHECK-NEXT: %166 = phi { ptr, i1 } [ %165, %_llgo_139 ], [ zeroinitializer, %_llgo_140 ] -// CHECK-NEXT: %167 = extractvalue { ptr, i1 } %166, 0 -// CHECK-NEXT: %168 = extractvalue { ptr, i1 } %166, 1 -// CHECK-NEXT: br i1 %168, label %_llgo_17, label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_142: ; preds = %_llgo_18 -// CHECK-NEXT: %169 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %170 = insertvalue { ptr, i1 } undef, ptr %169, 0 -// CHECK-NEXT: %171 = insertvalue { ptr, i1 } %170, i1 true, 1 -// CHECK-NEXT: br label %_llgo_144 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_143: ; preds = %_llgo_18 -// CHECK-NEXT: br label %_llgo_144 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_144: ; preds = %_llgo_143, %_llgo_142 -// CHECK-NEXT: %172 = phi { ptr, i1 } [ %171, %_llgo_142 ], [ zeroinitializer, %_llgo_143 ] -// CHECK-NEXT: %173 = extractvalue { ptr, i1 } %172, 0 -// CHECK-NEXT: %174 = extractvalue { ptr, i1 } %172, 1 -// CHECK-NEXT: br i1 %174, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_145: ; preds = %_llgo_20 -// CHECK-NEXT: %175 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %176 = insertvalue { ptr, i1 } undef, ptr %175, 0 -// CHECK-NEXT: %177 = insertvalue { ptr, i1 } %176, i1 true, 1 -// CHECK-NEXT: br label %_llgo_147 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_146: ; preds = %_llgo_20 -// CHECK-NEXT: br label %_llgo_147 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_147: ; preds = %_llgo_146, %_llgo_145 -// CHECK-NEXT: %178 = phi { ptr, i1 } [ %177, %_llgo_145 ], [ zeroinitializer, %_llgo_146 ] -// CHECK-NEXT: %179 = extractvalue { ptr, i1 } %178, 0 -// CHECK-NEXT: %180 = extractvalue { ptr, i1 } %178, 1 -// CHECK-NEXT: br i1 %180, label %_llgo_21, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_148: ; preds = %_llgo_22 -// CHECK-NEXT: %181 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %182 = insertvalue { ptr, i1 } undef, ptr %181, 0 -// CHECK-NEXT: %183 = insertvalue { ptr, i1 } %182, i1 true, 1 -// CHECK-NEXT: br label %_llgo_150 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_149: ; preds = %_llgo_22 -// CHECK-NEXT: br label %_llgo_150 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_150: ; preds = %_llgo_149, %_llgo_148 -// CHECK-NEXT: %184 = phi { ptr, i1 } [ %183, %_llgo_148 ], [ zeroinitializer, %_llgo_149 ] -// CHECK-NEXT: %185 = extractvalue { ptr, i1 } %184, 0 -// CHECK-NEXT: %186 = extractvalue { ptr, i1 } %184, 1 -// CHECK-NEXT: br i1 %186, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_151: ; preds = %_llgo_24 -// CHECK-NEXT: %187 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %188 = insertvalue { ptr, i1 } undef, ptr %187, 0 -// CHECK-NEXT: %189 = insertvalue { ptr, i1 } %188, i1 true, 1 -// CHECK-NEXT: br label %_llgo_153 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_152: ; preds = %_llgo_24 -// CHECK-NEXT: br label %_llgo_153 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_153: ; preds = %_llgo_152, %_llgo_151 -// CHECK-NEXT: %190 = phi { ptr, i1 } [ %189, %_llgo_151 ], [ zeroinitializer, %_llgo_152 ] -// CHECK-NEXT: %191 = extractvalue { ptr, i1 } %190, 0 -// CHECK-NEXT: %192 = extractvalue { ptr, i1 } %190, 1 -// CHECK-NEXT: br i1 %192, label %_llgo_25, label %_llgo_26 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_154: ; preds = %_llgo_26 -// CHECK-NEXT: %193 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %194 = insertvalue { ptr, i1 } undef, ptr %193, 0 -// CHECK-NEXT: %195 = insertvalue { ptr, i1 } %194, i1 true, 1 -// CHECK-NEXT: br label %_llgo_156 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_155: ; preds = %_llgo_26 -// CHECK-NEXT: br label %_llgo_156 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_156: ; preds = %_llgo_155, %_llgo_154 -// CHECK-NEXT: %196 = phi { ptr, i1 } [ %195, %_llgo_154 ], [ zeroinitializer, %_llgo_155 ] -// CHECK-NEXT: %197 = extractvalue { ptr, i1 } %196, 0 -// CHECK-NEXT: %198 = extractvalue { ptr, i1 } %196, 1 -// CHECK-NEXT: br i1 %198, label %_llgo_27, label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_157: ; preds = %_llgo_28 -// CHECK-NEXT: %199 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %200 = insertvalue { ptr, i1 } undef, ptr %199, 0 -// CHECK-NEXT: %201 = insertvalue { ptr, i1 } %200, i1 true, 1 -// CHECK-NEXT: br label %_llgo_159 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_158: ; preds = %_llgo_28 -// CHECK-NEXT: br label %_llgo_159 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_159: ; preds = %_llgo_158, %_llgo_157 -// CHECK-NEXT: %202 = phi { ptr, i1 } [ %201, %_llgo_157 ], [ zeroinitializer, %_llgo_158 ] -// CHECK-NEXT: %203 = extractvalue { ptr, i1 } %202, 0 -// CHECK-NEXT: %204 = extractvalue { ptr, i1 } %202, 1 -// CHECK-NEXT: br i1 %204, label %_llgo_29, label %_llgo_30 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_160: ; preds = %_llgo_30 -// CHECK-NEXT: %205 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %206 = insertvalue { ptr, i1 } undef, ptr %205, 0 -// CHECK-NEXT: %207 = insertvalue { ptr, i1 } %206, i1 true, 1 -// CHECK-NEXT: br label %_llgo_162 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_161: ; preds = %_llgo_30 -// CHECK-NEXT: br label %_llgo_162 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_162: ; preds = %_llgo_161, %_llgo_160 -// CHECK-NEXT: %208 = phi { ptr, i1 } [ %207, %_llgo_160 ], [ zeroinitializer, %_llgo_161 ] -// CHECK-NEXT: %209 = extractvalue { ptr, i1 } %208, 0 -// CHECK-NEXT: %210 = extractvalue { ptr, i1 } %208, 1 -// CHECK-NEXT: br i1 %210, label %_llgo_31, label %_llgo_32 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_163: ; preds = %_llgo_32 -// CHECK-NEXT: %211 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %212 = insertvalue { ptr, i1 } undef, ptr %211, 0 -// CHECK-NEXT: %213 = insertvalue { ptr, i1 } %212, i1 true, 1 -// CHECK-NEXT: br label %_llgo_165 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_164: ; preds = %_llgo_32 -// CHECK-NEXT: br label %_llgo_165 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_165: ; preds = %_llgo_164, %_llgo_163 -// CHECK-NEXT: %214 = phi { ptr, i1 } [ %213, %_llgo_163 ], [ zeroinitializer, %_llgo_164 ] -// CHECK-NEXT: %215 = extractvalue { ptr, i1 } %214, 0 -// CHECK-NEXT: %216 = extractvalue { ptr, i1 } %214, 1 -// CHECK-NEXT: br i1 %216, label %_llgo_33, label %_llgo_34 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_166: ; preds = %_llgo_34 -// CHECK-NEXT: %217 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %218 = insertvalue { ptr, i1 } undef, ptr %217, 0 -// CHECK-NEXT: %219 = insertvalue { ptr, i1 } %218, i1 true, 1 -// CHECK-NEXT: br label %_llgo_168 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_167: ; preds = %_llgo_34 -// CHECK-NEXT: br label %_llgo_168 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_168: ; preds = %_llgo_167, %_llgo_166 -// CHECK-NEXT: %220 = phi { ptr, i1 } [ %219, %_llgo_166 ], [ zeroinitializer, %_llgo_167 ] -// CHECK-NEXT: %221 = extractvalue { ptr, i1 } %220, 0 -// CHECK-NEXT: %222 = extractvalue { ptr, i1 } %220, 1 -// CHECK-NEXT: br i1 %222, label %_llgo_35, label %_llgo_36 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_169: ; preds = %_llgo_36 -// CHECK-NEXT: %223 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %224 = insertvalue { ptr, i1 } undef, ptr %223, 0 -// CHECK-NEXT: %225 = insertvalue { ptr, i1 } %224, i1 true, 1 -// CHECK-NEXT: br label %_llgo_171 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_170: ; preds = %_llgo_36 -// CHECK-NEXT: br label %_llgo_171 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_171: ; preds = %_llgo_170, %_llgo_169 -// CHECK-NEXT: %226 = phi { ptr, i1 } [ %225, %_llgo_169 ], [ zeroinitializer, %_llgo_170 ] -// CHECK-NEXT: %227 = extractvalue { ptr, i1 } %226, 0 -// CHECK-NEXT: %228 = extractvalue { ptr, i1 } %226, 1 -// CHECK-NEXT: br i1 %228, label %_llgo_37, label %_llgo_38 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_172: ; preds = %_llgo_38 -// CHECK-NEXT: %229 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %230 = insertvalue { ptr, i1 } undef, ptr %229, 0 -// CHECK-NEXT: %231 = insertvalue { ptr, i1 } %230, i1 true, 1 -// CHECK-NEXT: br label %_llgo_174 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_173: ; preds = %_llgo_38 -// CHECK-NEXT: br label %_llgo_174 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_174: ; preds = %_llgo_173, %_llgo_172 -// CHECK-NEXT: %232 = phi { ptr, i1 } [ %231, %_llgo_172 ], [ zeroinitializer, %_llgo_173 ] -// CHECK-NEXT: %233 = extractvalue { ptr, i1 } %232, 0 -// CHECK-NEXT: %234 = extractvalue { ptr, i1 } %232, 1 -// CHECK-NEXT: br i1 %234, label %_llgo_39, label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_175: ; preds = %_llgo_40 -// CHECK-NEXT: %235 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %236 = insertvalue { ptr, i1 } undef, ptr %235, 0 -// CHECK-NEXT: %237 = insertvalue { ptr, i1 } %236, i1 true, 1 -// CHECK-NEXT: br label %_llgo_177 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_176: ; preds = %_llgo_40 -// CHECK-NEXT: br label %_llgo_177 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_177: ; preds = %_llgo_176, %_llgo_175 -// CHECK-NEXT: %238 = phi { ptr, i1 } [ %237, %_llgo_175 ], [ zeroinitializer, %_llgo_176 ] -// CHECK-NEXT: %239 = extractvalue { ptr, i1 } %238, 0 -// CHECK-NEXT: %240 = extractvalue { ptr, i1 } %238, 1 -// CHECK-NEXT: br i1 %240, label %_llgo_41, label %_llgo_42 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_178: ; preds = %_llgo_42 -// CHECK-NEXT: %241 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %242 = insertvalue { ptr, i1 } undef, ptr %241, 0 -// CHECK-NEXT: %243 = insertvalue { ptr, i1 } %242, i1 true, 1 -// CHECK-NEXT: br label %_llgo_180 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_179: ; preds = %_llgo_42 -// CHECK-NEXT: br label %_llgo_180 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_180: ; preds = %_llgo_179, %_llgo_178 -// CHECK-NEXT: %244 = phi { ptr, i1 } [ %243, %_llgo_178 ], [ zeroinitializer, %_llgo_179 ] -// CHECK-NEXT: %245 = extractvalue { ptr, i1 } %244, 0 -// CHECK-NEXT: %246 = extractvalue { ptr, i1 } %244, 1 -// CHECK-NEXT: br i1 %246, label %_llgo_43, label %_llgo_44 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_181: ; preds = %_llgo_44 -// CHECK-NEXT: %247 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %248 = insertvalue { ptr, i1 } undef, ptr %247, 0 -// CHECK-NEXT: %249 = insertvalue { ptr, i1 } %248, i1 true, 1 -// CHECK-NEXT: br label %_llgo_183 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_182: ; preds = %_llgo_44 -// CHECK-NEXT: br label %_llgo_183 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_183: ; preds = %_llgo_182, %_llgo_181 -// CHECK-NEXT: %250 = phi { ptr, i1 } [ %249, %_llgo_181 ], [ zeroinitializer, %_llgo_182 ] -// CHECK-NEXT: %251 = extractvalue { ptr, i1 } %250, 0 -// CHECK-NEXT: %252 = extractvalue { ptr, i1 } %250, 1 -// CHECK-NEXT: br i1 %252, label %_llgo_45, label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_184: ; preds = %_llgo_46 -// CHECK-NEXT: %253 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %254 = insertvalue { ptr, i1 } undef, ptr %253, 0 -// CHECK-NEXT: %255 = insertvalue { ptr, i1 } %254, i1 true, 1 -// CHECK-NEXT: br label %_llgo_186 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_185: ; preds = %_llgo_46 -// CHECK-NEXT: br label %_llgo_186 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_186: ; preds = %_llgo_185, %_llgo_184 -// CHECK-NEXT: %256 = phi { ptr, i1 } [ %255, %_llgo_184 ], [ zeroinitializer, %_llgo_185 ] -// CHECK-NEXT: %257 = extractvalue { ptr, i1 } %256, 0 -// CHECK-NEXT: %258 = extractvalue { ptr, i1 } %256, 1 -// CHECK-NEXT: br i1 %258, label %_llgo_47, label %_llgo_48 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_187: ; preds = %_llgo_48 -// CHECK-NEXT: %259 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %260 = insertvalue { ptr, i1 } undef, ptr %259, 0 -// CHECK-NEXT: %261 = insertvalue { ptr, i1 } %260, i1 true, 1 -// CHECK-NEXT: br label %_llgo_189 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_188: ; preds = %_llgo_48 -// CHECK-NEXT: br label %_llgo_189 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_189: ; preds = %_llgo_188, %_llgo_187 -// CHECK-NEXT: %262 = phi { ptr, i1 } [ %261, %_llgo_187 ], [ zeroinitializer, %_llgo_188 ] -// CHECK-NEXT: %263 = extractvalue { ptr, i1 } %262, 0 -// CHECK-NEXT: %264 = extractvalue { ptr, i1 } %262, 1 -// CHECK-NEXT: br i1 %264, label %_llgo_49, label %_llgo_50 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_190: ; preds = %_llgo_50 -// CHECK-NEXT: %265 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %266 = insertvalue { ptr, i1 } undef, ptr %265, 0 -// CHECK-NEXT: %267 = insertvalue { ptr, i1 } %266, i1 true, 1 -// CHECK-NEXT: br label %_llgo_192 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_191: ; preds = %_llgo_50 -// CHECK-NEXT: br label %_llgo_192 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_192: ; preds = %_llgo_191, %_llgo_190 -// CHECK-NEXT: %268 = phi { ptr, i1 } [ %267, %_llgo_190 ], [ zeroinitializer, %_llgo_191 ] -// CHECK-NEXT: %269 = extractvalue { ptr, i1 } %268, 0 -// CHECK-NEXT: %270 = extractvalue { ptr, i1 } %268, 1 -// CHECK-NEXT: br i1 %270, label %_llgo_51, label %_llgo_52 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_193: ; preds = %_llgo_52 -// CHECK-NEXT: %271 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %272 = insertvalue { ptr, i1 } undef, ptr %271, 0 -// CHECK-NEXT: %273 = insertvalue { ptr, i1 } %272, i1 true, 1 -// CHECK-NEXT: br label %_llgo_195 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_194: ; preds = %_llgo_52 -// CHECK-NEXT: br label %_llgo_195 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_195: ; preds = %_llgo_194, %_llgo_193 -// CHECK-NEXT: %274 = phi { ptr, i1 } [ %273, %_llgo_193 ], [ zeroinitializer, %_llgo_194 ] -// CHECK-NEXT: %275 = extractvalue { ptr, i1 } %274, 0 -// CHECK-NEXT: %276 = extractvalue { ptr, i1 } %274, 1 -// CHECK-NEXT: br i1 %276, label %_llgo_53, label %_llgo_54 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_196: ; preds = %_llgo_54 -// CHECK-NEXT: %277 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %278 = insertvalue { ptr, i1 } undef, ptr %277, 0 -// CHECK-NEXT: %279 = insertvalue { ptr, i1 } %278, i1 true, 1 -// CHECK-NEXT: br label %_llgo_198 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_197: ; preds = %_llgo_54 -// CHECK-NEXT: br label %_llgo_198 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_198: ; preds = %_llgo_197, %_llgo_196 -// CHECK-NEXT: %280 = phi { ptr, i1 } [ %279, %_llgo_196 ], [ zeroinitializer, %_llgo_197 ] -// CHECK-NEXT: %281 = extractvalue { ptr, i1 } %280, 0 -// CHECK-NEXT: %282 = extractvalue { ptr, i1 } %280, 1 -// CHECK-NEXT: br i1 %282, label %_llgo_55, label %_llgo_56 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_199: ; preds = %_llgo_56 -// CHECK-NEXT: %283 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %284 = insertvalue { ptr, i1 } undef, ptr %283, 0 -// CHECK-NEXT: %285 = insertvalue { ptr, i1 } %284, i1 true, 1 -// CHECK-NEXT: br label %_llgo_201 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_200: ; preds = %_llgo_56 -// CHECK-NEXT: br label %_llgo_201 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_201: ; preds = %_llgo_200, %_llgo_199 -// CHECK-NEXT: %286 = phi { ptr, i1 } [ %285, %_llgo_199 ], [ zeroinitializer, %_llgo_200 ] -// CHECK-NEXT: %287 = extractvalue { ptr, i1 } %286, 0 -// CHECK-NEXT: %288 = extractvalue { ptr, i1 } %286, 1 -// CHECK-NEXT: br i1 %288, label %_llgo_57, label %_llgo_58 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_202: ; preds = %_llgo_58 -// CHECK-NEXT: %289 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %290 = insertvalue { ptr, i1 } undef, ptr %289, 0 -// CHECK-NEXT: %291 = insertvalue { ptr, i1 } %290, i1 true, 1 -// CHECK-NEXT: br label %_llgo_204 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_203: ; preds = %_llgo_58 -// CHECK-NEXT: br label %_llgo_204 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_204: ; preds = %_llgo_203, %_llgo_202 -// CHECK-NEXT: %292 = phi { ptr, i1 } [ %291, %_llgo_202 ], [ zeroinitializer, %_llgo_203 ] -// CHECK-NEXT: %293 = extractvalue { ptr, i1 } %292, 0 -// CHECK-NEXT: %294 = extractvalue { ptr, i1 } %292, 1 -// CHECK-NEXT: br i1 %294, label %_llgo_59, label %_llgo_60 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_205: ; preds = %_llgo_60 -// CHECK-NEXT: %295 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %296 = insertvalue { ptr, i1 } undef, ptr %295, 0 -// CHECK-NEXT: %297 = insertvalue { ptr, i1 } %296, i1 true, 1 -// CHECK-NEXT: br label %_llgo_207 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_206: ; preds = %_llgo_60 -// CHECK-NEXT: br label %_llgo_207 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_207: ; preds = %_llgo_206, %_llgo_205 -// CHECK-NEXT: %298 = phi { ptr, i1 } [ %297, %_llgo_205 ], [ zeroinitializer, %_llgo_206 ] -// CHECK-NEXT: %299 = extractvalue { ptr, i1 } %298, 0 -// CHECK-NEXT: %300 = extractvalue { ptr, i1 } %298, 1 -// CHECK-NEXT: br i1 %300, label %_llgo_61, label %_llgo_62 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_208: ; preds = %_llgo_62 -// CHECK-NEXT: %301 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %302 = insertvalue { ptr, i1 } undef, ptr %301, 0 -// CHECK-NEXT: %303 = insertvalue { ptr, i1 } %302, i1 true, 1 -// CHECK-NEXT: br label %_llgo_210 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_209: ; preds = %_llgo_62 -// CHECK-NEXT: br label %_llgo_210 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_210: ; preds = %_llgo_209, %_llgo_208 -// CHECK-NEXT: %304 = phi { ptr, i1 } [ %303, %_llgo_208 ], [ zeroinitializer, %_llgo_209 ] -// CHECK-NEXT: %305 = extractvalue { ptr, i1 } %304, 0 -// CHECK-NEXT: %306 = extractvalue { ptr, i1 } %304, 1 -// CHECK-NEXT: br i1 %306, label %_llgo_63, label %_llgo_64 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_211: ; preds = %_llgo_64 -// CHECK-NEXT: %307 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %308 = insertvalue { ptr, i1 } undef, ptr %307, 0 -// CHECK-NEXT: %309 = insertvalue { ptr, i1 } %308, i1 true, 1 -// CHECK-NEXT: br label %_llgo_213 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_212: ; preds = %_llgo_64 -// CHECK-NEXT: br label %_llgo_213 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_213: ; preds = %_llgo_212, %_llgo_211 -// CHECK-NEXT: %310 = phi { ptr, i1 } [ %309, %_llgo_211 ], [ zeroinitializer, %_llgo_212 ] -// CHECK-NEXT: %311 = extractvalue { ptr, i1 } %310, 0 -// CHECK-NEXT: %312 = extractvalue { ptr, i1 } %310, 1 -// CHECK-NEXT: br i1 %312, label %_llgo_65, label %_llgo_66 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_214: ; preds = %_llgo_66 -// CHECK-NEXT: %313 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %314 = insertvalue { ptr, i1 } undef, ptr %313, 0 -// CHECK-NEXT: %315 = insertvalue { ptr, i1 } %314, i1 true, 1 -// CHECK-NEXT: br label %_llgo_216 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_215: ; preds = %_llgo_66 -// CHECK-NEXT: br label %_llgo_216 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_216: ; preds = %_llgo_215, %_llgo_214 -// CHECK-NEXT: %316 = phi { ptr, i1 } [ %315, %_llgo_214 ], [ zeroinitializer, %_llgo_215 ] -// CHECK-NEXT: %317 = extractvalue { ptr, i1 } %316, 0 -// CHECK-NEXT: %318 = extractvalue { ptr, i1 } %316, 1 -// CHECK-NEXT: br i1 %318, label %_llgo_67, label %_llgo_68 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_217: ; preds = %_llgo_68 -// CHECK-NEXT: %319 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %320 = insertvalue { ptr, i1 } undef, ptr %319, 0 -// CHECK-NEXT: %321 = insertvalue { ptr, i1 } %320, i1 true, 1 -// CHECK-NEXT: br label %_llgo_219 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_218: ; preds = %_llgo_68 -// CHECK-NEXT: br label %_llgo_219 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_219: ; preds = %_llgo_218, %_llgo_217 -// CHECK-NEXT: %322 = phi { ptr, i1 } [ %321, %_llgo_217 ], [ zeroinitializer, %_llgo_218 ] -// CHECK-NEXT: %323 = extractvalue { ptr, i1 } %322, 0 -// CHECK-NEXT: %324 = extractvalue { ptr, i1 } %322, 1 -// CHECK-NEXT: br i1 %324, label %_llgo_69, label %_llgo_70 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_220: ; preds = %_llgo_70 -// CHECK-NEXT: %325 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %326 = insertvalue { ptr, i1 } undef, ptr %325, 0 -// CHECK-NEXT: %327 = insertvalue { ptr, i1 } %326, i1 true, 1 -// CHECK-NEXT: br label %_llgo_222 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_221: ; preds = %_llgo_70 -// CHECK-NEXT: br label %_llgo_222 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_222: ; preds = %_llgo_221, %_llgo_220 -// CHECK-NEXT: %328 = phi { ptr, i1 } [ %327, %_llgo_220 ], [ zeroinitializer, %_llgo_221 ] -// CHECK-NEXT: %329 = extractvalue { ptr, i1 } %328, 0 -// CHECK-NEXT: %330 = extractvalue { ptr, i1 } %328, 1 -// CHECK-NEXT: br i1 %330, label %_llgo_71, label %_llgo_72 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_223: ; preds = %_llgo_72 -// CHECK-NEXT: %331 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %332 = insertvalue { ptr, i1 } undef, ptr %331, 0 -// CHECK-NEXT: %333 = insertvalue { ptr, i1 } %332, i1 true, 1 -// CHECK-NEXT: br label %_llgo_225 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_224: ; preds = %_llgo_72 -// CHECK-NEXT: br label %_llgo_225 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_225: ; preds = %_llgo_224, %_llgo_223 -// CHECK-NEXT: %334 = phi { ptr, i1 } [ %333, %_llgo_223 ], [ zeroinitializer, %_llgo_224 ] -// CHECK-NEXT: %335 = extractvalue { ptr, i1 } %334, 0 -// CHECK-NEXT: %336 = extractvalue { ptr, i1 } %334, 1 -// CHECK-NEXT: br i1 %336, label %_llgo_73, label %_llgo_74 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_226: ; preds = %_llgo_74 -// CHECK-NEXT: %337 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %338 = insertvalue { ptr, i1 } undef, ptr %337, 0 -// CHECK-NEXT: %339 = insertvalue { ptr, i1 } %338, i1 true, 1 -// CHECK-NEXT: br label %_llgo_228 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_227: ; preds = %_llgo_74 -// CHECK-NEXT: br label %_llgo_228 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_228: ; preds = %_llgo_227, %_llgo_226 -// CHECK-NEXT: %340 = phi { ptr, i1 } [ %339, %_llgo_226 ], [ zeroinitializer, %_llgo_227 ] -// CHECK-NEXT: %341 = extractvalue { ptr, i1 } %340, 0 -// CHECK-NEXT: %342 = extractvalue { ptr, i1 } %340, 1 -// CHECK-NEXT: br i1 %342, label %_llgo_75, label %_llgo_76 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_229: ; preds = %_llgo_76 -// CHECK-NEXT: %343 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %344 = insertvalue { ptr, i1 } undef, ptr %343, 0 -// CHECK-NEXT: %345 = insertvalue { ptr, i1 } %344, i1 true, 1 -// CHECK-NEXT: br label %_llgo_231 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_230: ; preds = %_llgo_76 -// CHECK-NEXT: br label %_llgo_231 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_231: ; preds = %_llgo_230, %_llgo_229 -// CHECK-NEXT: %346 = phi { ptr, i1 } [ %345, %_llgo_229 ], [ zeroinitializer, %_llgo_230 ] -// CHECK-NEXT: %347 = extractvalue { ptr, i1 } %346, 0 -// CHECK-NEXT: %348 = extractvalue { ptr, i1 } %346, 1 -// CHECK-NEXT: br i1 %348, label %_llgo_77, label %_llgo_78 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_232: ; preds = %_llgo_78 -// CHECK-NEXT: %349 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %350 = insertvalue { ptr, i1 } undef, ptr %349, 0 -// CHECK-NEXT: %351 = insertvalue { ptr, i1 } %350, i1 true, 1 -// CHECK-NEXT: br label %_llgo_234 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_233: ; preds = %_llgo_78 -// CHECK-NEXT: br label %_llgo_234 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_234: ; preds = %_llgo_233, %_llgo_232 -// CHECK-NEXT: %352 = phi { ptr, i1 } [ %351, %_llgo_232 ], [ zeroinitializer, %_llgo_233 ] -// CHECK-NEXT: %353 = extractvalue { ptr, i1 } %352, 0 -// CHECK-NEXT: %354 = extractvalue { ptr, i1 } %352, 1 -// CHECK-NEXT: br i1 %354, label %_llgo_79, label %_llgo_80 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_235: ; preds = %_llgo_80 -// CHECK-NEXT: %355 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %356 = insertvalue { ptr, i1 } undef, ptr %355, 0 -// CHECK-NEXT: %357 = insertvalue { ptr, i1 } %356, i1 true, 1 -// CHECK-NEXT: br label %_llgo_237 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_236: ; preds = %_llgo_80 -// CHECK-NEXT: br label %_llgo_237 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_237: ; preds = %_llgo_236, %_llgo_235 -// CHECK-NEXT: %358 = phi { ptr, i1 } [ %357, %_llgo_235 ], [ zeroinitializer, %_llgo_236 ] -// CHECK-NEXT: %359 = extractvalue { ptr, i1 } %358, 0 -// CHECK-NEXT: %360 = extractvalue { ptr, i1 } %358, 1 -// CHECK-NEXT: br i1 %360, label %_llgo_81, label %_llgo_82 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_238: ; preds = %_llgo_82 -// CHECK-NEXT: %361 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %362 = insertvalue { ptr, i1 } undef, ptr %361, 0 -// CHECK-NEXT: %363 = insertvalue { ptr, i1 } %362, i1 true, 1 -// CHECK-NEXT: br label %_llgo_240 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_239: ; preds = %_llgo_82 -// CHECK-NEXT: br label %_llgo_240 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_240: ; preds = %_llgo_239, %_llgo_238 -// CHECK-NEXT: %364 = phi { ptr, i1 } [ %363, %_llgo_238 ], [ zeroinitializer, %_llgo_239 ] -// CHECK-NEXT: %365 = extractvalue { ptr, i1 } %364, 0 -// CHECK-NEXT: %366 = extractvalue { ptr, i1 } %364, 1 -// CHECK-NEXT: br i1 %366, label %_llgo_83, label %_llgo_84 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_241: ; preds = %_llgo_84 -// CHECK-NEXT: %367 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %368 = insertvalue { ptr, i1 } undef, ptr %367, 0 -// CHECK-NEXT: %369 = insertvalue { ptr, i1 } %368, i1 true, 1 -// CHECK-NEXT: br label %_llgo_243 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_242: ; preds = %_llgo_84 -// CHECK-NEXT: br label %_llgo_243 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_243: ; preds = %_llgo_242, %_llgo_241 -// CHECK-NEXT: %370 = phi { ptr, i1 } [ %369, %_llgo_241 ], [ zeroinitializer, %_llgo_242 ] -// CHECK-NEXT: %371 = extractvalue { ptr, i1 } %370, 0 -// CHECK-NEXT: %372 = extractvalue { ptr, i1 } %370, 1 -// CHECK-NEXT: br i1 %372, label %_llgo_85, label %_llgo_86 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_244: ; preds = %_llgo_86 -// CHECK-NEXT: %373 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %374 = insertvalue { ptr, i1 } undef, ptr %373, 0 -// CHECK-NEXT: %375 = insertvalue { ptr, i1 } %374, i1 true, 1 -// CHECK-NEXT: br label %_llgo_246 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_245: ; preds = %_llgo_86 -// CHECK-NEXT: br label %_llgo_246 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_246: ; preds = %_llgo_245, %_llgo_244 -// CHECK-NEXT: %376 = phi { ptr, i1 } [ %375, %_llgo_244 ], [ zeroinitializer, %_llgo_245 ] -// CHECK-NEXT: %377 = extractvalue { ptr, i1 } %376, 0 -// CHECK-NEXT: %378 = extractvalue { ptr, i1 } %376, 1 -// CHECK-NEXT: br i1 %378, label %_llgo_87, label %_llgo_88 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_247: ; preds = %_llgo_88 -// CHECK-NEXT: %379 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %380 = insertvalue { ptr, i1 } undef, ptr %379, 0 -// CHECK-NEXT: %381 = insertvalue { ptr, i1 } %380, i1 true, 1 -// CHECK-NEXT: br label %_llgo_249 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_248: ; preds = %_llgo_88 -// CHECK-NEXT: br label %_llgo_249 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_249: ; preds = %_llgo_248, %_llgo_247 -// CHECK-NEXT: %382 = phi { ptr, i1 } [ %381, %_llgo_247 ], [ zeroinitializer, %_llgo_248 ] -// CHECK-NEXT: %383 = extractvalue { ptr, i1 } %382, 0 -// CHECK-NEXT: %384 = extractvalue { ptr, i1 } %382, 1 -// CHECK-NEXT: br i1 %384, label %_llgo_89, label %_llgo_90 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_250: ; preds = %_llgo_90 -// CHECK-NEXT: %385 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %386 = insertvalue { ptr, i1 } undef, ptr %385, 0 -// CHECK-NEXT: %387 = insertvalue { ptr, i1 } %386, i1 true, 1 -// CHECK-NEXT: br label %_llgo_252 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_251: ; preds = %_llgo_90 -// CHECK-NEXT: br label %_llgo_252 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_252: ; preds = %_llgo_251, %_llgo_250 -// CHECK-NEXT: %388 = phi { ptr, i1 } [ %387, %_llgo_250 ], [ zeroinitializer, %_llgo_251 ] -// CHECK-NEXT: %389 = extractvalue { ptr, i1 } %388, 0 -// CHECK-NEXT: %390 = extractvalue { ptr, i1 } %388, 1 -// CHECK-NEXT: br i1 %390, label %_llgo_91, label %_llgo_92 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_253: ; preds = %_llgo_92 -// CHECK-NEXT: %391 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %392 = insertvalue { ptr, i1 } undef, ptr %391, 0 -// CHECK-NEXT: %393 = insertvalue { ptr, i1 } %392, i1 true, 1 -// CHECK-NEXT: br label %_llgo_255 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_254: ; preds = %_llgo_92 -// CHECK-NEXT: br label %_llgo_255 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_255: ; preds = %_llgo_254, %_llgo_253 -// CHECK-NEXT: %394 = phi { ptr, i1 } [ %393, %_llgo_253 ], [ zeroinitializer, %_llgo_254 ] -// CHECK-NEXT: %395 = extractvalue { ptr, i1 } %394, 0 -// CHECK-NEXT: %396 = extractvalue { ptr, i1 } %394, 1 -// CHECK-NEXT: br i1 %396, label %_llgo_93, label %_llgo_94 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_256: ; preds = %_llgo_94 -// CHECK-NEXT: %397 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %398 = insertvalue { ptr, i1 } undef, ptr %397, 0 -// CHECK-NEXT: %399 = insertvalue { ptr, i1 } %398, i1 true, 1 -// CHECK-NEXT: br label %_llgo_258 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_257: ; preds = %_llgo_94 -// CHECK-NEXT: br label %_llgo_258 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_258: ; preds = %_llgo_257, %_llgo_256 -// CHECK-NEXT: %400 = phi { ptr, i1 } [ %399, %_llgo_256 ], [ zeroinitializer, %_llgo_257 ] -// CHECK-NEXT: %401 = extractvalue { ptr, i1 } %400, 0 -// CHECK-NEXT: %402 = extractvalue { ptr, i1 } %400, 1 -// CHECK-NEXT: br i1 %402, label %_llgo_95, label %_llgo_96 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_259: ; preds = %_llgo_96 -// CHECK-NEXT: %403 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %404 = insertvalue { ptr, i1 } undef, ptr %403, 0 -// CHECK-NEXT: %405 = insertvalue { ptr, i1 } %404, i1 true, 1 -// CHECK-NEXT: br label %_llgo_261 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_260: ; preds = %_llgo_96 -// CHECK-NEXT: br label %_llgo_261 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_261: ; preds = %_llgo_260, %_llgo_259 -// CHECK-NEXT: %406 = phi { ptr, i1 } [ %405, %_llgo_259 ], [ zeroinitializer, %_llgo_260 ] -// CHECK-NEXT: %407 = extractvalue { ptr, i1 } %406, 0 -// CHECK-NEXT: %408 = extractvalue { ptr, i1 } %406, 1 -// CHECK-NEXT: br i1 %408, label %_llgo_97, label %_llgo_98 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_262: ; preds = %_llgo_98 -// CHECK-NEXT: %409 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %410 = insertvalue { ptr, i1 } undef, ptr %409, 0 -// CHECK-NEXT: %411 = insertvalue { ptr, i1 } %410, i1 true, 1 -// CHECK-NEXT: br label %_llgo_264 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_263: ; preds = %_llgo_98 -// CHECK-NEXT: br label %_llgo_264 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_264: ; preds = %_llgo_263, %_llgo_262 -// CHECK-NEXT: %412 = phi { ptr, i1 } [ %411, %_llgo_262 ], [ zeroinitializer, %_llgo_263 ] -// CHECK-NEXT: %413 = extractvalue { ptr, i1 } %412, 0 -// CHECK-NEXT: %414 = extractvalue { ptr, i1 } %412, 1 -// CHECK-NEXT: br i1 %414, label %_llgo_99, label %_llgo_100 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_265: ; preds = %_llgo_100 -// CHECK-NEXT: %415 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %416 = insertvalue { ptr, i1 } undef, ptr %415, 0 -// CHECK-NEXT: %417 = insertvalue { ptr, i1 } %416, i1 true, 1 -// CHECK-NEXT: br label %_llgo_267 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_266: ; preds = %_llgo_100 -// CHECK-NEXT: br label %_llgo_267 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_267: ; preds = %_llgo_266, %_llgo_265 -// CHECK-NEXT: %418 = phi { ptr, i1 } [ %417, %_llgo_265 ], [ zeroinitializer, %_llgo_266 ] -// CHECK-NEXT: %419 = extractvalue { ptr, i1 } %418, 0 -// CHECK-NEXT: %420 = extractvalue { ptr, i1 } %418, 1 -// CHECK-NEXT: br i1 %420, label %_llgo_101, label %_llgo_102 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_268: ; preds = %_llgo_102 -// CHECK-NEXT: %421 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %422 = insertvalue { ptr, i1 } undef, ptr %421, 0 -// CHECK-NEXT: %423 = insertvalue { ptr, i1 } %422, i1 true, 1 -// CHECK-NEXT: br label %_llgo_270 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_269: ; preds = %_llgo_102 -// CHECK-NEXT: br label %_llgo_270 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_270: ; preds = %_llgo_269, %_llgo_268 -// CHECK-NEXT: %424 = phi { ptr, i1 } [ %423, %_llgo_268 ], [ zeroinitializer, %_llgo_269 ] -// CHECK-NEXT: %425 = extractvalue { ptr, i1 } %424, 0 -// CHECK-NEXT: %426 = extractvalue { ptr, i1 } %424, 1 -// CHECK-NEXT: br i1 %426, label %_llgo_103, label %_llgo_104 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_271: ; preds = %_llgo_104 -// CHECK-NEXT: %427 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %428 = insertvalue { ptr, i1 } undef, ptr %427, 0 -// CHECK-NEXT: %429 = insertvalue { ptr, i1 } %428, i1 true, 1 -// CHECK-NEXT: br label %_llgo_273 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_272: ; preds = %_llgo_104 -// CHECK-NEXT: br label %_llgo_273 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_273: ; preds = %_llgo_272, %_llgo_271 -// CHECK-NEXT: %430 = phi { ptr, i1 } [ %429, %_llgo_271 ], [ zeroinitializer, %_llgo_272 ] -// CHECK-NEXT: %431 = extractvalue { ptr, i1 } %430, 0 -// CHECK-NEXT: %432 = extractvalue { ptr, i1 } %430, 1 -// CHECK-NEXT: br i1 %432, label %_llgo_105, label %_llgo_106 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_274: ; preds = %_llgo_106 -// CHECK-NEXT: %433 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %434 = insertvalue { ptr, i1 } undef, ptr %433, 0 -// CHECK-NEXT: %435 = insertvalue { ptr, i1 } %434, i1 true, 1 -// CHECK-NEXT: br label %_llgo_276 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_275: ; preds = %_llgo_106 -// CHECK-NEXT: br label %_llgo_276 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_276: ; preds = %_llgo_275, %_llgo_274 -// CHECK-NEXT: %436 = phi { ptr, i1 } [ %435, %_llgo_274 ], [ zeroinitializer, %_llgo_275 ] -// CHECK-NEXT: %437 = extractvalue { ptr, i1 } %436, 0 -// CHECK-NEXT: %438 = extractvalue { ptr, i1 } %436, 1 -// CHECK-NEXT: br i1 %438, label %_llgo_107, label %_llgo_108 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_277: ; preds = %_llgo_108 -// CHECK-NEXT: %439 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %440 = insertvalue { ptr, i1 } undef, ptr %439, 0 -// CHECK-NEXT: %441 = insertvalue { ptr, i1 } %440, i1 true, 1 -// CHECK-NEXT: br label %_llgo_279 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_278: ; preds = %_llgo_108 -// CHECK-NEXT: br label %_llgo_279 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_279: ; preds = %_llgo_278, %_llgo_277 -// CHECK-NEXT: %442 = phi { ptr, i1 } [ %441, %_llgo_277 ], [ zeroinitializer, %_llgo_278 ] -// CHECK-NEXT: %443 = extractvalue { ptr, i1 } %442, 0 -// CHECK-NEXT: %444 = extractvalue { ptr, i1 } %442, 1 -// CHECK-NEXT: br i1 %444, label %_llgo_109, label %_llgo_110 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_280: ; preds = %_llgo_110 -// CHECK-NEXT: %445 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %446 = insertvalue { ptr, i1 } undef, ptr %445, 0 -// CHECK-NEXT: %447 = insertvalue { ptr, i1 } %446, i1 true, 1 -// CHECK-NEXT: br label %_llgo_282 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_281: ; preds = %_llgo_110 -// CHECK-NEXT: br label %_llgo_282 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_282: ; preds = %_llgo_281, %_llgo_280 -// CHECK-NEXT: %448 = phi { ptr, i1 } [ %447, %_llgo_280 ], [ zeroinitializer, %_llgo_281 ] -// CHECK-NEXT: %449 = extractvalue { ptr, i1 } %448, 0 -// CHECK-NEXT: %450 = extractvalue { ptr, i1 } %448, 1 -// CHECK-NEXT: br i1 %450, label %_llgo_111, label %_llgo_112 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_283: ; preds = %_llgo_112 -// CHECK-NEXT: %451 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %452 = insertvalue { ptr, i1 } undef, ptr %451, 0 -// CHECK-NEXT: %453 = insertvalue { ptr, i1 } %452, i1 true, 1 -// CHECK-NEXT: br label %_llgo_285 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_284: ; preds = %_llgo_112 -// CHECK-NEXT: br label %_llgo_285 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_285: ; preds = %_llgo_284, %_llgo_283 -// CHECK-NEXT: %454 = phi { ptr, i1 } [ %453, %_llgo_283 ], [ zeroinitializer, %_llgo_284 ] -// CHECK-NEXT: %455 = extractvalue { ptr, i1 } %454, 0 -// CHECK-NEXT: %456 = extractvalue { ptr, i1 } %454, 1 -// CHECK-NEXT: br i1 %456, label %_llgo_113, label %_llgo_114 -// CHECK-NEXT: } +// Ident has the dedicated fast path; the switch covers every declared node type +// and returns zero only for an unknown implementation. +// CHECK: [[TYPE_IDENT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: [[IS_IDENT:%[0-9]+]] = icmp eq ptr [[TYPE_IDENT]], @"*_llgo_go/ast.Ident" +// CHECK: ret i64 1073741824 +// CHECK: [[TYPE_ARRAY:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: [[IS_ARRAY:%[0-9]+]] = icmp eq ptr [[TYPE_ARRAY]], @"*_llgo_go/ast.ArrayType" +// CHECK: ret i64 1 +// CHECK-COUNT-55: call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: icmp eq ptr %{{[0-9]+}}, @"*_llgo_go/ast.ValueSpec" +// CHECK: ret i64 36028797018963968 +// CHECK: ret i64 0 diff --git a/cl/_testgo/defer1/in.go b/cl/_testgo/defer1/in.go index 3ebfbc1987..b770289037 100644 --- a/cl/_testgo/defer1/in.go +++ b/cl/_testgo/defer1/in.go @@ -1,10 +1,92 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"bye", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"hi", align 1{{$}} +// CHECK: [[HELLO:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" +// CHECK: [[BYE:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"bye" +// CHECK: [[WORLD:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"world" +// CHECK: [[HI:@[0-9]+]] = private unnamed_addr constant [2 x i8] c"hi" +// CHECK-LABEL: define i1 @main.f(%"{{.*}}String" %0){{.*}} { +// CHECK: [[F_LEN:%.*]] = extractvalue %"{{.*}}String" %0, 1 +// CHECK-NEXT: [[F_RESULT:%.*]] = icmp sgt i64 [[F_LEN]], 2 +// CHECK-NEXT: ret i1 [[F_RESULT]] + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) +// CHECK: [[FLAGS:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 1 +// CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 +// True branch: capture s, then bye, as distinct nodes and flag bits. +// CHECK: [[HELLO_FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[HELLO_FLAGS:%.*]] = or i64 [[HELLO_FLAGS0]], 1 +// CHECK-NEXT: store i64 [[HELLO_FLAGS]], ptr [[FLAGS]] +// CHECK: [[HELLO_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[HELLO_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[HELLO_PREV]], ptr {{%.*}} +// CHECK: store i64 1, ptr {{%.*}} +// CHECK: store %"{{.*}}String" { ptr [[HELLO]], i64 5 }, ptr {{%.*}} +// CHECK: store ptr [[HELLO_NODE]], ptr [[HEAD]] +// CHECK: [[BYE_FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[BYE_FLAGS:%.*]] = or i64 [[BYE_FLAGS0]], 2 +// CHECK-NEXT: store i64 [[BYE_FLAGS]], ptr [[FLAGS]] +// CHECK: [[BYE_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[BYE_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[BYE_PREV]], ptr {{%.*}} +// CHECK: store i64 2, ptr {{%.*}} +// CHECK: store %"{{.*}}String" { ptr [[BYE]], i64 3 }, ptr {{%.*}} +// CHECK: store ptr [[BYE_NODE]], ptr [[HEAD]] +// False branch: capture world and mark its own cleanup bit. +// CHECK: [[WORLD_FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[WORLD_FLAGS:%.*]] = or i64 [[WORLD_FLAGS0]], 4 +// CHECK-NEXT: store i64 [[WORLD_FLAGS]], ptr [[FLAGS]] +// CHECK: [[WORLD_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[WORLD_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[WORLD_PREV]], ptr {{%.*}} +// CHECK: store i64 3, ptr {{%.*}} +// CHECK: store %"{{.*}}String" { ptr [[WORLD]], i64 5 }, ptr {{%.*}} +// CHECK: store ptr [[WORLD_NODE]], ptr [[HEAD]] +// The shared cleanup first tests the false-branch bit. +// CHECK: [[WORLD_MASK:%.*]] = and i64 {{%.*}}, 4 +// CHECK: [[COND:%.*]] = call i1 @main.f(%"{{.*}}String" { ptr [[HELLO]], i64 5 }) +// CHECK-NEXT: br i1 [[COND]], label %{{.*}}, label %{{.*}} +// The direct closure is the final defer after the string-node cleanups. +// CHECK: call void @"main.main$1"() +// The true path tests bye before hello, matching LIFO registration order. +// CHECK: [[HELLO_MASK:%.*]] = and i64 {{%.*}}, 1 +// CHECK: [[BYE_MASK:%.*]] = and i64 {{%.*}}, 2 +// Each active bit pops and prints the node currently at the head. +// CHECK: [[WORLD_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[WORLD_CANDIDATE]], null +// CHECK: [[WORLD_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[WORLD_VALUE:%.*]] = load { ptr, i64, %"{{.*}}String" }, ptr [[WORLD_ACTIVE]] +// CHECK: [[WORLD_NEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[WORLD_VALUE]], 0 +// CHECK-NEXT: store ptr [[WORLD_NEXT]], ptr [[HEAD]] +// CHECK: [[WORLD_TEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[WORLD_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[WORLD_ACTIVE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[WORLD_TEXT]]) +// CHECK: [[BYE_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[BYE_CANDIDATE]], null +// CHECK: [[BYE_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[BYE_VALUE:%.*]] = load { ptr, i64, %"{{.*}}String" }, ptr [[BYE_ACTIVE]] +// CHECK: [[BYE_NEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[BYE_VALUE]], 0 +// CHECK-NEXT: store ptr [[BYE_NEXT]], ptr [[HEAD]] +// CHECK: [[BYE_TEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[BYE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[BYE_ACTIVE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[BYE_TEXT]]) +// CHECK: [[HELLO_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[HELLO_CANDIDATE]], null +// CHECK: [[HELLO_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[HELLO_VALUE:%.*]] = load { ptr, i64, %"{{.*}}String" }, ptr [[HELLO_ACTIVE]] +// CHECK: [[HELLO_NEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[HELLO_VALUE]], 0 +// CHECK-NEXT: store ptr [[HELLO_NEXT]], ptr [[HEAD]] +// CHECK: [[HELLO_TEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[HELLO_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[HELLO_ACTIVE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[HELLO_TEXT]]) +// CHECK-LABEL: define void @"main.main$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" { ptr [[HI]], i64 2 }) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void func f(s string) bool { return len(s) > 2 @@ -22,217 +104,3 @@ func main() { } defer println("bye") } - -// CHECK-LABEL: define i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = icmp sgt i64 %1, 2 -// CHECK-NEXT: ret i1 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_4), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = or i64 %13, 1 -// CHECK-NEXT: store i64 %14, ptr %7, align 8 -// CHECK-NEXT: %15 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %17 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 0 -// CHECK-NEXT: store ptr %15, ptr %17, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %19, align 8 -// CHECK-NEXT: store ptr %16, ptr %10, align 8 -// CHECK-NEXT: %20 = load i64, ptr %7, align 8 -// CHECK-NEXT: %21 = or i64 %20, 2 -// CHECK-NEXT: store i64 %21, ptr %7, align 8 -// CHECK-NEXT: %22 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %10, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_8), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: %27 = load i64, ptr %7, align 8 -// CHECK-NEXT: %28 = or i64 %27, 4 -// CHECK-NEXT: store i64 %28, ptr %7, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %31 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 0 -// CHECK-NEXT: store ptr %29, ptr %31, align 8 -// CHECK-NEXT: %32 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 1 -// CHECK-NEXT: store i64 3, ptr %32, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %33, align 8 -// CHECK-NEXT: store ptr %30, ptr %10, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_7, %_llgo_3, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_12), ptr %8, align 8 -// CHECK-NEXT: %34 = load i64, ptr %7, align 8 -// CHECK-NEXT: %35 = and i64 %34, 4 -// CHECK-NEXT: %36 = icmp ne i64 %35, 0 -// CHECK-NEXT: br i1 %36, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_0 -// CHECK-NEXT: %37 = call i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: br i1 %37, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %9, align 8 -// CHECK-NEXT: %38 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %38, [label %_llgo_5, label %_llgo_10, label %_llgo_11, label %_llgo_12, label %_llgo_4] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7, %_llgo_22 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %8, align 8 -// CHECK-NEXT: %39 = load i64, ptr %7, align 8 -// CHECK-NEXT: call void @"main.main$1"() -// CHECK-NEXT: %40 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %41 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %40, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %41) -// CHECK-NEXT: %42 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %42, [label %_llgo_5, label %_llgo_8, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_7, %_llgo_18 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %8, align 8 -// CHECK-NEXT: %43 = load i64, ptr %7, align 8 -// CHECK-NEXT: %44 = and i64 %43, 1 -// CHECK-NEXT: %45 = icmp ne i64 %44, 0 -// CHECK-NEXT: br i1 %45, label %_llgo_21, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_7, %_llgo_14 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_11), ptr %8, align 8 -// CHECK-NEXT: %46 = load i64, ptr %7, align 8 -// CHECK-NEXT: %47 = and i64 %46, 2 -// CHECK-NEXT: %48 = icmp ne i64 %47, 0 -// CHECK-NEXT: br i1 %48, label %_llgo_17, label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_4 -// CHECK-NEXT: %49 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %50 = icmp ne ptr %49, null -// CHECK-NEXT: br i1 %50, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_16, %_llgo_4 -// CHECK-NEXT: br label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_13 -// CHECK-NEXT: %51 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %52 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %51, align 8 -// CHECK-NEXT: %53 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %52, 0 -// CHECK-NEXT: store ptr %53, ptr %10, align 8 -// CHECK-NEXT: %54 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %52, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %51) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %54) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_15, %_llgo_13 -// CHECK-NEXT: br label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_12 -// CHECK-NEXT: %55 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %56 = icmp ne ptr %55, null -// CHECK-NEXT: br i1 %56, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_20, %_llgo_12 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_17 -// CHECK-NEXT: %57 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %58 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %57, align 8 -// CHECK-NEXT: %59 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %58, 0 -// CHECK-NEXT: store ptr %59, ptr %10, align 8 -// CHECK-NEXT: %60 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %58, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %57) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %60) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_19, %_llgo_17 -// CHECK-NEXT: br label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_11 -// CHECK-NEXT: %61 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %62 = icmp ne ptr %61, null -// CHECK-NEXT: br i1 %62, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_24, %_llgo_11 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_21 -// CHECK-NEXT: %63 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %64 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %63, align 8 -// CHECK-NEXT: %65 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %64, 0 -// CHECK-NEXT: store ptr %65, ptr %10, align 8 -// CHECK-NEXT: %66 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %64, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %63) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %66) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_23, %_llgo_21 -// CHECK-NEXT: br label %_llgo_22 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/defer2/in.go b/cl/_testgo/defer2/in.go index 08adb62f02..fd640e12b7 100644 --- a/cl/_testgo/defer2/in.go +++ b/cl/_testgo/defer2/in.go @@ -1,9 +1,31 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"bye", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} +// The condition is evaluated before installing its selected defer, while all +// paths share the same defer-chain cleanup. +// CHECK: @[[HELLO:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" +// CHECK: @[[BYE:[0-9]+]] = private unnamed_addr constant [3 x i8] c"bye" +// CHECK: @[[WORLD:[0-9]+]] = private unnamed_addr constant [5 x i8] c"world" +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[COND:%[0-9]+]] = call i1 @main.f(%"{{.*}}String" { ptr @[[HELLO]], i64 5 }) +// CHECK-NEXT: [[PREVIOUS_DEFER:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[DEFER_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: [[PREVIOUS_SLOT:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[DEFER_FRAME]], i32 0, i32 2 +// CHECK-NEXT: store ptr [[PREVIOUS_DEFER]], ptr [[PREVIOUS_SLOT]] +// CHECK: [[DEFER_HEAD:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[DEFER_FRAME]], i32 0, i32 5 +// CHECK: [[TRUE_HEAD1:%[0-9]+]] = load ptr, ptr [[DEFER_HEAD]] +// CHECK: store ptr [[TRUE_HEAD1]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" { ptr @[[HELLO]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: [[TRUE_NODE2:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store %"{{.*}}String" { ptr @[[BYE]], i64 3 }, ptr %{{[0-9]+}} +// CHECK: [[FALSE_NODE:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store %"{{.*}}String" { ptr @[[WORLD]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: br i1 [[COND]], label %{{.*}}, label %{{.*}} +// CHECK-COUNT-2: call void @"{{.*}}FreeDeferNode"(ptr %{{[0-9]+}}) +// CHECK: [[SAVED_DEFER:%[0-9]+]] = load %"{{.*}}Defer", ptr [[DEFER_FRAME]] +// CHECK-NEXT: [[RESTORED_DEFER:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[SAVED_DEFER]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[RESTORED_DEFER]]) +// CHECK: call void @"{{.*}}FreeDeferNode"(ptr %{{[0-9]+}}) func f(s string) bool { return len(s) > 2 @@ -18,204 +40,3 @@ func main() { } defer println("bye") } - -// CHECK-LABEL: define i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = icmp sgt i64 %1, 2 -// CHECK-NEXT: ret i1 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %2 = alloca i8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 2 -// CHECK-NEXT: store ptr %1, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %7, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %3) -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 4 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %11, align 8 -// CHECK-NEXT: %12 = call i32 @{{(__)?}}sigsetjmp(ptr %2, i32 0) -// CHECK-NEXT: %13 = icmp eq i32 %12, 0 -// CHECK-NEXT: br i1 %13, label %_llgo_4, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4 -// CHECK-NEXT: %14 = load i64, ptr %8, align 8 -// CHECK-NEXT: %15 = or i64 %14, 1 -// CHECK-NEXT: store i64 %15, ptr %8, align 8 -// CHECK-NEXT: %16 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: store ptr %16, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %20, align 8 -// CHECK-NEXT: store ptr %17, ptr %11, align 8 -// CHECK-NEXT: %21 = load i64, ptr %8, align 8 -// CHECK-NEXT: %22 = or i64 %21, 2 -// CHECK-NEXT: store i64 %22, ptr %8, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %24, i32 0, i32 0 -// CHECK-NEXT: store ptr %23, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %24, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %26, align 8 -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %24, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %27, align 8 -// CHECK-NEXT: store ptr %24, ptr %11, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_8), ptr %10, align 8 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_4 -// CHECK-NEXT: %28 = load i64, ptr %8, align 8 -// CHECK-NEXT: %29 = or i64 %28, 4 -// CHECK-NEXT: store i64 %29, ptr %8, align 8 -// CHECK-NEXT: %30 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %32 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %31, i32 0, i32 0 -// CHECK-NEXT: store ptr %30, ptr %32, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %31, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %33, align 8 -// CHECK-NEXT: %34 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %31, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %34, align 8 -// CHECK-NEXT: store ptr %31, ptr %11, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %10, align 8 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br i1 %0, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_2, %_llgo_1 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_11), ptr %9, align 8 -// CHECK-NEXT: %35 = load i64, ptr %8, align 8 -// CHECK-NEXT: %36 = and i64 %35, 4 -// CHECK-NEXT: %37 = icmp ne i64 %36, 0 -// CHECK-NEXT: br i1 %37, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7, %_llgo_21 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %1) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %10, align 8 -// CHECK-NEXT: %38 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %38, [label %_llgo_6, label %_llgo_10, label %_llgo_11, label %_llgo_5] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_21 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_21 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7, %_llgo_17 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: %39 = load i64, ptr %8, align 8 -// CHECK-NEXT: %40 = and i64 %39, 1 -// CHECK-NEXT: %41 = icmp ne i64 %40, 0 -// CHECK-NEXT: br i1 %41, label %_llgo_20, label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_7, %_llgo_13 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %9, align 8 -// CHECK-NEXT: %42 = load i64, ptr %8, align 8 -// CHECK-NEXT: %43 = and i64 %42, 2 -// CHECK-NEXT: %44 = icmp ne i64 %43, 0 -// CHECK-NEXT: br i1 %44, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_5 -// CHECK-NEXT: %45 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %46 = icmp ne ptr %45, null -// CHECK-NEXT: br i1 %46, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_15, %_llgo_5 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: %47 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %48 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %47, align 8 -// CHECK-NEXT: %49 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 0 -// CHECK-NEXT: store ptr %49, ptr %11, align 8 -// CHECK-NEXT: %50 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14, %_llgo_12 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_11 -// CHECK-NEXT: %51 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %52 = icmp ne ptr %51, null -// CHECK-NEXT: br i1 %52, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_19, %_llgo_11 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: %53 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %54 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %53, align 8 -// CHECK-NEXT: %55 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %54, 0 -// CHECK-NEXT: store ptr %55, ptr %11, align 8 -// CHECK-NEXT: %56 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %54, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %53) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %56) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18, %_llgo_16 -// CHECK-NEXT: br label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_10 -// CHECK-NEXT: %57 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %58 = icmp ne ptr %57, null -// CHECK-NEXT: br i1 %58, label %_llgo_22, label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_23, %_llgo_10 -// CHECK-NEXT: %59 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, align 8 -// CHECK-NEXT: %60 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %59, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %60) -// CHECK-NEXT: %61 = load ptr, ptr %10, align 8 -// CHECK-NEXT: indirectbr ptr %61, [label %_llgo_6, label %_llgo_8, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_20 -// CHECK-NEXT: %62 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %63 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %62, align 8 -// CHECK-NEXT: %64 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %63, 0 -// CHECK-NEXT: store ptr %64, ptr %11, align 8 -// CHECK-NEXT: %65 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %63, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %62) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %65) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_22, %_llgo_20 -// CHECK-NEXT: br label %_llgo_21 -// CHECK-NEXT: } diff --git a/cl/_testgo/defer3/in.go b/cl/_testgo/defer3/in.go index f1f9dc77f6..821153e243 100644 --- a/cl/_testgo/defer3/in.go +++ b/cl/_testgo/defer3/in.go @@ -1,12 +1,55 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"bye", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"panic message", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"unreachable", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [2 x i8] c"hi", align 1{{$}} +// A panic in fail must execute fail's own defer, restore the enclosing defer +// chain, then let main's selected and outer defers run while rethrowing. +// CHECK: @[[D3_BYE:[0-9]+]] = private unnamed_addr constant [3 x i8] c"bye" +// CHECK: @[[D3_PANIC:[0-9]+]] = private unnamed_addr constant [13 x i8] c"panic message" +// CHECK: @[[D3_HELLO:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" +// CHECK: @[[D3_WORLD:[0-9]+]] = private unnamed_addr constant [5 x i8] c"world" +// CHECK-LABEL: define void @main.fail(){{.*}} { +// CHECK: [[D3_FAIL_PREV:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[D3_FAIL_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: [[D3_FAIL_PREV_SLOT:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[D3_FAIL_FRAME]], i32 0, i32 2 +// CHECK-NEXT: store ptr [[D3_FAIL_PREV]], ptr [[D3_FAIL_PREV_SLOT]] +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[D3_FAIL_FRAME]]) +// CHECK: [[D3_FAIL_HEAD:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[D3_FAIL_FRAME]], i32 0, i32 5 +// CHECK: call void @"{{.*}}Rethrow"(ptr [[D3_FAIL_PREV]]) +// CHECK: [[D3_FAIL_OLD_HEAD:%[0-9]+]] = load ptr, ptr [[D3_FAIL_HEAD]] +// CHECK-NEXT: [[D3_FAIL_NODE:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[D3_FAIL_OLD_HEAD]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" { ptr @[[D3_BYE]], i64 3 }, ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[D3_FAIL_NODE]], ptr [[D3_FAIL_HEAD]] +// CHECK: store %"{{.*}}String" { ptr @[[D3_PANIC]], i64 13 }, ptr [[D3_PANIC_BOX:%[0-9]+]] +// CHECK-NEXT: [[D3_PANIC_EFACE:%[0-9]+]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D3_PANIC_BOX]], 1 +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D3_PANIC_EFACE]]) +// CHECK: [[D3_RUN_NODE:%[0-9]+]] = load ptr, ptr [[D3_FAIL_HEAD]] +// CHECK: [[D3_RUN_PAYLOAD:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}String" } %{{[0-9]+}}, 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[D3_RUN_NODE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[D3_RUN_PAYLOAD]]) +// CHECK: [[D3_FAIL_SAVED:%[0-9]+]] = load %"{{.*}}Defer", ptr [[D3_FAIL_FRAME]] +// CHECK-NEXT: [[D3_FAIL_RESTORE:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[D3_FAIL_SAVED]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[D3_FAIL_RESTORE]]) +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[D3_MAIN_PREV:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[D3_MAIN_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[D3_MAIN_PREV]], ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[D3_MAIN_FRAME]]) +// CHECK: store %"{{.*}}String" { ptr @[[D3_HELLO]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: call void @main.fail() +// CHECK: store %"{{.*}}String" { ptr @[[D3_WORLD]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}Rethrow"(ptr [[D3_MAIN_PREV]]) +// CHECK: [[D3_COND:%[0-9]+]] = call i1 @main.f(%"{{.*}}String" { ptr @[[D3_HELLO]], i64 5 }) +// CHECK-NEXT: br i1 [[D3_COND]], label %{{.*}}, label %{{.*}} +// CHECK: call void @"main.main$1"() +// CHECK: [[D3_MAIN_SAVED:%[0-9]+]] = load %"{{.*}}Defer", ptr [[D3_MAIN_FRAME]] +// CHECK-NEXT: [[D3_MAIN_RESTORE:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[D3_MAIN_SAVED]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[D3_MAIN_RESTORE]]) +// CHECK-COUNT-2: call void @"{{.*}}FreeDeferNode"(ptr %{{[0-9]+}}) +// CHECK-LABEL: define void @"main.main$1"(){{.*}} { +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 2 }) +// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) +// CHECK-NEXT: ret void func f(s string) bool { return len(s) > 2 @@ -30,256 +73,3 @@ func main() { fail() println("unreachable") } - -// CHECK-LABEL: define i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = icmp sgt i64 %1, 2 -// CHECK-NEXT: ret i1 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.fail(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %15 = icmp ne ptr %14, null -// CHECK-NEXT: br i1 %15, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %16 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: store ptr %16, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %20, align 8 -// CHECK-NEXT: store ptr %17, ptr %10, align 8 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, ptr %21, align 8 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %22) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %23, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: %24 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %25 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %24, align 8 -// CHECK-NEXT: %26 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %25, 0 -// CHECK-NEXT: store ptr %26, ptr %10, align 8 -// CHECK-NEXT: %27 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %25, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %24) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %27) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6, %_llgo_2 -// CHECK-NEXT: %28 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %29 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %28, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %29) -// CHECK-NEXT: %30 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %30, [label %_llgo_3] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_4), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = or i64 %13, 1 -// CHECK-NEXT: store i64 %14, ptr %7, align 8 -// CHECK-NEXT: %15 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %17 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 0 -// CHECK-NEXT: store ptr %15, ptr %17, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %19, align 8 -// CHECK-NEXT: store ptr %16, ptr %10, align 8 -// CHECK-NEXT: call void @main.fail() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 11 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_8), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: %20 = load i64, ptr %7, align 8 -// CHECK-NEXT: %21 = or i64 %20, 2 -// CHECK-NEXT: store i64 %21, ptr %7, align 8 -// CHECK-NEXT: %22 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %10, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_7, %_llgo_3, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_11), ptr %8, align 8 -// CHECK-NEXT: %27 = load i64, ptr %7, align 8 -// CHECK-NEXT: %28 = and i64 %27, 2 -// CHECK-NEXT: %29 = icmp ne i64 %28, 0 -// CHECK-NEXT: br i1 %29, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_0 -// CHECK-NEXT: %30 = call i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: br i1 %30, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %9, align 8 -// CHECK-NEXT: %31 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %31, [label %_llgo_5, label %_llgo_10, label %_llgo_11, label %_llgo_4] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7, %_llgo_17 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %8, align 8 -// CHECK-NEXT: %32 = load i64, ptr %7, align 8 -// CHECK-NEXT: call void @"main.main$1"() -// CHECK-NEXT: %33 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %33, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %34) -// CHECK-NEXT: %35 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %35, [label %_llgo_5, label %_llgo_8, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_7, %_llgo_13 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %8, align 8 -// CHECK-NEXT: %36 = load i64, ptr %7, align 8 -// CHECK-NEXT: %37 = and i64 %36, 1 -// CHECK-NEXT: %38 = icmp ne i64 %37, 0 -// CHECK-NEXT: br i1 %38, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_4 -// CHECK-NEXT: %39 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %40 = icmp ne ptr %39, null -// CHECK-NEXT: br i1 %40, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_15, %_llgo_4 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: %41 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %42 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, align 8 -// CHECK-NEXT: %43 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %42, 0 -// CHECK-NEXT: store ptr %43, ptr %10, align 8 -// CHECK-NEXT: %44 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %42, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %41) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %44) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14, %_llgo_12 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_11 -// CHECK-NEXT: %45 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %46 = icmp ne ptr %45, null -// CHECK-NEXT: br i1 %46, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_19, %_llgo_11 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: %47 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %48 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %47, align 8 -// CHECK-NEXT: %49 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 0 -// CHECK-NEXT: store ptr %49, ptr %10, align 8 -// CHECK-NEXT: %50 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18, %_llgo_16 -// CHECK-NEXT: br label %_llgo_17 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/defer4/in.go b/cl/_testgo/defer4/in.go index 40c9b764dc..29fff17728 100644 --- a/cl/_testgo/defer4/in.go +++ b/cl/_testgo/defer4/in.go @@ -1,13 +1,72 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [3 x i8] c"bye", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [13 x i8] c"panic message", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [8 x i8] c"recover:", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [9 x i8] c"reachable", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [2 x i8] c"hi", align 1{{$}} +// fail's recovery defer is associated with its own recover frame; after it +// consumes the string panic, fail's ordinary defer runs and main continues. +// CHECK: @[[D4_BYE:[0-9]+]] = private unnamed_addr constant [3 x i8] c"bye" +// CHECK: @[[D4_PANIC:[0-9]+]] = private unnamed_addr constant [13 x i8] c"panic message" +// CHECK: @[[D4_HELLO:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" +// CHECK: @[[D4_WORLD:[0-9]+]] = private unnamed_addr constant [5 x i8] c"world" +// CHECK-LABEL: define void @main.fail(){{.*}} { +// CHECK: [[D4_FAIL_PREV:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[D4_FAIL_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[D4_FAIL_PREV]], ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[D4_FAIL_FRAME]]) +// CHECK: [[D4_FAIL_HEAD:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[D4_FAIL_FRAME]], i32 0, i32 5 +// CHECK: [[D4_RECOVER_STATE:%[0-9]+]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @"main.fail$1") +// CHECK-NEXT: call void @"main.fail$1"() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[D4_RECOVER_STATE]]) +// CHECK: call void @"{{.*}}Rethrow"(ptr [[D4_FAIL_PREV]]) +// CHECK: [[D4_FAIL_OLD_HEAD:%[0-9]+]] = load ptr, ptr [[D4_FAIL_HEAD]] +// CHECK-NEXT: [[D4_FAIL_NODE:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[D4_FAIL_OLD_HEAD]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" { ptr @[[D4_BYE]], i64 3 }, ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[D4_FAIL_NODE]], ptr [[D4_FAIL_HEAD]] +// CHECK: store %"{{.*}}String" { ptr @[[D4_PANIC]], i64 13 }, ptr [[D4_PANIC_BOX:%[0-9]+]] +// CHECK-NEXT: [[D4_PANIC_EFACE:%[0-9]+]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D4_PANIC_BOX]], 1 +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D4_PANIC_EFACE]]) +// CHECK: [[D4_PENDING_NODE:%[0-9]+]] = load ptr, ptr [[D4_FAIL_HEAD]] +// CHECK-NEXT: [[D4_HAS_NODE:%[0-9]+]] = icmp ne ptr [[D4_PENDING_NODE]], null +// CHECK-NEXT: br i1 [[D4_HAS_NODE]], label %{{.*}}, label %{{.*}} +// CHECK: [[D4_RUN_NODE:%[0-9]+]] = load ptr, ptr [[D4_FAIL_HEAD]] +// CHECK: [[D4_RUN_PAYLOAD:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}String" } %{{[0-9]+}}, 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[D4_RUN_NODE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[D4_RUN_PAYLOAD]]) +// CHECK: [[D4_FAIL_SAVED:%[0-9]+]] = load %"{{.*}}Defer", ptr [[D4_FAIL_FRAME]] +// CHECK-NEXT: [[D4_FAIL_RESTORE:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[D4_FAIL_SAVED]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[D4_FAIL_RESTORE]]) +// CHECK-LABEL: define void @"main.fail$1"(){{.*}} { +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.fail$1", ptr [[D4_RECOVER_TOKEN:%[0-9]+]]) +// CHECK-NEXT: [[D4_RECOVERED:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[D4_RECOVER_TOKEN]]) +// CHECK-NEXT: [[D4_IS_NIL:%[0-9]+]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[D4_RECOVERED]], %"{{.*}}eface" zeroinitializer) +// CHECK-NEXT: [[D4_HAS_PANIC:%[0-9]+]] = xor i1 [[D4_IS_NIL]], true +// CHECK-NEXT: br i1 [[D4_HAS_PANIC]], label %{{.*}}, label %{{.*}} +// CHECK: [[D4_RECOVER_TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[D4_RECOVERED]], 0 +// CHECK-NEXT: [[D4_IS_STRING:%[0-9]+]] = icmp eq ptr [[D4_RECOVER_TYPE]], @_llgo_string +// CHECK-NEXT: br i1 [[D4_IS_STRING]], label %{{.*}}, label %{{.*}} +// CHECK: [[D4_RECOVER_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[D4_RECOVERED]], 1 +// CHECK-NEXT: [[D4_RECOVER_STRING:%[0-9]+]] = load %"{{.*}}String", ptr [[D4_RECOVER_DATA]] +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" [[D4_RECOVER_STRING]]) +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[D4_MAIN_PREV:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[D4_MAIN_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[D4_MAIN_PREV]], ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[D4_MAIN_FRAME]]) +// CHECK: store %"{{.*}}String" { ptr @[[D4_HELLO]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: call void @main.fail() +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 9 }) +// CHECK: store %"{{.*}}String" { ptr @[[D4_WORLD]], i64 5 }, ptr %{{[0-9]+}} +// CHECK: [[D4_COND:%[0-9]+]] = call i1 @main.f(%"{{.*}}String" { ptr @[[D4_HELLO]], i64 5 }) +// CHECK-NEXT: br i1 [[D4_COND]], label %{{.*}}, label %{{.*}} +// CHECK: call void @"main.main$1"() +// CHECK: [[D4_MAIN_SAVED:%[0-9]+]] = load %"{{.*}}Defer", ptr [[D4_MAIN_FRAME]] +// CHECK-NEXT: [[D4_MAIN_RESTORE:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[D4_MAIN_SAVED]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[D4_MAIN_RESTORE]]) +// CHECK-COUNT-2: call void @"{{.*}}FreeDeferNode"(ptr %{{[0-9]+}}) +// CHECK-LABEL: define void @"main.main$1"(){{.*}} { +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 2 }) +// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) +// CHECK-NEXT: ret void func f(s string) bool { return len(s) > 2 @@ -36,295 +95,3 @@ func main() { fail() println("reachable") } - -// CHECK-LABEL: define i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = icmp sgt i64 %1, 2 -// CHECK-NEXT: ret i1 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.fail(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?sigsetjmp}}(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_6), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.fail$1") -// CHECK-NEXT: call void @"main.fail$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %15 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %17 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 0 -// CHECK-NEXT: store ptr %15, ptr %17, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }, ptr %19, align 8 -// CHECK-NEXT: store ptr %16, ptr %10, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 13 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %22 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %22, [label %_llgo_3, label %_llgo_6, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.fail, %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %23 = load i64, ptr %7, align 8 -// CHECK-NEXT: %24 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %25 = icmp ne ptr %24, null -// CHECK-NEXT: br i1 %25, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %26 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %27 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %26, align 8 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %27, 0 -// CHECK-NEXT: store ptr %28, ptr %10, align 8 -// CHECK-NEXT: %29 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %27, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %26) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_6 -// CHECK-NEXT: %30 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %30, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %31) -// CHECK-NEXT: %32 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %32, [label %_llgo_3] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.fail$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.fail$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: %3 = xor i1 %2, true -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 0 -// CHECK-NEXT: %5 = icmp eq ptr %4, @_llgo_string -// CHECK-NEXT: br i1 %5, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 1 -// CHECK-NEXT: %7 = load %"{{.*}}/runtime/internal/runtime.String", ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 8 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %4, ptr @_llgo_string) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_4), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?sigsetjmp}}(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = or i64 %13, 1 -// CHECK-NEXT: store i64 %14, ptr %7, align 8 -// CHECK-NEXT: %15 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %17 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 0 -// CHECK-NEXT: store ptr %15, ptr %17, align 8 -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %16, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 5 }, ptr %19, align 8 -// CHECK-NEXT: store ptr %16, ptr %10, align 8 -// CHECK-NEXT: call void @main.fail() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_8), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: %20 = load i64, ptr %7, align 8 -// CHECK-NEXT: %21 = or i64 %20, 2 -// CHECK-NEXT: store i64 %21, ptr %7, align 8 -// CHECK-NEXT: %22 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 5 }, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %10, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_7, %_llgo_3, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_11), ptr %8, align 8 -// CHECK-NEXT: %27 = load i64, ptr %7, align 8 -// CHECK-NEXT: %28 = and i64 %27, 2 -// CHECK-NEXT: %29 = icmp ne i64 %28, 0 -// CHECK-NEXT: br i1 %29, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_0 -// CHECK-NEXT: %30 = call i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 5 }) -// CHECK-NEXT: br i1 %30, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %9, align 8 -// CHECK-NEXT: %31 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %31, [label %_llgo_5, label %_llgo_10, label %_llgo_11, label %_llgo_4] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7, %_llgo_17 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_5), ptr %8, align 8 -// CHECK-NEXT: %32 = load i64, ptr %7, align 8 -// CHECK-NEXT: call void @"main.main$1"() -// CHECK-NEXT: %33 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %33, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %34) -// CHECK-NEXT: %35 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %35, [label %_llgo_5, label %_llgo_8, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_7, %_llgo_13 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %8, align 8 -// CHECK-NEXT: %36 = load i64, ptr %7, align 8 -// CHECK-NEXT: %37 = and i64 %36, 1 -// CHECK-NEXT: %38 = icmp ne i64 %37, 0 -// CHECK-NEXT: br i1 %38, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_4 -// CHECK-NEXT: %39 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %40 = icmp ne ptr %39, null -// CHECK-NEXT: br i1 %40, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_15, %_llgo_4 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: %41 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %42 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, align 8 -// CHECK-NEXT: %43 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %42, 0 -// CHECK-NEXT: store ptr %43, ptr %10, align 8 -// CHECK-NEXT: %44 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %42, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %41) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %44) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14, %_llgo_12 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_11 -// CHECK-NEXT: %45 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %46 = icmp ne ptr %45, null -// CHECK-NEXT: br i1 %46, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_19, %_llgo_11 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: %47 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %48 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %47, align 8 -// CHECK-NEXT: %49 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 0 -// CHECK-NEXT: store ptr %49, ptr %10, align 8 -// CHECK-NEXT: %50 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %48, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18, %_llgo_16 -// CHECK-NEXT: br label %_llgo_17 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/defer5/in.go b/cl/_testgo/defer5/in.go index 4bcca285f0..ada9e03c59 100644 --- a/cl/_testgo/defer5/in.go +++ b/cl/_testgo/defer5/in.go @@ -1,15 +1,98 @@ // LITTEST package main +// Bind the four messages so the checks below prove which defer/panic payload +// flows through each lowering path without depending on numbered globals. +// CHECK-DAG: [[DEFER_A:@[0-9]+]] = private unnamed_addr constant [1 x i8] c"A" +// CHECK-DAG: [[DEFER_B:@[0-9]+]] = private unnamed_addr constant [1 x i8] c"B" +// CHECK-DAG: [[PANIC_MAIN:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"panic in main" +// CHECK-DAG: [[PRINT_DEFER1:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"in defer 1" +// CHECK-DAG: [[PANIC_DEFER1:@[0-9]+]] = private unnamed_addr constant [16 x i8] c"panic in defer 1" +// CHECK-DAG: [[PRINT_DEFER2:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"in defer 2" +// CHECK-DAG: [[PANIC_DEFER2:@[0-9]+]] = private unnamed_addr constant [16 x i8] c"panic in defer 2" + // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: GetThreadDefer - // CHECK: blockaddress(@main.main, %_llgo_2) - // CHECK: blockaddress(@main.main, %_llgo_8) - // CHECK: call void @"main.main$1"() + // The function installs one defer frame and preserves both the previous + // thread frame and the initial resume block used after longjmp. + // CHECK: [[OUTER_DEFER:%[0-9]+]] = call ptr @"{{.*}}.GetThreadDefer"() + // CHECK-NEXT: [[DEFER_JMPBUF:%[0-9]+]] = alloca i8, i64 {{[0-9]+}}, align 1 + // CHECK-NEXT: [[DEFER_FRAME:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 48) + // CHECK: [[FRAME_BUF_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 0 + // CHECK-NEXT: store ptr [[DEFER_JMPBUF]], ptr [[FRAME_BUF_FIELD]] + // CHECK: [[FRAME_PREV_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 2 + // CHECK-NEXT: store ptr [[OUTER_DEFER]], ptr [[FRAME_PREV_FIELD]] + // CHECK: [[FRAME_RESUME_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 3 + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[OUTER_RESUME:[A-Za-z0-9_]+]]), ptr [[FRAME_RESUME_FIELD]] + // CHECK-NEXT: call void @"{{.*}}.SetThreadDefer"(ptr [[DEFER_FRAME]]) + // CHECK: [[DEFER_STATE_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 1 + // CHECK-NEXT: [[DEFER_RESUME_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 3 + // CHECK-NEXT: [[DEFER_RETHROW_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 4 + // CHECK-NEXT: [[DEFER_HEAD_FIELD:%[0-9]+]] = getelementptr inbounds %"{{.*}}.Defer", ptr [[DEFER_FRAME]], i32 0, i32 5 + // CHECK: [[SETJMP_RESULT:%[0-9]+]] = call i32 @{{(__)?sigsetjmp}}(ptr [[DEFER_JMPBUF]], i32 0) + // CHECK-NEXT: [[FIRST_ENTRY:%[0-9]+]] = icmp eq i32 [[SETJMP_RESULT]], 0 + // CHECK-NEXT: br i1 [[FIRST_ENTRY]], label %{{.*}}, label %{{.*}} + + // CHECK: [[OUTER_RESUME]]: + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[DEFER2_BLOCK:[A-Za-z0-9_]+]]), ptr [[DEFER_RESUME_FIELD]] + // CHECK: call void @"{{.*}}.Rethrow"(ptr [[OUTER_DEFER]]) + + // Plain println defers are registered as linked nodes. Their state and + // payload identify A as the outer defer and B as the inner one. + // CHECK: [[DEFER_A_NODE:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 32) + // CHECK: [[DEFER_A_STATE:%[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}.String" }, ptr [[DEFER_A_NODE]], i32 0, i32 1 + // CHECK-NEXT: store i64 0, ptr [[DEFER_A_STATE]] + // CHECK-NEXT: [[DEFER_A_ARG:%[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}.String" }, ptr [[DEFER_A_NODE]], i32 0, i32 2 + // CHECK-NEXT: store %"{{.*}}.String" { ptr [[DEFER_A]], i64 1 }, ptr [[DEFER_A_ARG]] + // CHECK-NEXT: store ptr [[DEFER_A_NODE]], ptr [[DEFER_HEAD_FIELD]] + // CHECK: [[DEFER_B_NODE:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 32) + // CHECK: [[DEFER_B_STATE:%[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}.String" }, ptr [[DEFER_B_NODE]], i32 0, i32 1 + // CHECK-NEXT: store i64 3, ptr [[DEFER_B_STATE]] + // CHECK-NEXT: [[DEFER_B_ARG:%[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}.String" }, ptr [[DEFER_B_NODE]], i32 0, i32 2 + // CHECK-NEXT: store %"{{.*}}.String" { ptr [[DEFER_B]], i64 1 }, ptr [[DEFER_B_ARG]] + // CHECK-NEXT: store ptr [[DEFER_B_NODE]], ptr [[DEFER_HEAD_FIELD]] + // CHECK: [[MAIN_PANIC_BOX:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 16) + // CHECK-NEXT: store %"{{.*}}.String" { ptr [[PANIC_MAIN]], i64 13 }, ptr [[MAIN_PANIC_BOX]] + // CHECK-NEXT: [[MAIN_PANIC_VALUE:%[0-9]+]] = insertvalue %"{{.*}}.eface" { ptr @_llgo_string, ptr undef }, ptr [[MAIN_PANIC_BOX]], 1 + // CHECK-NEXT: call void @"{{.*}}.Panic"(%"{{.*}}.eface" [[MAIN_PANIC_VALUE]]) + + // The state machine invokes defer 2 first, then enters a recover frame for + // defer 1. Capturing block labels keeps the relation without pinning their + // generated numbers. + // CHECK: [[LANDING_BLOCK:[A-Za-z0-9_]+]]: + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[RETHROW_BLOCK:[A-Za-z0-9_]+]]), ptr [[DEFER_RETHROW_FIELD]] + // CHECK: indirectbr ptr %{{[0-9]+}}, [{{.*}}label %[[DEFER2_BLOCK]]{{.*}}] + // CHECK: [[AFTER_RECOVER:[A-Za-z0-9_]+]]: + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[RETHROW_BLOCK]]), ptr [[DEFER_RESUME_FIELD]] + // CHECK: [[RECOVER_BLOCK:[A-Za-z0-9_]+]]: + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[AFTER_RECOVER]]), ptr [[DEFER_RESUME_FIELD]] + // CHECK: [[RECOVER_STATE:%[0-9]+]] = call %"{{.*}}.recoverState" @"{{.*}}.StartRecoverFrame"(ptr @"main.main$1") + // CHECK-NEXT: call void @"main.main$1"() + // CHECK-NEXT: call void @"{{.*}}.EndRecoverFrame"(%"{{.*}}.recoverState" [[RECOVER_STATE]]) + // CHECK: [[DEFER2_BLOCK]]: + // CHECK-NEXT: store ptr blockaddress(@main.main, %[[RECOVER_BLOCK]]), ptr [[DEFER_RESUME_FIELD]] // CHECK: call void @"main.main$2"() - // CHECK: FreeDeferNode - // CHECK: FreeDeferNode + // CHECK-NEXT: br label %[[RECOVER_BLOCK]] + + // Both linked println nodes are popped, freed, and printed through the + // values read from the same defer-head field. + // CHECK: [[POP1:%[0-9]+]] = load ptr, ptr [[DEFER_HEAD_FIELD]] + // CHECK-NEXT: [[POP1_RECORD:%[0-9]+]] = load { ptr, i64, %"{{.*}}.String" }, ptr [[POP1]] + // CHECK-NEXT: [[POP1_PREV:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}.String" } [[POP1_RECORD]], 0 + // CHECK-NEXT: store ptr [[POP1_PREV]], ptr [[DEFER_HEAD_FIELD]] + // CHECK-NEXT: [[POP1_TEXT:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}.String" } [[POP1_RECORD]], 2 + // CHECK-NEXT: call void @"{{.*}}.FreeDeferNode"(ptr [[POP1]]) + // CHECK-NEXT: call void @"{{.*}}.PrintString"(%"{{.*}}.String" [[POP1_TEXT]]) + // CHECK: [[POP2:%[0-9]+]] = load ptr, ptr [[DEFER_HEAD_FIELD]] + // CHECK-NEXT: [[POP2_RECORD:%[0-9]+]] = load { ptr, i64, %"{{.*}}.String" }, ptr [[POP2]] + // CHECK-NEXT: [[POP2_PREV:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}.String" } [[POP2_RECORD]], 0 + // CHECK-NEXT: store ptr [[POP2_PREV]], ptr [[DEFER_HEAD_FIELD]] + // CHECK-NEXT: [[POP2_TEXT:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}.String" } [[POP2_RECORD]], 2 + // CHECK-NEXT: call void @"{{.*}}.FreeDeferNode"(ptr [[POP2]]) + // CHECK-NEXT: call void @"{{.*}}.PrintString"(%"{{.*}}.String" [[POP2_TEXT]]) + // CHECK: [[DEFER_FRAME_VALUE:%[0-9]+]] = load %"{{.*}}.Defer", ptr [[DEFER_FRAME]] + // CHECK-NEXT: [[PREVIOUS_DEFER:%[0-9]+]] = extractvalue %"{{.*}}.Defer" [[DEFER_FRAME_VALUE]], 2 + // CHECK-NEXT: call void @"{{.*}}.SetThreadDefer"(ptr [[PREVIOUS_DEFER]]) defer println("A") defer func() { if e := recover(); e != nil { @@ -26,9 +109,20 @@ func main() { } // CHECK-LABEL: define void @"main.main$1"(){{.*}} { -// CHECK: Recover -// CHECK: PrintString -// CHECK: PrintByte +// CHECK: [[RECOVER_TOKEN:%[0-9]+]] = alloca i8 +// CHECK-NEXT: call void @"{{.*}}.BindRecoverFrame"(ptr @"main.main$1", ptr [[RECOVER_TOKEN]]) +// CHECK-NEXT: [[RECOVERED:%[0-9]+]] = call %"{{.*}}.eface" @"{{.*}}.Recover"(ptr [[RECOVER_TOKEN]]) +// CHECK-NEXT: [[RECOVER_EMPTY:%[0-9]+]] = call i1 @"{{.*}}.EfaceEqual"(%"{{.*}}.eface" [[RECOVERED]], %"{{.*}}.eface" zeroinitializer) +// CHECK-NEXT: [[RECOVER_NONEMPTY:%[0-9]+]] = xor i1 [[RECOVER_EMPTY]], true +// CHECK-NEXT: br i1 [[RECOVER_NONEMPTY]], label %{{.*}}, label %{{.*}} +// CHECK: call void @"{{.*}}.PrintString"(%"{{.*}}.String" { ptr [[PRINT_DEFER1]], i64 10 }) +// CHECK: [[DEFER1_PANIC_BOX:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 16) +// CHECK-NEXT: store %"{{.*}}.String" { ptr [[PANIC_DEFER1]], i64 16 }, ptr [[DEFER1_PANIC_BOX]] +// CHECK-NEXT: [[DEFER1_PANIC:%[0-9]+]] = insertvalue %"{{.*}}.eface" { ptr @_llgo_string, ptr undef }, ptr [[DEFER1_PANIC_BOX]], 1 +// CHECK-NEXT: call void @"{{.*}}.Panic"(%"{{.*}}.eface" [[DEFER1_PANIC]]) // CHECK-LABEL: define void @"main.main$2"(){{.*}} { -// CHECK: PrintString -// CHECK: PrintByte +// CHECK: call void @"{{.*}}.PrintString"(%"{{.*}}.String" { ptr [[PRINT_DEFER2]], i64 10 }) +// CHECK: [[DEFER2_PANIC_BOX:%[0-9]+]] = call ptr @"{{.*}}.AllocU"(i64 16) +// CHECK-NEXT: store %"{{.*}}.String" { ptr [[PANIC_DEFER2]], i64 16 }, ptr [[DEFER2_PANIC_BOX]] +// CHECK-NEXT: [[DEFER2_PANIC:%[0-9]+]] = insertvalue %"{{.*}}.eface" { ptr @_llgo_string, ptr undef }, ptr [[DEFER2_PANIC_BOX]], 1 +// CHECK-NEXT: call void @"{{.*}}.Panic"(%"{{.*}}.eface" [[DEFER2_PANIC]]) diff --git a/cl/_testgo/deferclosure/in.go b/cl/_testgo/deferclosure/in.go index bb8af74aac..8c5833a6ac 100644 --- a/cl/_testgo/deferclosure/in.go +++ b/cl/_testgo/deferclosure/in.go @@ -1,19 +1,114 @@ // LITTEST package main +// Cover the distinct deferred function-value forms in this test without +// pinning the defer-node layout or basic blocks. +// CHECK-LABEL: define void @"main.(*Handler).SetHandler"(ptr %0, { ptr, ptr } %1){{.*}} { +// CHECK: [[HANDLER_FIELD:%.*]] = getelementptr inbounds %main.Handler, ptr %0, i32 0, i32 0 +// CHECK: store { ptr, ptr } %1, ptr [[HANDLER_FIELD]] + +// CHECK-LABEL: define void @"main.(*Processor).SetCallback"(ptr %0, { ptr, ptr } %1){{.*}} { +// CHECK: [[PROCESSOR_FIELD:%.*]] = getelementptr inbounds %main.Processor, ptr %0, i32 0, i32 0 +// CHECK: store { ptr, ptr } %1, ptr [[PROCESSOR_FIELD]] + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.testDeferMethodLiteral() +// CHECK: call void @main.testDeferClosureValue() +// CHECK: call void @main.testDeferStructClosure() +// CHECK: call void @main.testDeferFieldAccess() + +// CHECK-LABEL: define void @main.testDeferClosureValue(){{.*}} { +// The captured 42 is stored in the closure environment before the function pair is deferred. +// CHECK: [[VALUE_CAPTURE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: store i64 42, ptr [[VALUE_CAPTURE]] +// CHECK: [[VALUE_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: store ptr [[VALUE_CAPTURE]], ptr %{{.*}} +// CHECK: [[VALUE_FN:%.*]] = insertvalue { ptr, ptr } { ptr @"main.testDeferClosureValue$1", ptr undef }, ptr [[VALUE_ENV]], 1 +// CHECK: [[VALUE_PREV_DEFER:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// CHECK: store { ptr, ptr } [[VALUE_FN]], ptr %{{.*}} +// When unwound, the deferred function pair is removed, freed, and invoked with its environment. +// CHECK: [[VALUE_NODE_DATA:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[VALUE_NODE:%[-A-Za-z0-9_.]+]] +// CHECK: [[VALUE_RUN_FN:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[VALUE_NODE_DATA]], 2 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr [[VALUE_NODE]]) +// CHECK: [[VALUE_RUN_ENV:%.*]] = extractvalue { ptr, ptr } [[VALUE_RUN_FN]], 1 +// CHECK: [[VALUE_RUN_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[VALUE_RUN_FN]], 0 +// CHECK: [[VALUE_RUN_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[VALUE_RUN_CODE_RAW]]) +// CHECK: call void [[VALUE_RUN_CODE]](ptr {{(nest|swiftself)}} [[VALUE_RUN_ENV]]) + +// CHECK-LABEL: define void @"main.testDeferClosureValue$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[VALUE_BODY_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[VALUE_BODY_ADDR:%.*]] = extractvalue { ptr } [[VALUE_BODY_ENV]], 0 +// CHECK: [[VALUE_BODY_X:%.*]] = load i64, ptr [[VALUE_BODY_ADDR]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[VALUE_BODY_X]]) + +// CHECK-LABEL: define void @main.testDeferFieldAccess(){{.*}} { +// The field value, rather than its declaration, is the pair placed into the defer record. +// CHECK: [[FIELD_HOLDER:%.*]] = alloca %main.FuncHolder +// CHECK: [[FIELD_STORE_SLOT:%.*]] = getelementptr inbounds %main.FuncHolder, ptr [[FIELD_HOLDER]], i32 0, i32 0 +// CHECK: store volatile { ptr, ptr } { ptr @"main.testDeferFieldAccess$1", ptr null }, ptr [[FIELD_STORE_SLOT]] +// CHECK: [[FIELD_LOAD_SLOT:%.*]] = getelementptr inbounds %main.FuncHolder, ptr [[FIELD_HOLDER]], i32 0, i32 0 +// CHECK: [[FIELD_FN:%.*]] = load volatile { ptr, ptr }, ptr [[FIELD_LOAD_SLOT]] +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// CHECK: store { ptr, ptr } [[FIELD_FN]], ptr %{{.*}} +// CHECK: [[FIELD_NODE_DATA:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[FIELD_NODE:%[-A-Za-z0-9_.]+]] +// CHECK: [[FIELD_RUN_FN:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[FIELD_NODE_DATA]], 2 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr [[FIELD_NODE]]) +// CHECK: [[FIELD_RECOVER_CODE:%.*]] = extractvalue { ptr, ptr } [[FIELD_RUN_FN]], 0 +// CHECK: [[FIELD_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr [[FIELD_RECOVER_CODE]]) +// CHECK: [[FIELD_RUN_ENV:%.*]] = extractvalue { ptr, ptr } [[FIELD_RUN_FN]], 1 +// CHECK: [[FIELD_RUN_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[FIELD_RUN_FN]], 0 +// CHECK: [[FIELD_RUN_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[FIELD_RUN_CODE_RAW]]) +// CHECK: call void [[FIELD_RUN_CODE]](ptr {{(nest|swiftself)}} [[FIELD_RUN_ENV]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[FIELD_RECOVER]]) + +// CHECK-LABEL: define void @"main.testDeferFieldAccess$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" { ptr @{{.*}}, i64 19 }) + +// CHECK-LABEL: define void @main.testDeferMethodLiteral(){{.*}} { +// CHECK: [[METHOD_HANDLER:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: call void @"main.(*Handler).SetHandler"(ptr [[METHOD_HANDLER]], { ptr, ptr } { ptr @"main.testDeferMethodLiteral$1", ptr null }) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// The deferred receiver and second literal are recorded independently. +// CHECK: store ptr [[METHOD_HANDLER]], ptr [[METHOD_RECEIVER_SLOT:%.*]] +// CHECK: store ptr @"main.testDeferMethodLiteral$2", ptr [[METHOD_CODE_SLOT:%.*]] +// CHECK: [[METHOD_NODE_DATA:%.*]] = load { ptr, i64, ptr, ptr }, ptr [[METHOD_NODE:%[-A-Za-z0-9_.]+]] +// CHECK: [[METHOD_RECEIVER:%.*]] = extractvalue { ptr, i64, ptr, ptr } [[METHOD_NODE_DATA]], 2 +// CHECK: [[METHOD_CODE:%.*]] = extractvalue { ptr, i64, ptr, ptr } [[METHOD_NODE_DATA]], 3 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr [[METHOD_NODE]]) +// CHECK: [[METHOD_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[METHOD_CODE]], 0 +// CHECK: [[METHOD_PAIR:%.*]] = insertvalue { ptr, ptr } [[METHOD_PAIR_0]], ptr null, 1 +// CHECK: call void @"main.(*Handler).SetHandler"(ptr [[METHOD_RECEIVER]], { ptr, ptr } [[METHOD_PAIR]]) + +// CHECK-LABEL: define void @"main.testDeferMethodLiteral$2"(i64 %0){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) + +// CHECK-LABEL: define void @main.testDeferStructClosure(){{.*}} { +// CHECK: [[STRUCT_PROCESSOR:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: [[STRUCT_MSG:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: store %"{{.*}}String" { ptr @{{.*}}, i64 8 }, ptr [[STRUCT_MSG]] +// CHECK: [[STRUCT_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: store ptr [[STRUCT_MSG]], ptr %{{.*}} +// CHECK: [[STRUCT_FN:%.*]] = insertvalue { ptr, ptr } { ptr @"main.testDeferStructClosure$1", ptr undef }, ptr [[STRUCT_ENV]], 1 +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// CHECK: store ptr [[STRUCT_PROCESSOR]], ptr %{{.*}} +// CHECK: store { ptr, ptr } [[STRUCT_FN]], ptr %{{.*}} +// CHECK: [[STRUCT_NODE_DATA:%.*]] = load { ptr, i64, ptr, { ptr, ptr } }, ptr [[STRUCT_NODE:%[-A-Za-z0-9_.]+]] +// CHECK: [[STRUCT_RUN_PROCESSOR:%.*]] = extractvalue { ptr, i64, ptr, { ptr, ptr } } [[STRUCT_NODE_DATA]], 2 +// CHECK: [[STRUCT_RUN_FN:%.*]] = extractvalue { ptr, i64, ptr, { ptr, ptr } } [[STRUCT_NODE_DATA]], 3 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr [[STRUCT_NODE]]) +// CHECK: call void @"main.(*Processor).SetCallback"(ptr [[STRUCT_RUN_PROCESSOR]], { ptr, ptr } [[STRUCT_RUN_FN]]) + +// CHECK-LABEL: define void @"main.testDeferStructClosure$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}String" %1){{.*}} { +// CHECK: [[STRUCT_BODY_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[STRUCT_BODY_MSG_ADDR:%.*]] = extractvalue { ptr } [[STRUCT_BODY_ENV]], 0 +// CHECK: [[STRUCT_BODY_MSG:%.*]] = load %"{{.*}}String", ptr [[STRUCT_BODY_MSG_ADDR]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" %1) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[STRUCT_BODY_MSG]]) + // Test deferred closure and method-value lowering. // Type for holding a function -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [16 x i8] c"deferred closure", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"closure value", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [17 x i8] c"field access test", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"callback from field", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"before return", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"deferred", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"captured", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"struct closure test", align 1{{$}} - type Handler struct { fn func(int) } @@ -87,435 +182,3 @@ func main() { testDeferStructClosure() testDeferFieldAccess() } - -// CHECK-LABEL: define void @"main.(*Handler).SetHandler"(ptr %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.Handler, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %1, ptr %2, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.(*Processor).SetCallback"(ptr %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.Processor, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %1, ptr %2, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.testDeferMethodLiteral() -// CHECK-NEXT: call void @main.testDeferClosureValue() -// CHECK-NEXT: call void @main.testDeferStructClosure() -// CHECK-NEXT: call void @main.testDeferFieldAccess() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.testDeferClosureValue(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 42, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.testDeferClosureValue$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %5 = alloca i8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 0 -// CHECK-NEXT: store ptr %5, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 2 -// CHECK-NEXT: store ptr %4, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferClosureValue, %_llgo_2), ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %6) -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 4 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %14, align 8 -// CHECK-NEXT: %15 = call i32 @{{(__)?}}sigsetjmp(ptr %5, i32 0) -// CHECK-NEXT: %16 = icmp eq i32 %15, 0 -// CHECK-NEXT: br i1 %16, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferClosureValue, %_llgo_3), ptr %12, align 8 -// CHECK-NEXT: %17 = load i64, ptr %11, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %19 = icmp ne ptr %18, null -// CHECK-NEXT: br i1 %19, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %4) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 0 -// CHECK-NEXT: store ptr %20, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %24, align 8 -// CHECK-NEXT: store ptr %21, ptr %14, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 16 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.testDeferClosureValue, %_llgo_6), ptr %13, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferClosureValue, %_llgo_3), ptr %13, align 8 -// CHECK-NEXT: %25 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %25, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %26 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %27 = load { ptr, i64, { ptr, ptr } }, ptr %26, align 8 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, { ptr, ptr } } %27, 0 -// CHECK-NEXT: store ptr %28, ptr %14, align 8 -// CHECK-NEXT: %29 = extractvalue { ptr, i64, { ptr, ptr } } %27, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %26) -// CHECK-NEXT: %30 = extractvalue { ptr, ptr } %29, 1 -// CHECK-NEXT: %31 = extractvalue { ptr, ptr } %29, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %31) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %30) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %32 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, align 8 -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %32, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %33) -// CHECK-NEXT: %34 = load ptr, ptr %13, align 8 -// CHECK-NEXT: indirectbr ptr %34, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.testDeferClosureValue$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.testDeferFieldAccess(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.FuncHolder, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: store volatile %main.FuncHolder zeroinitializer, ptr %0, align 8 -// CHECK-NEXT: %1 = getelementptr inbounds %main.FuncHolder, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store volatile { ptr, ptr } { ptr @"main.testDeferFieldAccess$1", ptr null }, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.FuncHolder, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load volatile { ptr, ptr }, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %5 = alloca i8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 0 -// CHECK-NEXT: store ptr %5, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 2 -// CHECK-NEXT: store ptr %4, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferFieldAccess, %_llgo_2), ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %6) -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 4 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %14, align 8 -// CHECK-NEXT: %15 = call i32 @{{(__)?}}sigsetjmp(ptr %5, i32 0) -// CHECK-NEXT: %16 = icmp eq i32 %15, 0 -// CHECK-NEXT: br i1 %16, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferFieldAccess, %_llgo_3), ptr %12, align 8 -// CHECK-NEXT: %17 = load i64, ptr %11, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %19 = icmp ne ptr %18, null -// CHECK-NEXT: br i1 %19, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %4) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 0 -// CHECK-NEXT: store ptr %20, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %21, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %24, align 8 -// CHECK-NEXT: store ptr %21, ptr %14, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 17 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.testDeferFieldAccess, %_llgo_6), ptr %13, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferFieldAccess, %_llgo_3), ptr %13, align 8 -// CHECK-NEXT: %25 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %25, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %26 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %27 = load { ptr, i64, { ptr, ptr } }, ptr %26, align 8 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, { ptr, ptr } } %27, 0 -// CHECK-NEXT: store ptr %28, ptr %14, align 8 -// CHECK-NEXT: %29 = extractvalue { ptr, i64, { ptr, ptr } } %27, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %26) -// CHECK-NEXT: %30 = extractvalue { ptr, ptr } %29, 0 -// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %30) -// CHECK-NEXT: %32 = extractvalue { ptr, ptr } %29, 1 -// CHECK-NEXT: %33 = extractvalue { ptr, ptr } %29, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %33) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %31) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %34 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, align 8 -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %34, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %35) -// CHECK-NEXT: %36 = load ptr, ptr %13, align 8 -// CHECK-NEXT: indirectbr ptr %36, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.testDeferFieldAccess$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.testDeferMethodLiteral(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: call void @"main.(*Handler).SetHandler"(ptr %0, { ptr, ptr } { ptr @"main.testDeferMethodLiteral$1", ptr null }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %2 = alloca i8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 2 -// CHECK-NEXT: store ptr %1, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferMethodLiteral, %_llgo_2), ptr %7, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %3) -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 1 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 3 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 4 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %11, align 8 -// CHECK-NEXT: %12 = call i32 @{{(__)?}}sigsetjmp(ptr %2, i32 0) -// CHECK-NEXT: %13 = icmp eq i32 %12, 0 -// CHECK-NEXT: br i1 %13, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferMethodLiteral, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %14 = load i64, ptr %8, align 8 -// CHECK-NEXT: %15 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %16 = icmp ne ptr %15, null -// CHECK-NEXT: br i1 %16, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %1) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %18, i32 0, i32 0 -// CHECK-NEXT: store ptr %17, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %18, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %20, align 8 -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %18, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %18, i32 0, i32 3 -// CHECK-NEXT: store ptr @"main.testDeferMethodLiteral$2", ptr %22, align 8 -// CHECK-NEXT: store ptr %18, ptr %11, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.testDeferMethodLiteral, %_llgo_6), ptr %10, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferMethodLiteral, %_llgo_3), ptr %10, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %23, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %24 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %25 = load { ptr, i64, ptr, ptr }, ptr %24, align 8 -// CHECK-NEXT: %26 = extractvalue { ptr, i64, ptr, ptr } %25, 0 -// CHECK-NEXT: store ptr %26, ptr %11, align 8 -// CHECK-NEXT: %27 = extractvalue { ptr, i64, ptr, ptr } %25, 2 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, ptr, ptr } %25, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %24) -// CHECK-NEXT: %29 = insertvalue { ptr, ptr } undef, ptr %28, 0 -// CHECK-NEXT: %30 = insertvalue { ptr, ptr } %29, ptr null, 1 -// CHECK-NEXT: call void @"main.(*Handler).SetHandler"(ptr %27, { ptr, ptr } %30) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %31 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %3, align 8 -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %31, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %32) -// CHECK-NEXT: %33 = load ptr, ptr %10, align 8 -// CHECK-NEXT: indirectbr ptr %33, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.testDeferMethodLiteral$1"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.testDeferMethodLiteral$2"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.testDeferStructClosure(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.testDeferStructClosure$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %6 = alloca i8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 0 -// CHECK-NEXT: store ptr %6, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 2 -// CHECK-NEXT: store ptr %5, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferStructClosure, %_llgo_2), ptr %11, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %7) -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 1 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 3 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 4 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %15, align 8 -// CHECK-NEXT: %16 = call i32 @{{(__)?}}sigsetjmp(ptr %6, i32 0) -// CHECK-NEXT: %17 = icmp eq i32 %16, 0 -// CHECK-NEXT: br i1 %17, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferStructClosure, %_llgo_3), ptr %13, align 8 -// CHECK-NEXT: %18 = load i64, ptr %12, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %20 = icmp ne ptr %19, null -// CHECK-NEXT: br i1 %20, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %5) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %21 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 40) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, ptr, { ptr, ptr } }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr %21, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, ptr, { ptr, ptr } }, ptr %22, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, ptr, { ptr, ptr } }, ptr %22, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, ptr, { ptr, ptr } }, ptr %22, i32 0, i32 3 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %26, align 8 -// CHECK-NEXT: store ptr %22, ptr %15, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.testDeferStructClosure, %_llgo_6), ptr %14, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.testDeferStructClosure, %_llgo_3), ptr %14, align 8 -// CHECK-NEXT: %27 = load ptr, ptr %13, align 8 -// CHECK-NEXT: indirectbr ptr %27, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %28 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %29 = load { ptr, i64, ptr, { ptr, ptr } }, ptr %28, align 8 -// CHECK-NEXT: %30 = extractvalue { ptr, i64, ptr, { ptr, ptr } } %29, 0 -// CHECK-NEXT: store ptr %30, ptr %15, align 8 -// CHECK-NEXT: %31 = extractvalue { ptr, i64, ptr, { ptr, ptr } } %29, 2 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, ptr, { ptr, ptr } } %29, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %28) -// CHECK-NEXT: call void @"main.(*Processor).SetCallback"(ptr %31, { ptr, ptr } %32) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %33 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, align 8 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %33, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %34) -// CHECK-NEXT: %35 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %35, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.testDeferStructClosure$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.String", ptr %3, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/defercomplex/in.go b/cl/_testgo/defercomplex/in.go index 19a74dbdaf..b0bd9112dc 100644 --- a/cl/_testgo/defercomplex/in.go +++ b/cl/_testgo/defercomplex/in.go @@ -1,15 +1,83 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"cleanup-final", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"cleanup-before-loop", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"exit-outer", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"post-loop", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"branch-even", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"branch-odd", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"nested", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"nested-tail", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [1 x i8] c"-", align 1{{$}} +// Nested loop/branch defers must all use one function-level defer chain; the +// deferred recorder retains its result slice through a closure environment. +// CHECK: @[[CLEANUP_FINAL:[0-9]+]] = private unnamed_addr constant [13 x i8] c"cleanup-final" +// CHECK: @[[CLEANUP_BEFORE:[0-9]+]] = private unnamed_addr constant [19 x i8] c"cleanup-before-loop" +// CHECK: @[[EXIT_OUTER:[0-9]+]] = private unnamed_addr constant [10 x i8] c"exit-outer" +// CHECK: @[[POST_LOOP:[0-9]+]] = private unnamed_addr constant [9 x i8] c"post-loop" +// CHECK: @[[BRANCH_EVEN:[0-9]+]] = private unnamed_addr constant [11 x i8] c"branch-even" +// CHECK: @[[BRANCH_ODD:[0-9]+]] = private unnamed_addr constant [10 x i8] c"branch-odd" +// CHECK: @[[NESTED:[0-9]+]] = private unnamed_addr constant [6 x i8] c"nested" +// CHECK: @[[NESTED_TAIL:[0-9]+]] = private unnamed_addr constant [11 x i8] c"nested-tail" +// CHECK-LABEL: define %"{{.*}}Slice" @main.complexOrder(){{.*}} { +// CHECK: [[RESULT_SLOT:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 24) +// CHECK: store ptr [[RESULT_SLOT]], ptr [[RECORD_ENV_SLOT:%[0-9]+]] +// CHECK: [[RECORD_FN:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.complexOrder$1", ptr undef }, ptr [[RECORD_ENV:%[0-9]+]], 1 +// CHECK-NEXT: [[FINAL_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label1(%"{{.*}}String" { ptr @[[CLEANUP_FINAL]], i64 13 }, i64 0) +// CHECK-NEXT: [[PREVIOUS_DEFER:%[0-9]+]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[DEFER_FRAME:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREVIOUS_DEFER]], ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[DEFER_FRAME]]) +// CHECK: [[DEFER_HEAD:%[0-9]+]] = getelementptr inbounds %"{{.*}}Defer", ptr [[DEFER_FRAME]], i32 0, i32 5 +// CHECK: [[OUTER_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label1(%"{{.*}}String" { ptr @[[EXIT_OUTER]], i64 10 }, i64 [[OUTER_I:%[0-9]+]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[OUTER_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[OUTER_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[POST_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label1(%"{{.*}}String" { ptr @[[POST_LOOP]], i64 9 }, i64 0) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[POST_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[POST_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[EVEN_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label2(%"{{.*}}String" { ptr @[[BRANCH_EVEN]], i64 11 }, i64 [[OUTER_I]], i64 [[INNER_J:%[0-9]+]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[EVEN_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[EVEN_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[ODD_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label2(%"{{.*}}String" { ptr @[[BRANCH_ODD]], i64 10 }, i64 [[OUTER_I]], i64 [[INNER_J]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[ODD_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[ODD_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[NESTED_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label3(%"{{.*}}String" { ptr @[[NESTED]], i64 6 }, i64 [[OUTER_I]], i64 [[INNER_J]], i64 [[INNER_K:%[0-9]+]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[NESTED_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[NESTED_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[TAIL_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label3(%"{{.*}}String" { ptr @[[NESTED_TAIL]], i64 11 }, i64 [[OUTER_I]], i64 [[INNER_J]], i64 [[INNER_K]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[TAIL_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[TAIL_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: call void @"{{.*}}Rethrow"(ptr [[PREVIOUS_DEFER]]) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[FINAL_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[FINAL_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK-NEXT: [[BEFORE_LABEL:%[0-9]+]] = call %"{{.*}}String" @main.label1(%"{{.*}}String" { ptr @[[CLEANUP_BEFORE]], i64 19 }, i64 0) +// CHECK: store { ptr, ptr } [[RECORD_FN]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" [[BEFORE_LABEL]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[BEFORE_NODE:%[0-9]+]], ptr [[DEFER_HEAD]] +// CHECK: [[RUN_RECORD:%[0-9]+]] = load { ptr, i64, { ptr, ptr }, %"{{.*}}String" }, ptr [[RUN_NODE:%[0-9]+]] +// CHECK: [[RUN_FN:%[0-9]+]] = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}String" } [[RUN_RECORD]], 2 +// CHECK-NEXT: [[RUN_LABEL:%[0-9]+]] = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}String" } [[RUN_RECORD]], 3 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[RUN_NODE]]) +// CHECK: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %{{[0-9]+}}, %"{{.*}}String" [[RUN_LABEL]]) +// CHECK: [[SAVED_DEFER:%[0-9]+]] = load %"{{.*}}Defer", ptr [[DEFER_FRAME]] +// CHECK-NEXT: [[RESTORED_DEFER:%[0-9]+]] = extractvalue %"{{.*}}Defer" [[SAVED_DEFER]], 2 +// CHECK-NEXT: call void @"{{.*}}SetThreadDefer"(ptr [[RESTORED_DEFER]]) +// CHECK-LABEL: define void @"main.complexOrder$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}String" %1){{.*}} { +// CHECK: [[RECORD_ENV_VALUE:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[RECORD_RESULT_SLOT:%[0-9]+]] = extractvalue { ptr } [[RECORD_ENV_VALUE]], 0 +// CHECK-NEXT: [[OLD_RESULT:%[0-9]+]] = load %"{{.*}}Slice", ptr [[RECORD_RESULT_SLOT]] +// CHECK: store %"{{.*}}String" %1, ptr %{{[0-9]+}} +// CHECK: [[APPEND_DATA:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[APPEND_SLICE:%[0-9]+]], 0 +// CHECK-NEXT: [[APPEND_LEN:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[APPEND_SLICE]], 1 +// CHECK-NEXT: [[NEW_RESULT:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}SliceAppend"(%"{{.*}}Slice" [[OLD_RESULT]], ptr [[APPEND_DATA]], i64 [[APPEND_LEN]], i64 16) +// CHECK-NEXT: [[UPDATED_RESULT_SLOT:%[0-9]+]] = extractvalue { ptr } [[RECORD_ENV_VALUE]], 0 +// CHECK-NEXT: store %"{{.*}}Slice" [[NEW_RESULT]], ptr [[UPDATED_RESULT_SLOT]] +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[ORDER:%[0-9]+]] = call %"{{.*}}Slice" @main.complexOrder() +// CHECK-NEXT: [[ORDER_LEN:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[ORDER]], 1 +// CHECK: [[ORDER_DATA:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[ORDER]], 0 +// CHECK: [[LABEL_PTR:%[0-9]+]] = getelementptr inbounds %"{{.*}}String", ptr [[ORDER_DATA]], i64 %{{[0-9]+}} +// CHECK-NEXT: [[LABEL:%[0-9]+]] = load %"{{.*}}String", ptr [[LABEL_PTR]] +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[LABEL]]) func main() { for _, label := range complexOrder() { @@ -60,702 +128,3 @@ func label3(prefix string, a, b, c int) string { func digit(n int) string { return string(rune('0' + n)) } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @main.complexOrder(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.complexOrder$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @main.label1(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, i64 0) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %6 = alloca i8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 0 -// CHECK-NEXT: store ptr %6, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 2 -// CHECK-NEXT: store ptr %5, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %11, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %7) -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 1 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 3 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 4 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %15, align 8 -// CHECK-NEXT: %16 = call i32 @{{(__)?}}sigsetjmp(ptr %6, i32 0) -// CHECK-NEXT: %17 = icmp eq i32 %16, 0 -// CHECK-NEXT: br i1 %17, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_17 -// CHECK-NEXT: %18 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %0, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_7, %_llgo_18 -// CHECK-NEXT: %19 = phi i64 [ 0, %_llgo_18 ], [ %38, %_llgo_7 ] -// CHECK-NEXT: %20 = icmp slt i64 %19, 2 -// CHECK-NEXT: br i1 %20, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.String" @main.label1(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }, i64 %19) -// CHECK-NEXT: %22 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %26, align 8 -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %23, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %21, ptr %27, align 8 -// CHECK-NEXT: store ptr %23, ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %28 = call %"{{.*}}/runtime/internal/runtime.String" @main.label1(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }, i64 0) -// CHECK-NEXT: %29 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %31 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 0 -// CHECK-NEXT: store ptr %29, ptr %31, align 8 -// CHECK-NEXT: %32 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 1 -// CHECK-NEXT: store i64 3, ptr %32, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %33, align 8 -// CHECK-NEXT: %34 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %28, ptr %34, align 8 -// CHECK-NEXT: store ptr %30, ptr %15, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_20), ptr %14, align 8 -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_13, %_llgo_3 -// CHECK-NEXT: %35 = phi i64 [ 0, %_llgo_3 ], [ %63, %_llgo_13 ] -// CHECK-NEXT: %36 = icmp slt i64 %35, 2 -// CHECK-NEXT: br i1 %36, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %37 = icmp eq i64 %35, 0 -// CHECK-NEXT: br i1 %37, label %_llgo_8, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: %38 = add i64 %19, 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: %39 = call %"{{.*}}/runtime/internal/runtime.String" @main.label2(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 11 }, i64 %19, i64 %35) -// CHECK-NEXT: %40 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %42 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, i32 0, i32 0 -// CHECK-NEXT: store ptr %40, ptr %42, align 8 -// CHECK-NEXT: %43 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, i32 0, i32 1 -// CHECK-NEXT: store i64 4, ptr %43, align 8 -// CHECK-NEXT: %44 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %44, align 8 -// CHECK-NEXT: %45 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %41, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %39, ptr %45, align 8 -// CHECK-NEXT: store ptr %41, ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_10, %_llgo_8 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_6 -// CHECK-NEXT: %46 = call %"{{.*}}/runtime/internal/runtime.String" @main.label2(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }, i64 %19, i64 %35) -// CHECK-NEXT: %47 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %48 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %49 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %48, i32 0, i32 0 -// CHECK-NEXT: store ptr %47, ptr %49, align 8 -// CHECK-NEXT: %50 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %48, i32 0, i32 1 -// CHECK-NEXT: store i64 5, ptr %50, align 8 -// CHECK-NEXT: %51 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %48, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %51, align 8 -// CHECK-NEXT: %52 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %48, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %46, ptr %52, align 8 -// CHECK-NEXT: store ptr %48, ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_15, %_llgo_9 -// CHECK-NEXT: %53 = phi i64 [ 0, %_llgo_9 ], [ %71, %_llgo_15 ] -// CHECK-NEXT: %54 = icmp slt i64 %53, 2 -// CHECK-NEXT: br i1 %54, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_11 -// CHECK-NEXT: %55 = call %"{{.*}}/runtime/internal/runtime.String" @main.label3(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }, i64 %19, i64 %35, i64 %53) -// CHECK-NEXT: %56 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %58 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %57, i32 0, i32 0 -// CHECK-NEXT: store ptr %56, ptr %58, align 8 -// CHECK-NEXT: %59 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %57, i32 0, i32 1 -// CHECK-NEXT: store i64 6, ptr %59, align 8 -// CHECK-NEXT: %60 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %57, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %60, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %57, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %55, ptr %61, align 8 -// CHECK-NEXT: store ptr %57, ptr %15, align 8 -// CHECK-NEXT: %62 = icmp eq i64 %53, 1 -// CHECK-NEXT: br i1 %62, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_11 -// CHECK-NEXT: %63 = add i64 %35, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.String" @main.label3(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 11 }, i64 %19, i64 %35, i64 %53) -// CHECK-NEXT: %65 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %66 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %67 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %66, i32 0, i32 0 -// CHECK-NEXT: store ptr %65, ptr %67, align 8 -// CHECK-NEXT: %68 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %66, i32 0, i32 1 -// CHECK-NEXT: store i64 7, ptr %68, align 8 -// CHECK-NEXT: %69 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %66, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %69, align 8 -// CHECK-NEXT: %70 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %66, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %64, ptr %70, align 8 -// CHECK-NEXT: store ptr %66, ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14, %_llgo_12 -// CHECK-NEXT: %71 = add i64 %53, 1 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_19, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_27), ptr %13, align 8 -// CHECK-NEXT: %72 = load i64, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_19, %_llgo_79 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %5) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_0 -// CHECK-NEXT: %73 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %74 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %75 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %74, i32 0, i32 0 -// CHECK-NEXT: store ptr %73, ptr %75, align 8 -// CHECK-NEXT: %76 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %74, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %76, align 8 -// CHECK-NEXT: %77 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %74, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %77, align 8 -// CHECK-NEXT: %78 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %74, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %4, ptr %78, align 8 -// CHECK-NEXT: store ptr %74, ptr %15, align 8 -// CHECK-NEXT: %79 = call %"{{.*}}/runtime/internal/runtime.String" @main.label1(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }, i64 0) -// CHECK-NEXT: %80 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %82 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %81, i32 0, i32 0 -// CHECK-NEXT: store ptr %80, ptr %82, align 8 -// CHECK-NEXT: %83 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %81, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %83, align 8 -// CHECK-NEXT: %84 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %81, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %84, align 8 -// CHECK-NEXT: %85 = getelementptr inbounds { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %81, i32 0, i32 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %79, ptr %85, align 8 -// CHECK-NEXT: store ptr %81, ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_17), ptr %14, align 8 -// CHECK-NEXT: %86 = load ptr, ptr %13, align 8 -// CHECK-NEXT: indirectbr ptr %86, [label %_llgo_17, label %_llgo_21, label %_llgo_22, label %_llgo_23, label %_llgo_24, label %_llgo_25, label %_llgo_26, label %_llgo_27, label %_llgo_16] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_79 -// CHECK-NEXT: %87 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %0, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %87 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_19, %_llgo_77 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_17), ptr %13, align 8 -// CHECK-NEXT: %88 = load i64, ptr %12, align 8 -// CHECK-NEXT: %89 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %90 = icmp ne ptr %89, null -// CHECK-NEXT: br i1 %90, label %_llgo_78, label %_llgo_79 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_19, %_llgo_54 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_21), ptr %13, align 8 -// CHECK-NEXT: %91 = load i64, ptr %12, align 8 -// CHECK-NEXT: %92 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %93 = icmp ne ptr %92, null -// CHECK-NEXT: br i1 %93, label %_llgo_76, label %_llgo_77 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_19, %_llgo_52 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_22), ptr %13, align 8 -// CHECK-NEXT: %94 = load i64, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_19, %_llgo_25 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %95 = load i64, ptr %12, align 8 -// CHECK-NEXT: %96 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %97 = icmp ne ptr %96, null -// CHECK-NEXT: br i1 %97, label %_llgo_51, label %_llgo_52 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_19, %_llgo_26 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_24), ptr %13, align 8 -// CHECK-NEXT: %98 = load i64, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_19, %_llgo_27 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_25), ptr %13, align 8 -// CHECK-NEXT: %99 = load i64, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_19, %_llgo_29 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_26), ptr %13, align 8 -// CHECK-NEXT: %100 = load i64, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_26 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_50, %_llgo_48, %_llgo_46, %_llgo_44, %_llgo_42, %_llgo_16 -// CHECK-NEXT: %101 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %102 = icmp ne ptr %101, null -// CHECK-NEXT: br i1 %102, label %_llgo_30, label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_39, %_llgo_28 -// CHECK-NEXT: br label %_llgo_27 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_28 -// CHECK-NEXT: %103 = load { ptr, i64 }, ptr %101, align 8 -// CHECK-NEXT: %104 = extractvalue { ptr, i64 } %103, 1 -// CHECK-NEXT: br label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_30 -// CHECK-NEXT: %105 = icmp eq i64 %104, 2 -// CHECK-NEXT: br i1 %105, label %_llgo_32, label %_llgo_33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_31 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %13, align 8 -// CHECK-NEXT: %106 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %107 = icmp ne ptr %106, null -// CHECK-NEXT: br i1 %107, label %_llgo_41, label %_llgo_42 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_31 -// CHECK-NEXT: %108 = icmp eq i64 %104, 4 -// CHECK-NEXT: br i1 %108, label %_llgo_34, label %_llgo_35 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_34: ; preds = %_llgo_33 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %13, align 8 -// CHECK-NEXT: %109 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %110 = icmp ne ptr %109, null -// CHECK-NEXT: br i1 %110, label %_llgo_43, label %_llgo_44 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_35: ; preds = %_llgo_33 -// CHECK-NEXT: %111 = icmp eq i64 %104, 5 -// CHECK-NEXT: br i1 %111, label %_llgo_36, label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_36: ; preds = %_llgo_35 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %13, align 8 -// CHECK-NEXT: %112 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %113 = icmp ne ptr %112, null -// CHECK-NEXT: br i1 %113, label %_llgo_45, label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_37: ; preds = %_llgo_35 -// CHECK-NEXT: %114 = icmp eq i64 %104, 6 -// CHECK-NEXT: br i1 %114, label %_llgo_38, label %_llgo_39 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_38: ; preds = %_llgo_37 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %13, align 8 -// CHECK-NEXT: %115 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %116 = icmp ne ptr %115, null -// CHECK-NEXT: br i1 %116, label %_llgo_47, label %_llgo_48 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_39: ; preds = %_llgo_37 -// CHECK-NEXT: %117 = icmp eq i64 %104, 7 -// CHECK-NEXT: br i1 %117, label %_llgo_40, label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_40: ; preds = %_llgo_39 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_16), ptr %13, align 8 -// CHECK-NEXT: %118 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %119 = icmp ne ptr %118, null -// CHECK-NEXT: br i1 %119, label %_llgo_49, label %_llgo_50 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_41: ; preds = %_llgo_32 -// CHECK-NEXT: %120 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %121 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %120, align 8 -// CHECK-NEXT: %122 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %121, 0 -// CHECK-NEXT: store ptr %122, ptr %15, align 8 -// CHECK-NEXT: %123 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %121, 2 -// CHECK-NEXT: %124 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %121, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %120) -// CHECK-NEXT: %125 = extractvalue { ptr, ptr } %123, 1 -// CHECK-NEXT: %126 = extractvalue { ptr, ptr } %123, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %126) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %125, %"{{.*}}/runtime/internal/runtime.String" %124) -// CHECK-NEXT: br label %_llgo_42 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_42: ; preds = %_llgo_41, %_llgo_32 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_43: ; preds = %_llgo_34 -// CHECK-NEXT: %127 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %128 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %127, align 8 -// CHECK-NEXT: %129 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %128, 0 -// CHECK-NEXT: store ptr %129, ptr %15, align 8 -// CHECK-NEXT: %130 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %128, 2 -// CHECK-NEXT: %131 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %128, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %127) -// CHECK-NEXT: %132 = extractvalue { ptr, ptr } %130, 1 -// CHECK-NEXT: %133 = extractvalue { ptr, ptr } %130, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %133) -// CHECK-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %132, %"{{.*}}/runtime/internal/runtime.String" %131) -// CHECK-NEXT: br label %_llgo_44 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_44: ; preds = %_llgo_43, %_llgo_34 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_45: ; preds = %_llgo_36 -// CHECK-NEXT: %134 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %135 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %134, align 8 -// CHECK-NEXT: %136 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %135, 0 -// CHECK-NEXT: store ptr %136, ptr %15, align 8 -// CHECK-NEXT: %137 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %135, 2 -// CHECK-NEXT: %138 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %135, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %134) -// CHECK-NEXT: %139 = extractvalue { ptr, ptr } %137, 1 -// CHECK-NEXT: %140 = extractvalue { ptr, ptr } %137, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %140) -// CHECK-NEXT: call void %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %139, %"{{.*}}/runtime/internal/runtime.String" %138) -// CHECK-NEXT: br label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_46: ; preds = %_llgo_45, %_llgo_36 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_47: ; preds = %_llgo_38 -// CHECK-NEXT: %141 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %142 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %141, align 8 -// CHECK-NEXT: %143 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %142, 0 -// CHECK-NEXT: store ptr %143, ptr %15, align 8 -// CHECK-NEXT: %144 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %142, 2 -// CHECK-NEXT: %145 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %142, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %141) -// CHECK-NEXT: %146 = extractvalue { ptr, ptr } %144, 1 -// CHECK-NEXT: %147 = extractvalue { ptr, ptr } %144, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %147) -// CHECK-NEXT: call void %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %146, %"{{.*}}/runtime/internal/runtime.String" %145) -// CHECK-NEXT: br label %_llgo_48 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_48: ; preds = %_llgo_47, %_llgo_38 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_49: ; preds = %_llgo_40 -// CHECK-NEXT: %148 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %149 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %148, align 8 -// CHECK-NEXT: %150 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %149, 0 -// CHECK-NEXT: store ptr %150, ptr %15, align 8 -// CHECK-NEXT: %151 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %149, 2 -// CHECK-NEXT: %152 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %149, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %148) -// CHECK-NEXT: %153 = extractvalue { ptr, ptr } %151, 1 -// CHECK-NEXT: %154 = extractvalue { ptr, ptr } %151, 0 -// CHECK-NEXT: %__llgo_funcval_code4 = call ptr asm "", "=r,0"(ptr %154) -// CHECK-NEXT: call void %__llgo_funcval_code4(ptr {{(nest|swiftself)}} %153, %"{{.*}}/runtime/internal/runtime.String" %152) -// CHECK-NEXT: br label %_llgo_50 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_50: ; preds = %_llgo_49, %_llgo_40 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_51: ; preds = %_llgo_24 -// CHECK-NEXT: %155 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %156 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %155, align 8 -// CHECK-NEXT: %157 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %156, 0 -// CHECK-NEXT: store ptr %157, ptr %15, align 8 -// CHECK-NEXT: %158 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %156, 2 -// CHECK-NEXT: %159 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %156, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %155) -// CHECK-NEXT: %160 = extractvalue { ptr, ptr } %158, 1 -// CHECK-NEXT: %161 = extractvalue { ptr, ptr } %158, 0 -// CHECK-NEXT: %__llgo_funcval_code5 = call ptr asm "", "=r,0"(ptr %161) -// CHECK-NEXT: call void %__llgo_funcval_code5(ptr {{(nest|swiftself)}} %160, %"{{.*}}/runtime/internal/runtime.String" %159) -// CHECK-NEXT: br label %_llgo_52 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_52: ; preds = %_llgo_51, %_llgo_24 -// CHECK-NEXT: br label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_53: ; preds = %_llgo_75, %_llgo_73, %_llgo_71, %_llgo_69, %_llgo_67, %_llgo_23 -// CHECK-NEXT: %162 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %163 = icmp ne ptr %162, null -// CHECK-NEXT: br i1 %163, label %_llgo_55, label %_llgo_54 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_54: ; preds = %_llgo_64, %_llgo_53 -// CHECK-NEXT: br label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_55: ; preds = %_llgo_53 -// CHECK-NEXT: %164 = load { ptr, i64 }, ptr %162, align 8 -// CHECK-NEXT: %165 = extractvalue { ptr, i64 } %164, 1 -// CHECK-NEXT: br label %_llgo_56 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_56: ; preds = %_llgo_55 -// CHECK-NEXT: %166 = icmp eq i64 %165, 2 -// CHECK-NEXT: br i1 %166, label %_llgo_57, label %_llgo_58 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_57: ; preds = %_llgo_56 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %167 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %168 = icmp ne ptr %167, null -// CHECK-NEXT: br i1 %168, label %_llgo_66, label %_llgo_67 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_58: ; preds = %_llgo_56 -// CHECK-NEXT: %169 = icmp eq i64 %165, 4 -// CHECK-NEXT: br i1 %169, label %_llgo_59, label %_llgo_60 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_59: ; preds = %_llgo_58 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %170 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %171 = icmp ne ptr %170, null -// CHECK-NEXT: br i1 %171, label %_llgo_68, label %_llgo_69 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_60: ; preds = %_llgo_58 -// CHECK-NEXT: %172 = icmp eq i64 %165, 5 -// CHECK-NEXT: br i1 %172, label %_llgo_61, label %_llgo_62 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_61: ; preds = %_llgo_60 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %173 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %174 = icmp ne ptr %173, null -// CHECK-NEXT: br i1 %174, label %_llgo_70, label %_llgo_71 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_62: ; preds = %_llgo_60 -// CHECK-NEXT: %175 = icmp eq i64 %165, 6 -// CHECK-NEXT: br i1 %175, label %_llgo_63, label %_llgo_64 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_63: ; preds = %_llgo_62 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %176 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %177 = icmp ne ptr %176, null -// CHECK-NEXT: br i1 %177, label %_llgo_72, label %_llgo_73 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_64: ; preds = %_llgo_62 -// CHECK-NEXT: %178 = icmp eq i64 %165, 7 -// CHECK-NEXT: br i1 %178, label %_llgo_65, label %_llgo_54 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_65: ; preds = %_llgo_64 -// CHECK-NEXT: store ptr blockaddress(@main.complexOrder, %_llgo_23), ptr %13, align 8 -// CHECK-NEXT: %179 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %180 = icmp ne ptr %179, null -// CHECK-NEXT: br i1 %180, label %_llgo_74, label %_llgo_75 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_66: ; preds = %_llgo_57 -// CHECK-NEXT: %181 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %182 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %181, align 8 -// CHECK-NEXT: %183 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %182, 0 -// CHECK-NEXT: store ptr %183, ptr %15, align 8 -// CHECK-NEXT: %184 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %182, 2 -// CHECK-NEXT: %185 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %182, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %181) -// CHECK-NEXT: %186 = extractvalue { ptr, ptr } %184, 1 -// CHECK-NEXT: %187 = extractvalue { ptr, ptr } %184, 0 -// CHECK-NEXT: %__llgo_funcval_code6 = call ptr asm "", "=r,0"(ptr %187) -// CHECK-NEXT: call void %__llgo_funcval_code6(ptr {{(nest|swiftself)}} %186, %"{{.*}}/runtime/internal/runtime.String" %185) -// CHECK-NEXT: br label %_llgo_67 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_67: ; preds = %_llgo_66, %_llgo_57 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_68: ; preds = %_llgo_59 -// CHECK-NEXT: %188 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %189 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %188, align 8 -// CHECK-NEXT: %190 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %189, 0 -// CHECK-NEXT: store ptr %190, ptr %15, align 8 -// CHECK-NEXT: %191 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %189, 2 -// CHECK-NEXT: %192 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %189, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %188) -// CHECK-NEXT: %193 = extractvalue { ptr, ptr } %191, 1 -// CHECK-NEXT: %194 = extractvalue { ptr, ptr } %191, 0 -// CHECK-NEXT: %__llgo_funcval_code7 = call ptr asm "", "=r,0"(ptr %194) -// CHECK-NEXT: call void %__llgo_funcval_code7(ptr {{(nest|swiftself)}} %193, %"{{.*}}/runtime/internal/runtime.String" %192) -// CHECK-NEXT: br label %_llgo_69 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_69: ; preds = %_llgo_68, %_llgo_59 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_70: ; preds = %_llgo_61 -// CHECK-NEXT: %195 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %196 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %195, align 8 -// CHECK-NEXT: %197 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %196, 0 -// CHECK-NEXT: store ptr %197, ptr %15, align 8 -// CHECK-NEXT: %198 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %196, 2 -// CHECK-NEXT: %199 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %196, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %195) -// CHECK-NEXT: %200 = extractvalue { ptr, ptr } %198, 1 -// CHECK-NEXT: %201 = extractvalue { ptr, ptr } %198, 0 -// CHECK-NEXT: %__llgo_funcval_code8 = call ptr asm "", "=r,0"(ptr %201) -// CHECK-NEXT: call void %__llgo_funcval_code8(ptr {{(nest|swiftself)}} %200, %"{{.*}}/runtime/internal/runtime.String" %199) -// CHECK-NEXT: br label %_llgo_71 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_71: ; preds = %_llgo_70, %_llgo_61 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_72: ; preds = %_llgo_63 -// CHECK-NEXT: %202 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %203 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %202, align 8 -// CHECK-NEXT: %204 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %203, 0 -// CHECK-NEXT: store ptr %204, ptr %15, align 8 -// CHECK-NEXT: %205 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %203, 2 -// CHECK-NEXT: %206 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %203, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %202) -// CHECK-NEXT: %207 = extractvalue { ptr, ptr } %205, 1 -// CHECK-NEXT: %208 = extractvalue { ptr, ptr } %205, 0 -// CHECK-NEXT: %__llgo_funcval_code9 = call ptr asm "", "=r,0"(ptr %208) -// CHECK-NEXT: call void %__llgo_funcval_code9(ptr {{(nest|swiftself)}} %207, %"{{.*}}/runtime/internal/runtime.String" %206) -// CHECK-NEXT: br label %_llgo_73 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_73: ; preds = %_llgo_72, %_llgo_63 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_74: ; preds = %_llgo_65 -// CHECK-NEXT: %209 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %210 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %209, align 8 -// CHECK-NEXT: %211 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %210, 0 -// CHECK-NEXT: store ptr %211, ptr %15, align 8 -// CHECK-NEXT: %212 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %210, 2 -// CHECK-NEXT: %213 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %210, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %209) -// CHECK-NEXT: %214 = extractvalue { ptr, ptr } %212, 1 -// CHECK-NEXT: %215 = extractvalue { ptr, ptr } %212, 0 -// CHECK-NEXT: %__llgo_funcval_code10 = call ptr asm "", "=r,0"(ptr %215) -// CHECK-NEXT: call void %__llgo_funcval_code10(ptr {{(nest|swiftself)}} %214, %"{{.*}}/runtime/internal/runtime.String" %213) -// CHECK-NEXT: br label %_llgo_75 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_75: ; preds = %_llgo_74, %_llgo_65 -// CHECK-NEXT: br label %_llgo_53 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_76: ; preds = %_llgo_22 -// CHECK-NEXT: %216 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %217 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %216, align 8 -// CHECK-NEXT: %218 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %217, 0 -// CHECK-NEXT: store ptr %218, ptr %15, align 8 -// CHECK-NEXT: %219 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %217, 2 -// CHECK-NEXT: %220 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %217, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %216) -// CHECK-NEXT: %221 = extractvalue { ptr, ptr } %219, 1 -// CHECK-NEXT: %222 = extractvalue { ptr, ptr } %219, 0 -// CHECK-NEXT: %__llgo_funcval_code11 = call ptr asm "", "=r,0"(ptr %222) -// CHECK-NEXT: call void %__llgo_funcval_code11(ptr {{(nest|swiftself)}} %221, %"{{.*}}/runtime/internal/runtime.String" %220) -// CHECK-NEXT: br label %_llgo_77 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_77: ; preds = %_llgo_76, %_llgo_22 -// CHECK-NEXT: br label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_78: ; preds = %_llgo_21 -// CHECK-NEXT: %223 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %224 = load { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" }, ptr %223, align 8 -// CHECK-NEXT: %225 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %224, 0 -// CHECK-NEXT: store ptr %225, ptr %15, align 8 -// CHECK-NEXT: %226 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %224, 2 -// CHECK-NEXT: %227 = extractvalue { ptr, i64, { ptr, ptr }, %"{{.*}}/runtime/internal/runtime.String" } %224, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %223) -// CHECK-NEXT: %228 = extractvalue { ptr, ptr } %226, 1 -// CHECK-NEXT: %229 = extractvalue { ptr, ptr } %226, 0 -// CHECK-NEXT: %__llgo_funcval_code12 = call ptr asm "", "=r,0"(ptr %229) -// CHECK-NEXT: call void %__llgo_funcval_code12(ptr {{(nest|swiftself)}} %228, %"{{.*}}/runtime/internal/runtime.String" %227) -// CHECK-NEXT: br label %_llgo_79 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_79: ; preds = %_llgo_78, %_llgo_21 -// CHECK-NEXT: %230 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %7, align 8 -// CHECK-NEXT: %231 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %230, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %231) -// CHECK-NEXT: %232 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %232, [label %_llgo_17, label %_llgo_20] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.complexOrder$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %5, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %1, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %5, 0 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, i64 1, 1 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, i64 1, 2 -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, 0 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, 1 -// CHECK-NEXT: %12 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %4, ptr %10, i64 %11, i64 16) -// CHECK-NEXT: %13 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %12, ptr %13, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = add i64 48, %0 -// CHECK-NEXT: %2 = trunc i64 %1 to i32 -// CHECK-NEXT: %3 = sext i32 %2 to i64 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromInt64"(i64 %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.label1(%"{{.*}}/runtime/internal/runtime.String" %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %1) -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %2, %"{{.*}}/runtime/internal/runtime.String" %3) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.label2(%"{{.*}}/runtime/internal/runtime.String" %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %1) -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %3, %"{{.*}}/runtime/internal/runtime.String" %4) -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %5, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %2) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %6, %"{{.*}}/runtime/internal/runtime.String" %7) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %8 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.label3(%"{{.*}}/runtime/internal/runtime.String" %0, i64 %1, i64 %2, i64 %3){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %1) -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %4, %"{{.*}}/runtime/internal/runtime.String" %5) -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %6, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %2) -// CHECK-NEXT: %9 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %7, %"{{.*}}/runtime/internal/runtime.String" %8) -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %9, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }) -// CHECK-NEXT: %11 = call %"{{.*}}/runtime/internal/runtime.String" @main.digit(i64 %3) -// CHECK-NEXT: %12 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %10, %"{{.*}}/runtime/internal/runtime.String" %11) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %12 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.Slice" @main.complexOrder() -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %2 = phi i64 [ -1, %_llgo_0 ], [ %3, %_llgo_2 ] -// CHECK-NEXT: %3 = add i64 %2, 1 -// CHECK-NEXT: %4 = icmp slt i64 %3, %1 -// CHECK-NEXT: br i1 %4, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %7 = icmp slt i64 %3, 0 -// CHECK-NEXT: %8 = icmp uge i64 %3, %6 -// CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, i64 %3, i1 true, i64 %6) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %5, i64 %3 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.String", ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/deferdispatch-wasm-target/in.go b/cl/_testgo/deferdispatch-wasm-target/in.go index fa31f1a8d5..bbdc3061e6 100644 --- a/cl/_testgo/deferdispatch-wasm-target/in.go +++ b/cl/_testgo/deferdispatch-wasm-target/in.go @@ -1,8 +1,10 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --check-globals=smart +// NOTE: Autogenerated snapshot targets: TARGET-WASM package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} +// TARGET-WASM: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} +// TARGET-WASM: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} func run() { defer println("first") @@ -13,144 +15,129 @@ func main() { run() } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.run() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.run(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8, i32 200, align 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 24) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 4 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i32 0, ptr %4, align 4 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 4 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr null, ptr %6, align 4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %9, align 4 -// CHECK-NEXT: store ptr null, ptr %10, align 4 -// CHECK-NEXT: %11 = call i32 @setjmp(ptr %1) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr inttoptr (i32 2 to ptr), ptr %8, align 4 -// CHECK-NEXT: %13 = load i32, ptr %7, align 4 -// CHECK-NEXT: %14 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %15 = icmp ne ptr %14, null -// CHECK-NEXT: br i1 %15, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %16 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: store ptr %16, ptr %18, align 4 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i32 0, ptr %19, align 4 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i32 5 }, ptr %20, align 4 -// CHECK-NEXT: store ptr %17, ptr %10, align 4 -// CHECK-NEXT: %21 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr %21, ptr %23, align 4 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 1 -// CHECK-NEXT: store i32 1, ptr %24, align 4 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i32 6 }, ptr %25, align 4 -// CHECK-NEXT: store ptr %22, ptr %10, align 4 -// CHECK-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %9, align 4 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr null, ptr %9, align 4 -// CHECK-NEXT: %26 = load ptr, ptr %8, align 4 -// CHECK-NEXT: %27 = ptrtoint ptr %26 to i32 -// CHECK-NEXT: switch i32 %27, label %_llgo_13 [ -// CHECK-NEXT: i32 1, label %_llgo_3 -// CHECK-NEXT: i32 2, label %_llgo_7 -// CHECK-NEXT: i32 0, label %_llgo_2 -// CHECK-NEXT: ] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_11 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5, %_llgo_9 -// CHECK-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %8, align 4 -// CHECK-NEXT: %28 = load i32, ptr %7, align 4 -// CHECK-NEXT: %29 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %30 = icmp ne ptr %29, null -// CHECK-NEXT: br i1 %30, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: %31 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %32 = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %31, align 4 -// CHECK-NEXT: %33 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %32, 0 -// CHECK-NEXT: store ptr %33, ptr %10, align 4 -// CHECK-NEXT: %34 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %32, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %31) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_2 -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7 -// CHECK-NEXT: %35 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %36 = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %35, align 4 -// CHECK-NEXT: %37 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %36, 0 -// CHECK-NEXT: store ptr %37, ptr %10, align 4 -// CHECK-NEXT: %38 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %36, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10, %_llgo_7 -// CHECK-NEXT: %39 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 4 -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %39, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %40) -// CHECK-NEXT: %41 = load ptr, ptr %9, align 4 -// CHECK-NEXT: %42 = ptrtoint ptr %41 to i32 -// CHECK-NEXT: switch i32 %42, label %_llgo_12 [ -// CHECK-NEXT: i32 0, label %_llgo_3 -// CHECK-NEXT: i32 1, label %_llgo_6 -// CHECK-NEXT: ] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_11 -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_5 -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// TARGET-WASM-LABEL: define void @main.run(){{.*}} { +// TARGET-WASM-NEXT: _llgo_[[BB0:[0-9]+]]: +// TARGET-WASM-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// TARGET-WASM-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// TARGET-WASM-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// TARGET-WASM-NEXT: %[[TMP3:[0-9]+]] = alloca i8, i32 200, align 1 +// TARGET-WASM-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 24) +// TARGET-WASM-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 0 +// TARGET-WASM-NEXT: store ptr %[[TMP3]], ptr %[[TMP5]], align 4 +// TARGET-WASM-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// TARGET-WASM-NEXT: store i32 0, ptr %[[TMP6]], align 4 +// TARGET-WASM-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 2 +// TARGET-WASM-NEXT: store ptr %[[TMP2]], ptr %[[TMP7]], align 4 +// TARGET-WASM-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// TARGET-WASM-NEXT: store ptr null, ptr %[[TMP8]], align 4 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP4]]) +// TARGET-WASM-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// TARGET-WASM-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// TARGET-WASM-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 4 +// TARGET-WASM-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 5 +// TARGET-WASM-NEXT: store ptr null, ptr %[[TMP11]], align 4 +// TARGET-WASM-NEXT: store ptr null, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP13:[0-9]+]] = call i32 @setjmp(ptr %[[TMP3]]) +// TARGET-WASM-NEXT: %[[TMP14:[0-9]+]] = icmp eq i32 %[[TMP13]], 0 +// TARGET-WASM-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB4:[0-9]+]], label %_llgo_[[BB5:[0-9]+]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB1:[0-9]+]]: +// TARGET-WASM-NEXT: ret void +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB2:[0-9]+]]: +// TARGET-WASM-NEXT: store ptr inttoptr (i32 2 to ptr), ptr %[[TMP10]], align 4 +// TARGET-WASM-NEXT: %[[TMP15:[0-9]+]] = load i32, ptr %[[TMP9]], align 4 +// TARGET-WASM-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP17:[0-9]+]] = icmp ne ptr %[[TMP16]], null +// TARGET-WASM-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB8:[0-9]+]], label %_llgo_[[BB9:[0-9]+]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB3:[0-9]+]]: +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %[[TMP2]]) +// TARGET-WASM-NEXT: br label %_llgo_[[BB1]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB4]]: +// TARGET-WASM-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP19:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) +// TARGET-WASM-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 0 +// TARGET-WASM-NEXT: store ptr %[[TMP18]], ptr %[[TMP20]], align 4 +// TARGET-WASM-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 1 +// TARGET-WASM-NEXT: store i32 0, ptr %[[TMP21]], align 4 +// TARGET-WASM-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 2 +// TARGET-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i32 5 }, ptr %[[TMP22]], align 4 +// TARGET-WASM-NEXT: store ptr %[[TMP19]], ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) +// TARGET-WASM-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 0 +// TARGET-WASM-NEXT: store ptr %[[TMP23]], ptr %[[TMP25]], align 4 +// TARGET-WASM-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 1 +// TARGET-WASM-NEXT: store i32 1, ptr %[[TMP26]], align 4 +// TARGET-WASM-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 2 +// TARGET-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i32 6 }, ptr %[[TMP27]], align 4 +// TARGET-WASM-NEXT: store ptr %[[TMP24]], ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %[[TMP11]], align 4 +// TARGET-WASM-NEXT: br label %_llgo_[[BB2]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB5]]: +// TARGET-WASM-NEXT: store ptr null, ptr %[[TMP11]], align 4 +// TARGET-WASM-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP10]], align 4 +// TARGET-WASM-NEXT: %[[TMP29:[0-9]+]] = ptrtoint ptr %[[TMP28]] to i32 +// TARGET-WASM-NEXT: switch i32 %[[TMP29]], label %_llgo_[[BB13:[0-9]+]] [ +// TARGET-WASM-NEXT: i32 1, label %_llgo_[[BB3]] +// TARGET-WASM-NEXT: i32 2, label %_llgo_[[BB7:[0-9]+]] +// TARGET-WASM-NEXT: i32 0, label %_llgo_[[BB2]] +// TARGET-WASM-NEXT: ] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB6:[0-9]+]]: +// TARGET-WASM-NEXT: ret void +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB7]]: +// TARGET-WASM-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %[[TMP10]], align 4 +// TARGET-WASM-NEXT: %[[TMP30:[0-9]+]] = load i32, ptr %[[TMP9]], align 4 +// TARGET-WASM-NEXT: %[[TMP31:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP32:[0-9]+]] = icmp ne ptr %[[TMP31]], null +// TARGET-WASM-NEXT: br i1 %[[TMP32]], label %_llgo_[[BB10:[0-9]+]], label %_llgo_[[BB11:[0-9]+]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB8]]: +// TARGET-WASM-NEXT: %[[TMP33:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP34:[0-9]+]] = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP33]], align 4 +// TARGET-WASM-NEXT: %[[TMP35:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP34]], 0 +// TARGET-WASM-NEXT: store ptr %[[TMP35]], ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP36:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP34]], 2 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP33]]) +// TARGET-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP36]], ptr %[[TMP1]], align 4 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr byval(%"{{.*}}/runtime/internal/runtime.String") %[[TMP1]]) +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// TARGET-WASM-NEXT: br label %_llgo_[[BB9]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB9]]: +// TARGET-WASM-NEXT: br label %_llgo_[[BB7]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB10]]: +// TARGET-WASM-NEXT: %[[TMP37:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP38:[0-9]+]] = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP37]], align 4 +// TARGET-WASM-NEXT: %[[TMP39:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP38]], 0 +// TARGET-WASM-NEXT: store ptr %[[TMP39]], ptr %[[TMP12]], align 4 +// TARGET-WASM-NEXT: %[[TMP40:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP38]], 2 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP37]]) +// TARGET-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP40]], ptr %[[TMP0]], align 4 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr byval(%"{{.*}}/runtime/internal/runtime.String") %[[TMP0]]) +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// TARGET-WASM-NEXT: br label %_llgo_[[BB11]] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB11]]: +// TARGET-WASM-NEXT: %[[TMP41:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], align 4 +// TARGET-WASM-NEXT: %[[TMP42:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %[[TMP41]], 2 +// TARGET-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP42]]) +// TARGET-WASM-NEXT: %[[TMP43:[0-9]+]] = load ptr, ptr %[[TMP11]], align 4 +// TARGET-WASM-NEXT: %[[TMP44:[0-9]+]] = ptrtoint ptr %[[TMP43]] to i32 +// TARGET-WASM-NEXT: switch i32 %[[TMP44]], label %_llgo_[[BB12:[0-9]+]] [ +// TARGET-WASM-NEXT: i32 0, label %_llgo_[[BB3]] +// TARGET-WASM-NEXT: i32 1, label %_llgo_[[BB6]] +// TARGET-WASM-NEXT: ] +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB12]]: +// TARGET-WASM-NEXT: unreachable +// TARGET-WASM-EMPTY: +// TARGET-WASM-NEXT: _llgo_[[BB13]]: +// TARGET-WASM-NEXT: unreachable +// TARGET-WASM-NEXT: } diff --git a/cl/_testgo/deferdispatch-wasm/in.go b/cl/_testgo/deferdispatch-wasm/in.go index fa31f1a8d5..87f52bc3bb 100644 --- a/cl/_testgo/deferdispatch-wasm/in.go +++ b/cl/_testgo/deferdispatch-wasm/in.go @@ -1,8 +1,10 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --check-globals=smart +// NOTE: Autogenerated snapshot targets: WASIP1-WASM package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} +// WASIP1-WASM: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} +// WASIP1-WASM: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} func run() { defer println("first") @@ -13,144 +15,129 @@ func main() { run() } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.run() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.run(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8, i32 200, align 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 24) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 4 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i32 0, ptr %4, align 4 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 4 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr null, ptr %6, align 4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %9, align 4 -// CHECK-NEXT: store ptr null, ptr %10, align 4 -// CHECK-NEXT: %11 = call i32 @setjmp(ptr %1) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr inttoptr (i32 2 to ptr), ptr %8, align 4 -// CHECK-NEXT: %13 = load i32, ptr %7, align 4 -// CHECK-NEXT: %14 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %15 = icmp ne ptr %14, null -// CHECK-NEXT: br i1 %15, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %16 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: store ptr %16, ptr %18, align 4 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i32 0, ptr %19, align 4 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i32 5 }, ptr %20, align 4 -// CHECK-NEXT: store ptr %17, ptr %10, align 4 -// CHECK-NEXT: %21 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr %21, ptr %23, align 4 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 1 -// CHECK-NEXT: store i32 1, ptr %24, align 4 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i32 6 }, ptr %25, align 4 -// CHECK-NEXT: store ptr %22, ptr %10, align 4 -// CHECK-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %9, align 4 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr null, ptr %9, align 4 -// CHECK-NEXT: %26 = load ptr, ptr %8, align 4 -// CHECK-NEXT: %27 = ptrtoint ptr %26 to i32 -// CHECK-NEXT: switch i32 %27, label %_llgo_13 [ -// CHECK-NEXT: i32 1, label %_llgo_3 -// CHECK-NEXT: i32 2, label %_llgo_7 -// CHECK-NEXT: i32 0, label %_llgo_2 -// CHECK-NEXT: ] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_11 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5, %_llgo_9 -// CHECK-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %8, align 4 -// CHECK-NEXT: %28 = load i32, ptr %7, align 4 -// CHECK-NEXT: %29 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %30 = icmp ne ptr %29, null -// CHECK-NEXT: br i1 %30, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: %31 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %32 = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %31, align 4 -// CHECK-NEXT: %33 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %32, 0 -// CHECK-NEXT: store ptr %33, ptr %10, align 4 -// CHECK-NEXT: %34 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %32, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %31) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_2 -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7 -// CHECK-NEXT: %35 = load ptr, ptr %10, align 4 -// CHECK-NEXT: %36 = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %35, align 4 -// CHECK-NEXT: %37 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %36, 0 -// CHECK-NEXT: store ptr %37, ptr %10, align 4 -// CHECK-NEXT: %38 = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %36, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10, %_llgo_7 -// CHECK-NEXT: %39 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 4 -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %39, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %40) -// CHECK-NEXT: %41 = load ptr, ptr %9, align 4 -// CHECK-NEXT: %42 = ptrtoint ptr %41 to i32 -// CHECK-NEXT: switch i32 %42, label %_llgo_12 [ -// CHECK-NEXT: i32 0, label %_llgo_3 -// CHECK-NEXT: i32 1, label %_llgo_6 -// CHECK-NEXT: ] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_11 -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_5 -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// WASIP1-WASM-LABEL: define void @main.run(){{.*}} { +// WASIP1-WASM-NEXT: _llgo_[[BB0:[0-9]+]]: +// WASIP1-WASM-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// WASIP1-WASM-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// WASIP1-WASM-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// WASIP1-WASM-NEXT: %[[TMP3:[0-9]+]] = alloca i8, i32 200, align 1 +// WASIP1-WASM-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 24) +// WASIP1-WASM-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 0 +// WASIP1-WASM-NEXT: store ptr %[[TMP3]], ptr %[[TMP5]], align 4 +// WASIP1-WASM-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// WASIP1-WASM-NEXT: store i32 0, ptr %[[TMP6]], align 4 +// WASIP1-WASM-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 2 +// WASIP1-WASM-NEXT: store ptr %[[TMP2]], ptr %[[TMP7]], align 4 +// WASIP1-WASM-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// WASIP1-WASM-NEXT: store ptr null, ptr %[[TMP8]], align 4 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP4]]) +// WASIP1-WASM-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// WASIP1-WASM-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// WASIP1-WASM-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 4 +// WASIP1-WASM-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 5 +// WASIP1-WASM-NEXT: store ptr null, ptr %[[TMP11]], align 4 +// WASIP1-WASM-NEXT: store ptr null, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP13:[0-9]+]] = call i32 @setjmp(ptr %[[TMP3]]) +// WASIP1-WASM-NEXT: %[[TMP14:[0-9]+]] = icmp eq i32 %[[TMP13]], 0 +// WASIP1-WASM-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB4:[0-9]+]], label %_llgo_[[BB5:[0-9]+]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB1:[0-9]+]]: +// WASIP1-WASM-NEXT: ret void +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB2:[0-9]+]]: +// WASIP1-WASM-NEXT: store ptr inttoptr (i32 2 to ptr), ptr %[[TMP10]], align 4 +// WASIP1-WASM-NEXT: %[[TMP15:[0-9]+]] = load i32, ptr %[[TMP9]], align 4 +// WASIP1-WASM-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP17:[0-9]+]] = icmp ne ptr %[[TMP16]], null +// WASIP1-WASM-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB8:[0-9]+]], label %_llgo_[[BB9:[0-9]+]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB3:[0-9]+]]: +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %[[TMP2]]) +// WASIP1-WASM-NEXT: br label %_llgo_[[BB1]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB4]]: +// WASIP1-WASM-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP19:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) +// WASIP1-WASM-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 0 +// WASIP1-WASM-NEXT: store ptr %[[TMP18]], ptr %[[TMP20]], align 4 +// WASIP1-WASM-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 1 +// WASIP1-WASM-NEXT: store i32 0, ptr %[[TMP21]], align 4 +// WASIP1-WASM-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 2 +// WASIP1-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i32 5 }, ptr %[[TMP22]], align 4 +// WASIP1-WASM-NEXT: store ptr %[[TMP19]], ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i32 16) +// WASIP1-WASM-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 0 +// WASIP1-WASM-NEXT: store ptr %[[TMP23]], ptr %[[TMP25]], align 4 +// WASIP1-WASM-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 1 +// WASIP1-WASM-NEXT: store i32 1, ptr %[[TMP26]], align 4 +// WASIP1-WASM-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 2 +// WASIP1-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i32 6 }, ptr %[[TMP27]], align 4 +// WASIP1-WASM-NEXT: store ptr %[[TMP24]], ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %[[TMP11]], align 4 +// WASIP1-WASM-NEXT: br label %_llgo_[[BB2]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB5]]: +// WASIP1-WASM-NEXT: store ptr null, ptr %[[TMP11]], align 4 +// WASIP1-WASM-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP10]], align 4 +// WASIP1-WASM-NEXT: %[[TMP29:[0-9]+]] = ptrtoint ptr %[[TMP28]] to i32 +// WASIP1-WASM-NEXT: switch i32 %[[TMP29]], label %_llgo_[[BB13:[0-9]+]] [ +// WASIP1-WASM-NEXT: i32 1, label %_llgo_[[BB3]] +// WASIP1-WASM-NEXT: i32 2, label %_llgo_[[BB7:[0-9]+]] +// WASIP1-WASM-NEXT: i32 0, label %_llgo_[[BB2]] +// WASIP1-WASM-NEXT: ] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB6:[0-9]+]]: +// WASIP1-WASM-NEXT: ret void +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB7]]: +// WASIP1-WASM-NEXT: store ptr inttoptr (i32 1 to ptr), ptr %[[TMP10]], align 4 +// WASIP1-WASM-NEXT: %[[TMP30:[0-9]+]] = load i32, ptr %[[TMP9]], align 4 +// WASIP1-WASM-NEXT: %[[TMP31:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP32:[0-9]+]] = icmp ne ptr %[[TMP31]], null +// WASIP1-WASM-NEXT: br i1 %[[TMP32]], label %_llgo_[[BB10:[0-9]+]], label %_llgo_[[BB11:[0-9]+]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB8]]: +// WASIP1-WASM-NEXT: %[[TMP33:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP34:[0-9]+]] = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP33]], align 4 +// WASIP1-WASM-NEXT: %[[TMP35:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP34]], 0 +// WASIP1-WASM-NEXT: store ptr %[[TMP35]], ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP36:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP34]], 2 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP33]]) +// WASIP1-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP36]], ptr %[[TMP1]], align 4 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr byval(%"{{.*}}/runtime/internal/runtime.String") %[[TMP1]]) +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// WASIP1-WASM-NEXT: br label %_llgo_[[BB9]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB9]]: +// WASIP1-WASM-NEXT: br label %_llgo_[[BB7]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB10]]: +// WASIP1-WASM-NEXT: %[[TMP37:[0-9]+]] = load ptr, ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP38:[0-9]+]] = load { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP37]], align 4 +// WASIP1-WASM-NEXT: %[[TMP39:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP38]], 0 +// WASIP1-WASM-NEXT: store ptr %[[TMP39]], ptr %[[TMP12]], align 4 +// WASIP1-WASM-NEXT: %[[TMP40:[0-9]+]] = extractvalue { ptr, i32, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP38]], 2 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP37]]) +// WASIP1-WASM-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP40]], ptr %[[TMP0]], align 4 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr byval(%"{{.*}}/runtime/internal/runtime.String") %[[TMP0]]) +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// WASIP1-WASM-NEXT: br label %_llgo_[[BB11]] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB11]]: +// WASIP1-WASM-NEXT: %[[TMP41:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], align 4 +// WASIP1-WASM-NEXT: %[[TMP42:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %[[TMP41]], 2 +// WASIP1-WASM-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP42]]) +// WASIP1-WASM-NEXT: %[[TMP43:[0-9]+]] = load ptr, ptr %[[TMP11]], align 4 +// WASIP1-WASM-NEXT: %[[TMP44:[0-9]+]] = ptrtoint ptr %[[TMP43]] to i32 +// WASIP1-WASM-NEXT: switch i32 %[[TMP44]], label %_llgo_[[BB12:[0-9]+]] [ +// WASIP1-WASM-NEXT: i32 0, label %_llgo_[[BB3]] +// WASIP1-WASM-NEXT: i32 1, label %_llgo_[[BB6]] +// WASIP1-WASM-NEXT: ] +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB12]]: +// WASIP1-WASM-NEXT: unreachable +// WASIP1-WASM-EMPTY: +// WASIP1-WASM-NEXT: _llgo_[[BB13]]: +// WASIP1-WASM-NEXT: unreachable +// WASIP1-WASM-NEXT: } diff --git a/cl/_testgo/deferdispatch/in.go b/cl/_testgo/deferdispatch/in.go index 985b00eb16..7061d427ec 100644 --- a/cl/_testgo/deferdispatch/in.go +++ b/cl/_testgo/deferdispatch/in.go @@ -1,8 +1,10 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --check-globals=smart +// NOTE: Autogenerated snapshot targets: LINUX-AMD64 package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} +// LINUX-AMD64: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"first", align 1{{$}} +// LINUX-AMD64: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [6 x i8] c"second", align 1{{$}} func run() { defer println("first") @@ -13,128 +15,121 @@ func main() { run() } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.run() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.run(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8, i64 200, align 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @__sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_7), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %15 = icmp ne ptr %14, null -// CHECK-NEXT: br i1 %15, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %16 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %18 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: store ptr %16, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %17, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %20, align 8 -// CHECK-NEXT: store ptr %17, ptr %10, align 8 -// CHECK-NEXT: %21 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr %21, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %22, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 6 }, ptr %25, align 8 -// CHECK-NEXT: store ptr %22, ptr %10, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %26 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %26, [label %_llgo_3, label %_llgo_7, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_11 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5, %_llgo_9 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %27 = load i64, ptr %7, align 8 -// CHECK-NEXT: %28 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %29 = icmp ne ptr %28, null -// CHECK-NEXT: br i1 %29, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: %30 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %31 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %30, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %31, 0 -// CHECK-NEXT: store ptr %32, ptr %10, align 8 -// CHECK-NEXT: %33 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %31, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %30) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_2 -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_7 -// CHECK-NEXT: %34 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %35 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %34, align 8 -// CHECK-NEXT: %36 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %35, 0 -// CHECK-NEXT: store ptr %36, ptr %10, align 8 -// CHECK-NEXT: %37 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %35, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10, %_llgo_7 -// CHECK-NEXT: %38 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %38, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %39) -// CHECK-NEXT: %40 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %40, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } +// LINUX-AMD64-LABEL: define void @main.run(){{.*}} { +// LINUX-AMD64-NEXT: _llgo_[[BB0:[0-9]+]]: +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca i8, i64 200, align 1 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP3]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 2 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// LINUX-AMD64-NEXT: store ptr blockaddress(@main.run, %_llgo_[[BB2:[0-9]+]]), ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP4]]) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 3 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 4 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], i32 0, i32 5 +// LINUX-AMD64-NEXT: store ptr null, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = call i32 @__sigsetjmp(ptr %[[TMP3]], i32 0) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = icmp eq i32 %[[TMP13]], 0 +// LINUX-AMD64-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB4:[0-9]+]], label %_llgo_[[BB5:[0-9]+]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB1:[0-9]+]]: +// LINUX-AMD64-NEXT: ret void +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB2]]: +// LINUX-AMD64-NEXT: store ptr blockaddress(@main.run, %_llgo_[[BB7:[0-9]+]]), ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load i64, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = icmp ne ptr %[[TMP16]], null +// LINUX-AMD64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB8:[0-9]+]], label %_llgo_[[BB9:[0-9]+]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB3:[0-9]+]]: +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %[[TMP2]]) +// LINUX-AMD64-NEXT: br label %_llgo_[[BB1]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB4]]: +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP18]], ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP19]], i32 0, i32 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: store ptr %[[TMP19]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP23]], ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP24]], i32 0, i32 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 6 }, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: store ptr %[[TMP24]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: store ptr blockaddress(@main.run, %_llgo_[[BB6:[0-9]+]]), ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: br label %_llgo_[[BB2]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB5]]: +// LINUX-AMD64-NEXT: store ptr blockaddress(@main.run, %_llgo_[[BB3]]), ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: indirectbr ptr %[[TMP28]], [label %_llgo_[[BB3]], label %_llgo_[[BB7]], label %_llgo_[[BB2]]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB6]]: +// LINUX-AMD64-NEXT: ret void +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB7]]: +// LINUX-AMD64-NEXT: store ptr blockaddress(@main.run, %_llgo_[[BB3]]), ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load i64, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = icmp ne ptr %[[TMP30]], null +// LINUX-AMD64-NEXT: br i1 %[[TMP31]], label %_llgo_[[BB10:[0-9]+]], label %_llgo_[[BB11:[0-9]+]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB8]]: +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP33]], 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP34]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP33]], 2 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP32]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP35]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = load ptr, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = load i64, ptr %[[TMP38]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP37]], i64 %[[TMP39]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// LINUX-AMD64-NEXT: br label %_llgo_[[BB9]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB9]]: +// LINUX-AMD64-NEXT: br label %_llgo_[[BB7]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB10]]: +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %[[TMP40]], align 8 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP41]], 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP42]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %[[TMP41]], 2 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %[[TMP40]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP43]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = load ptr, ptr %[[TMP44]], align 8 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = load i64, ptr %[[TMP46]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP45]], i64 %[[TMP47]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// LINUX-AMD64-NEXT: br label %_llgo_[[BB11]] +// LINUX-AMD64-EMPTY: +// LINUX-AMD64-NEXT: _llgo_[[BB11]]: +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %[[TMP48]], 2 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %[[TMP49]]) +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: indirectbr ptr %[[TMP50]], [label %_llgo_[[BB3]], label %_llgo_[[BB6]]] +// LINUX-AMD64-NEXT: } diff --git a/cl/_testgo/deferiface/in.go b/cl/_testgo/deferiface/in.go index 5cedafe869..ab69320e3d 100644 --- a/cl/_testgo/deferiface/in.go +++ b/cl/_testgo/deferiface/in.go @@ -1,9 +1,6 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"reset", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"body", align 1{{$}} - type resetter interface { Reset() } @@ -25,127 +22,54 @@ func main() { run(&item{42}) } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - // CHECK-LABEL: define void @"main.(*item).Reset"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.item, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[RESET_VALUE_PTR:%.*]] = getelementptr inbounds %main.item, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[RESET_VALUE:%.*]] = load i64, ptr [[RESET_VALUE_PTR]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[RESET_VALUE]]) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.item, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 42, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.item") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: call void @main.run(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[ITEM:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK-NEXT: [[ITEM_VALUE:%.*]] = getelementptr inbounds %main.item, ptr [[ITEM]], i32 0, i32 0 +// CHECK-NEXT: store i64 42, ptr [[ITEM_VALUE]] +// CHECK: [[ITEM_ITAB:%.*]] = call ptr @"{{.*}}NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.item") +// CHECK-NEXT: [[ITEM_IFACE0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[ITEM_ITAB]], 0 +// CHECK-NEXT: [[ITEM_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[ITEM_IFACE0]], ptr [[ITEM]], 1 +// CHECK-NEXT: call void @main.run(%"{{.*}}iface" [[ITEM_IFACE]]) -// CHECK-LABEL: define void @main.run(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 3 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %8 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 0 -// CHECK-NEXT: store ptr %8, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 2 -// CHECK-NEXT: store ptr %7, ptr %12, align 8 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_2), ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %9) -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 1 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 3 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 4 -// CHECK-NEXT: %17 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %17, align 8 -// CHECK-NEXT: %18 = call i32 @{{(__)?}}sigsetjmp(ptr %8, i32 0) -// CHECK-NEXT: %19 = icmp eq i32 %18, 0 -// CHECK-NEXT: br i1 %19, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_3), ptr %15, align 8 -// CHECK-NEXT: %20 = load i64, ptr %14, align 8 -// CHECK-NEXT: %21 = load ptr, ptr %17, align 8 -// CHECK-NEXT: %22 = icmp ne ptr %21, null -// CHECK-NEXT: br i1 %22, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %7) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %23 = load ptr, ptr %17, align 8 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %24, i32 0, i32 0 -// CHECK-NEXT: store ptr %23, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %24, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %26, align 8 -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %24, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %6, ptr %27, align 8 -// CHECK-NEXT: store ptr %24, ptr %17, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_6), ptr %16, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.run, %_llgo_3), ptr %16, align 8 -// CHECK-NEXT: %28 = load ptr, ptr %15, align 8 -// CHECK-NEXT: indirectbr ptr %28, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %29 = load ptr, ptr %17, align 8 -// CHECK-NEXT: %30 = load { ptr, i64, { ptr, ptr } }, ptr %29, align 8 -// CHECK-NEXT: %31 = extractvalue { ptr, i64, { ptr, ptr } } %30, 0 -// CHECK-NEXT: store ptr %31, ptr %17, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, { ptr, ptr } } %30, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %29) -// CHECK-NEXT: %33 = extractvalue { ptr, ptr } %32, 0 -// CHECK-NEXT: %34 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %33) -// CHECK-NEXT: %35 = extractvalue { ptr, ptr } %32, 1 -// CHECK-NEXT: %36 = extractvalue { ptr, ptr } %32, 0 -// CHECK-NEXT: call void %36(ptr %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %34) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %37 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %9, align 8 -// CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %37, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %38) -// CHECK-NEXT: %39 = load ptr, ptr %16, align 8 -// CHECK-NEXT: indirectbr ptr %39, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } +// run resolves Reset once, stores its code+receiver pair as the defer payload, +// then invokes exactly that payload from cleanup under a recover frame. +// CHECK-LABEL: define void @main.run(%"{{.*}}iface" %0){{.*}} { +// CHECK: [[RESET_RECEIVER:%.*]] = call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" %0) +// CHECK-NEXT: [[RESET_ITAB:%.*]] = extractvalue %"{{.*}}iface" %0, 0 +// CHECK-NEXT: [[RESET_SLOT:%.*]] = getelementptr ptr, ptr [[RESET_ITAB]], i64 3 +// CHECK-NEXT: [[RESET_METHOD:%.*]] = load ptr, ptr [[RESET_SLOT]] +// CHECK-NEXT: [[RESET_CALL0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[RESET_METHOD]], 0 +// CHECK-NEXT: [[RESET_CALL:%.*]] = insertvalue { ptr, ptr } [[RESET_CALL0]], ptr [[RESET_RECEIVER]], 1 +// CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) +// CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 +// CHECK: [[HEAD_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[HEAD_CANDIDATE]], null +// CHECK: call void @"{{.*}}Rethrow"(ptr [[PREV_DEFER]]) +// CHECK: [[OLD_HEAD:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[NODE_PREV:%.*]] = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr [[NODE]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[OLD_HEAD]], ptr [[NODE_PREV]] +// CHECK: [[NODE_CALL:%.*]] = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr [[NODE]], i32 0, i32 2 +// CHECK-NEXT: store { ptr, ptr } [[RESET_CALL]], ptr [[NODE_CALL]] +// CHECK-NEXT: store ptr [[NODE]], ptr [[HEAD]] +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 4 }) +// CHECK: [[ACTIVE_NODE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: [[NODE_VALUE:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[ACTIVE_NODE]] +// CHECK: [[NEXT_NODE:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[NODE_VALUE]], 0 +// CHECK-NEXT: store ptr [[NEXT_NODE]], ptr [[HEAD]] +// CHECK-NEXT: [[DEFERRED_RESET:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[NODE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[ACTIVE_NODE]]) +// CHECK-NEXT: [[DEFERRED_RESET_FN:%.*]] = extractvalue { ptr, ptr } [[DEFERRED_RESET]], 0 +// CHECK-NEXT: [[RESET_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr [[DEFERRED_RESET_FN]]) +// CHECK-NEXT: [[DEFERRED_RESET_RECEIVER:%.*]] = extractvalue { ptr, ptr } [[DEFERRED_RESET]], 1 +// CHECK-NEXT: [[DEFERRED_RESET_CODE:%.*]] = extractvalue { ptr, ptr } [[DEFERRED_RESET]], 0 +// CHECK-NEXT: call void [[DEFERRED_RESET_CODE]](ptr [[DEFERRED_RESET_RECEIVER]]) +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[RESET_RECOVER]]) diff --git a/cl/_testgo/deferloop/in.go b/cl/_testgo/deferloop/in.go index 7fec91526a..aebc2fba74 100644 --- a/cl/_testgo/deferloop/in.go +++ b/cl/_testgo/deferloop/in.go @@ -1,14 +1,47 @@ // LITTEST package main +// A defer in a loop stores the current iteration value in each LIFO node. +// CHECK: [[LOOP_TEXT:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"loop" // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: GetThreadDefer + // CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() + // CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) + // CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} + // CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) + // CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 + // CHECK: [[I:%.*]] = phi i64 [ 0, %{{.*}} ], [ [[NEXT_I:%.*]], %{{.*}} ] + // CHECK: [[IN_RANGE:%.*]] = icmp slt i64 [[I]], 3 + // CHECK: br i1 [[IN_RANGE]], label %{{.*}}, label %{{.*}} for i := 0; i < 3; i++ { - // CHECK: blockaddress(@main.main, %_llgo_6) + // CHECK: [[OLD_HEAD:%.*]] = load ptr, ptr [[HEAD]] + // CHECK: [[NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 40) + // CHECK: [[NODE_PREV:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String", i64 }, ptr [[NODE]], i32 0, i32 0 + // CHECK: store ptr [[OLD_HEAD]], ptr [[NODE_PREV]] + // CHECK: [[NODE_KIND:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String", i64 }, ptr [[NODE]], i32 0, i32 1 + // CHECK: store i64 0, ptr [[NODE_KIND]] + // CHECK: [[NODE_TEXT:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String", i64 }, ptr [[NODE]], i32 0, i32 2 + // CHECK: store %"{{.*}}String" { ptr [[LOOP_TEXT]], i64 4 }, ptr [[NODE_TEXT]] + // CHECK: [[NODE_I:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String", i64 }, ptr [[NODE]], i32 0, i32 3 + // CHECK: store i64 [[I]], ptr [[NODE_I]] + // CHECK: store ptr [[NODE]], ptr [[HEAD]] + // CHECK: [[NEXT_I]] = add i64 [[I]], 1 defer println("loop", i) } - // CHECK: PrintString - // CHECK: PrintInt - // CHECK: FreeDeferNode + // CHECK: [[HEAD_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] + // CHECK-NEXT: [[HAS_NODE:%.*]] = icmp ne ptr [[HEAD_CANDIDATE]], null + // CHECK: [[NODE_HEADER:%.*]] = load { ptr, i64 }, ptr [[HEAD_CANDIDATE]] + // CHECK-NEXT: [[DEFER_KIND:%.*]] = extractvalue { ptr, i64 } [[NODE_HEADER]], 1 + // CHECK: icmp eq i64 [[DEFER_KIND]], 0 + // CHECK: [[DUE_NODE:%.*]] = load ptr, ptr [[HEAD]] + // CHECK-NEXT: [[HAS_DUE_NODE:%.*]] = icmp ne ptr [[DUE_NODE]], null + // CHECK: [[ACTIVE_NODE:%.*]] = load ptr, ptr [[HEAD]] + // CHECK: [[NODE_VALUE:%.*]] = load { ptr, i64, %"{{.*}}String", i64 }, ptr [[ACTIVE_NODE]] + // CHECK: [[NEXT_NODE:%.*]] = extractvalue { ptr, i64, %"{{.*}}String", i64 } [[NODE_VALUE]], 0 + // CHECK: store ptr [[NEXT_NODE]], ptr [[HEAD]] + // CHECK: [[DEFER_TEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String", i64 } [[NODE_VALUE]], 2 + // CHECK: [[DEFER_I:%.*]] = extractvalue { ptr, i64, %"{{.*}}String", i64 } [[NODE_VALUE]], 3 + // CHECK: call void @"{{.*}}FreeDeferNode"(ptr [[ACTIVE_NODE]]) + // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" [[DEFER_TEXT]]) + // CHECK: call void @"{{.*}}PrintInt"(i64 [[DEFER_I]]) } diff --git a/cl/_testgo/embedunexport-1598/in.go b/cl/_testgo/embedunexport-1598/in.go index c519dff1c4..cf41bbf294 100644 --- a/cl/_testgo/embedunexport-1598/in.go +++ b/cl/_testgo/embedunexport-1598/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.Wrapped.Name\E|\Qmain.Wrapped.github.com/goplus/llgo/cl/_testdata/embedunexport.setName\E|\Qmain.(*Wrapped).Name\E|\Qmain.(*Wrapped).github.com/goplus/llgo/cl/_testdata/embedunexport.setName\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/llgo/cl/_testdata/embedunexport" @@ -8,51 +10,7 @@ type Wrapped struct { *embedunexport.Base } -// CHECK-LABEL: define %"{{.*}}String" @main.Wrapped.Name(%main.Wrapped %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.Wrapped, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.Wrapped %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Wrapped, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call %"{{.*}}String" @"{{.*}}embedunexport.(*Base).Name"(ptr %3) -// CHECK-NEXT: ret %"{{.*}}String" %4 - -// CHECK-LABEL: define void @"main.Wrapped.github.com/goplus/llgo/cl/_testdata/embedunexport.setName"(%main.Wrapped %0, %"{{.*}}String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.Wrapped, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.Wrapped %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.Wrapped, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: call void @"{{.*}}embedunexport.(*Base).setName"(ptr %4, %"{{.*}}String" %1) -// CHECK-NEXT: ret void - -// CHECK-LABEL: define %"{{.*}}String" @"main.(*Wrapped).Name"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.Wrapped, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}String" @"{{.*}}embedunexport.(*Base).Name"(ptr %2) -// CHECK-NEXT: ret %"{{.*}}String" %3 - -// CHECK-LABEL: define void @"main.(*Wrapped).github.com/goplus/llgo/cl/_testdata/embedunexport.setName"(ptr %0, %"{{.*}}String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.Wrapped, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}embedunexport.(*Base).setName"(ptr %3, %"{{.*}}String" %1) -// CHECK-NEXT: ret void - -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call ptr @"{{.*}}embedunexport.NewBase"(%"{{.*}}String" { ptr @0, i64 4 }) - // CHECK: call ptr @"{{.*}}AllocZ"(i64 8) - // CHECK: call ptr @"{{.*}}NewItab"(ptr @"{{.*}}embedunexport.iface{{.*}}", ptr @"*_llgo_main.Wrapped") - // CHECK: call void @"{{.*}}embedunexport.Use"(%"{{.*}}iface" %5) - // CHECK: call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" %5) - // CHECK: call %"{{.*}}String" %13(ptr %12) - // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" %14) - // CHECK: call void @"{{.*}}PrintByte"(i8 10) - // CHECK: ret void base := embedunexport.NewBase("test") wrapped := &Wrapped{Base: base} @@ -62,3 +20,112 @@ func main() { println(obj.Name()) } + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.Wrapped.Name( +// DARWIN-ARM64-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, i64 } @main.Wrapped.Name( +// LINUX-AMD64-SAME: %main.Wrapped %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca i64, align 8 +// DARWIN-ARM64-NEXT: store i64 %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %main.Wrapped, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca %main.Wrapped, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: store %main.Wrapped %[[TMP2]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testdata/embedunexport.(*Base).Name"(ptr %[[TMP5]]) +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]] +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %main.Wrapped, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP2]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: store %main.Wrapped %[[TMP0]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = call { ptr, i64 } @"{{.*}}/cl/_testdata/embedunexport.(*Base).Name"(ptr %[[TMP4]]) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP5]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load { ptr, i64 }, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, i64 } %[[TMP8]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.Wrapped.{{.*}}/cl/_testdata/embedunexport.setName"( +// DARWIN-ARM64-SAME: i64 %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: %main.Wrapped %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], i64 %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca i64, align 8 +// DARWIN-ARM64-NEXT: store i64 %[[TMP0]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %main.Wrapped, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = alloca %main.Wrapped, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP4]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: store %main.Wrapped %[[TMP3]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP2]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/cl/_testdata/embedunexport.(*Base).setName"(ptr %[[TMP6]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %main.Wrapped, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP8]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: store %main.Wrapped %[[TMP0]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load i64, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/cl/_testdata/embedunexport.(*Base).setName"(ptr %[[TMP10]], ptr %[[TMP12]], i64 %[[TMP14]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*Wrapped).Name"( +// LINUX-AMD64-LABEL: define { ptr, i64 } @"main.(*Wrapped).Name"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load ptr, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testdata/embedunexport.(*Base).Name"(ptr %[[TMP2]]) +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %[[TMP3]] +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = load ptr, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = call { ptr, i64 } @"{{.*}}/cl/_testdata/embedunexport.(*Base).Name"(ptr %[[TMP3]]) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP4]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP5]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load { ptr, i64 }, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, i64 } %[[TMP7]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.(*Wrapped).{{.*}}/cl/_testdata/embedunexport.setName"( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], i64 %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load ptr, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/cl/_testdata/embedunexport.(*Base).setName"(ptr %[[TMP3]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main.Wrapped, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load i64, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/cl/_testdata/embedunexport.(*Base).setName"(ptr %[[TMP9]], ptr %[[TMP11]], i64 %[[TMP13]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testgo/equal/in.go b/cl/_testgo/equal/in.go index b1b657132e..b4a85c1864 100644 --- a/cl/_testgo/equal/in.go +++ b/cl/_testgo/equal/in.go @@ -1,91 +1,103 @@ // LITTEST package main +// Each source section below exercises a different equality lowering. Keep the +// checks function-scoped and follow the comparison result through to assert so +// a coincidental helper call elsewhere cannot satisfy the test. +// CHECK-LABEL: define void @main.assert(i1 %0){{.*}} { +// CHECK: br i1 %0, label %{{.*}}, label %{{.*}} + +// Function values: the generated closure code pointer is non-nil and that +// predicate is what reaches assert. +// CHECK-LABEL: define void @"main.init#1"(){{.*}} { +// CHECK: %[[CLOSURE:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.init#1$2", ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK: %[[CODE:[0-9]+]] = extractvalue { ptr, ptr } %[[CLOSURE]], 0 +// CHECK: %[[FUNC_NONNULL:[0-9]+]] = icmp ne ptr %[[CODE]], null +// CHECK: call void @main.assert(i1 %[[FUNC_NONNULL]]) + +// CHECK-LABEL: define i64 @"main.init#1$1"(i64 %0, i64 %1){{.*}} { +// CHECK: [[FUNC_SUM:%[0-9]+]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[FUNC_SUM]] + +// CHECK-LABEL: define void @"main.init#1$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: load { ptr }, ptr %0 + +// Arrays: all three elements participate in equality, and inequality negates +// the aggregate result rather than changing element semantics. +// CHECK-LABEL: define void @"main.init#2"(){{.*}} { +// CHECK: %[[ARRAY_L:[0-9]+]] = load [3 x i64], ptr %{{[0-9]+}} +// CHECK: %[[ARRAY_R:[0-9]+]] = load [3 x i64], ptr %{{[0-9]+}} +// CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 0 +// CHECK: extractvalue [3 x i64] %[[ARRAY_R]], 0 +// CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 1 +// CHECK: extractvalue [3 x i64] %[[ARRAY_R]], 1 +// CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 2 +// CHECK: extractvalue [3 x i64] %[[ARRAY_R]], 2 +// CHECK: %[[ARRAY_EQ:[0-9]+]] = and i1 %{{[0-9]+}}, %{{[0-9]+}} +// CHECK: call void @main.assert(i1 %[[ARRAY_EQ]]) +// CHECK: %[[ARRAY_NE:[0-9]+]] = xor i1 %{{[0-9]+}}, true +// CHECK: call void @main.assert(i1 %[[ARRAY_NE]]) + +// Structs delegate string and interface fields to their semantic equality +// helpers and combine both results before asserting the aggregate result. +// CHECK-LABEL: define void @"main.init#3"(){{.*}} { +// CHECK: %[[STRUCT_L:[0-9]+]] = load %main.T, ptr %{{[0-9]+}} +// CHECK: %[[STRUCT_R:[0-9]+]] = load %main.T, ptr %{{[0-9]+}} +// CHECK: %[[STRING_L:[0-9]+]] = extractvalue %main.T %[[STRUCT_L]], 2 +// CHECK: %[[STRING_R:[0-9]+]] = extractvalue %main.T %[[STRUCT_R]], 2 +// CHECK: %[[STRING_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %[[STRING_L]], %"{{.*}}/runtime/internal/runtime.String" %[[STRING_R]]) +// CHECK: %[[WITH_STRING:[0-9]+]] = and i1 %{{[0-9]+}}, %[[STRING_EQ]] +// CHECK: %[[EFACE_L:[0-9]+]] = extractvalue %main.T %[[STRUCT_L]], 3 +// CHECK: %[[EFACE_R:[0-9]+]] = extractvalue %main.T %[[STRUCT_R]], 3 +// CHECK: %[[EFACE_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %[[EFACE_L]], %"{{.*}}/runtime/internal/runtime.eface" %[[EFACE_R]]) +// CHECK: %[[STRUCT_EQ:[0-9]+]] = and i1 %[[WITH_STRING]], %[[EFACE_EQ]] +// CHECK: call void @main.assert(i1 %[[STRUCT_EQ]]) + +// Slices compare with nil through their data pointer. Check the non-empty and +// zero-length/non-zero-capacity make paths separately. +// CHECK-LABEL: define void @"main.init#4"(){{.*}} { +// CHECK: %[[SLICE_LEN:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %{{[0-9]+}}, i64 8, i64 2, i64 0, i64 2,{{.*}}) +// CHECK: %[[SLICE_CAP:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %{{[0-9]+}}, i64 8, i64 2, i64 0, i64 0,{{.*}}) +// CHECK: %[[SLICE_PTR:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE_CAP]], 0 +// CHECK: %[[SLICE_NONNULL:[0-9]+]] = icmp ne ptr %[[SLICE_PTR]], null +// CHECK: call void @main.assert(i1 %[[SLICE_NONNULL]]) + +// Interface equality must feed the assertion directly, including a negated +// result for unequal dynamic types. +// CHECK-LABEL: define void @"main.init#5"(){{.*}} { +// CHECK: %[[IFACE_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: call void @main.assert(i1 %[[IFACE_EQ]]) +// CHECK: %[[IFACE_EQ2:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: call void @main.assert(i1 %[[IFACE_EQ2]]) +// CHECK: %[[IFACE_RAW_NE:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[IFACE_NE:[0-9]+]] = xor i1 %[[IFACE_RAW_NE]], true +// CHECK: call void @main.assert(i1 %[[IFACE_NE]]) + +// CHECK-LABEL: define void @"main.init#6"(){{.*}} { +// CHECK: %[[CHAN_A:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) +// CHECK: %[[CHAN_B:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) +// CHECK: %[[CHAN_NE:[0-9]+]] = icmp ne ptr %[[CHAN_A]], %[[CHAN_B]] +// CHECK: call void @main.assert(i1 %[[CHAN_NE]]) + +// CHECK-LABEL: define void @"main.init#7"(){{.*}} { +// CHECK: %[[MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) +// CHECK: %[[MAP_NONNULL:[0-9]+]] = icmp ne ptr %[[MAP]], null +// CHECK: call void @main.assert(i1 %[[MAP_NONNULL]]) + func test() {} -// CHECK-LABEL: define void @main.assert(i1 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 6 }, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %1, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } func assert(cond bool) { if !cond { panic("failed") } } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"main.init#1"() -// CHECK-NEXT: call void @"main.init#2"() -// CHECK-NEXT: call void @"main.init#3"() -// CHECK-NEXT: call void @"main.init#4"() -// CHECK-NEXT: call void @"main.init#5"() -// CHECK-NEXT: call void @"main.init#6"() -// CHECK-NEXT: call void @"main.init#7"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.init#1$2", ptr undef }, ptr %1, 1 -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %3, 0 -// CHECK-NEXT: %5 = icmp ne ptr %4, null -// CHECK-NEXT: call void @main.assert(i1 %5) -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %3, 0 -// CHECK-NEXT: %7 = icmp ne ptr null, %6 -// CHECK-NEXT: call void @main.assert(i1 %7) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: ret void -// CHECK-NEXT: } // func func init() { fn1 := test fn2 := func(i, j int) int { return i + j } - // CHECK-LABEL: define i64 @"main.init#1$1"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = add i64 %0, %1 - // CHECK-NEXT: ret i64 %2 - // CHECK-NEXT: } var n int fn3 := func() { println(n) } - // CHECK-LABEL: define void @"main.init#1$2"(ptr {{(nest|swiftself)}} %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: %3 = load i64, ptr %2, align 8 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } var fn4 func() int assert(test != nil) assert(nil != test) @@ -99,60 +111,6 @@ func init() { assert(nil == fn4) } -// CHECK-LABEL: define void @"main.init#2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: %0 = alloca [3 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 24, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: store i64 2, ptr %2, align 8 -// CHECK-NEXT: store i64 3, ptr %3, align 8 -// CHECK-NEXT: %4 = alloca [3 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %4, i8 0, i64 24, i1 false) -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %4, i64 0 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %4, i64 1 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %4, i64 2 -// CHECK-NEXT: store i64 1, ptr %5, align 8 -// CHECK-NEXT: store i64 2, ptr %6, align 8 -// CHECK-NEXT: store i64 3, ptr %7, align 8 -// CHECK-NEXT: %8 = load [3 x i64], ptr %0, align 8 -// CHECK-NEXT: %9 = load [3 x i64], ptr %4, align 8 -// CHECK-NEXT: %10 = extractvalue [3 x i64] %8, 0 -// CHECK-NEXT: %11 = extractvalue [3 x i64] %9, 0 -// CHECK-NEXT: %12 = icmp eq i64 %10, %11 -// CHECK-NEXT: %13 = and i1 true, %12 -// CHECK-NEXT: %14 = extractvalue [3 x i64] %8, 1 -// CHECK-NEXT: %15 = extractvalue [3 x i64] %9, 1 -// CHECK-NEXT: %16 = icmp eq i64 %14, %15 -// CHECK-NEXT: %17 = and i1 %13, %16 -// CHECK-NEXT: %18 = extractvalue [3 x i64] %8, 2 -// CHECK-NEXT: %19 = extractvalue [3 x i64] %9, 2 -// CHECK-NEXT: %20 = icmp eq i64 %18, %19 -// CHECK-NEXT: %21 = and i1 %17, %20 -// CHECK-NEXT: call void @main.assert(i1 %21) -// CHECK-NEXT: %22 = getelementptr inbounds i64, ptr %4, i64 1 -// CHECK-NEXT: store i64 1, ptr %22, align 8 -// CHECK-NEXT: %23 = load [3 x i64], ptr %0, align 8 -// CHECK-NEXT: %24 = load [3 x i64], ptr %4, align 8 -// CHECK-NEXT: %25 = extractvalue [3 x i64] %23, 0 -// CHECK-NEXT: %26 = extractvalue [3 x i64] %24, 0 -// CHECK-NEXT: %27 = icmp eq i64 %25, %26 -// CHECK-NEXT: %28 = and i1 true, %27 -// CHECK-NEXT: %29 = extractvalue [3 x i64] %23, 1 -// CHECK-NEXT: %30 = extractvalue [3 x i64] %24, 1 -// CHECK-NEXT: %31 = icmp eq i64 %29, %30 -// CHECK-NEXT: %32 = and i1 %28, %31 -// CHECK-NEXT: %33 = extractvalue [3 x i64] %23, 2 -// CHECK-NEXT: %34 = extractvalue [3 x i64] %24, 2 -// CHECK-NEXT: %35 = icmp eq i64 %33, %34 -// CHECK-NEXT: %36 = and i1 %32, %35 -// CHECK-NEXT: %37 = xor i1 %36, true -// CHECK-NEXT: call void @main.assert(i1 %37) -// CHECK-NEXT: ret void -// CHECK-NEXT: } // array func init() { assert([0]float64{} == [0]float64{}) @@ -172,15 +130,6 @@ type T struct { type N struct{} -// CHECK-LABEL: define void @"main.init#3"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr {{%[0-9]+}}, align 8 -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef } -// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" -// CHECK: call void @main.assert -// CHECK: ret void -// CHECK-NEXT: } // struct func init() { var n1, n2 N @@ -195,35 +144,6 @@ func init() { assert(y != z) } -// CHECK-LABEL: define void @"main.init#4"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: store i64 2, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: store i64 3, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 3, 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 3, 2 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %12 = icmp ne ptr %11, null -// CHECK-NEXT: call void @main.assert(i1 %12) -// CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, 0 -// CHECK-NEXT: %14 = icmp ne ptr %13, null -// CHECK-NEXT: call void @main.assert(i1 %14) -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %10, 0 -// CHECK-NEXT: %16 = icmp ne ptr %15, null -// CHECK-NEXT: call void @main.assert(i1 %16) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: ret void -// CHECK-NEXT: } // slice func init() { var a []int @@ -238,17 +158,6 @@ func init() { assert(b == nil) } -// CHECK-LABEL: define void @"main.init#5"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr {{%[0-9]+}}, align 8 -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef } -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr {{%[0-9]+}}, align 8 -// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" -// CHECK: call void @main.assert -// CHECK: ret void -// CHECK-NEXT: } // iface func init() { var a any = 100 @@ -263,18 +172,6 @@ func init() { assert(c != y) } -// CHECK-LABEL: define void @"main.init#6"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: %2 = icmp eq ptr %0, %0 -// CHECK-NEXT: call void @main.assert(i1 %2) -// CHECK-NEXT: %3 = icmp ne ptr %0, %1 -// CHECK-NEXT: call void @main.assert(i1 %3) -// CHECK-NEXT: %4 = icmp ne ptr %0, null -// CHECK-NEXT: call void @main.assert(i1 %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } // chan func init() { a := make(chan int) @@ -284,14 +181,6 @@ func init() { assert(a != nil) } -// CHECK-LABEL: define void @"main.init#7"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) -// CHECK-NEXT: %1 = icmp ne ptr %0, null -// CHECK-NEXT: call void @main.assert(i1 %1) -// CHECK-NEXT: call void @main.assert(i1 true) -// CHECK-NEXT: ret void -// CHECK-NEXT: } // map func init() { m1 := make(map[int]string) @@ -300,7 +189,5 @@ func init() { assert(m2 == nil) } -// CHECK-LABEL: define {{.*}} @main.main{{.*}} -// CHECK: ret void func main() { } diff --git a/cl/_testgo/errors/in.go b/cl/_testgo/errors/in.go index 01af262dcb..0a17e44987 100644 --- a/cl/_testgo/errors/in.go +++ b/cl/_testgo/errors/in.go @@ -4,14 +4,13 @@ package main // New returns an error that formats as the given text. // Each call to New returns a distinct error value even if the text is identical. // CHECK-LABEL: define %"{{.*}}iface" @main.New(%"{{.*}}String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %main.errorString, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}String" %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}NewItab"(ptr @"{{.*}}iface{{.*}}", ptr @"*_llgo_main.errorString") -// CHECK-NEXT: %4 = insertvalue %"{{.*}}iface" undef, ptr %3, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}iface" %4, ptr %1, 1 -// CHECK-NEXT: ret %"{{.*}}iface" %5 +// CHECK: [[NEW_ERROR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: [[NEW_ERROR_FIELD:%[0-9]+]] = getelementptr inbounds %main.errorString, ptr [[NEW_ERROR]], i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}String" %0, ptr [[NEW_ERROR_FIELD]] +// CHECK: [[NEW_ERROR_ITAB:%[0-9]+]] = call ptr @"{{.*}}NewItab"(ptr @"{{.*}}iface{{.*}}", ptr @"*_llgo_main.errorString") +// CHECK-NEXT: [[NEW_ERROR_IFACE0:%[0-9]+]] = insertvalue %"{{.*}}iface" undef, ptr [[NEW_ERROR_ITAB]], 0 +// CHECK-NEXT: [[NEW_ERROR_IFACE:%[0-9]+]] = insertvalue %"{{.*}}iface" [[NEW_ERROR_IFACE0]], ptr [[NEW_ERROR]], 1 +// CHECK-NEXT: ret %"{{.*}}iface" [[NEW_ERROR_IFACE]] func New(text string) error { return &errorString{text} } @@ -22,23 +21,17 @@ type errorString struct { } // CHECK-LABEL: define %"{{.*}}String" @"main.(*errorString).Error"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.errorString, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}String", ptr %1, align 8 -// CHECK-NEXT: ret %"{{.*}}String" %2 +// CHECK: [[ERROR_FIELD:%[0-9]+]] = getelementptr inbounds %main.errorString, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[ERROR_TEXT:%[0-9]+]] = load %"{{.*}}String", ptr [[ERROR_FIELD]] +// CHECK-NEXT: ret %"{{.*}}String" [[ERROR_TEXT]] func (e *errorString) Error() string { return e.s } // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call %"{{.*}}iface" @main.New(%"{{.*}}String" { ptr @7, i64 8 }) - // CHECK: call void @"{{.*}}PrintIface"(%"{{.*}}iface" %0) - // CHECK: call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" %0) - // CHECK: call %"{{.*}}String" %8(ptr %7) - // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" %9) - // CHECK: call void @"{{.*}}PrintByte"(i8 10) - // CHECK: ret void + // CHECK: call %"{{.*}}iface" @main.New(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 8 }) + // CHECK: call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" %{{[0-9]+}}) err := New("an error") println(err) println(err.Error()) diff --git a/cl/_testgo/genericembediface/in.go b/cl/_testgo/genericembediface/in.go index 2b32b36ed5..3d541f0b68 100644 --- a/cl/_testgo/genericembediface/in.go +++ b/cl/_testgo/genericembediface/in.go @@ -5,12 +5,6 @@ import ( "github.com/goplus/llgo/cl/_testgo/genericembediface/streamlib" ) -// CHECK: {{^}}@2 = private unnamed_addr constant [20 x i8] c"ServerReflectionInfo", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [7 x i8] c"Context", align 1{{$}} -// CHECK: {{^}}@18 = private unnamed_addr constant [4 x i8] c"pass", align 1{{$}} -// CHECK: {{^}}@19 = private unnamed_addr constant [58 x i8] c"{{.*}}/cl/_testgo/genericembediface.server", align 1{{$}} -// CHECK: {{^}}@20 = private unnamed_addr constant [58 x i8] c"{{.*}}/cl/_testgo/genericembediface.stream", align 1{{$}} - type Request struct{} type Response struct{} @@ -39,136 +33,103 @@ func main() { println("pass") } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.handler(%"{{.*}}/runtime/internal/runtime.eface" %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %3 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.ReflectionServer, ptr %2) -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %2) -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5, 0 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %6, ptr %4, 1 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %1, ptr %9, align 8 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]") -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %11, ptr %8, 1 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %7) -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %7, 0 -// CHECK-NEXT: %15 = getelementptr ptr, ptr %14, i64 3 -// CHECK-NEXT: %16 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 -// CHECK-NEXT: %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 -// CHECK-NEXT: %19 = extractvalue { ptr, ptr } %18, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %18, 0 -// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.iface" %20(ptr %19, %"{{.*}}/runtime/internal/runtime.iface" %12) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %2, ptr @_llgo_main.ReflectionServer) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/genericembediface/streamlib.init"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// The concrete stream method is reached through a generic struct embedding an interface. +// CHECK: [[CONTEXT:@[0-9]+]] = private unnamed_addr constant [7 x i8] c"Context" +// handler asserts srv to ReflectionServer, wraps stream as the instantiated generic +// BidiStreamingServer, and invokes ServerReflectionInfo through the asserted itab. +// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.handler(%"{{.*}}/runtime/internal/runtime.eface" %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { +// CHECK: [[H_DYN_TYPE:%.*]] = extractvalue %"{{.*}}eface" %0, 0 +// CHECK: [[H_IMPLEMENTS:%.*]] = call i1 @"{{.*}}Implements"(ptr @_llgo_main.ReflectionServer, ptr [[H_DYN_TYPE]]) +// CHECK: br i1 [[H_IMPLEMENTS]], label %{{.*}}, label %{{.*}} +// CHECK: [[H_DYN_DATA:%.*]] = extractvalue %"{{.*}}eface" %0, 1 +// CHECK: [[H_REF_ITAB:%.*]] = call ptr @"{{.*}}NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr [[H_DYN_TYPE]]) +// CHECK: [[H_REF_IFACE0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[H_REF_ITAB]], 0 +// CHECK: [[H_REF_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[H_REF_IFACE0]], ptr [[H_DYN_DATA]], 1 +// CHECK: [[H_GENERIC_STREAM:%.*]] = call ptr @"{{.*}}AllocZ"(i64 16) +// CHECK: [[H_STREAM_FIELD:%.*]] = getelementptr inbounds %"{{.*}}GenericServerStream[main.Request,main.Response]", ptr [[H_GENERIC_STREAM]], i32 0, i32 0 +// CHECK: store %"{{.*}}iface" %1, ptr [[H_STREAM_FIELD]] +// CHECK: [[H_STREAM_ITAB:%.*]] = call ptr @"{{.*}}NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_{{.*}}GenericServerStream[main.Request,main.Response]") +// CHECK: [[H_STREAM_IFACE0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[H_STREAM_ITAB]], 0 +// CHECK: [[H_STREAM_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[H_STREAM_IFACE0]], ptr [[H_GENERIC_STREAM]], 1 +// CHECK: [[H_SERVER_DATA:%.*]] = call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" [[H_REF_IFACE]]) +// CHECK: [[H_SERVER_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[H_REF_IFACE]], 0 +// CHECK: [[H_METHOD_SLOT:%.*]] = getelementptr ptr, ptr [[H_SERVER_ITAB]], i64 3 +// CHECK: [[H_METHOD:%.*]] = load ptr, ptr [[H_METHOD_SLOT]] +// CHECK: [[H_CALL0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[H_METHOD]], 0 +// CHECK: [[H_CALL:%.*]] = insertvalue { ptr, ptr } [[H_CALL0]], ptr [[H_SERVER_DATA]], 1 +// CHECK: [[H_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[H_CALL]], 1 +// CHECK: [[H_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[H_CALL]], 0 +// CHECK: [[H_RESULT:%.*]] = call %"{{.*}}iface" [[H_CALL_FN]](ptr [[H_CALL_DATA]], %"{{.*}}iface" [[H_STREAM_IFACE]]) +// CHECK: ret %"{{.*}}iface" [[H_RESULT]] +// CHECK: call void @"{{.*}}PanicTypeAssert"(ptr null, ptr [[H_DYN_TYPE]], ptr @_llgo_main.ReflectionServer) +// CHECK-NEXT: unreachable + +// main supplies the value implementations of ReflectionServer and ServerStream. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.server zeroinitializer, ptr %0, align 1 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.server, ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.stream zeroinitializer, ptr %2, align 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.stream) -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %3, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %4, ptr %2, 1 -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.iface" @main.handler(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.iface" %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.server.ServerReflectionInfo(%main.server %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } +// CHECK: [[M_SERVER:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.server, ptr undef }, ptr {{%.*}}, 1 +// CHECK: [[M_STREAM_ITAB:%.*]] = call ptr @"{{.*}}NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.stream) +// CHECK: [[M_STREAM0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[M_STREAM_ITAB]], 0 +// CHECK: [[M_STREAM:%.*]] = insertvalue %"{{.*}}iface" [[M_STREAM0]], ptr {{%.*}}, 1 +// CHECK: call %"{{.*}}iface" @main.handler(%"{{.*}}eface" [[M_SERVER]], %"{{.*}}iface" [[M_STREAM]]) -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*server).ServerReflectionInfo"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @19, i64 58 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 20 }) -// CHECK-NEXT: %3 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %3) -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @main.server.ServerReflectionInfo(%main.server zeroinitializer, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.stream.Context(%main.stream %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 7 } -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*stream).Context"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 58 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 7 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @main.stream.Context(%main.stream zeroinitializer) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testgo/genericembediface/streamlib.(*GenericServerStream[main.Request,main.Response]).Context"(ptr %0){{.*}} { +// CHECK-LABEL: define %"{{.*}}iface" @main.server.ServerReflectionInfo(%main.server %0, %"{{.*}}iface" %1){{.*}} { // CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %1, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 3 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"{{.*}}/cl/_testgo/genericembediface/streamlib.(*GenericServerStream[main.Request,main.Response]).Context", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %13 -// CHECK-NEXT: } - -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response].Context"(%"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]" %0){{.*}} { +// CHECK-NEXT: ret %"{{.*}}iface" zeroinitializer + +// The pointer wrapper preserves the stream argument while forwarding to the value method. +// CHECK-LABEL: define %"{{.*}}iface" @"main.(*server).ServerReflectionInfo"(ptr %0, %"{{.*}}iface" %1){{.*}} { +// CHECK: [[SERVER_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}PanicWrapNilPointer"(i1 [[SERVER_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: [[SERVER_DEREF_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}AssertNilDeref"(i1 [[SERVER_DEREF_NIL]]) +// CHECK: [[SERVER_RESULT:%.*]] = call %"{{.*}}iface" @main.server.ServerReflectionInfo(%main.server zeroinitializer, %"{{.*}}iface" %1) +// CHECK: ret %"{{.*}}iface" [[SERVER_RESULT]] + +// CHECK-LABEL: define %"{{.*}}String" @main.stream.Context(%main.stream %0){{.*}} { // CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response]", ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"{{.*}}/cl/_testgo/genericembediface/streamlib.GenericServerStream[main.Request,main.Response].Context", ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" %13(ptr %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %14 -// CHECK-NEXT: } +// CHECK-NEXT: ret %"{{.*}}String" { ptr [[CONTEXT]], i64 7 } + +// CHECK-LABEL: define %"{{.*}}String" @"main.(*stream).Context"(ptr %0){{.*}} { +// CHECK: [[STREAM_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}PanicWrapNilPointer"(i1 [[STREAM_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" { ptr [[CONTEXT]], i64 7 }) +// CHECK: [[STREAM_DEREF_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}AssertNilDeref"(i1 [[STREAM_DEREF_NIL]]) +// CHECK: [[STREAM_RESULT:%.*]] = call %"{{.*}}String" @main.stream.Context(%main.stream zeroinitializer) +// CHECK: ret %"{{.*}}String" [[STREAM_RESULT]] + +// Both instantiated forwarding methods load the embedded ServerStream method and +// preserve its receiver across the recover-frame alias used for interface calls. +// CHECK-LABEL: define linkonce %"{{.*}}String" @"{{.*}}/streamlib.(*GenericServerStream[main.Request,main.Response]).Context"(ptr %0){{.*}} { +// CHECK: [[GP_FIELD:%.*]] = getelementptr inbounds %"{{.*}}GenericServerStream[main.Request,main.Response]", ptr %0, i32 0, i32 0 +// CHECK: [[GP_IFACE:%.*]] = load %"{{.*}}iface", ptr [[GP_FIELD]] +// CHECK: [[GP_DATA:%.*]] = call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" [[GP_IFACE]]) +// CHECK: [[GP_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[GP_IFACE]], 0 +// CHECK: [[GP_SLOT:%.*]] = getelementptr ptr, ptr [[GP_ITAB]], i64 3 +// CHECK: [[GP_METHOD:%.*]] = load ptr, ptr [[GP_SLOT]] +// CHECK: [[GP_CALL0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[GP_METHOD]], 0 +// CHECK: [[GP_CALL:%.*]] = insertvalue { ptr, ptr } [[GP_CALL0]], ptr [[GP_DATA]], 1 +// CHECK: [[GP_ALIAS_FN:%.*]] = extractvalue { ptr, ptr } [[GP_CALL]], 0 +// CHECK: [[GP_RECOVER:%.*]] = call ptr @"{{.*}}StartRecoverFrameAlias"(ptr @"{{.*}}/streamlib.(*GenericServerStream[main.Request,main.Response]).Context", ptr [[GP_ALIAS_FN]]) +// CHECK: [[GP_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[GP_CALL]], 1 +// CHECK: [[GP_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[GP_CALL]], 0 +// CHECK: [[GP_RESULT:%.*]] = call %"{{.*}}String" [[GP_CALL_FN]](ptr [[GP_CALL_DATA]]) +// CHECK: call void @"{{.*}}EndRecoverFrameAlias"(ptr [[GP_RECOVER]]) +// CHECK: ret %"{{.*}}String" [[GP_RESULT]] + +// CHECK-LABEL: define linkonce %"{{.*}}String" @"{{.*}}/streamlib.GenericServerStream[main.Request,main.Response].Context"(%"{{.*}}GenericServerStream[main.Request,main.Response]" %0){{.*}} { +// CHECK: [[GV_FIELD:%.*]] = getelementptr inbounds %"{{.*}}GenericServerStream[main.Request,main.Response]", ptr {{%.*}}, i32 0, i32 0 +// CHECK: [[GV_IFACE:%.*]] = load %"{{.*}}iface", ptr [[GV_FIELD]] +// CHECK: [[GV_DATA:%.*]] = call ptr @"{{.*}}IfacePtrData"(%"{{.*}}iface" [[GV_IFACE]]) +// CHECK: [[GV_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[GV_IFACE]], 0 +// CHECK: [[GV_SLOT:%.*]] = getelementptr ptr, ptr [[GV_ITAB]], i64 3 +// CHECK: [[GV_METHOD:%.*]] = load ptr, ptr [[GV_SLOT]] +// CHECK: [[GV_CALL0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[GV_METHOD]], 0 +// CHECK: [[GV_CALL:%.*]] = insertvalue { ptr, ptr } [[GV_CALL0]], ptr [[GV_DATA]], 1 +// CHECK: [[GV_ALIAS_FN:%.*]] = extractvalue { ptr, ptr } [[GV_CALL]], 0 +// CHECK: [[GV_RECOVER:%.*]] = call ptr @"{{.*}}StartRecoverFrameAlias"(ptr @"{{.*}}/streamlib.GenericServerStream[main.Request,main.Response].Context", ptr [[GV_ALIAS_FN]]) +// CHECK: [[GV_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[GV_CALL]], 1 +// CHECK: [[GV_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[GV_CALL]], 0 +// CHECK: [[GV_RESULT:%.*]] = call %"{{.*}}String" [[GV_CALL_FN]](ptr [[GV_CALL_DATA]]) +// CHECK: call void @"{{.*}}EndRecoverFrameAlias"(ptr [[GV_RECOVER]]) +// CHECK: ret %"{{.*}}String" [[GV_RESULT]] diff --git a/cl/_testgo/genericiter/in.go b/cl/_testgo/genericiter/in.go index 7a3e4d9f7d..77462a4c79 100644 --- a/cl/_testgo/genericiter/in.go +++ b/cl/_testgo/genericiter/in.go @@ -1,9 +1,6 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [17 x i8] c"bad Ascend result", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [2 x i8] c"ok", align 1{{$}} - type IteratorG[T any] func(T) bool type TreeG[T any] struct{} @@ -18,58 +15,28 @@ type Tree TreeG[int] type Iterator IteratorG[int] // CHECK-LABEL: define void @"main.(*Tree).Ascend"(ptr %0, %main.Iterator %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue %main.Iterator %1, 0 -// CHECK-NEXT: %3 = insertvalue %"main.IteratorG[int]" undef, ptr %2, 0 -// CHECK-NEXT: %4 = extractvalue %main.Iterator %1, 1 -// CHECK-NEXT: %5 = insertvalue %"main.IteratorG[int]" %3, ptr %4, 1 -// CHECK-NEXT: call void @"main.(*TreeG[int]).Ascend"(ptr %0, %"main.IteratorG[int]" %5) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[TREE_CODE:%[0-9]+]] = extractvalue %main.Iterator %1, 0 +// CHECK-NEXT: [[TREE_GENERIC0:%[0-9]+]] = insertvalue %"main.IteratorG[int]" undef, ptr [[TREE_CODE]], 0 +// CHECK-NEXT: [[TREE_ENV:%[0-9]+]] = extractvalue %main.Iterator %1, 1 +// CHECK-NEXT: [[TREE_GENERIC:%[0-9]+]] = insertvalue %"main.IteratorG[int]" [[TREE_GENERIC0]], ptr [[TREE_ENV]], 1 +// CHECK-NEXT: call void @"main.(*TreeG[int]).Ascend"(ptr %0, %"main.IteratorG[int]" [[TREE_GENERIC]]) func (t *Tree) Ascend(iterator Iterator) { (*TreeG[int])(t).Ascend((IteratorG[int])(iterator)) } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = alloca %main.Iterator, align 8 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %4, align 8 -// CHECK-NEXT: %5 = load %main.Iterator, ptr %4, align 8 -// CHECK-NEXT: call void @"main.(*Tree).Ascend"(ptr @"__llgo.moduleZeroSizedAlloc$", %main.Iterator %5) -// CHECK-NEXT: %6 = load i64, ptr %0, align 8 -// CHECK-NEXT: %7 = icmp ne i64 %6, 1 -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 17 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"main.(*Tree).Ascend"(ptr @"__llgo.moduleZeroSizedAlloc$", %main.Iterator %{{[0-9]+}}) func main() { var got int tree := (*Tree)(new(TreeG[int])) // CHECK-LABEL: define i1 @"main.main$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = add i64 %1, 1 - // CHECK-NEXT: %3 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %4 = extractvalue { ptr } %3, 0 - // CHECK-NEXT: store i64 %2, ptr %4, align 8 - // CHECK-NEXT: ret i1 false - // CHECK-NEXT: } + // CHECK: [[ITER_VALUE:%[0-9]+]] = add i64 %1, 1 + // CHECK: [[ITER_ENV:%[0-9]+]] = load { ptr }, ptr %0 + // CHECK-NEXT: [[ITER_GOT:%[0-9]+]] = extractvalue { ptr } [[ITER_ENV]], 0 + // CHECK-NEXT: store i64 [[ITER_VALUE]], ptr [[ITER_GOT]] + // CHECK-NEXT: ret i1 false tree.Ascend(func(v int) bool { got = v + 1 @@ -82,10 +49,6 @@ func main() { } // CHECK-LABEL: define linkonce void @"main.(*TreeG[int]).Ascend"(ptr %0, %"main.IteratorG[int]" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue %"main.IteratorG[int]" %1, 1 -// CHECK-NEXT: %3 = extractvalue %"main.IteratorG[int]" %1, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %3) -// CHECK-NEXT: %4 = call i1 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %2, i64 0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[GENERIC_ENV:%[0-9]+]] = extractvalue %"main.IteratorG[int]" %1, 1 +// CHECK-NEXT: [[GENERIC_CODE:%[0-9]+]] = extractvalue %"main.IteratorG[int]" %1, 0 +// CHECK: call i1 %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[GENERIC_ENV]], i64 0) diff --git a/cl/_testgo/goexit/in.go b/cl/_testgo/goexit/in.go index ad67e5dc77..1996c222e5 100644 --- a/cl/_testgo/goexit/in.go +++ b/cl/_testgo/goexit/in.go @@ -5,9 +5,196 @@ import ( "runtime" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"must nil", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"must error", align 1{{$}} +// Goexit runs deferred frames without creating a recoverable panic value. +// CHECK: [[MUST_NIL:@[0-9]+]] = private unnamed_addr constant [8 x i8] c"must nil" +// CHECK: [[ERROR:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"error" +// CHECK: [[MUST_ERROR:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"must error" + +// demo1 starts a goroutine and waits for the value sent by its ordinary defer. +// CHECK-LABEL: define void @main.demo1(){{.*}} { +// CHECK: [[D1_CH_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[D1_CH:%.*]] = call ptr @"{{.*}}NewChan"(i64 1, i64 0) +// CHECK: store ptr [[D1_CH]], ptr [[D1_CH_SLOT]] +// CHECK: [[D1_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D1_CH_SLOT]], ptr {{%.*}} +// CHECK: [[D1_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo1$1", ptr undef }, ptr [[D1_ENV]], 1 +// CHECK: store { ptr, ptr } [[D1_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1", ptr {{%.*}}, i64 0) +// CHECK: [[D1_RECV_CH:%.*]] = load ptr, ptr [[D1_CH_SLOT]] +// CHECK: [[D1_RECV_BUF:%.*]] = alloca i1 +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[D1_RECV_CH]], ptr [[D1_RECV_BUF]], i64 1) +// CHECK: load i1, ptr [[D1_RECV_BUF]] + +// CHECK-LABEL: define void @"main.demo1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D1_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D1_CH_CAPTURE:%.*]] = extractvalue { ptr } [[D1_CAPTURE]], 0 +// CHECK: [[D1_DEFER_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D1_CH_CAPTURE]], ptr {{%.*}} +// CHECK: [[D1_DEFER:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo1$1$1", ptr undef }, ptr [[D1_DEFER_ENV]], 1 +// CHECK: [[D1_HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr {{%.*}}, i32 0, i32 5 +// CHECK: [[D1_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[D1_NODE_FUNC:%.*]] = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr [[D1_NODE]], i32 0, i32 2 +// CHECK: store { ptr, ptr } [[D1_DEFER]], ptr [[D1_NODE_FUNC]] +// CHECK: store ptr [[D1_NODE]], ptr [[D1_HEAD]] +// CHECK-NOT: StartRecoverFrame +// CHECK: call void @runtime.Goexit() +// CHECK: [[D1_ACTIVE_NODE:%.*]] = load ptr, ptr [[D1_HEAD]] +// CHECK: [[D1_NODE_VALUE:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[D1_ACTIVE_NODE]] +// CHECK: [[D1_DEFER_VALUE:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[D1_NODE_VALUE]], 2 +// CHECK: call void @"{{.*}}FreeDeferNode"(ptr [[D1_ACTIVE_NODE]]) +// CHECK: [[D1_DEFER_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[D1_DEFER_VALUE]], 1 +// CHECK: [[D1_DEFER_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[D1_DEFER_VALUE]], 0 +// CHECK-NOT: StartRecoverFrame +// CHECK: [[D1_DEFER_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[D1_DEFER_CALL_FN]]) +// CHECK: call void [[D1_DEFER_CODE]](ptr {{(nest|swiftself)}} [[D1_DEFER_CALL_ENV]]) + +// CHECK-LABEL: define void @"main.demo1$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D1_SEND_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D1_SEND_SLOT:%.*]] = extractvalue { ptr } [[D1_SEND_CAPTURE]], 0 +// CHECK: [[D1_SEND_CH:%.*]] = load ptr, ptr [[D1_SEND_SLOT]] +// CHECK: [[D1_SEND_BUF:%.*]] = alloca i1 +// CHECK: store i1 true, ptr [[D1_SEND_BUF]] +// CHECK: call i1 @"{{.*}}ChanSend"(ptr [[D1_SEND_CH]], ptr [[D1_SEND_BUF]], i64 1) + +// demo2 verifies that recover in a Goexit defer observes nil, then signals completion. +// CHECK-LABEL: define void @main.demo2(){{.*}} { +// CHECK: [[D2_CH_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[D2_CH:%.*]] = call ptr @"{{.*}}NewChan"(i64 1, i64 0) +// CHECK: store ptr [[D2_CH]], ptr [[D2_CH_SLOT]] +// CHECK: [[D2_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D2_CH_SLOT]], ptr {{%.*}} +// CHECK: [[D2_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo2$1", ptr undef }, ptr [[D2_ENV]], 1 +// CHECK: store { ptr, ptr } [[D2_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2", ptr {{%.*}}, i64 0) +// CHECK: [[D2_RECV_CH:%.*]] = load ptr, ptr [[D2_CH_SLOT]] +// CHECK: [[D2_RECV_BUF:%.*]] = alloca i1 +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[D2_RECV_CH]], ptr [[D2_RECV_BUF]], i64 1) +// CHECK: load i1, ptr [[D2_RECV_BUF]] + +// CHECK-LABEL: define void @"main.demo2$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D2_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D2_CH_CAPTURE:%.*]] = extractvalue { ptr } [[D2_CAPTURE]], 0 +// CHECK: [[D2_DEFER_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D2_CH_CAPTURE]], ptr {{%.*}} +// CHECK: [[D2_DEFER:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo2$1$1", ptr undef }, ptr [[D2_DEFER_ENV]], 1 +// CHECK: [[D2_HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr {{%.*}}, i32 0, i32 5 +// CHECK: [[D2_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[D2_NODE_FUNC:%.*]] = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr [[D2_NODE]], i32 0, i32 2 +// CHECK: store { ptr, ptr } [[D2_DEFER]], ptr [[D2_NODE_FUNC]] +// CHECK: store ptr [[D2_NODE]], ptr [[D2_HEAD]] +// CHECK: call void @runtime.Goexit() +// CHECK: [[D2_ACTIVE_NODE:%.*]] = load ptr, ptr [[D2_HEAD]] +// CHECK: [[D2_NODE_VALUE:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[D2_ACTIVE_NODE]] +// CHECK: [[D2_DEFER_VALUE:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[D2_NODE_VALUE]], 2 +// CHECK: call void @"{{.*}}FreeDeferNode"(ptr [[D2_ACTIVE_NODE]]) +// CHECK: [[D2_RECOVER_FN:%.*]] = extractvalue { ptr, ptr } [[D2_DEFER_VALUE]], 0 +// CHECK: [[D2_RECOVER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr [[D2_RECOVER_FN]]) +// CHECK: [[D2_DEFER_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[D2_DEFER_VALUE]], 1 +// CHECK: [[D2_DEFER_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[D2_DEFER_VALUE]], 0 +// CHECK: [[D2_DEFER_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[D2_DEFER_CALL_FN]]) +// CHECK: call void [[D2_DEFER_CODE]](ptr {{(nest|swiftself)}} [[D2_DEFER_CALL_ENV]]) +// CHECK: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[D2_RECOVER_STATE]]) + +// CHECK-LABEL: define void @"main.demo2$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D2_SEND_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D2_RECOVER_TOKEN:%.*]] = alloca i8 +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.demo2$1$1", ptr [[D2_RECOVER_TOKEN]]) +// CHECK: [[D2_RECOVERED:%.*]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[D2_RECOVER_TOKEN]]) +// CHECK: [[D2_IS_NIL:%.*]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[D2_RECOVERED]], %"{{.*}}eface" zeroinitializer) +// CHECK: [[D2_NOT_NIL:%.*]] = xor i1 [[D2_IS_NIL]], true +// CHECK: br i1 [[D2_NOT_NIL]], label %{{.*}}, label %{{.*}} +// CHECK: store %"{{.*}}String" { ptr [[MUST_NIL]], i64 8 }, ptr [[D2_MUST_NIL_BUF:%.*]], align {{[0-9]+}} +// CHECK: [[D2_MUST_NIL:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D2_MUST_NIL_BUF]], 1 +// CHECK: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D2_MUST_NIL]]) +// CHECK: [[D2_SEND_SLOT:%.*]] = extractvalue { ptr } [[D2_SEND_CAPTURE]], 0 +// CHECK: [[D2_SEND_CH:%.*]] = load ptr, ptr [[D2_SEND_SLOT]] +// CHECK: [[D2_SEND_BUF:%.*]] = alloca i1 +// CHECK: store i1 true, ptr [[D2_SEND_BUF]] +// CHECK: call i1 @"{{.*}}ChanSend"(ptr [[D2_SEND_CH]], ptr [[D2_SEND_BUF]], i64 1) + +// demo3 turns Goexit's nil recover into a panic, then recovers that panic outside. +// CHECK-LABEL: define void @main.demo3(){{.*}} { +// CHECK: [[D3_CH_SLOT:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK: [[D3_CH:%.*]] = call ptr @"{{.*}}NewChan"(i64 1, i64 0) +// CHECK: store ptr [[D3_CH]], ptr [[D3_CH_SLOT]] +// CHECK: [[D3_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D3_CH_SLOT]], ptr {{%.*}} +// CHECK: [[D3_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo3$1", ptr undef }, ptr [[D3_ENV]], 1 +// CHECK: store { ptr, ptr } [[D3_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$3", ptr {{%.*}}, i64 0) +// CHECK: [[D3_RECV_CH:%.*]] = load ptr, ptr [[D3_CH_SLOT]] +// CHECK: [[D3_RECV_BUF:%.*]] = alloca i1 +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[D3_RECV_CH]], ptr [[D3_RECV_BUF]], i64 1) +// CHECK: load i1, ptr [[D3_RECV_BUF]] + +// CHECK-LABEL: define void @"main.demo3$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D3_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D3_CH_CAPTURE:%.*]] = extractvalue { ptr } [[D3_CAPTURE]], 0 +// CHECK: [[D3_OUTER_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[D3_CH_CAPTURE]], ptr {{%.*}} +// CHECK: [[D3_OUTER_DEFER:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo3$1$1", ptr undef }, ptr [[D3_OUTER_ENV]], 1 +// CHECK: [[D3_HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr {{%.*}}, i32 0, i32 5 +// CHECK: [[D3_INNER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @"main.demo3$1$2") +// CHECK-NEXT: call void @"main.demo3$1$2"() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[D3_INNER_STATE]]) +// CHECK: [[D3_OUTER_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[D3_OUTER_NODE_FUNC:%.*]] = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr [[D3_OUTER_NODE]], i32 0, i32 2 +// CHECK: store { ptr, ptr } [[D3_OUTER_DEFER]], ptr [[D3_OUTER_NODE_FUNC]] +// CHECK: store ptr [[D3_OUTER_NODE]], ptr [[D3_HEAD]] +// CHECK: call void @runtime.Goexit() +// CHECK: [[D3_HAS_NODE:%.*]] = load ptr, ptr [[D3_HEAD]] +// CHECK: icmp ne ptr [[D3_HAS_NODE]], null +// CHECK: [[D3_ACTIVE_NODE:%.*]] = load ptr, ptr [[D3_HEAD]] +// CHECK: [[D3_NODE_VALUE:%.*]] = load { ptr, i64, { ptr, ptr } }, ptr [[D3_ACTIVE_NODE]] +// CHECK: [[D3_OUTER_VALUE:%.*]] = extractvalue { ptr, i64, { ptr, ptr } } [[D3_NODE_VALUE]], 2 +// CHECK: call void @"{{.*}}FreeDeferNode"(ptr [[D3_ACTIVE_NODE]]) +// CHECK: [[D3_OUTER_FN:%.*]] = extractvalue { ptr, ptr } [[D3_OUTER_VALUE]], 0 +// CHECK: [[D3_OUTER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr [[D3_OUTER_FN]]) +// CHECK: [[D3_OUTER_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[D3_OUTER_VALUE]], 1 +// CHECK: [[D3_OUTER_CALL_FN:%.*]] = extractvalue { ptr, ptr } [[D3_OUTER_VALUE]], 0 +// CHECK: [[D3_OUTER_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[D3_OUTER_CALL_FN]]) +// CHECK: call void [[D3_OUTER_CODE]](ptr {{(nest|swiftself)}} [[D3_OUTER_CALL_ENV]]) +// CHECK: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[D3_OUTER_STATE]]) + +// CHECK-LABEL: define void @"main.demo3$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[D3_OUTER_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[D3_OUTER_TOKEN:%.*]] = alloca i8 +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.demo3$1$1", ptr [[D3_OUTER_TOKEN]]) +// CHECK: [[D3_RECOVERED_ERROR:%.*]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[D3_OUTER_TOKEN]]) +// CHECK: store %"{{.*}}String" { ptr [[ERROR]], i64 5 }, ptr [[D3_ERROR_BUF:%.*]], align {{[0-9]+}} +// CHECK: [[D3_ERROR_EFACE:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D3_ERROR_BUF]], 1 +// CHECK: [[D3_IS_ERROR:%.*]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[D3_RECOVERED_ERROR]], %"{{.*}}eface" [[D3_ERROR_EFACE]]) +// CHECK: [[D3_NOT_ERROR:%.*]] = xor i1 [[D3_IS_ERROR]], true +// CHECK: br i1 [[D3_NOT_ERROR]], label %{{.*}}, label %{{.*}} +// CHECK: store %"{{.*}}String" { ptr [[MUST_ERROR]], i64 10 }, ptr [[D3_MUST_ERROR_BUF:%.*]], align {{[0-9]+}} +// CHECK: [[D3_MUST_ERROR:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D3_MUST_ERROR_BUF]], 1 +// CHECK: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D3_MUST_ERROR]]) +// CHECK: [[D3_SEND_SLOT:%.*]] = extractvalue { ptr } [[D3_OUTER_CAPTURE]], 0 +// CHECK: [[D3_SEND_CH:%.*]] = load ptr, ptr [[D3_SEND_SLOT]] +// CHECK: [[D3_SEND_BUF:%.*]] = alloca i1 +// CHECK: store i1 true, ptr [[D3_SEND_BUF]] +// CHECK: call i1 @"{{.*}}ChanSend"(ptr [[D3_SEND_CH]], ptr [[D3_SEND_BUF]], i64 1) + +// CHECK-LABEL: define void @"main.demo3$1$2"(){{.*}} { +// CHECK: [[D3_INNER_TOKEN:%.*]] = alloca i8 +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.demo3$1$2", ptr [[D3_INNER_TOKEN]]) +// CHECK: [[D3_RECOVERED_NIL:%.*]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[D3_INNER_TOKEN]]) +// CHECK: [[D3_INNER_IS_NIL:%.*]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[D3_RECOVERED_NIL]], %"{{.*}}eface" zeroinitializer) +// CHECK: [[D3_INNER_NOT_NIL:%.*]] = xor i1 [[D3_INNER_IS_NIL]], true +// CHECK: br i1 [[D3_INNER_NOT_NIL]], label %{{.*}}, label %{{.*}} +// CHECK: store %"{{.*}}String" { ptr [[MUST_NIL]], i64 8 }, ptr [[D3_INNER_MUST_NIL_BUF:%.*]], align {{[0-9]+}} +// CHECK: [[D3_INNER_MUST_NIL:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D3_INNER_MUST_NIL_BUF]], 1 +// CHECK: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D3_INNER_MUST_NIL]]) +// CHECK: store %"{{.*}}String" { ptr [[ERROR]], i64 5 }, ptr [[D3_INNER_ERROR_BUF:%.*]], align {{[0-9]+}} +// CHECK: [[D3_INNER_ERROR:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[D3_INNER_ERROR_BUF]], 1 +// CHECK: call void @"{{.*}}Panic"(%"{{.*}}eface" [[D3_INNER_ERROR]]) + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_0: +// CHECK-NEXT: call void @main.demo1() +// CHECK-NEXT: call void @main.demo2() +// CHECK-NEXT: call void @main.demo3() +// CHECK-NEXT: ret void func main() { demo1() @@ -60,512 +247,3 @@ func demo3() { }() <-ch } - -// CHECK-LABEL: define void @main.demo1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 1, i64 0) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.demo1$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %6 = getelementptr inbounds { { ptr, ptr } }, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %5, i64 0) -// CHECK-NEXT: %7 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %8 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %9 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %9, i8 0, i64 1, i1 false) -// CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %7, ptr %9, i64 1) -// CHECK-NEXT: %11 = load i1, ptr %9, align 1 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } { ptr @"main.demo1$1$1", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %7 = alloca i8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store ptr %7, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 2 -// CHECK-NEXT: store ptr %6, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.demo1$1", %_llgo_2), ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %8) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 4 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %16, align 8 -// CHECK-NEXT: %17 = call i32 @{{(__)?}}sigsetjmp(ptr %7, i32 0) -// CHECK-NEXT: %18 = icmp eq i32 %17, 0 -// CHECK-NEXT: br i1 %18, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.demo1$1", %_llgo_3), ptr %14, align 8 -// CHECK-NEXT: %19 = load i64, ptr %13, align 8 -// CHECK-NEXT: %20 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %21 = icmp ne ptr %20, null -// CHECK-NEXT: br i1 %21, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %6) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %5, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %16, align 8 -// CHECK-NEXT: call void @runtime.Goexit() -// CHECK-NEXT: store ptr blockaddress(@"main.demo1$1", %_llgo_6), ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.demo1$1", %_llgo_3), ptr %15, align 8 -// CHECK-NEXT: %27 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %27, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %28 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %29 = load { ptr, i64, { ptr, ptr } }, ptr %28, align 8 -// CHECK-NEXT: %30 = extractvalue { ptr, i64, { ptr, ptr } } %29, 0 -// CHECK-NEXT: store ptr %30, ptr %16, align 8 -// CHECK-NEXT: %31 = extractvalue { ptr, i64, { ptr, ptr } } %29, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %28) -// CHECK-NEXT: %32 = extractvalue { ptr, ptr } %31, 1 -// CHECK-NEXT: %33 = extractvalue { ptr, ptr } %31, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %33) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %32) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %34 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, align 8 -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %34, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %35) -// CHECK-NEXT: %36 = load ptr, ptr %15, align 8 -// CHECK-NEXT: indirectbr ptr %36, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo1$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 1, i1 false) -// CHECK-NEXT: store i1 true, ptr %5, align 1 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %3, ptr %5, i64 1) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.demo2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 1, i64 0) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.demo2$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %6 = getelementptr inbounds { { ptr, ptr } }, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$2", ptr %5, i64 0) -// CHECK-NEXT: %7 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %8 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %9 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %9, i8 0, i64 1, i1 false) -// CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %7, ptr %9, i64 1) -// CHECK-NEXT: %11 = load i1, ptr %9, align 1 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo2$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } { ptr @"main.demo2$1$1", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %7 = alloca i8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store ptr %7, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 2 -// CHECK-NEXT: store ptr %6, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.demo2$1", %_llgo_2), ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %8) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 4 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %16, align 8 -// CHECK-NEXT: %17 = call i32 @{{(__)?}}sigsetjmp(ptr %7, i32 0) -// CHECK-NEXT: %18 = icmp eq i32 %17, 0 -// CHECK-NEXT: br i1 %18, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.demo2$1", %_llgo_3), ptr %14, align 8 -// CHECK-NEXT: %19 = load i64, ptr %13, align 8 -// CHECK-NEXT: %20 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %21 = icmp ne ptr %20, null -// CHECK-NEXT: br i1 %21, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %6) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %5, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %16, align 8 -// CHECK-NEXT: call void @runtime.Goexit() -// CHECK-NEXT: store ptr blockaddress(@"main.demo2$1", %_llgo_6), ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.demo2$1", %_llgo_3), ptr %15, align 8 -// CHECK-NEXT: %27 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %27, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %28 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %29 = load { ptr, i64, { ptr, ptr } }, ptr %28, align 8 -// CHECK-NEXT: %30 = extractvalue { ptr, i64, { ptr, ptr } } %29, 0 -// CHECK-NEXT: store ptr %30, ptr %16, align 8 -// CHECK-NEXT: %31 = extractvalue { ptr, i64, { ptr, ptr } } %29, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %28) -// CHECK-NEXT: %32 = extractvalue { ptr, ptr } %31, 0 -// CHECK-NEXT: %33 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %32) -// CHECK-NEXT: %34 = extractvalue { ptr, ptr } %31, 1 -// CHECK-NEXT: %35 = extractvalue { ptr, ptr } %31, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %35) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %33) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %36 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, align 8 -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %36, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %37) -// CHECK-NEXT: %38 = load ptr, ptr %15, align 8 -// CHECK-NEXT: indirectbr ptr %38, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo2$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.demo2$1$1", ptr %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %2) -// CHECK-NEXT: %4 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %3, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: %5 = xor i1 %4, true -// CHECK-NEXT: br i1 %5, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %7) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %9 = load ptr, ptr %8, align 8 -// CHECK-NEXT: %10 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %11 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %11, i8 0, i64 1, i1 false) -// CHECK-NEXT: store i1 true, ptr %11, align 1 -// CHECK-NEXT: %12 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %9, ptr %11, i64 1) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.demo3(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 1, i64 0) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.demo3$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %6 = getelementptr inbounds { { ptr, ptr } }, ptr %5, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$3", ptr %5, i64 0) -// CHECK-NEXT: %7 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %8 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %9 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %9, i8 0, i64 1, i1 false) -// CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %7, ptr %9, i64 1) -// CHECK-NEXT: %11 = load i1, ptr %9, align 1 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo3$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } { ptr @"main.demo3$1$1", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %7 = alloca i8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store ptr %7, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 2 -// CHECK-NEXT: store ptr %6, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.demo3$1", %_llgo_2), ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %8) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 4 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %16, align 8 -// CHECK-NEXT: %17 = call i32 @{{(__)?}}sigsetjmp(ptr %7, i32 0) -// CHECK-NEXT: %18 = icmp eq i32 %17, 0 -// CHECK-NEXT: br i1 %18, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.demo3$1", %_llgo_7), ptr %14, align 8 -// CHECK-NEXT: %19 = load i64, ptr %13, align 8 -// CHECK-NEXT: %20 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.demo3$1$2") -// CHECK-NEXT: call void @"main.demo3$1$2"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %20) -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %6) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %21 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %22, i32 0, i32 0 -// CHECK-NEXT: store ptr %21, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %22, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %22, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %5, ptr %25, align 8 -// CHECK-NEXT: store ptr %22, ptr %16, align 8 -// CHECK-NEXT: call void @runtime.Goexit() -// CHECK-NEXT: store ptr blockaddress(@"main.demo3$1", %_llgo_6), ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.demo3$1", %_llgo_3), ptr %15, align 8 -// CHECK-NEXT: %26 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %26, [label %_llgo_3, label %_llgo_7, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_9 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@"main.demo3$1", %_llgo_3), ptr %14, align 8 -// CHECK-NEXT: %27 = load i64, ptr %13, align 8 -// CHECK-NEXT: %28 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %29 = icmp ne ptr %28, null -// CHECK-NEXT: br i1 %29, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: %30 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %31 = load { ptr, i64, { ptr, ptr } }, ptr %30, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, { ptr, ptr } } %31, 0 -// CHECK-NEXT: store ptr %32, ptr %16, align 8 -// CHECK-NEXT: %33 = extractvalue { ptr, i64, { ptr, ptr } } %31, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %30) -// CHECK-NEXT: %34 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %35 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %34) -// CHECK-NEXT: %36 = extractvalue { ptr, ptr } %33, 1 -// CHECK-NEXT: %37 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %37) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %35) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_7 -// CHECK-NEXT: %38 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, align 8 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %38, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %39) -// CHECK-NEXT: %40 = load ptr, ptr %15, align 8 -// CHECK-NEXT: indirectbr ptr %40, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo3$1$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.demo3$1$1", ptr %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %2) -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %3, %"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: %7 = xor i1 %6, true -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %11 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %12 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %13 = alloca i1, align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %13, i8 0, i64 1, i1 false) -// CHECK-NEXT: store i1 true, ptr %13, align 1 -// CHECK-NEXT: %14 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %11, ptr %13, i64 1) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %12) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.demo3$1$2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.demo3$1$2", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: %3 = xor i1 %2, true -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %7) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.demo1() -// CHECK-NEXT: call void @main.demo2() -// CHECK-NEXT: call void @main.demo3() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { { ptr, ptr } } %3, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { { ptr, ptr } } %3, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$3"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { { ptr, ptr } } %3, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } diff --git a/cl/_testgo/goroutine/in.go b/cl/_testgo/goroutine/in.go index 0521c06343..8d08111af9 100644 --- a/cl/_testgo/goroutine/in.go +++ b/cl/_testgo/goroutine/in.go @@ -1,29 +1,36 @@ // LITTEST package main +// Goroutine arguments live in an owned root. The generated entry wrappers must +// release that root and pass the closure environment through the hidden ABI. // CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1" +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2" +// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[GOROUTINE_TEXT:%[0-9]+]]) +// CHECK: [[GOROUTINE_ENV:%[0-9]+]] = load { ptr }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[GOROUTINE_DONE:%[0-9]+]] = extractvalue { ptr } [[GOROUTINE_ENV]], 0 +// CHECK-NEXT: store i1 true, ptr [[GOROUTINE_DONE]] +// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr +// CHECK: [[ROUTINE1_ARGS:%[0-9]+]] = load { %"{{.*}}String" }, ptr [[ROUTINE1_ROOT:%[0-9]+]] +// CHECK-NEXT: [[ROUTINE1_TEXT:%[0-9]+]] = extractvalue { %"{{.*}}String" } [[ROUTINE1_ARGS]], 0 +// CHECK-NEXT: call void @"{{.*}}FreeRoot"(ptr [[ROUTINE1_ROOT]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[ROUTINE1_TEXT]]) +// CHECK: ret ptr null +// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr +// CHECK: [[ROUTINE2_ARGS:%[0-9]+]] = load { { ptr, ptr }, %"{{.*}}String" }, ptr [[ROUTINE2_ROOT:%[0-9]+]] +// CHECK-NEXT: [[ROUTINE2_CLOSURE:%[0-9]+]] = extractvalue { { ptr, ptr }, %"{{.*}}String" } [[ROUTINE2_ARGS]], 0 +// CHECK-NEXT: [[ROUTINE2_TEXT:%[0-9]+]] = extractvalue { { ptr, ptr }, %"{{.*}}String" } [[ROUTINE2_ARGS]], 1 +// CHECK-NEXT: call void @"{{.*}}FreeRoot"(ptr [[ROUTINE2_ROOT]]) +// CHECK-NEXT: [[ROUTINE2_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[ROUTINE2_CLOSURE]], 1 +// CHECK-NEXT: [[ROUTINE2_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[ROUTINE2_CLOSURE]], 0 +// CHECK: call void %{{.*}}(ptr {{(nest|swiftself)}} [[ROUTINE2_ENV]], %"{{.*}}String" [[ROUTINE2_TEXT]]) +// CHECK-NEXT: ret ptr null + func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 1) - // CHECK: store i1 false, ptr %0, align 1 - // CHECK: call ptr @"{{.*}}AllocRoot"(i64 16) - // CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1", ptr %1, i64 0) done := false go println("hello") go func(s string) { - // CHECK: call ptr @"{{.*}}AllocU"(i64 8) - // CHECK: { ptr @"main.main$1", ptr undef } - // CHECK: call ptr @"{{.*}}AllocRoot"(i64 32) - // CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2", ptr {{%[0-9]+}}, i64 0) - // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @2, i64 1 }) - // CHECK: ret void - // CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}String" %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" %1) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: store i1 true, ptr %3, align 1 - // CHECK-NEXT: ret void println(s) done = true }("Hello, goroutine") @@ -31,24 +38,3 @@ func main() { print(".") } } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { %"{{.*}}String" }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { %"{{.*}}String" } %1, 0 -// CHECK-NEXT: call void @"{{.*}}FreeRoot"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" %2) -// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) -// CHECK-NEXT: ret ptr null - -// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr }, %"{{.*}}String" }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr }, %"{{.*}}String" } %1, 0 -// CHECK-NEXT: %3 = extractvalue { { ptr, ptr }, %"{{.*}}String" } %1, 1 -// CHECK-NEXT: call void @"{{.*}}FreeRoot"(ptr %0) -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, %"{{.*}}String" %3) -// CHECK-NEXT: ret ptr null diff --git a/cl/_testgo/ifaceconv/in.go b/cl/_testgo/ifaceconv/in.go index b7b9ce6160..425ce4a523 100644 --- a/cl/_testgo/ifaceconv/in.go +++ b/cl/_testgo/ifaceconv/in.go @@ -3,23 +3,6 @@ package main // Tests of interface conversions and type assertions. -// CHECK: {{^}}@0 = private unnamed_addr constant [46 x i8] c"{{.*}}/cl/_testgo/ifaceconv.C1", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [1 x i8] c"f", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [46 x i8] c"{{.*}}/cl/_testgo/ifaceconv.C2", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [1 x i8] c"g", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [21 x i8] c"nil i0.(I0) succeeded", align 1{{$}} -// CHECK: {{^}}@11 = private unnamed_addr constant [21 x i8] c"nil i1.(I1) succeeded", align 1{{$}} -// CHECK: {{^}}@14 = private unnamed_addr constant [21 x i8] c"nil i2.(I2) succeeded", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [17 x i8] c"C1 i1.(I0) failed", align 1{{$}} -// CHECK: {{^}}@19 = private unnamed_addr constant [17 x i8] c"C1 i1.(I1) failed", align 1{{$}} -// CHECK: {{^}}@20 = private unnamed_addr constant [20 x i8] c"C1 i1.(I2) succeeded", align 1{{$}} -// CHECK: {{^}}@22 = private unnamed_addr constant [17 x i8] c"C2 i1.(I0) failed", align 1{{$}} -// CHECK: {{^}}@23 = private unnamed_addr constant [17 x i8] c"C2 i1.(I1) failed", align 1{{$}} -// CHECK: {{^}}@24 = private unnamed_addr constant [17 x i8] c"C2 i1.(I2) failed", align 1{{$}} -// CHECK: {{^}}@25 = private unnamed_addr constant [17 x i8] c"C1 I0(i1) was nil", align 1{{$}} -// CHECK: {{^}}@26 = private unnamed_addr constant [17 x i8] c"C1 I1(i1) was nil", align 1{{$}} -// CHECK: {{^}}@27 = private unnamed_addr constant [4 x i8] c"pass", align 1{{$}} - type I0 interface { } type I1 interface { @@ -34,9 +17,7 @@ type C0 struct{} type C1 struct{} // CHECK-LABEL: define void @main.C1.f(%main.C1 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: ret void func (C1) f() {} @@ -108,359 +89,94 @@ func main() { } // CHECK-LABEL: define void @"main.(*C1).f"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 46 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 1 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: call void @main.C1.f(%main.C1 zeroinitializer) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[C1_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[C1_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: [[C1_DEREF_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[C1_DEREF_NIL]]) +// CHECK: call void @main.C1.f(%main.C1 zeroinitializer) // CHECK-LABEL: define void @main.C2.f(%main.C2 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: ret void // CHECK-LABEL: define void @main.C2.g(%main.C2 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: ret void // CHECK-LABEL: define void @"main.(*C2).f"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 46 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 1 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: call void @main.C2.f(%main.C2 zeroinitializer) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[C2_F_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[C2_F_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: call void @main.C2.f(%main.C2 zeroinitializer) // CHECK-LABEL: define void @"main.(*C2).g"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 46 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 1 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: call void @main.C2.g(%main.C2 zeroinitializer) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[C2_G_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[C2_G_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: call void @main.C2.g(%main.C2 zeroinitializer) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 false, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_25 -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 21 }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %0, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_25 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %3 = icmp ne ptr %2, null -// CHECK-NEXT: br i1 %3, label %_llgo_26, label %_llgo_27 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_28 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @11, i64 21 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_28 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %7 = icmp ne ptr %6, null -// CHECK-NEXT: br i1 %7, label %_llgo_29, label %_llgo_30 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_31 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @14, i64 21 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_31 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %11, ptr null, 1 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %13, 0 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %14, ptr null, 1 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr %16) -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %17, 0 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %18, ptr null, 1 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.C1 zeroinitializer, ptr %20, align 1 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C1) -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %21, 0 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %22, ptr %20, 1 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %23) -// CHECK-NEXT: %25 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I0, ptr %24) -// CHECK-NEXT: br i1 %25, label %_llgo_32, label %_llgo_33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_34 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 17 }, ptr %26, align 8 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %27) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_34 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %23) -// CHECK-NEXT: %29 = icmp ne ptr %28, null -// CHECK-NEXT: br i1 %29, label %_llgo_35, label %_llgo_36 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_37 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @19, i64 17 }, ptr %30, align 8 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %31) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_37 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %23) -// CHECK-NEXT: %33 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I2, ptr %32) -// CHECK-NEXT: br i1 %33, label %_llgo_38, label %_llgo_39 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_40 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 20 }, ptr %34, align 8 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %35) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_40 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.C2 zeroinitializer, ptr %36, align 1 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C2) -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %37, 0 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %38, ptr %36, 1 -// CHECK-NEXT: %40 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %39) -// CHECK-NEXT: %41 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I0, ptr %40) -// CHECK-NEXT: br i1 %41, label %_llgo_41, label %_llgo_42 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_43 -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 17 }, ptr %42, align 8 -// CHECK-NEXT: %43 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %42, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %43) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_43 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %39) -// CHECK-NEXT: %45 = icmp ne ptr %44, null -// CHECK-NEXT: br i1 %45, label %_llgo_44, label %_llgo_45 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_46 -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 17 }, ptr %46, align 8 -// CHECK-NEXT: %47 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %46, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %47) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_46 -// CHECK-NEXT: %48 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %39) -// CHECK-NEXT: %49 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I2, ptr %48) -// CHECK-NEXT: br i1 %49, label %_llgo_47, label %_llgo_48 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_49 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @24, i64 17 }, ptr %50, align 8 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %50, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %51) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_49 -// CHECK-NEXT: %52 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.C1 zeroinitializer, ptr %52, align 1 -// CHECK-NEXT: %53 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C1) -// CHECK-NEXT: %54 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %53, 0 -// CHECK-NEXT: %55 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %54, ptr %52, 1 -// CHECK-NEXT: %56 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %55) -// CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %55, 1 -// CHECK-NEXT: %58 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %56, 0 -// CHECK-NEXT: %59 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %58, ptr %57, 1 -// CHECK-NEXT: %60 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %59, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %60, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18 -// CHECK-NEXT: %61 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 17 }, ptr %61, align 8 -// CHECK-NEXT: %62 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %61, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %62) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_18 -// CHECK-NEXT: %63 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %55) -// CHECK-NEXT: %64 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %55, 1 -// CHECK-NEXT: %65 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %63, 0 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %65, ptr %64, 1 -// CHECK-NEXT: %67 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %68 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %67, 0 -// CHECK-NEXT: %69 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %68, ptr null, 1 -// CHECK-NEXT: %70 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %66, %"{{.*}}/runtime/internal/runtime.eface" %69) -// CHECK-NEXT: br i1 %70, label %_llgo_21, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_20 -// CHECK-NEXT: %71 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @26, i64 17 }, ptr %71, align 8 -// CHECK-NEXT: %72 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %71, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %72) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_20 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @27, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_24, %_llgo_23 -// CHECK-NEXT: %73 = phi { %"{{.*}}/runtime/internal/runtime.eface", i1 } [ { %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer, i1 true }, %_llgo_23 ], [ zeroinitializer, %_llgo_24 ] -// CHECK-NEXT: %74 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %73, 0 -// CHECK-NEXT: %75 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %73, 1 -// CHECK-NEXT: br i1 %75, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_2 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_2 -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_27, %_llgo_26 -// CHECK-NEXT: %76 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ { %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_26 ], [ zeroinitializer, %_llgo_27 ] -// CHECK-NEXT: %77 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %76, 0 -// CHECK-NEXT: %78 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %76, 1 -// CHECK-NEXT: br i1 %78, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_4 -// CHECK-NEXT: br label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_4 -// CHECK-NEXT: br label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_30, %_llgo_29 -// CHECK-NEXT: %79 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ { %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, i1 true }, %_llgo_29 ], [ zeroinitializer, %_llgo_30 ] -// CHECK-NEXT: %80 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %79, 0 -// CHECK-NEXT: %81 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %79, 1 -// CHECK-NEXT: br i1 %81, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_6 -// CHECK-NEXT: %82 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %23, 1 -// CHECK-NEXT: %83 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %24, 0 -// CHECK-NEXT: %84 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %83, ptr %82, 1 -// CHECK-NEXT: %85 = insertvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } undef, %"{{.*}}/runtime/internal/runtime.eface" %84, 0 -// CHECK-NEXT: %86 = insertvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %85, i1 true, 1 -// CHECK-NEXT: br label %_llgo_34 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_6 -// CHECK-NEXT: br label %_llgo_34 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_34: ; preds = %_llgo_33, %_llgo_32 -// CHECK-NEXT: %87 = phi { %"{{.*}}/runtime/internal/runtime.eface", i1 } [ %86, %_llgo_32 ], [ zeroinitializer, %_llgo_33 ] -// CHECK-NEXT: %88 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %87, 0 -// CHECK-NEXT: %89 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %87, 1 -// CHECK-NEXT: br i1 %89, label %_llgo_8, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_35: ; preds = %_llgo_8 -// CHECK-NEXT: %90 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %23, 0 -// CHECK-NEXT: %91 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %90, i1 true, 1 -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_36: ; preds = %_llgo_8 -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_37: ; preds = %_llgo_36, %_llgo_35 -// CHECK-NEXT: %92 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %91, %_llgo_35 ], [ zeroinitializer, %_llgo_36 ] -// CHECK-NEXT: %93 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %92, 0 -// CHECK-NEXT: %94 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %92, 1 -// CHECK-NEXT: br i1 %94, label %_llgo_10, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_38: ; preds = %_llgo_10 -// CHECK-NEXT: %95 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %23, 1 -// CHECK-NEXT: %96 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr %32) -// CHECK-NEXT: %97 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %96, 0 -// CHECK-NEXT: %98 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %97, ptr %95, 1 -// CHECK-NEXT: %99 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %98, 0 -// CHECK-NEXT: %100 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %99, i1 true, 1 -// CHECK-NEXT: br label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_39: ; preds = %_llgo_10 -// CHECK-NEXT: br label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_40: ; preds = %_llgo_39, %_llgo_38 -// CHECK-NEXT: %101 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %100, %_llgo_38 ], [ zeroinitializer, %_llgo_39 ] -// CHECK-NEXT: %102 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %101, 0 -// CHECK-NEXT: %103 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %101, 1 -// CHECK-NEXT: br i1 %103, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_41: ; preds = %_llgo_12 -// CHECK-NEXT: %104 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %39, 1 -// CHECK-NEXT: %105 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %40, 0 -// CHECK-NEXT: %106 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %105, ptr %104, 1 -// CHECK-NEXT: %107 = insertvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } undef, %"{{.*}}/runtime/internal/runtime.eface" %106, 0 -// CHECK-NEXT: %108 = insertvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %107, i1 true, 1 -// CHECK-NEXT: br label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_42: ; preds = %_llgo_12 -// CHECK-NEXT: br label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_43: ; preds = %_llgo_42, %_llgo_41 -// CHECK-NEXT: %109 = phi { %"{{.*}}/runtime/internal/runtime.eface", i1 } [ %108, %_llgo_41 ], [ zeroinitializer, %_llgo_42 ] -// CHECK-NEXT: %110 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %109, 0 -// CHECK-NEXT: %111 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %109, 1 -// CHECK-NEXT: br i1 %111, label %_llgo_14, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_44: ; preds = %_llgo_14 -// CHECK-NEXT: %112 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %39, 0 -// CHECK-NEXT: %113 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %112, i1 true, 1 -// CHECK-NEXT: br label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_45: ; preds = %_llgo_14 -// CHECK-NEXT: br label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_46: ; preds = %_llgo_45, %_llgo_44 -// CHECK-NEXT: %114 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %113, %_llgo_44 ], [ zeroinitializer, %_llgo_45 ] -// CHECK-NEXT: %115 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %114, 0 -// CHECK-NEXT: %116 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %114, 1 -// CHECK-NEXT: br i1 %116, label %_llgo_16, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_47: ; preds = %_llgo_16 -// CHECK-NEXT: %117 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %39, 1 -// CHECK-NEXT: %118 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr %48) -// CHECK-NEXT: %119 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %118, 0 -// CHECK-NEXT: %120 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %119, ptr %117, 1 -// CHECK-NEXT: %121 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %120, 0 -// CHECK-NEXT: %122 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %121, i1 true, 1 -// CHECK-NEXT: br label %_llgo_49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_48: ; preds = %_llgo_16 -// CHECK-NEXT: br label %_llgo_49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_49: ; preds = %_llgo_48, %_llgo_47 -// CHECK-NEXT: %123 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %122, %_llgo_47 ], [ zeroinitializer, %_llgo_48 ] -// CHECK-NEXT: %124 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %123, 0 -// CHECK-NEXT: %125 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %123, 1 -// CHECK-NEXT: br i1 %125, label %_llgo_18, label %_llgo_17 -// CHECK-NEXT: } +// A nil empty-interface assertion is known false; non-empty nil assertions test IfaceType. +// CHECK: br i1 false, label %{{.*}}, label %{{.*}} +// CHECK: [[NIL_I1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" zeroinitializer) +// CHECK: [[NIL_I1_OK:%.*]] = icmp ne ptr [[NIL_I1_TYPE]], null +// CHECK: br i1 [[NIL_I1_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[NIL_I2_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" zeroinitializer) +// CHECK: [[NIL_I2_OK:%.*]] = icmp ne ptr [[NIL_I2_TYPE]], null +// CHECK: br i1 [[NIL_I2_OK]], label %{{.*}}, label %{{.*}} +// Converting nil I2 to I1 derives the target itab from the nil dynamic type. +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" zeroinitializer) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" zeroinitializer) +// CHECK: [[NIL_DYNAMIC_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" zeroinitializer) +// CHECK: [[NIL_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr [[NIL_DYNAMIC_TYPE]]) +// C1 implements I0 and I1, but its dynamic type is tested against I2. +// CHECK: [[C1_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) +// CHECK: store %main.C1 zeroinitializer, ptr [[C1_DATA]] +// CHECK: [[C1_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C1) +// CHECK: [[C1_IFACE_0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[C1_ITAB]], 0 +// CHECK: [[C1_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[C1_IFACE_0]], ptr [[C1_DATA]], 1 +// CHECK: [[C1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C1_IFACE]]) +// CHECK: [[C1_IS_I0:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I0, ptr [[C1_TYPE]]) +// CHECK: br i1 [[C1_IS_I0]], label %{{.*}}, label %{{.*}} +// CHECK: [[C1_I1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C1_IFACE]]) +// CHECK: [[C1_IS_I1:%.*]] = icmp ne ptr [[C1_I1_TYPE]], null +// CHECK: br i1 [[C1_IS_I1]], label %{{.*}}, label %{{.*}} +// CHECK: [[C1_I2_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C1_IFACE]]) +// CHECK: [[C1_IS_I2:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I2, ptr [[C1_I2_TYPE]]) +// CHECK: br i1 [[C1_IS_I2]], label %{{.*}}, label %{{.*}} +// C2 follows the same assertion pipeline, including its positive I2 test. +// CHECK: [[C2_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) +// CHECK: store %main.C2 zeroinitializer, ptr [[C2_DATA]] +// CHECK: [[C2_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C2) +// CHECK: [[C2_IFACE_0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[C2_ITAB]], 0 +// CHECK: [[C2_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[C2_IFACE_0]], ptr [[C2_DATA]], 1 +// CHECK: [[C2_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C2_IFACE]]) +// CHECK: [[C2_IS_I0:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I0, ptr [[C2_TYPE]]) +// CHECK: br i1 [[C2_IS_I0]], label %{{.*}}, label %{{.*}} +// CHECK: [[C2_I1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C2_IFACE]]) +// CHECK: [[C2_IS_I1:%.*]] = icmp ne ptr [[C2_I1_TYPE]], null +// CHECK: br i1 [[C2_IS_I1]], label %{{.*}}, label %{{.*}} +// CHECK: [[C2_I2_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[C2_IFACE]]) +// CHECK: [[C2_IS_I2:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I2, ptr [[C2_I2_TYPE]]) +// CHECK: br i1 [[C2_IS_I2]], label %{{.*}}, label %{{.*}} +// The final conversions rebuild an eface from the same C1 payload before nil comparison. +// CHECK: [[FINAL_C1_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.C1) +// CHECK: [[FINAL_C1_IFACE_0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[FINAL_C1_ITAB]], 0 +// CHECK: [[FINAL_C1_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[FINAL_C1_IFACE_0]], ptr [[FINAL_C1_DATA:%.*]], 1 +// CHECK: [[FINAL_C1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[FINAL_C1_IFACE]]) +// CHECK: [[FINAL_C1_PAYLOAD:%.*]] = extractvalue %"{{.*}}iface" [[FINAL_C1_IFACE]], 1 +// CHECK: [[FINAL_EFACE_0:%.*]] = insertvalue %"{{.*}}eface" undef, ptr [[FINAL_C1_TYPE]], 0 +// CHECK: [[FINAL_EFACE:%.*]] = insertvalue %"{{.*}}eface" [[FINAL_EFACE_0]], ptr [[FINAL_C1_PAYLOAD]], 1 +// CHECK: [[I0_IS_NIL:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}eface" [[FINAL_EFACE]], %"{{.*}}eface" zeroinitializer) +// CHECK: br i1 [[I0_IS_NIL]], label %{{.*}}, label %{{.*}} +// CHECK: [[FINAL_I1_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[FINAL_C1_IFACE]]) +// CHECK: [[FINAL_I1_PAYLOAD:%.*]] = extractvalue %"{{.*}}iface" [[FINAL_C1_IFACE]], 1 +// CHECK: [[FINAL_I1_EFACE_0:%.*]] = insertvalue %"{{.*}}eface" undef, ptr [[FINAL_I1_TYPE]], 0 +// CHECK: [[FINAL_I1_EFACE:%.*]] = insertvalue %"{{.*}}eface" [[FINAL_I1_EFACE_0]], ptr [[FINAL_I1_PAYLOAD]], 1 +// CHECK: [[I1_IS_NIL:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}eface" [[FINAL_I1_EFACE]], %"{{.*}}eface" %{{.*}}) +// CHECK: br i1 [[I1_IS_NIL]], label %{{.*}}, label %{{.*}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" { ptr @{{.*}}, i64 4 }) +// CHECK: ret void +// The successful C2-to-I2 assertion preserves C2's payload under a target itab. +// CHECK: extractvalue %"{{.*}}iface" [[C2_IFACE]], 1 +// CHECK: [[C2_I2_PAYLOAD:%.*]] = extractvalue %"{{.*}}iface" [[C2_IFACE]], 1 +// CHECK: [[C2_TARGET_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceconv.iface${{[-A-Za-z0-9_]+}}", ptr [[C2_I2_TYPE]]) +// CHECK: [[C2_TARGET_IFACE_0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[C2_TARGET_ITAB]], 0 +// CHECK: [[C2_TARGET_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[C2_TARGET_IFACE_0]], ptr [[C2_I2_PAYLOAD]], 1 +// CHECK: insertvalue { %"{{.*}}iface", i1 } %{{.*}}, i1 true, 1 diff --git a/cl/_testgo/ifaceprom/in.go b/cl/_testgo/ifaceprom/in.go index ab0f5d1c36..309f13967f 100644 --- a/cl/_testgo/ifaceprom/in.go +++ b/cl/_testgo/ifaceprom/in.go @@ -5,11 +5,6 @@ package main // struct. In particular, this test exercises that the correct // method is called. -// CHECK: {{^}}@0 = private unnamed_addr constant [3 x i8] c"two", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [48 x i8] c"{{.*}}/cl/_testgo/ifaceprom.impl", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [3 x i8] c"one", align 1{{$}} -// CHECK: {{^}}@13 = private unnamed_addr constant [4 x i8] c"pass", align 1{{$}} - type I interface { one() int two() string @@ -66,392 +61,192 @@ func main() { } // CHECK-LABEL: define i64 @main.S.one(%main.S %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.S, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.S %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.S, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @main.S.one, ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call i64 %13(ptr %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: ret i64 %14 -// CHECK-NEXT: } +// CHECK: [[S_ONE_ADDR:%[0-9]+]] = alloca %main.S +// CHECK: store %main.S %0, ptr [[S_ONE_ADDR]] +// CHECK-NEXT: [[S_ONE_FIELD:%[0-9]+]] = getelementptr inbounds %main.S, ptr [[S_ONE_ADDR]], i32 0, i32 0 +// CHECK-NEXT: [[S_ONE_IFACE:%[0-9]+]] = load %"{{.*}}iface", ptr [[S_ONE_FIELD]] +// CHECK: [[S_ONE_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[S_ONE_IFACE]]) +// CHECK: [[S_ONE_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[S_ONE_IFACE]], 0 +// CHECK: [[S_ONE_SLOT:%.*]] = getelementptr ptr, ptr [[S_ONE_ITAB]], i64 3 +// CHECK: [[S_ONE_CODE:%.*]] = load ptr, ptr [[S_ONE_SLOT]] +// CHECK: [[S_ONE_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[S_ONE_CODE]], 0 +// CHECK: [[S_ONE_PAIR:%.*]] = insertvalue { ptr, ptr } [[S_ONE_PAIR_0]], ptr [[S_ONE_DATA]], 1 +// CHECK: [[S_ONE_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[S_ONE_PAIR]], 1 +// CHECK: [[S_ONE_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[S_ONE_PAIR]], 0 +// CHECK: [[S_ONE_RESULT:%.*]] = call i64 [[S_ONE_CALL_CODE]](ptr [[S_ONE_CALL_DATA]]) +// CHECK: ret i64 [[S_ONE_RESULT]] // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.S.two(%main.S %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.S, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.S %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.S, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 4 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @main.S.two, ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" %13(ptr %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %14 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.(*S).one"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %1, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 3 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.(*S).one", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call i64 %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret i64 %13 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*S).two"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %1, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 4 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.(*S).two", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %13 -// CHECK-NEXT: } +// CHECK: [[S_TWO_ADDR:%[0-9]+]] = alloca %main.S +// CHECK: store %main.S %0, ptr [[S_TWO_ADDR]] +// CHECK-NEXT: [[S_TWO_FIELD:%[0-9]+]] = getelementptr inbounds %main.S, ptr [[S_TWO_ADDR]], i32 0, i32 0 +// CHECK-NEXT: [[S_TWO_IFACE:%[0-9]+]] = load %"{{.*}}iface", ptr [[S_TWO_FIELD]] +// CHECK: [[S_TWO_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[S_TWO_IFACE]]) +// CHECK: [[S_TWO_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[S_TWO_IFACE]], 0 +// CHECK: [[S_TWO_SLOT:%.*]] = getelementptr ptr, ptr [[S_TWO_ITAB]], i64 4 +// CHECK: [[S_TWO_CODE:%.*]] = load ptr, ptr [[S_TWO_SLOT]] +// CHECK: [[S_TWO_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[S_TWO_CODE]], 0 +// CHECK: [[S_TWO_PAIR:%.*]] = insertvalue { ptr, ptr } [[S_TWO_PAIR_0]], ptr [[S_TWO_DATA]], 1 +// CHECK: [[S_TWO_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[S_TWO_PAIR]], 1 +// CHECK: [[S_TWO_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[S_TWO_PAIR]], 0 +// CHECK: [[S_TWO_RESULT:%.*]] = call %"{{.*}}String" [[S_TWO_CALL_CODE]](ptr [[S_TWO_CALL_DATA]]) +// CHECK: ret %"{{.*}}String" [[S_TWO_RESULT]] // CHECK-LABEL: define i64 @main.impl.one(%main.impl %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 1 -// CHECK-NEXT: } +// CHECK: ret i64 1 // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.impl.two(%main.impl %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 } -// CHECK-NEXT: } +// CHECK: ret %"{{.*}}String" { ptr @{{.*}}, i64 3 } // CHECK-LABEL: define i64 @"main.(*impl).one"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 48 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 3 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call i64 @main.impl.one(%main.impl zeroinitializer) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*impl).two"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 48 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @main.impl.two(%main.impl zeroinitializer) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %3 -// CHECK-NEXT: } +// CHECK: [[IMPL_ONE_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[IMPL_ONE_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: [[IMPL_ONE_RESULT:%.*]] = call i64 @main.impl.one(%main.impl zeroinitializer) +// CHECK: ret i64 [[IMPL_ONE_RESULT]] -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK-LABEL: define %"{{.*}}String" @"main.(*impl).two"(ptr %0){{.*}} { +// CHECK: [[IMPL_TWO_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[IMPL_TWO_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: [[IMPL_TWO_RESULT:%.*]] = call %"{{.*}}String" @main.impl.two(%main.impl zeroinitializer) +// CHECK: ret %"{{.*}}String" [[IMPL_TWO_RESULT]] // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.S, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.impl zeroinitializer, ptr %2, align 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceprom.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.impl) -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %3, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %4, ptr %2, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %5, ptr %1, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %7 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %6, align 8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %7) -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %7, 0 -// CHECK-NEXT: %10 = getelementptr ptr, ptr %9, i64 3 -// CHECK-NEXT: %11 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } undef, ptr %11, 0 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } %12, ptr %8, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %13, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 -// CHECK-NEXT: %16 = call i64 %15(ptr %14) -// CHECK-NEXT: %17 = icmp ne i64 %16, 1 -// CHECK-NEXT: br i1 %17, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %16, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %20 = load %main.S, ptr %0, align 8 -// CHECK-NEXT: %21 = extractvalue %main.S %20, 0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %21) -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %21, 0 -// CHECK-NEXT: %24 = getelementptr ptr, ptr %23, i64 3 -// CHECK-NEXT: %25 = load ptr, ptr %24, align 8 -// CHECK-NEXT: %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 -// CHECK-NEXT: %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %27, 1 -// CHECK-NEXT: %29 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: %30 = call i64 %29(ptr %28) -// CHECK-NEXT: %31 = icmp ne i64 %30, 1 -// CHECK-NEXT: br i1 %31, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %30, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %33) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %34 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %35 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %34, align 8 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %35) -// CHECK-NEXT: %37 = icmp ne ptr %36, null -// CHECK-NEXT: br i1 %37, label %_llgo_17, label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_17 -// CHECK-NEXT: %38 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %93, ptr %38, align 8 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %38, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %39) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_17 -// CHECK-NEXT: %40 = load %main.S, ptr %0, align 8 -// CHECK-NEXT: %41 = extractvalue %main.S %40, 0 -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %41) -// CHECK-NEXT: %43 = icmp ne ptr %42, null -// CHECK-NEXT: br i1 %43, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_19 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %100, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %44, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %45) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_19 -// CHECK-NEXT: %46 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %47 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %46, align 8 -// CHECK-NEXT: %48 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %47) -// CHECK-NEXT: %49 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %47, 0 -// CHECK-NEXT: %50 = getelementptr ptr, ptr %49, i64 4 -// CHECK-NEXT: %51 = load ptr, ptr %50, align 8 -// CHECK-NEXT: %52 = insertvalue { ptr, ptr } undef, ptr %51, 0 -// CHECK-NEXT: %53 = insertvalue { ptr, ptr } %52, ptr %48, 1 -// CHECK-NEXT: %54 = extractvalue { ptr, ptr } %53, 1 -// CHECK-NEXT: %55 = extractvalue { ptr, ptr } %53, 0 -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.String" %55(ptr %54) -// CHECK-NEXT: %57 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %56, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: %58 = xor i1 %57, true -// CHECK-NEXT: br i1 %58, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8 -// CHECK-NEXT: %59 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %56, ptr %59, align 8 -// CHECK-NEXT: %60 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %59, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %60) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_8 -// CHECK-NEXT: %61 = load %main.S, ptr %0, align 8 -// CHECK-NEXT: %62 = extractvalue %main.S %61, 0 -// CHECK-NEXT: %63 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %62) -// CHECK-NEXT: %64 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %62, 0 -// CHECK-NEXT: %65 = getelementptr ptr, ptr %64, i64 4 -// CHECK-NEXT: %66 = load ptr, ptr %65, align 8 -// CHECK-NEXT: %67 = insertvalue { ptr, ptr } undef, ptr %66, 0 -// CHECK-NEXT: %68 = insertvalue { ptr, ptr } %67, ptr %63, 1 -// CHECK-NEXT: %69 = extractvalue { ptr, ptr } %68, 1 -// CHECK-NEXT: %70 = extractvalue { ptr, ptr } %68, 0 -// CHECK-NEXT: %71 = call %"{{.*}}/runtime/internal/runtime.String" %70(ptr %69) -// CHECK-NEXT: %72 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %71, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: %73 = xor i1 %72, true -// CHECK-NEXT: br i1 %73, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10 -// CHECK-NEXT: %74 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %71, ptr %74, align 8 -// CHECK-NEXT: %75 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %74, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %75) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_10 -// CHECK-NEXT: %76 = getelementptr inbounds %main.S, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %77 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %76, align 8 -// CHECK-NEXT: %78 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %77) -// CHECK-NEXT: %79 = icmp ne ptr %78, null -// CHECK-NEXT: br i1 %79, label %_llgo_21, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_21 -// CHECK-NEXT: %80 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %107, ptr %80, align 8 -// CHECK-NEXT: %81 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %80, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %81) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_21 -// CHECK-NEXT: %82 = load %main.S, ptr %0, align 8 -// CHECK-NEXT: %83 = extractvalue %main.S %82, 0 -// CHECK-NEXT: %84 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %83) -// CHECK-NEXT: %85 = icmp ne ptr %84, null -// CHECK-NEXT: br i1 %85, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_23 -// CHECK-NEXT: %86 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %115, ptr %86, align 8 -// CHECK-NEXT: %87 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %86, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %87) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_23 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @13, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_4 -// CHECK-NEXT: %88 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %89 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %88, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %35, ptr %89, align 8 -// CHECK-NEXT: %90 = insertvalue { ptr, ptr } { ptr @"main.I.one$bound", ptr undef }, ptr %88, 1 -// CHECK-NEXT: %91 = extractvalue { ptr, ptr } %90, 1 -// CHECK-NEXT: %92 = extractvalue { ptr, ptr } %90, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %92) -// CHECK-NEXT: %93 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %91) -// CHECK-NEXT: %94 = icmp ne i64 %93, 1 -// CHECK-NEXT: br i1 %94, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @_llgo_main.I, ptr %36, ptr @_llgo_main.I) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_6 -// CHECK-NEXT: %95 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %96 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %95, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %41, ptr %96, align 8 -// CHECK-NEXT: %97 = insertvalue { ptr, ptr } { ptr @"main.I.one$bound", ptr undef }, ptr %95, 1 -// CHECK-NEXT: %98 = extractvalue { ptr, ptr } %97, 1 -// CHECK-NEXT: %99 = extractvalue { ptr, ptr } %97, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %99) -// CHECK-NEXT: %100 = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %98) -// CHECK-NEXT: %101 = icmp ne i64 %100, 1 -// CHECK-NEXT: br i1 %101, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_6 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @_llgo_main.I, ptr %42, ptr @_llgo_main.I) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_12 -// CHECK-NEXT: %102 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %103 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %102, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %77, ptr %103, align 8 -// CHECK-NEXT: %104 = insertvalue { ptr, ptr } { ptr @"main.I.two$bound", ptr undef }, ptr %102, 1 -// CHECK-NEXT: %105 = extractvalue { ptr, ptr } %104, 1 -// CHECK-NEXT: %106 = extractvalue { ptr, ptr } %104, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %106) -// CHECK-NEXT: %107 = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %105) -// CHECK-NEXT: %108 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %107, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: %109 = xor i1 %108, true -// CHECK-NEXT: br i1 %109, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @_llgo_main.I, ptr %78, ptr @_llgo_main.I) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_14 -// CHECK-NEXT: %110 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %111 = getelementptr inbounds { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %110, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %83, ptr %111, align 8 -// CHECK-NEXT: %112 = insertvalue { ptr, ptr } { ptr @"main.I.two$bound", ptr undef }, ptr %110, 1 -// CHECK-NEXT: %113 = extractvalue { ptr, ptr } %112, 1 -// CHECK-NEXT: %114 = extractvalue { ptr, ptr } %112, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %114) -// CHECK-NEXT: %115 = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %113) -// CHECK-NEXT: %116 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %115, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: %117 = xor i1 %116, true -// CHECK-NEXT: br i1 %117, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_14 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @_llgo_main.I, ptr %84, ptr @_llgo_main.I) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// CHECK: [[IMPL_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) +// CHECK: store %main.impl zeroinitializer, ptr [[IMPL_DATA]] +// CHECK: [[IMPL_ITAB:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/ifaceprom.iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.impl) +// CHECK: [[MAIN_IFACE_0:%.*]] = insertvalue %"{{.*}}iface" undef, ptr [[IMPL_ITAB]], 0 +// CHECK: [[MAIN_IFACE:%.*]] = insertvalue %"{{.*}}iface" [[MAIN_IFACE_0]], ptr [[IMPL_DATA]], 1 +// CHECK: store %"{{.*}}iface" [[MAIN_IFACE]], ptr [[S_IFACE_FIELD:%.*]] +// Direct s.I.one uses slot 3 and compares that call result with 1. +// CHECK: [[DIRECT_ONE_IFACE:%.*]] = load %"{{.*}}iface", ptr %{{.*}} +// CHECK: [[DIRECT_ONE_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[DIRECT_ONE_IFACE]]) +// CHECK: [[DIRECT_ONE_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[DIRECT_ONE_IFACE]], 0 +// CHECK: [[DIRECT_ONE_SLOT:%.*]] = getelementptr ptr, ptr [[DIRECT_ONE_ITAB]], i64 3 +// CHECK: [[DIRECT_ONE_CODE:%.*]] = load ptr, ptr [[DIRECT_ONE_SLOT]] +// CHECK: [[DIRECT_ONE_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[DIRECT_ONE_CODE]], 0 +// CHECK: [[DIRECT_ONE_PAIR:%.*]] = insertvalue { ptr, ptr } [[DIRECT_ONE_PAIR_0]], ptr [[DIRECT_ONE_DATA]], 1 +// CHECK: [[DIRECT_ONE_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[DIRECT_ONE_PAIR]], 1 +// CHECK: [[DIRECT_ONE_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[DIRECT_ONE_PAIR]], 0 +// CHECK: [[DIRECT_ONE_RESULT:%.*]] = call i64 [[DIRECT_ONE_CALL_CODE]](ptr [[DIRECT_ONE_CALL_DATA]]) +// CHECK: [[DIRECT_ONE_BAD:%.*]] = icmp ne i64 [[DIRECT_ONE_RESULT]], 1 +// CHECK: br i1 [[DIRECT_ONE_BAD]], label %{{.*}}, label %{{.*}} +// Promoted s.one extracts the embedded interface and still uses slot 3. +// CHECK: [[PROMOTED_ONE_S:%.*]] = load %main.S, ptr %{{.*}} +// CHECK: [[PROMOTED_ONE_IFACE:%.*]] = extractvalue %main.S [[PROMOTED_ONE_S]], 0 +// CHECK: [[PROMOTED_ONE_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[PROMOTED_ONE_IFACE]]) +// CHECK: [[PROMOTED_ONE_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[PROMOTED_ONE_IFACE]], 0 +// CHECK: [[PROMOTED_ONE_SLOT:%.*]] = getelementptr ptr, ptr [[PROMOTED_ONE_ITAB]], i64 3 +// CHECK: [[PROMOTED_ONE_CODE:%.*]] = load ptr, ptr [[PROMOTED_ONE_SLOT]] +// CHECK: [[PROMOTED_ONE_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[PROMOTED_ONE_CODE]], 0 +// CHECK: [[PROMOTED_ONE_PAIR:%.*]] = insertvalue { ptr, ptr } [[PROMOTED_ONE_PAIR_0]], ptr [[PROMOTED_ONE_DATA]], 1 +// CHECK: [[PROMOTED_ONE_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_ONE_PAIR]], 1 +// CHECK: [[PROMOTED_ONE_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_ONE_PAIR]], 0 +// CHECK: [[PROMOTED_ONE_RESULT:%.*]] = call i64 [[PROMOTED_ONE_CALL_CODE]](ptr [[PROMOTED_ONE_CALL_DATA]]) +// CHECK: [[PROMOTED_ONE_BAD:%.*]] = icmp ne i64 [[PROMOTED_ONE_RESULT]], 1 +// CHECK: br i1 [[PROMOTED_ONE_BAD]], label %{{.*}}, label %{{.*}} +// Both one method values first validate and retain their originating interfaces. +// CHECK: [[ONE_CLOSURE_IFACE:%.*]] = load %"{{.*}}iface", ptr %{{.*}} +// CHECK: [[ONE_CLOSURE_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[ONE_CLOSURE_IFACE]]) +// CHECK: [[ONE_CLOSURE_OK:%.*]] = icmp ne ptr [[ONE_CLOSURE_TYPE]], null +// CHECK: br i1 [[ONE_CLOSURE_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[PROMOTED_ONE_CLOSURE_S:%.*]] = load %main.S, ptr %{{.*}} +// CHECK: [[PROMOTED_ONE_CLOSURE_IFACE:%.*]] = extractvalue %main.S [[PROMOTED_ONE_CLOSURE_S]], 0 +// CHECK: [[PROMOTED_ONE_CLOSURE_TYPE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[PROMOTED_ONE_CLOSURE_IFACE]]) +// CHECK: [[PROMOTED_ONE_CLOSURE_OK:%.*]] = icmp ne ptr [[PROMOTED_ONE_CLOSURE_TYPE]], null +// CHECK: br i1 [[PROMOTED_ONE_CLOSURE_OK]], label %{{.*}}, label %{{.*}} +// Direct and promoted two calls both use slot 4 and compare the returned string with "two". +// CHECK: [[DIRECT_TWO_IFACE:%.*]] = load %"{{.*}}iface", ptr %{{.*}} +// CHECK: [[DIRECT_TWO_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[DIRECT_TWO_IFACE]]) +// CHECK: [[DIRECT_TWO_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[DIRECT_TWO_IFACE]], 0 +// CHECK: [[DIRECT_TWO_SLOT:%.*]] = getelementptr ptr, ptr [[DIRECT_TWO_ITAB]], i64 4 +// CHECK: [[DIRECT_TWO_CODE:%.*]] = load ptr, ptr [[DIRECT_TWO_SLOT]] +// CHECK: [[DIRECT_TWO_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[DIRECT_TWO_CODE]], 0 +// CHECK: [[DIRECT_TWO_PAIR:%.*]] = insertvalue { ptr, ptr } [[DIRECT_TWO_PAIR_0]], ptr [[DIRECT_TWO_DATA]], 1 +// CHECK: [[DIRECT_TWO_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[DIRECT_TWO_PAIR]], 1 +// CHECK: [[DIRECT_TWO_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[DIRECT_TWO_PAIR]], 0 +// CHECK: [[DIRECT_TWO_RESULT:%.*]] = call %"{{.*}}String" [[DIRECT_TWO_CALL_CODE]](ptr [[DIRECT_TWO_CALL_DATA]]) +// CHECK: [[DIRECT_TWO_EQ:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}String" [[DIRECT_TWO_RESULT]], %"{{.*}}String" { ptr @{{.*}}, i64 3 }) +// CHECK: [[DIRECT_TWO_BAD:%.*]] = xor i1 [[DIRECT_TWO_EQ]], true +// CHECK: br i1 [[DIRECT_TWO_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: [[PROMOTED_TWO_S:%.*]] = load %main.S, ptr %{{.*}} +// CHECK: [[PROMOTED_TWO_IFACE:%.*]] = extractvalue %main.S [[PROMOTED_TWO_S]], 0 +// CHECK: [[PROMOTED_TWO_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[PROMOTED_TWO_IFACE]]) +// CHECK: [[PROMOTED_TWO_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[PROMOTED_TWO_IFACE]], 0 +// CHECK: [[PROMOTED_TWO_SLOT:%.*]] = getelementptr ptr, ptr [[PROMOTED_TWO_ITAB]], i64 4 +// CHECK: [[PROMOTED_TWO_CODE:%.*]] = load ptr, ptr [[PROMOTED_TWO_SLOT]] +// CHECK: [[PROMOTED_TWO_PAIR_0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[PROMOTED_TWO_CODE]], 0 +// CHECK: [[PROMOTED_TWO_PAIR:%.*]] = insertvalue { ptr, ptr } [[PROMOTED_TWO_PAIR_0]], ptr [[PROMOTED_TWO_DATA]], 1 +// CHECK: [[PROMOTED_TWO_CALL_DATA:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_TWO_PAIR]], 1 +// CHECK: [[PROMOTED_TWO_CALL_CODE:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_TWO_PAIR]], 0 +// CHECK: [[PROMOTED_TWO_RESULT:%.*]] = call %"{{.*}}String" [[PROMOTED_TWO_CALL_CODE]](ptr [[PROMOTED_TWO_CALL_DATA]]) +// CHECK: [[PROMOTED_TWO_EQ:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}String" [[PROMOTED_TWO_RESULT]], %"{{.*}}String" { ptr @{{.*}}, i64 3 }) +// CHECK: [[PROMOTED_TWO_BAD:%.*]] = xor i1 [[PROMOTED_TWO_EQ]], true +// CHECK: br i1 [[PROMOTED_TWO_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: [[TWO_CLOSURE_IFACE:%.*]] = load %"{{.*}}iface", ptr %{{.*}} +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[TWO_CLOSURE_IFACE]]) +// CHECK: [[PROMOTED_TWO_CLOSURE_S:%.*]] = load %main.S, ptr %{{.*}} +// CHECK: [[PROMOTED_TWO_CLOSURE_IFACE:%.*]] = extractvalue %main.S [[PROMOTED_TWO_CLOSURE_S]], 0 +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}iface" [[PROMOTED_TWO_CLOSURE_IFACE]]) +// The four late closure paths store those same interfaces into their bound environments. +// CHECK: store %"{{.*}}iface" [[ONE_CLOSURE_IFACE]], ptr %{{.*}} +// CHECK: [[ONE_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.I.one$bound", ptr undef }, ptr [[ONE_BOUND_ENV:%.*]], 1 +// CHECK: [[ONE_BOUND_CALL_ENV:%.*]] = extractvalue { ptr, ptr } [[ONE_BOUND]], 1 +// CHECK: [[ONE_BOUND_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[ONE_BOUND]], 0 +// CHECK: [[ONE_BOUND_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[ONE_BOUND_CODE_RAW]]) +// CHECK: [[ONE_BOUND_RESULT:%.*]] = call i64 [[ONE_BOUND_CODE]](ptr {{(nest|swiftself)}} [[ONE_BOUND_CALL_ENV]]) +// CHECK: [[ONE_BOUND_BAD:%.*]] = icmp ne i64 [[ONE_BOUND_RESULT]], 1 +// CHECK: store %"{{.*}}iface" [[PROMOTED_ONE_CLOSURE_IFACE]], ptr %{{.*}} +// CHECK: [[PROMOTED_ONE_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.I.one$bound", ptr undef }, ptr %{{.*}}, 1 +// CHECK: [[PROMOTED_ONE_BOUND_ENV:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_ONE_BOUND]], 1 +// CHECK: [[PROMOTED_ONE_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_ONE_BOUND]], 0 +// CHECK: [[PROMOTED_ONE_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[PROMOTED_ONE_CODE_RAW]]) +// CHECK: [[PROMOTED_ONE_BOUND_RESULT:%.*]] = call i64 [[PROMOTED_ONE_CODE]](ptr {{(nest|swiftself)}} [[PROMOTED_ONE_BOUND_ENV]]) +// CHECK: [[PROMOTED_ONE_BOUND_BAD:%.*]] = icmp ne i64 [[PROMOTED_ONE_BOUND_RESULT]], 1 +// CHECK: store %"{{.*}}iface" [[TWO_CLOSURE_IFACE]], ptr %{{.*}} +// CHECK: [[TWO_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.I.two$bound", ptr undef }, ptr %{{.*}}, 1 +// CHECK: [[TWO_BOUND_ENV:%.*]] = extractvalue { ptr, ptr } [[TWO_BOUND]], 1 +// CHECK: [[TWO_BOUND_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[TWO_BOUND]], 0 +// CHECK: [[TWO_BOUND_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[TWO_BOUND_CODE_RAW]]) +// CHECK: [[TWO_BOUND_RESULT:%.*]] = call %"{{.*}}String" [[TWO_BOUND_CODE]](ptr {{(nest|swiftself)}} [[TWO_BOUND_ENV]]) +// CHECK: [[TWO_BOUND_EQ:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}String" [[TWO_BOUND_RESULT]], %"{{.*}}String" { ptr @{{.*}}, i64 3 }) +// CHECK: store %"{{.*}}iface" [[PROMOTED_TWO_CLOSURE_IFACE]], ptr %{{.*}} +// CHECK: [[PROMOTED_TWO_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.I.two$bound", ptr undef }, ptr %{{.*}}, 1 +// CHECK: [[PROMOTED_TWO_BOUND_ENV:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_TWO_BOUND]], 1 +// CHECK: [[PROMOTED_TWO_BOUND_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[PROMOTED_TWO_BOUND]], 0 +// CHECK: [[PROMOTED_TWO_BOUND_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[PROMOTED_TWO_BOUND_CODE_RAW]]) +// CHECK: [[PROMOTED_TWO_BOUND_RESULT:%.*]] = call %"{{.*}}String" [[PROMOTED_TWO_BOUND_CODE]](ptr {{(nest|swiftself)}} [[PROMOTED_TWO_BOUND_ENV]]) +// CHECK: [[PROMOTED_TWO_BOUND_EQ:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}String" [[PROMOTED_TWO_BOUND_RESULT]], %"{{.*}}String" { ptr @{{.*}}, i64 3 }) // CHECK-LABEL: define i64 @"main.I.one$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface" } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 3 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.I.one$bound", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call i64 %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret i64 %13 -// CHECK-NEXT: } +// CHECK: [[BOUND_ONE_ENV:%[0-9]+]] = load { %"{{.*}}iface" }, ptr %0 +// CHECK: [[BOUND_ONE_IFACE:%.*]] = extractvalue { %"{{.*}}iface" } [[BOUND_ONE_ENV]], 0 +// CHECK: [[BOUND_ONE_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[BOUND_ONE_IFACE]]) +// CHECK: [[BOUND_ONE_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[BOUND_ONE_IFACE]], 0 +// CHECK: [[BOUND_ONE_SLOT:%.*]] = getelementptr ptr, ptr [[BOUND_ONE_ITAB]], i64 3 +// CHECK: [[BOUND_ONE_CODE:%.*]] = load ptr, ptr [[BOUND_ONE_SLOT]] +// CHECK-NEXT: [[BOUND_ONE_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[BOUND_ONE_CODE]], 0 +// CHECK-NEXT: [[BOUND_ONE_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[BOUND_ONE_PAIR0]], ptr [[BOUND_ONE_DATA]], 1 +// CHECK-NEXT: [[BOUND_ONE_RECOVER_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_ONE_PAIR]], 0 +// CHECK-NEXT: [[BOUND_ONE_RECOVER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.I.one$bound", ptr [[BOUND_ONE_RECOVER_CODE]]) +// CHECK-NEXT: [[BOUND_ONE_CALL_DATA:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_ONE_PAIR]], 1 +// CHECK-NEXT: [[BOUND_ONE_CALL_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_ONE_PAIR]], 0 +// CHECK-NEXT: [[BOUND_ONE_RESULT:%[0-9]+]] = call i64 [[BOUND_ONE_CALL_CODE]](ptr [[BOUND_ONE_CALL_DATA]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr [[BOUND_ONE_RECOVER]]) +// CHECK: ret i64 [[BOUND_ONE_RESULT]] // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.I.two$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { %"{{.*}}/runtime/internal/runtime.iface" }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface" } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %2) -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 0 -// CHECK-NEXT: %5 = getelementptr ptr, ptr %4, i64 4 -// CHECK-NEXT: %6 = load ptr, ptr %5, align 8 -// CHECK-NEXT: %7 = insertvalue { ptr, ptr } undef, ptr %6, 0 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } %7, ptr %3, 1 -// CHECK-NEXT: %9 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.I.two$bound", ptr %9) -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %8, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %10) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %13 -// CHECK-NEXT: } +// CHECK: [[BOUND_TWO_ENV:%[0-9]+]] = load { %"{{.*}}iface" }, ptr %0 +// CHECK: [[BOUND_TWO_IFACE:%.*]] = extractvalue { %"{{.*}}iface" } [[BOUND_TWO_ENV]], 0 +// CHECK: [[BOUND_TWO_DATA:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}iface" [[BOUND_TWO_IFACE]]) +// CHECK: [[BOUND_TWO_ITAB:%.*]] = extractvalue %"{{.*}}iface" [[BOUND_TWO_IFACE]], 0 +// CHECK: [[BOUND_TWO_SLOT:%.*]] = getelementptr ptr, ptr [[BOUND_TWO_ITAB]], i64 4 +// CHECK: [[BOUND_TWO_CODE:%.*]] = load ptr, ptr [[BOUND_TWO_SLOT]] +// CHECK-NEXT: [[BOUND_TWO_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[BOUND_TWO_CODE]], 0 +// CHECK-NEXT: [[BOUND_TWO_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[BOUND_TWO_PAIR0]], ptr [[BOUND_TWO_DATA]], 1 +// CHECK-NEXT: [[BOUND_TWO_RECOVER_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_TWO_PAIR]], 0 +// CHECK-NEXT: [[BOUND_TWO_RECOVER:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.I.two$bound", ptr [[BOUND_TWO_RECOVER_CODE]]) +// CHECK-NEXT: [[BOUND_TWO_CALL_DATA:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_TWO_PAIR]], 1 +// CHECK-NEXT: [[BOUND_TWO_CALL_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[BOUND_TWO_PAIR]], 0 +// CHECK-NEXT: [[BOUND_TWO_RESULT:%[0-9]+]] = call %"{{.*}}String" [[BOUND_TWO_CALL_CODE]](ptr [[BOUND_TWO_CALL_DATA]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr [[BOUND_TWO_RECOVER]]) +// CHECK: ret %"{{.*}}String" [[BOUND_TWO_RESULT]] diff --git a/cl/_testgo/indexerr/in.go b/cl/_testgo/indexerr/in.go index 38882a81f9..4bc3e34fb4 100644 --- a/cl/_testgo/indexerr/in.go +++ b/cl/_testgo/indexerr/in.go @@ -1,14 +1,57 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"array -1 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [12 x i8] c"2 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"-1 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [18 x i8] c"array 2 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [17 x i8] c"array2 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"slice -1 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [18 x i8] c"slice 2 must error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"slice2 2 must error", align 1{{$}} +// The fixture covers a matrix of fixed array/slice and signed/unsigned index +// lowering. Follow each predicate and index into CheckIndexRange; helper names +// alone would not prove that the right condition is being checked. +// CHECK-LABEL: define void @main.array(i64 %0){{.*}} { +// CHECK: %[[ARRAY_NEG:[0-9]+]] = icmp slt i64 %0, 0 +// CHECK: %[[ARRAY_UPPER:[0-9]+]] = icmp uge i64 %0, 2 +// CHECK: %[[ARRAY_OOB:[0-9]+]] = or i1 %[[ARRAY_UPPER]], %[[ARRAY_NEG]] +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[ARRAY_OOB]], i64 %0, i1 true, i64 2) + +// CHECK-LABEL: define void @main.array2(i64 %0){{.*}} { +// CHECK-NOT: icmp slt +// CHECK: %[[UARRAY_OOB:[0-9]+]] = icmp uge i64 %0, 2 +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[UARRAY_OOB]], i64 %0, i1 false, i64 2) + +// The literal-index cases keep the signedness bit correct after constant +// folding. They are intentionally representative; defer/recover mechanics are +// runtime-tested and are not part of this IR contract. +// CHECK-LABEL: define void @"main.init#10"(){{.*}} { +// CHECK: %[[SLICE10_LEN:[0-9]+]] = extractvalue %"{{.*}}Slice" %{{[0-9]+}}, 1 +// CHECK: %[[SLICE10_UPPER:[0-9]+]] = icmp uge i64 -1, %[[SLICE10_LEN]] +// CHECK: %[[SLICE10_OOB:[0-9]+]] = or i1 %[[SLICE10_UPPER]], true +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[SLICE10_OOB]], i64 -1, i1 true, i64 %[[SLICE10_LEN]]) + +// CHECK-LABEL: define void @"main.init#12"(){{.*}} { +// CHECK-NOT: icmp slt +// CHECK: %[[SLICE12_LEN:[0-9]+]] = extractvalue %"{{.*}}Slice" %{{[0-9]+}}, 1 +// CHECK: %[[SLICE12_OOB:[0-9]+]] = icmp uge i64 2, %[[SLICE12_LEN]] +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[SLICE12_OOB]], i64 2, i1 false, i64 %[[SLICE12_LEN]]) + +// CHECK-LABEL: define void @"main.init#7"(){{.*}} { +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 true, i64 -1, i1 true, i64 2) + +// CHECK-LABEL: define void @"main.init#9"(){{.*}} { +// CHECK-NOT: icmp slt +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 true, i64 2, i1 false, i64 2) + +// Slice bounds use the extracted dynamic length. Both helpers are checked so +// one source scenario cannot silently lose its range check. +// CHECK-LABEL: define void @main.slice(i64 %0){{.*}} { +// CHECK: %[[SLICE_LEN:[0-9]+]] = extractvalue %"{{.*}}Slice" %{{[0-9]+}}, 1 +// CHECK: %[[SLICE_NEG:[0-9]+]] = icmp slt i64 %0, 0 +// CHECK: %[[SLICE_UPPER:[0-9]+]] = icmp uge i64 %0, %[[SLICE_LEN]] +// CHECK: %[[SLICE_OOB:[0-9]+]] = or i1 %[[SLICE_UPPER]], %[[SLICE_NEG]] +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[SLICE_OOB]], i64 %0, i1 true, i64 %[[SLICE_LEN]]) + +// CHECK-LABEL: define void @main.slice2(i64 %0){{.*}} { +// CHECK: %[[SLICE2_LEN:[0-9]+]] = extractvalue %"{{.*}}Slice" %{{[0-9]+}}, 1 +// CHECK: %[[SLICE2_NEG:[0-9]+]] = icmp slt i64 %0, 0 +// CHECK: %[[SLICE2_UPPER:[0-9]+]] = icmp uge i64 %0, %[[SLICE2_LEN]] +// CHECK: %[[SLICE2_OOB:[0-9]+]] = or i1 %[[SLICE2_UPPER]], %[[SLICE2_NEG]] +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %[[SLICE2_OOB]], i64 %0, i1 true, i64 %[[SLICE2_LEN]]) func main() { } @@ -148,1096 +191,3 @@ func slice(n int) { func slice2(n int) { println([]int{1, 2}[n]) } - -// CHECK-LABEL: define void @main.array(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = load [2 x i64], ptr %1, align 8 -// CHECK-NEXT: %5 = icmp slt i64 %0, 0 -// CHECK-NEXT: %6 = icmp uge i64 %0, 2 -// CHECK-NEXT: %7 = or i1 %6, %5 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %7, i64 %0, i1 true, i64 2) -// CHECK-NEXT: %8 = getelementptr inbounds i64, ptr %1, i64 %0 -// CHECK-NEXT: %9 = load i64, ptr %8, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.array2(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = load [2 x i64], ptr %1, align 8 -// CHECK-NEXT: %5 = icmp uge i64 %0, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %5, i64 %0, i1 false, i64 2) -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 %0 -// CHECK-NEXT: %7 = load i64, ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"main.init#1"() -// CHECK-NEXT: call void @"main.init#2"() -// CHECK-NEXT: call void @"main.init#3"() -// CHECK-NEXT: call void @"main.init#4"() -// CHECK-NEXT: call void @"main.init#5"() -// CHECK-NEXT: call void @"main.init#6"() -// CHECK-NEXT: call void @"main.init#7"() -// CHECK-NEXT: call void @"main.init#8"() -// CHECK-NEXT: call void @"main.init#9"() -// CHECK-NEXT: call void @"main.init#10"() -// CHECK-NEXT: call void @"main.init#11"() -// CHECK-NEXT: call void @"main.init#12"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#1", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#1", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#1$1") -// CHECK-NEXT: call void @"main.init#1$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.array(i64 -1) -// CHECK-NEXT: store ptr blockaddress(@"main.init#1", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#1", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#1$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#1$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#10"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#10", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#10", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#10$1") -// CHECK-NEXT: call void @"main.init#10$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: store i64 1, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store i64 2, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %18, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %21, i64 2, 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, i64 2, 2 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 0 -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 1 -// CHECK-NEXT: %26 = icmp uge i64 -1, %25 -// CHECK-NEXT: %27 = or i1 %26, true -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %27, i64 -1, i1 true, i64 %25) -// CHECK-NEXT: %28 = getelementptr inbounds i64, ptr %24, i64 -1 -// CHECK-NEXT: %29 = load i64, ptr %28, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#10", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#10", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %30 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %30, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#10$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#10$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 12 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#11"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#11", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#11", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#11$1") -// CHECK-NEXT: call void @"main.init#11$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: store i64 1, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store i64 2, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %18, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %21, i64 2, 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, i64 2, 2 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 0 -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 1 -// CHECK-NEXT: %26 = icmp uge i64 2, %25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, i64 2, i1 true, i64 %25) -// CHECK-NEXT: %27 = getelementptr inbounds i64, ptr %24, i64 2 -// CHECK-NEXT: %28 = load i64, ptr %27, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %28) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#11", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#11", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#11$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#11$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#12"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#12", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#12", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#12$1") -// CHECK-NEXT: call void @"main.init#12$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: store i64 1, ptr %19, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store i64 2, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %18, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %21, i64 2, 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, i64 2, 2 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 0 -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 1 -// CHECK-NEXT: %26 = icmp uge i64 2, %25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, i64 2, i1 false, i64 %25) -// CHECK-NEXT: %27 = getelementptr inbounds i64, ptr %24, i64 2 -// CHECK-NEXT: %28 = load i64, ptr %27, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %28) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#12", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#12", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#12$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#12$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 12 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#2", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#2", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#2$1") -// CHECK-NEXT: call void @"main.init#2$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.array(i64 2) -// CHECK-NEXT: store ptr blockaddress(@"main.init#2", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#2", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#2$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#2$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 18 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#3"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#3$1") -// CHECK-NEXT: call void @"main.init#3$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.array2(i64 2) -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#3$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#3$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 17 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#4"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#4$1") -// CHECK-NEXT: call void @"main.init#4$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.slice(i64 -1) -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#4$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#4$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#5"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#5$1") -// CHECK-NEXT: call void @"main.init#5$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.slice(i64 2) -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#5$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#5$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 18 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#6"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#6", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#6", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#6$1") -// CHECK-NEXT: call void @"main.init#6$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: call void @main.slice2(i64 2) -// CHECK-NEXT: store ptr blockaddress(@"main.init#6", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#6", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %18, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#6$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#6$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#7"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#7", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#7", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#7$1") -// CHECK-NEXT: call void @"main.init#7$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 16, i1 false) -// CHECK-NEXT: store volatile [2 x i64] zeroinitializer, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store volatile i64 1, ptr %19, align 8 -// CHECK-NEXT: store volatile i64 2, ptr %20, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 true, i64 -1, i1 true, i64 2) -// CHECK-NEXT: %21 = getelementptr inbounds i64, ptr %18, i64 -1 -// CHECK-NEXT: %22 = load volatile i64, ptr %21, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %22) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#7", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#7", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %23, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#7$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#7$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 12 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#8"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#8", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#8", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#8$1") -// CHECK-NEXT: call void @"main.init#8$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 16, i1 false) -// CHECK-NEXT: store volatile [2 x i64] zeroinitializer, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store volatile i64 1, ptr %19, align 8 -// CHECK-NEXT: store volatile i64 2, ptr %20, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 true, i64 2, i1 true, i64 2) -// CHECK-NEXT: %21 = getelementptr inbounds i64, ptr %18, i64 2 -// CHECK-NEXT: %22 = load volatile i64, ptr %21, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %22) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#8", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#8", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %23, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#8$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#8$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#9"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#9", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#9", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#9$1") -// CHECK-NEXT: call void @"main.init#9$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 16, i1 false) -// CHECK-NEXT: store volatile [2 x i64] zeroinitializer, ptr %18, align 8 -// CHECK-NEXT: %19 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: store volatile i64 1, ptr %19, align 8 -// CHECK-NEXT: store volatile i64 2, ptr %20, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 true, i64 2, i1 false, i64 2) -// CHECK-NEXT: %21 = getelementptr inbounds i64, ptr %18, i64 2 -// CHECK-NEXT: %22 = load volatile i64, ptr %21, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %22) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.init#9", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#9", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %23 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %23, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#9$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#9$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 12 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.slice(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %1, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 2, 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 2, 2 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 -// CHECK-NEXT: %9 = icmp slt i64 %0, 0 -// CHECK-NEXT: %10 = icmp uge i64 %0, %8 -// CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, i64 %0, i1 true, i64 %8) -// CHECK-NEXT: %12 = getelementptr inbounds i64, ptr %7, i64 %0 -// CHECK-NEXT: %13 = load i64, ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.slice2(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %1, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 2, 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 2, 2 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 -// CHECK-NEXT: %9 = icmp slt i64 %0, 0 -// CHECK-NEXT: %10 = icmp uge i64 %0, %8 -// CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, i64 %0, i1 true, i64 %8) -// CHECK-NEXT: %12 = getelementptr inbounds i64, ptr %7, i64 %0 -// CHECK-NEXT: %13 = load i64, ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/interface/in.go b/cl/_testgo/interface/in.go index 9c5877892a..e79defac19 100644 --- a/cl/_testgo/interface/in.go +++ b/cl/_testgo/interface/in.go @@ -12,19 +12,34 @@ type Game1 struct { type Game2 struct { } -// CHECK-LABEL: define void @"main.(*Game2).initGame"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void func (p *Game2) initGame() { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Game1" -// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.Implements" -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab" -// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintIface" -// CHECK: ret void +// CHECK: [[G1_EFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Game1", ptr undef }, ptr [[G1_DATA:%[0-9]+]], 1 +// CHECK-NEXT: [[G1_TYPE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[G1_EFACE]], 0 +// CHECK-NEXT: [[G1_IMPLEMENTS:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @"_llgo_{{.*}}foo.Gamer", ptr [[G1_TYPE]]) +// CHECK-NEXT: br i1 [[G1_IMPLEMENTS]], label %{{.*}}, label %{{.*}} +// CHECK: [[G1_CALL_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[G1_IFACE:%[0-9]+]]) +// CHECK: [[G1_METHOD:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: [[G1_CALL_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[G1_METHOD]], 0 +// CHECK-NEXT: [[G1_CALL_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[G1_CALL_PAIR0]], ptr [[G1_CALL_DATA]], 1 +// CHECK: call void %{{[0-9]+}}(ptr %{{[0-9]+}}) +// CHECK: [[G2_IMPLEMENTS:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @"_llgo_{{.*}}foo.Gamer", ptr @"*_llgo_main.Game2") +// CHECK-NEXT: br i1 [[G2_IMPLEMENTS]], label %{{.*}}, label %{{.*}} +// CHECK: [[G1_EFACE_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[G1_EFACE]], 1 +// CHECK-NEXT: [[G1_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}foo.iface${{[-A-Za-z0-9_]+}}", ptr [[G1_TYPE]]) +// CHECK: [[G1_PAIR:%[0-9]+]] = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %{{[0-9]+}}, %{{.*}} ], [ zeroinitializer, %{{.*}} ] +// CHECK-NEXT: [[G1_IFACE]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } [[G1_PAIR]], 0 +// CHECK-NEXT: [[G1_OK:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } [[G1_PAIR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" [[G1_IFACE]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 [[G1_OK]]) +// CHECK: br i1 [[G1_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[G2_PAIR:%[0-9]+]] = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %{{[0-9]+}}, %{{.*}} ], [ zeroinitializer, %{{.*}} ] +// CHECK-NEXT: [[G2_IFACE:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } [[G2_PAIR]], 0 +// CHECK-NEXT: [[G2_OK:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } [[G2_PAIR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" [[G2_IFACE]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 [[G2_OK]]) func main() { var g1 any = &Game1{&foo.Game{}} diff --git a/cl/_testgo/interface1370/in.go b/cl/_testgo/interface1370/in.go index e5d43f5f2a..de27ac65e9 100644 --- a/cl/_testgo/interface1370/in.go +++ b/cl/_testgo/interface1370/in.go @@ -6,18 +6,13 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}geometry1370.NewRectangle"(double 5.000000e+00, double 3.000000e+00) -// CHECK-NEXT: %1 = call ptr @"{{.*}}NewItab"(ptr @"{{.*}}geometry1370.iface{{.*}}", ptr @"*_llgo_{{.*}}geometry1370.Rectangle") -// CHECK-NEXT: %2 = insertvalue %"{{.*}}iface" undef, ptr %1, 0 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}iface" %2, ptr %0, 1 -// CHECK-NEXT: call void @"{{.*}}geometry1370.RegisterShape"(%"{{.*}}iface" %3, i64 42) -// CHECK-NEXT: %4 = call i64 @"{{.*}}geometry1370.(*Rectangle).GetID"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 3 }) -// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %4) -// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) -// CHECK-NEXT: ret void +// CHECK: %[[RECT:[0-9]+]] = call ptr @"{{.*}}geometry1370.NewRectangle"(double 5.000000e+00, double 3.000000e+00) +// CHECK: %[[ITAB:[0-9]+]] = call ptr @"{{.*}}NewItab"(ptr @"{{.*}}geometry1370.iface{{.*}}", ptr @"*_llgo_{{.*}}geometry1370.Rectangle") +// CHECK: %[[IFACE_TYPE:[0-9]+]] = insertvalue %"{{.*}}iface" undef, ptr %[[ITAB]], 0 +// CHECK: %[[RECT_IFACE:[0-9]+]] = insertvalue %"{{.*}}iface" %[[IFACE_TYPE]], ptr %[[RECT]], 1 +// CHECK: call void @"{{.*}}geometry1370.RegisterShape"(%"{{.*}}iface" %[[RECT_IFACE]], i64 42) +// CHECK: %[[ID:[0-9]+]] = call i64 @"{{.*}}geometry1370.(*Rectangle).GetID"(ptr %[[RECT]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[ID]]) func main() { rect := geometry1370.NewRectangle(5.0, 3.0) geometry1370.RegisterShape(rect, 42) diff --git a/cl/_testgo/invoke/in.go b/cl/_testgo/invoke/in.go index 5d770df322..5b6b4b1a3b 100644 --- a/cl/_testgo/invoke/in.go +++ b/cl/_testgo/invoke/in.go @@ -1,23 +1,6 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [6 x i8] c"invoke", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [42 x i8] c"{{.*}}/cl/_testgo/invoke.T", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [6 x i8] c"Invoke", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [7 x i8] c"invoke1", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testgo/invoke.T1", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [7 x i8] c"invoke2", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testgo/invoke.T2", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [7 x i8] c"invoke3", align 1{{$}} -// CHECK: {{^}}@8 = private unnamed_addr constant [7 x i8] c"invoke4", align 1{{$}} -// CHECK: {{^}}@9 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testgo/invoke.T4", align 1{{$}} -// CHECK: {{^}}@10 = private unnamed_addr constant [7 x i8] c"invoke5", align 1{{$}} -// CHECK: {{^}}@11 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testgo/invoke.T5", align 1{{$}} -// CHECK: {{^}}@12 = private unnamed_addr constant [7 x i8] c"invoke6", align 1{{$}} -// CHECK: {{^}}@13 = private unnamed_addr constant [43 x i8] c"{{.*}}/cl/_testgo/invoke.T6", align 1{{$}} -// CHECK: {{^}}@14 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@36 = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} - type T struct { s string } @@ -141,334 +124,121 @@ type M interface { } // CHECK-LABEL: define i64 @main.T.Invoke(%main.T %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.T, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.T %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.T, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.String", ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 0 -// CHECK-NEXT: } +// CHECK: store %main.T %0, ptr [[T_INVOKE_ADDR:%[0-9]+]] +// CHECK: [[T_INVOKE_FIELD:%[0-9]+]] = getelementptr inbounds %main.T, ptr [[T_INVOKE_ADDR]], i32 0, i32 0 +// CHECK-NEXT: [[T_INVOKE_STRING:%[0-9]+]] = load %"{{.*}}String", ptr [[T_INVOKE_FIELD]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[T_INVOKE_STRING]]) +// CHECK: ret i64 0 // CHECK-LABEL: define i64 @"main.(*T).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 42 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load %main.T, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T.Invoke(%main.T %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.(*T).Method"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[T_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T_NIL]],{{.*}}) +// CHECK: %[[T_VALUE:[0-9]+]] = load %main.T, ptr %0 +// CHECK: %[[T_RESULT:[0-9]+]] = call i64 @main.T.Invoke(%main.T %[[T_VALUE]]) +// CHECK: ret i64 %[[T_RESULT]] // CHECK-LABEL: define i64 @main.T1.Invoke(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 1 -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) +// CHECK: ret i64 1 // CHECK-LABEL: define i64 @"main.(*T1).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load i64, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T1.Invoke(i64 %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: %[[T1_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T1_NIL]],{{.*}}) +// CHECK: %[[T1_VALUE:[0-9]+]] = load i64, ptr %0 +// CHECK: call i64 @main.T1.Invoke(i64 %[[T1_VALUE]]) // CHECK-LABEL: define i64 @main.T2.Invoke(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 2 -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %0) +// CHECK: ret i64 2 // CHECK-LABEL: define i64 @"main.(*T2).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load double, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T2.Invoke(double %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: %[[T2_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T2_NIL]],{{.*}}) +// CHECK: %[[T2_VALUE:[0-9]+]] = load double, ptr %0 +// CHECK: call i64 @main.T2.Invoke(double %[[T2_VALUE]]) +// T3 only has a pointer receiver, so its wrapper dereferences the pointer and +// preserves the signed int8 conversion. // CHECK-LABEL: define i64 @"main.(*T3).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) -// CHECK-NEXT: %2 = load i8, ptr %0, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %3 = sext i8 %2 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 3 -// CHECK-NEXT: } +// CHECK: %[[T3_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %[[T3_NIL]]) +// CHECK: %[[T3_VALUE:[0-9]+]] = load i8, ptr %0 +// CHECK: %[[T3_WIDE:[0-9]+]] = sext i8 %[[T3_VALUE]] to i64 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[T3_WIDE]]) // CHECK-LABEL: define i64 @main.T4.Invoke([1 x i64] %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store [1 x i64] %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 4 -// CHECK-NEXT: } +// CHECK: store [1 x i64] %0, ptr [[T4_INVOKE_ADDR:%[0-9]+]] +// CHECK: [[T4_ITEM_PTR:%[0-9]+]] = getelementptr inbounds i64, ptr [[T4_INVOKE_ADDR]], i64 0 +// CHECK-NEXT: [[T4_ITEM:%[0-9]+]] = load i64, ptr [[T4_ITEM_PTR]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[T4_ITEM]]) +// CHECK: ret i64 4 // CHECK-LABEL: define i64 @"main.(*T4).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @9, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load [1 x i64], ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T4.Invoke([1 x i64] %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: %[[T4_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T4_NIL]],{{.*}}) +// CHECK: %[[T4_VALUE:[0-9]+]] = load [1 x i64], ptr %0 +// CHECK: call i64 @main.T4.Invoke([1 x i64] %[[T4_VALUE]]) // CHECK-LABEL: define i64 @main.T5.Invoke(%main.T5 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.T5, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.T5 %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.T5, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @10, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 5 -// CHECK-NEXT: } +// CHECK: store %main.T5 %0, ptr [[T5_INVOKE_ADDR:%[0-9]+]] +// CHECK: [[T5_FIELD:%[0-9]+]] = getelementptr inbounds %main.T5, ptr [[T5_INVOKE_ADDR]], i32 0, i32 0 +// CHECK-NEXT: [[T5_ITEM:%[0-9]+]] = load i64, ptr [[T5_FIELD]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[T5_ITEM]]) +// CHECK: ret i64 5 // CHECK-LABEL: define i64 @"main.(*T5).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @11, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load %main.T5, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T5.Invoke(%main.T5 %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: %[[T5_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T5_NIL]],{{.*}}) +// CHECK: %[[T5_VALUE:[0-9]+]] = load %main.T5, ptr %0 +// CHECK: call i64 @main.T5.Invoke(%main.T5 %[[T5_VALUE]]) // CHECK-LABEL: define i64 @main.T6.Invoke(%main.T6 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %main.T6 %0, 1 -// CHECK-NEXT: %2 = extractvalue %main.T6 %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %2) -// CHECK-NEXT: %3 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @12, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret i64 6 -// CHECK-NEXT: } +// CHECK: %[[T6_DATA:[0-9]+]] = extractvalue %main.T6 %0, 1 +// CHECK: %[[T6_CODE:[0-9]+]] = extractvalue %main.T6 %0, 0 +// CHECK: %[[T6_CALL:__llgo_funcval_code]] = call ptr asm "", "=r,0"(ptr %[[T6_CODE]]) +// CHECK: call i64 %[[T6_CALL]](ptr {{(nest|swiftself)}} %[[T6_DATA]]) // CHECK-LABEL: define i64 @"main.(*T6).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @13, i64 43 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 6 }) -// CHECK-NEXT: %2 = load %main.T6, ptr %0, align 8 -// CHECK-NEXT: %3 = call i64 @main.T6.Invoke(%main.T6 %2) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[T6_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[T6_NIL]],{{.*}}) +// CHECK: %[[T6_LOADED:[0-9]+]] = load %main.T6, ptr %0 +// CHECK: call i64 @main.T6.Invoke(%main.T6 %[[T6_LOADED]]) // CHECK-LABEL: define void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 3 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %6, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %6, 0 -// CHECK-NEXT: %9 = call i64 %8(ptr %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: %[[INVOKE_DATA:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: %[[INVOKE_TYPE:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 +// CHECK: %[[INVOKE_SLOT:[0-9]+]] = getelementptr ptr, ptr %[[INVOKE_TYPE]], i64 3 +// CHECK: %[[INVOKE_METHOD:[0-9]+]] = load ptr, ptr %[[INVOKE_SLOT]] +// CHECK: %[[INVOKE_PAIR0:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[INVOKE_METHOD]], 0 +// CHECK: %[[INVOKE_PAIR:[0-9]+]] = insertvalue { ptr, ptr } %[[INVOKE_PAIR0]], ptr %[[INVOKE_DATA]], 1 +// CHECK: %[[INVOKE_CALL_DATA:[0-9]+]] = extractvalue { ptr, ptr } %[[INVOKE_PAIR]], 1 +// CHECK: %[[INVOKE_CALL_CODE:[0-9]+]] = extractvalue { ptr, ptr } %[[INVOKE_PAIR]], 0 +// CHECK: %[[INVOKE_RESULT:[0-9]+]] = call i64 %[[INVOKE_CALL_CODE]](ptr %[[INVOKE_CALL_DATA]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[INVOKE_RESULT]]) + +// main exercises both value and pointer method sets for every named type. +// Capture the first pair completely, then retain descriptor checks for the +// remaining matrix. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @14, i64 5 }, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store double 1.001000e+02, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: store i8 127, ptr %4, align 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %5, i64 0 -// CHECK-NEXT: store i64 200, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %8 = getelementptr inbounds %main.T5, ptr %7, i32 0, i32 0 -// CHECK-NEXT: store i64 300, ptr %8, align 8 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %main.T6 { ptr @"main.main$1", ptr null }, ptr %9, align 8 -// CHECK-NEXT: %10 = load %main.T, ptr %0, align 8 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.T %10, ptr %11, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T) -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %12, 0 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %13, ptr %11, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %14) -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %15, 0 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %16, ptr %0, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %17) -// CHECK-NEXT: %18 = load i64, ptr %2, align 8 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %18, ptr %19, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T1) -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %20, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %21, ptr %19, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %22) -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T1") -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %23, 0 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %24, ptr %2, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %25) -// CHECK-NEXT: %26 = load double, ptr %3, align 8 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double %26, ptr %27, align 8 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T2) -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %28, 0 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %29, ptr %27, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %30) -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T2") -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %31, 0 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %32, ptr %3, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %33) -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T3") -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %34, 0 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %35, ptr %4, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %36) -// CHECK-NEXT: %37 = load [1 x i64], ptr %5, align 8 -// CHECK-NEXT: %38 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store [1 x i64] %37, ptr %38, align 8 -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T4) -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %39, 0 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %40, ptr %38, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %41) -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T4") -// CHECK-NEXT: %43 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %42, 0 -// CHECK-NEXT: %44 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %43, ptr %5, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %44) -// CHECK-NEXT: %45 = load %main.T5, ptr %7, align 8 -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.T5 %45, ptr %46, align 8 -// CHECK-NEXT: %47 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T5) -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %47, 0 -// CHECK-NEXT: %49 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %48, ptr %46, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %49) -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T5") -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %50, 0 -// CHECK-NEXT: %52 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %51, ptr %7, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %52) -// CHECK-NEXT: %53 = load %main.T6, ptr %9, align 8 -// CHECK-NEXT: %54 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.T6 %53, ptr %54, align 8 -// CHECK-NEXT: %55 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T6) -// CHECK-NEXT: %56 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %55, 0 -// CHECK-NEXT: %57 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %56, ptr %54, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %57) -// CHECK-NEXT: %58 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T6") -// CHECK-NEXT: %59 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %58, 0 -// CHECK-NEXT: %60 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %59, ptr %9, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %60) -// CHECK-NEXT: %61 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %62 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %61) -// CHECK-NEXT: %63 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %62, 0 -// CHECK-NEXT: %64 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %63, ptr null, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %64) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %65, 0 -// CHECK-NEXT: %67 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %66, ptr %0, 1 -// CHECK-NEXT: %68 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %67) -// CHECK-NEXT: %69 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %67, 1 -// CHECK-NEXT: %70 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %68) -// CHECK-NEXT: %71 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %70, 0 -// CHECK-NEXT: %72 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %71, ptr %69, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %72) -// CHECK-NEXT: %73 = alloca %main.T, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %73, i8 0, i64 16, i1 false) -// CHECK-NEXT: %74 = getelementptr inbounds %main.T, ptr %73, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @36, i64 5 }, ptr %74, align 8 -// CHECK-NEXT: %75 = load %main.T, ptr %73, align 8 -// CHECK-NEXT: %76 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.T %75, ptr %76, align 8 -// CHECK-NEXT: %77 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.T, ptr undef }, ptr %76, 1 -// CHECK-NEXT: %78 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %77, 0 -// CHECK-NEXT: %79 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.I, ptr %78) -// CHECK-NEXT: br i1 %79, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %80 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %77, 1 -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %78) -// CHECK-NEXT: %82 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %81, 0 -// CHECK-NEXT: %83 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %82, ptr %80, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %83) -// CHECK-NEXT: %84 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %77, 0 -// CHECK-NEXT: %85 = icmp ne ptr %84, null -// CHECK-NEXT: br i1 %85, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %78, ptr @_llgo_main.I) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %86 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %77, 0 -// CHECK-NEXT: %87 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %86) -// CHECK-NEXT: br i1 %87, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %84, ptr @_llgo_any) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: %88 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %77, 1 -// CHECK-NEXT: %89 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %86) -// CHECK-NEXT: %90 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %89, 0 -// CHECK-NEXT: %91 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %90, ptr %88, 1 -// CHECK-NEXT: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %91) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %86, ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// CHECK: store %main.T6 { ptr @"main.main$1", ptr null }, ptr %{{[0-9]+}} +// CHECK: %[[T_VALUE_ITAB:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T) +// CHECK: %[[T_VALUE_IF0:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[T_VALUE_ITAB]], 0 +// CHECK: %[[T_VALUE_IFACE:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[T_VALUE_IF0]], ptr %{{[0-9]+}}, 1 +// CHECK: call void @main.invoke(%"{{.*}}/runtime/internal/runtime.iface" %[[T_VALUE_IFACE]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T1) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T1") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T2) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T2") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T3") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T4) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T4") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T5) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T5") +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.T6) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T6") +// CHECK: %[[ASSERT_TYPE:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType" +// CHECK: %[[ASSERT_ITAB:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %[[ASSERT_TYPE]]) // CHECK-LABEL: define i64 @"main.main$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 400 -// CHECK-NEXT: } +// CHECK: ret i64 400 diff --git a/cl/_testgo/localitycodegen/in.go b/cl/_testgo/localitycodegen/in.go index 01acc3de4d..100ef977ac 100644 --- a/cl/_testgo/localitycodegen/in.go +++ b/cl/_testgo/localitycodegen/in.go @@ -1,6 +1,8 @@ // LITTEST package main +// Package locality has one TLS scalar and one context-local block. Pointer +// values themselves must not become TLS globals or registered global roots. // CHECK-DAG: @main.scalar = thread_local global i64 0 // CHECK-DAG: @main.__llgo_local_cache = thread_local global i64 0 // CHECK-DAG: @"main.__llgo_tls_init$guard" = thread_local global i8 0 @@ -10,40 +12,30 @@ package main // CHECK-NOT: localitycodegen.initialized" = thread_local // CHECK-LABEL: define ptr @main.__llgo_local_block() -// CHECK: load i64, ptr @main.__llgo_local_cache -// CHECK: icmp ne i64 -// CHECK: ret ptr // CHECK: call ptr @"{{.*}}runtime.LocalPackage"(ptr @main.__llgo_local_cache, i64 16, i64 8) -// CHECK: ret ptr // CHECK-LABEL: define void @main.__llgo_tls_init() // CHECK: call void @main.__llgo_local_init_0() // CHECK-LABEL: define void @"main.__llgo_tls_init$ensure"() -// CHECK: load i8, ptr // CHECK: call void @"{{.*}}runtime.EnsureLocalInitializer"(ptr @"main.__llgo_tls_init$guard", ptr @"main.__llgo_tls_init$failure_cache" // CHECK-LABEL: define ptr @{{"?ExportedLocality"?}}() // CHECK: call i64 @"{{.*}}EnterLocalContext" // CHECK: call ptr @main.__llgo_local_block() // CHECK: call void @"{{.*}}LeaveLocalContext" -// CHECK: ret ptr // CHECK-LABEL: define void @main.init() -// CHECK: store i8 2, ptr // CHECK: call ptr @main.newPointer() // CHECK: call void @"main.__llgo_tls_init$ensure"() -// CHECK: call ptr @main.__llgo_local_block() // CHECK-LABEL: define { i64, ptr, ptr } @main.values() // CHECK: call void @"main.__llgo_tls_init$ensure"() // CHECK: load i64, ptr @main.scalar // CHECK: call ptr @main.__llgo_local_block() -// CHECK: load ptr, ptr -// CHECK: load ptr, ptr -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0) -// CHECK: alloca %"{{.*}}LocalContext", align 8 +// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr +// CHECK: alloca %"{{.*}}LocalContext" // CHECK: call i64 @"{{.*}}EnterLocalContext" // CHECK: call void @"{{.*}}LeaveLocalContext" diff --git a/cl/_testgo/makemaphint/in.go b/cl/_testgo/makemaphint/in.go index 50db26b3dd..74861a6bac 100644 --- a/cl/_testgo/makemaphint/in.go +++ b/cl/_testgo/makemaphint/in.go @@ -2,20 +2,29 @@ package main // CHECK-LABEL: define i64 @main.fromInt32(i32 %0){{.*}} { -// CHECK: %1 = sext i32 %0 to i64 -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 %1) +// CHECK: [[INT_HINT:%[0-9]+]] = sext i32 %0 to i64 +// CHECK-NEXT: [[INT_MAP:%[0-9]+]] = call ptr @"{{.*}}MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 [[INT_HINT]]) +// CHECK-NEXT: [[INT_LEN:%[0-9]+]] = call i64 @"{{.*}}MapLen"(ptr [[INT_MAP]]) +// CHECK-NEXT: ret i64 [[INT_LEN]] func fromInt32(n int32) int { return len(make(map[string]int, n)) } // CHECK-LABEL: define i64 @main.fromUint32(i32 %0){{.*}} { -// CHECK: %1 = zext i32 %0 to i64 -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 %1) +// CHECK: [[UINT_HINT:%[0-9]+]] = zext i32 %0 to i64 +// CHECK-NEXT: [[UINT_MAP:%[0-9]+]] = call ptr @"{{.*}}MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 [[UINT_HINT]]) +// CHECK-NEXT: [[UINT_LEN:%[0-9]+]] = call i64 @"{{.*}}MapLen"(ptr [[UINT_MAP]]) +// CHECK-NEXT: ret i64 [[UINT_LEN]] func fromUint32(n uint32) int { return len(make(map[string]int, n)) } func main() { + // CHECK-LABEL: define void @main.main(){{.*}} { + // CHECK: [[UINT_RESULT:%[0-9]+]] = call i64 @main.fromUint32(i32 2) + // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[UINT_RESULT]]) + // CHECK: [[INT_RESULT:%[0-9]+]] = call i64 @main.fromInt32(i32 3) + // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[INT_RESULT]]) println(fromUint32(2)) println(fromInt32(3)) } diff --git a/cl/_testgo/makeslice/in.go b/cl/_testgo/makeslice/in.go index 66fcfdab2a..0cf0b82fc3 100644 --- a/cl/_testgo/makeslice/in.go +++ b/cl/_testgo/makeslice/in.go @@ -1,8 +1,50 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"must error", align 1{{$}} +// Check the four semantically distinct make([]T, len, cap) cases: valid, +// negative length, len greater than cap, and allocation-size overflow. +// CHECK-LABEL: define void @"main.init#1"(){{.*}} { +// CHECK: [[VALID1:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}MakeSlice"(i64 2, i64 4, i64 8) +// CHECK-NEXT: [[VALID1_LEN:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[VALID1]], 1 +// CHECK-NEXT: [[VALID1_BAD_LEN:%[0-9]+]] = icmp ne i64 [[VALID1_LEN]], 2 +// CHECK: [[VALID1_CAP:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[VALID1]], 2 +// CHECK-NEXT: [[VALID1_BAD_CAP:%[0-9]+]] = icmp ne i64 [[VALID1_CAP]], 4 +// CHECK-LABEL: define void @"main.init#2"(){{.*}} { +// CHECK: [[VALID2:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}MakeSlice"(i64 2, i64 4, i64 8) +// CHECK-NEXT: [[VALID2_LEN:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[VALID2]], 1 +// CHECK-NEXT: [[VALID2_BAD_LEN:%[0-9]+]] = icmp ne i64 [[VALID2_LEN]], 2 +// CHECK: [[VALID2_CAP:%[0-9]+]] = extractvalue %"{{.*}}Slice" [[VALID2]], 2 +// CHECK-NEXT: [[VALID2_BAD_CAP:%[0-9]+]] = icmp ne i64 [[VALID2_CAP]], 4 +// CHECK-LABEL: define void @"main.init#3"(){{.*}} { +// CHECK: [[NEG_STATE:%[0-9]+]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @"main.init#3$1") +// CHECK-NEXT: call void @"main.init#3$1"() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[NEG_STATE]]) +// CHECK: call %"{{.*}}Slice" @"{{.*}}MakeSlice"(i64 -1, i64 -1, i64 8) +// CHECK-LABEL: define void @"main.init#3$1"(){{.*}} { +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.init#3$1", ptr [[NEG_TOKEN:%[0-9]+]]) +// CHECK-NEXT: [[NEG_RECOVER:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[NEG_TOKEN]]) +// CHECK-NEXT: [[NEG_MISSING:%[0-9]+]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[NEG_RECOVER]], %"{{.*}}eface" zeroinitializer) +// CHECK-NEXT: br i1 [[NEG_MISSING]], label %{{.*}}, label %{{.*}} +// CHECK-LABEL: define void @"main.init#4"(){{.*}} { +// CHECK: [[CAP_STATE:%[0-9]+]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @"main.init#4$1") +// CHECK-NEXT: call void @"main.init#4$1"() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[CAP_STATE]]) +// CHECK: call %"{{.*}}Slice" @"{{.*}}MakeSlice"(i64 2, i64 1, i64 8) +// CHECK-LABEL: define void @"main.init#4$1"(){{.*}} { +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.init#4$1", ptr [[CAP_TOKEN:%[0-9]+]]) +// CHECK-NEXT: [[CAP_RECOVER:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[CAP_TOKEN]]) +// CHECK-NEXT: [[CAP_MISSING:%[0-9]+]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[CAP_RECOVER]], %"{{.*}}eface" zeroinitializer) +// CHECK-NEXT: br i1 [[CAP_MISSING]], label %{{.*}}, label %{{.*}} +// CHECK-LABEL: define void @"main.init#5"(){{.*}} { +// CHECK: [[OVERFLOW_STATE:%[0-9]+]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @"main.init#5$1") +// CHECK-NEXT: call void @"main.init#5$1"() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[OVERFLOW_STATE]]) +// CHECK: call %"{{.*}}Slice" @"{{.*}}MakeSlice"(i64 9223372036854775807, i64 9223372036854775807, i64 8) +// CHECK-LABEL: define void @"main.init#5$1"(){{.*}} { +// CHECK: call void @"{{.*}}BindRecoverFrame"(ptr @"main.init#5$1", ptr [[OVERFLOW_TOKEN:%[0-9]+]]) +// CHECK-NEXT: [[OVERFLOW_RECOVER:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[OVERFLOW_TOKEN]]) +// CHECK-NEXT: [[OVERFLOW_MISSING:%[0-9]+]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[OVERFLOW_RECOVER]], %"{{.*}}eface" zeroinitializer) +// CHECK-NEXT: br i1 [[OVERFLOW_MISSING]], label %{{.*}}, label %{{.*}} func main() { } @@ -58,291 +100,3 @@ func init() { buf := make([]int, n) _ = buf } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"main.init#1"() -// CHECK-NEXT: call void @"main.init#2"() -// CHECK-NEXT: call void @"main.init#3"() -// CHECK-NEXT: call void @"main.init#4"() -// CHECK-NEXT: call void @"main.init#5"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 2, i64 4, i64 8) -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %2 = icmp ne i64 %1, 2 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 2 -// CHECK-NEXT: %6 = icmp ne i64 %5, 4 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#2"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 2, i64 4, i64 8) -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %2 = icmp ne i64 %1, 2 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 2 -// CHECK-NEXT: %6 = icmp ne i64 %5, 4 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#3"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#3$1") -// CHECK-NEXT: call void @"main.init#3$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 -1, i64 -1, i64 8) -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#3", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %19, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#3$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#3$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#4"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#4$1") -// CHECK-NEXT: call void @"main.init#4$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 2, i64 1, i64 8) -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#4", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %19, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#4$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#4$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#5"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.init#5$1") -// CHECK-NEXT: call void @"main.init#5$1"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 9223372036854775807, i64 9223372036854775807, i64 8) -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_6), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.init#5", %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %19, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.init#5$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.init#5$1", ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/multiret/in.go b/cl/_testgo/multiret/in.go index 9b208bb453..dce41dd75d 100644 --- a/cl/_testgo/multiret/in.go +++ b/cl/_testgo/multiret/in.go @@ -4,25 +4,21 @@ package main var a int = 1 // CHECK-LABEL: define { i64, double } @main.foo(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load i64, ptr @main.a, align 8 -// CHECK-NEXT: %2 = insertvalue { i64, double } undef, i64 %1, 0 -// CHECK-NEXT: %3 = insertvalue { i64, double } %2, double %0, 1 -// CHECK-NEXT: ret { i64, double } %3 +// CHECK: [[FOO_INT:%[0-9]+]] = load i64, ptr @main.a +// CHECK-NEXT: [[FOO_PAIR0:%[0-9]+]] = insertvalue { i64, double } undef, i64 [[FOO_INT]], 0 +// CHECK-NEXT: [[FOO_PAIR:%[0-9]+]] = insertvalue { i64, double } [[FOO_PAIR0]], double %0, 1 +// CHECK-NEXT: ret { i64, double } [[FOO_PAIR]] func foo(f float64) (int, float64) { return a, f } -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call { i64, double } @main.foo(double 2.000000e+00) - // CHECK-NEXT: %1 = extractvalue { i64, double } %0, 0 - // CHECK-NEXT: %2 = extractvalue { i64, double } %0, 1 - // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %1) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double %2) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void + // CHECK-LABEL: define void @main.main(){{.*}} { + // CHECK: [[FOO_RESULT:%[0-9]+]] = call { i64, double } @main.foo(double 2.000000e+00) + // CHECK-NEXT: [[MAIN_INT:%[0-9]+]] = extractvalue { i64, double } [[FOO_RESULT]], 0 + // CHECK-NEXT: [[MAIN_FLOAT:%[0-9]+]] = extractvalue { i64, double } [[FOO_RESULT]], 1 + // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[MAIN_INT]]) + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double [[MAIN_FLOAT]]) i, f := foo(2.0) println(i, f) } diff --git a/cl/_testgo/nesteddeferpanic/in.go b/cl/_testgo/nesteddeferpanic/in.go index b9d1c613b6..cb24f41053 100644 --- a/cl/_testgo/nesteddeferpanic/in.go +++ b/cl/_testgo/nesteddeferpanic/in.go @@ -1,7 +1,118 @@ // LITTEST package main +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.replacement() +// CHECK: call void @main.resumeOuterPanic() +// CHECK: call void @main.recoverThenPanic() + +// recoverThenPanic: recover panic(2), remember it, then execute deferred panic(3). +// CHECK-LABEL: define void @main.recoverThenPanic(){{.*}} { +// CHECK: [[RTP_OUTER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.recoverThenPanic$1") +// CHECK: call void @"main.recoverThenPanic$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RTP_OUTER_STATE]]) +// CHECK: call void @"main.recoverThenPanic$2"() + +// CHECK-LABEL: define void @"main.recoverThenPanic$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.recoverThenPanic$1", ptr [[RTP_OUTER_SLOT:%.*]]) +// CHECK: [[RTP_OUTER_VALUE:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RTP_OUTER_SLOT]]) +// CHECK: [[RTP_OUTER_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[RTP_OUTER_VALUE]], 0 +// CHECK: [[RTP_OUTER_IS_INT:%.*]] = icmp eq ptr [[RTP_OUTER_TYPE]], @_llgo_int +// CHECK: br i1 [[RTP_OUTER_IS_INT]], label %{{.*}}, label %{{.*}} +// CHECK: [[RTP_OUTER_DATA:%.*]] = extractvalue %"{{.*}}eface" [[RTP_OUTER_VALUE]], 1 +// CHECK: [[RTP_OUTER_INT:%.*]] = load i64, ptr [[RTP_OUTER_DATA]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[RTP_OUTER_INT]]) + +// CHECK-LABEL: define void @"main.recoverThenPanic$2"(){{.*}} { +// CHECK: [[RTP_INNER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.recoverThenPanic$2$1") +// CHECK: call void @"main.recoverThenPanic$2$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RTP_INNER_STATE]]) +// CHECK: store i64 2, ptr [[RTP_PANIC2_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[RTP_PANIC2:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[RTP_PANIC2_ADDR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[RTP_PANIC2]]) + +// CHECK-LABEL: define void @"main.recoverThenPanic$2$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.recoverThenPanic$2$1", ptr [[RTP_INNER_SLOT:%.*]]) +// CHECK: [[RTP_RECOVERED2:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RTP_INNER_SLOT]]) +// CHECK: [[RTP_RECOVERED2_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[RTP_RECOVERED2]], 0 +// CHECK: [[RTP_RECOVERED2_IS_INT:%.*]] = icmp eq ptr [[RTP_RECOVERED2_TYPE]], @_llgo_int +// CHECK: [[RTP_RECOVERED2_DATA:%.*]] = extractvalue %"{{.*}}eface" [[RTP_RECOVERED2]], 1 +// CHECK: [[RTP_OLD:%.*]] = load i64, ptr [[RTP_RECOVERED2_DATA]] +// CHECK: store i64 3, ptr [[RTP_PANIC3_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[RTP_PANIC3:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[RTP_PANIC3_ADDR]], 1 +// CHECK: store %"{{.*}}eface" [[RTP_PANIC3]], ptr %{{.*}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[RTP_OLD]]) +// CHECK: [[RTP_DEFERRED_PANIC:%.*]] = extractvalue { ptr, i64, %"{{.*}}eface" } %{{.*}}, 2 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[RTP_DEFERRED_PANIC]]) + +// replacement: panic(4) is superseded by a deferred panic(5), and the outer recover sees the latter. // CHECK-LABEL: define void @main.replacement(){{.*}} { +// CHECK: [[REPL_OUTER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.replacement$1") +// CHECK: call void @"main.replacement$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[REPL_OUTER_STATE]]) +// CHECK: call void @"main.replacement$2"() + +// CHECK-LABEL: define void @"main.replacement$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.replacement$1", ptr [[REPL_SLOT:%.*]]) +// CHECK: [[REPL_VALUE:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[REPL_SLOT]]) +// CHECK: [[REPL_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[REPL_VALUE]], 0 +// CHECK: [[REPL_IS_INT:%.*]] = icmp eq ptr [[REPL_TYPE]], @_llgo_int +// CHECK: [[REPL_DATA:%.*]] = extractvalue %"{{.*}}eface" [[REPL_VALUE]], 1 +// CHECK: [[REPL_INT:%.*]] = load i64, ptr [[REPL_DATA]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[REPL_INT]]) + +// CHECK-LABEL: define void @"main.replacement$2"(){{.*}} { +// CHECK: call void @"main.replacement$2$1"() +// CHECK: store i64 4, ptr [[REPL_PANIC4_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[REPL_PANIC4:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[REPL_PANIC4_ADDR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[REPL_PANIC4]]) + +// CHECK-LABEL: define void @"main.replacement$2$1"(){{.*}} { +// CHECK: store i64 5, ptr [[REPL_PANIC5_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[REPL_PANIC5:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[REPL_PANIC5_ADDR]], 1 +// CHECK: store %"{{.*}}eface" [[REPL_PANIC5]], ptr %{{.*}} +// CHECK: [[REPL_DEFERRED_PANIC:%.*]] = extractvalue { ptr, i64, %"{{.*}}eface" } %{{.*}}, 2 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[REPL_DEFERRED_PANIC]]) + +// resumeOuterPanic: the deepest recover consumes panic(2), allowing panic(1) to resume outward. +// CHECK-LABEL: define void @main.resumeOuterPanic(){{.*}} { +// CHECK: [[RESUME_OUTER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.resumeOuterPanic$1") +// CHECK: call void @"main.resumeOuterPanic$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RESUME_OUTER_STATE]]) +// CHECK: call void @"main.resumeOuterPanic$2"() + +// CHECK-LABEL: define void @"main.resumeOuterPanic$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.resumeOuterPanic$1", ptr [[RESUME_OUTER_SLOT:%.*]]) +// CHECK: [[RESUME_OUTER_VALUE:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RESUME_OUTER_SLOT]]) +// CHECK: [[RESUME_OUTER_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[RESUME_OUTER_VALUE]], 0 +// CHECK: icmp eq ptr [[RESUME_OUTER_TYPE]], @_llgo_int +// CHECK: [[RESUME_OUTER_DATA:%.*]] = extractvalue %"{{.*}}eface" [[RESUME_OUTER_VALUE]], 1 +// CHECK: [[RESUME_OUTER_INT:%.*]] = load i64, ptr [[RESUME_OUTER_DATA]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[RESUME_OUTER_INT]]) + +// CHECK-LABEL: define void @"main.resumeOuterPanic$2"(){{.*}} { +// CHECK: call void @"main.resumeOuterPanic$2$1"() +// CHECK: store i64 1, ptr [[RESUME_PANIC1_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[RESUME_PANIC1:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[RESUME_PANIC1_ADDR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[RESUME_PANIC1]]) + +// CHECK-LABEL: define void @"main.resumeOuterPanic$2$1"(){{.*}} { +// CHECK: [[RESUME_INNER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.resumeOuterPanic$2$1$1") +// CHECK: call void @"main.resumeOuterPanic$2$1$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RESUME_INNER_STATE]]) +// CHECK: store i64 2, ptr [[RESUME_PANIC2_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[RESUME_PANIC2:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[RESUME_PANIC2_ADDR]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[RESUME_PANIC2]]) + +// CHECK-LABEL: define void @"main.resumeOuterPanic$2$1$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.resumeOuterPanic$2$1$1", ptr [[RESUME_INNER_SLOT:%.*]]) +// CHECK: [[RESUME_INNER_VALUE:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RESUME_INNER_SLOT]]) +// CHECK: [[RESUME_INNER_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[RESUME_INNER_VALUE]], 0 +// CHECK: icmp eq ptr [[RESUME_INNER_TYPE]], @_llgo_int +// CHECK: [[RESUME_INNER_DATA:%.*]] = extractvalue %"{{.*}}eface" [[RESUME_INNER_VALUE]], 1 +// CHECK: [[RESUME_INNER_INT:%.*]] = load i64, ptr [[RESUME_INNER_DATA]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[RESUME_INNER_INT]]) + func replacement() { defer func() { println("replacement", recover().(int)) diff --git a/cl/_testgo/reader/in.go b/cl/_testgo/reader/in.go index 253b34cbfc..88fded0e75 100644 --- a/cl/_testgo/reader/in.go +++ b/cl/_testgo/reader/in.go @@ -5,21 +5,6 @@ import ( "unicode/utf8" ) -// CHECK: {{^}}@2 = private unnamed_addr constant [7 x i8] c"WriteTo", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [5 x i8] c"Close", align 1{{$}} -// CHECK: {{^}}@28 = private unnamed_addr constant [3 x i8] c"EOF", align 1{{$}} -// CHECK: {{^}}@29 = private unnamed_addr constant [11 x i8] c"short write", align 1{{$}} -// CHECK: {{^}}@30 = private unnamed_addr constant [11 x i8] c"hello world", align 1{{$}} -// CHECK: {{^}}@53 = private unnamed_addr constant [50 x i8] c"{{.*}}/cl/_testgo/reader.nopCloser", align 1{{$}} -// CHECK: {{^}}@54 = private unnamed_addr constant [58 x i8] c"{{.*}}/cl/_testgo/reader.nopCloserWriterTo", align 1{{$}} -// CHECK: {{^}}@55 = private unnamed_addr constant [37 x i8] c"stringsReader.ReadAt: negative offset", align 1{{$}} -// CHECK: {{^}}@56 = private unnamed_addr constant [34 x i8] c"stringsReader.Seek: invalid whence", align 1{{$}} -// CHECK: {{^}}@57 = private unnamed_addr constant [37 x i8] c"stringsReader.Seek: negative position", align 1{{$}} -// CHECK: {{^}}@58 = private unnamed_addr constant [48 x i8] c"stringsReader.UnreadByte: at beginning of string", align 1{{$}} -// CHECK: {{^}}@59 = private unnamed_addr constant [49 x i8] c"strings.Reader.UnreadRune: at beginning of string", align 1{{$}} -// CHECK: {{^}}@60 = private unnamed_addr constant [62 x i8] c"strings.Reader.UnreadRune: previous operation was not ReadRune", align 1{{$}} -// CHECK: {{^}}@61 = private unnamed_addr constant [48 x i8] c"stringsReader.WriteTo: invalid WriteString count", align 1{{$}} - type Reader interface { Read(p []byte) (n int, err error) } @@ -322,824 +307,202 @@ func main() { println(string(data), err) } +// NopCloser preserves the Reader payload and chooses the WriterTo-capable wrapper. // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.NopCloser(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.WriterTo, ptr %1) -// CHECK-NEXT: br i1 %2, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %3 = alloca %main.nopCloserWriterTo, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3, i8 0, i64 16, i1 false) -// CHECK-NEXT: %4 = getelementptr inbounds %main.nopCloserWriterTo, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %4, align 8 -// CHECK-NEXT: %5 = load %main.nopCloserWriterTo, ptr %3, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.nopCloserWriterTo %5, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.nopCloserWriterTo) -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %8, ptr %6, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %10 = alloca %main.nopCloser, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %10, i8 0, i64 16, i1 false) -// CHECK-NEXT: %11 = getelementptr inbounds %main.nopCloser, ptr %10, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %11, align 8 -// CHECK-NEXT: %12 = load %main.nopCloser, ptr %10, align 8 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.nopCloser %12, ptr %13, align 8 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @_llgo_main.nopCloser) -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %14, 0 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %15, ptr %13, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %1) -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %18, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %19, ptr %17, 1 -// CHECK-NEXT: %21 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %20, 0 -// CHECK-NEXT: %22 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %21, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %23 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %22, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %24 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %23, 0 -// CHECK-NEXT: %25 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %23, 1 -// CHECK-NEXT: br i1 %25, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } - +// CHECK: [[NC_TYPE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: [[NC_WRITER_TO:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.WriterTo, ptr [[NC_TYPE]]) +// CHECK: br i1 [[NC_WRITER_TO]], +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %{{[0-9]+}} +// CHECK: [[NC_WT_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"({{.*}}ptr @_llgo_main.nopCloserWriterTo) +// CHECK: ret %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}} +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %{{[0-9]+}} +// CHECK: [[NC_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"({{.*}}ptr @_llgo_main.nopCloser) +// CHECK: ret %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}} + +// ReadAll passes only the unused capacity to Reader.Read, extends by n, clears +// EOF, and grows only when len == cap. // CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @main.ReadAll(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 512) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %1, i64 1, i64 512, i64 0, i64 0, i1 true, i1 true, i1 true) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_6, %_llgo_3, %_llgo_0 -// CHECK-NEXT: %3 = phi %"{{.*}}/runtime/internal/runtime.Slice" [ %2, %_llgo_0 ], [ %24, %_llgo_3 ], [ %61, %_llgo_6 ] -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 0 -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %7, i64 1, i64 %6, i64 %4, i64 %5, i1 true, i1 true, i1 false) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %11 = getelementptr ptr, ptr %10, i64 3 -// CHECK-NEXT: %12 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %14, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %14, 0 -// CHECK-NEXT: %17 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %16(ptr %15, %"{{.*}}/runtime/internal/runtime.Slice" %8) -// CHECK-NEXT: %18 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %17, 0 -// CHECK-NEXT: %19 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %17, 1 -// CHECK-NEXT: %20 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 1 -// CHECK-NEXT: %21 = add i64 %20, %18 -// CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 0 -// CHECK-NEXT: %24 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %23, i64 1, i64 %22, i64 0, i64 %21, i1 true, i1 true, i1 false) -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %19) -// CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %19, 1 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %25, 0 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %27, ptr %26, 1 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %29, 0 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %30, ptr null, 1 -// CHECK-NEXT: %32 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %28, %"{{.*}}/runtime/internal/runtime.eface" %31) -// CHECK-NEXT: %33 = xor i1 %32, true -// CHECK-NEXT: br i1 %33, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %34 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %19) -// CHECK-NEXT: %36 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %19, 1 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %35, 0 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %37, ptr %36, 1 -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %34) -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %34, 1 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %39, 0 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %41, ptr %40, 1 -// CHECK-NEXT: %43 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %38, %"{{.*}}/runtime/internal/runtime.eface" %42) -// CHECK-NEXT: br i1 %43, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %44 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 1 -// CHECK-NEXT: %45 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 2 -// CHECK-NEXT: %46 = icmp eq i64 %44, %45 -// CHECK-NEXT: br i1 %46, label %_llgo_6, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: %47 = phi %"{{.*}}/runtime/internal/runtime.iface" [ %19, %_llgo_2 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %48 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } undef, %"{{.*}}/runtime/internal/runtime.Slice" %24, 0 -// CHECK-NEXT: %49 = insertvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %48, %"{{.*}}/runtime/internal/runtime.iface" %47, 1 -// CHECK-NEXT: ret { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_3 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %51 = getelementptr inbounds i8, ptr %50, i64 0 -// CHECK-NEXT: store i8 0, ptr %51, align 1 -// CHECK-NEXT: %52 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %50, 0 -// CHECK-NEXT: %53 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, i64 1, 1 -// CHECK-NEXT: %54 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %53, i64 1, 2 -// CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %54, 0 -// CHECK-NEXT: %56 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %54, 1 -// CHECK-NEXT: %57 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %24, ptr %55, i64 %56, i64 1) -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 1 -// CHECK-NEXT: %59 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, 2 -// CHECK-NEXT: %60 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, 0 -// CHECK-NEXT: %61 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %60, i64 1, i64 %59, i64 0, i64 %58, i1 true, i1 true, i1 false) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-NEXT: } - +// CHECK: [[READ_BUF:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"({{.*}}i64 512, i64 0, i64 0, +// CHECK: [[READ_TAIL:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"({{.*}}i64 %{{[0-9]+}}, i64 %{{[0-9]+}}, +// CHECK: [[READ_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK-NEXT: [[READ_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 +// CHECK-NEXT: [[READ_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[READ_TABLE]], i64 3 +// CHECK-NEXT: [[READ_METHOD:%[0-9]+]] = load ptr, ptr [[READ_SLOT]] +// CHECK: [[READ_PAIR:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.Slice" [[READ_TAIL]]) +// CHECK: [[READ_N:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[READ_PAIR]], 0 +// CHECK: [[READ_ERR:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[READ_PAIR]], 1 +// CHECK: [[READ_NEW_LEN:%[0-9]+]] = add i64 %{{[0-9]+}}, [[READ_N]] +// CHECK: [[READ_EXTENDED:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"({{.*}}i64 [[READ_NEW_LEN]], +// CHECK: [[READ_HAS_ERR:%[0-9]+]] = xor i1 %{{[0-9]+}}, true +// CHECK: br i1 [[READ_HAS_ERR]], +// CHECK: [[READ_EOF:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF +// CHECK: [[READ_IS_EOF:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: [[READ_FULL:%[0-9]+]] = icmp eq i64 %{{[0-9]+}}, %{{[0-9]+}} +// CHECK: br i1 [[READ_FULL]], +// CHECK: [[READ_GROWN:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" [[READ_EXTENDED]], ptr %{{[0-9]+}}, i64 %{{[0-9]+}}, i64 1) + +// WriteString dispatches StringWriter.WriteString when available and otherwise +// converts the same string to bytes for Writer.Write. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.WriteString(%"{{.*}}/runtime/internal/runtime.iface" %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %3 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.StringWriter, ptr %2) -// CHECK-NEXT: br i1 %3, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %38) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %38, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %12 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %11(ptr %10, %"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %13 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %12, 0 -// CHECK-NEXT: %14 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %12, 1 -// CHECK-NEXT: %15 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %13, 0 -// CHECK-NEXT: %16 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, %"{{.*}}/runtime/internal/runtime.iface" %14, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %20 = getelementptr ptr, ptr %19, i64 3 -// CHECK-NEXT: %21 = load ptr, ptr %20, align 8 -// CHECK-NEXT: %22 = insertvalue { ptr, ptr } undef, ptr %21, 0 -// CHECK-NEXT: %23 = insertvalue { ptr, ptr } %22, ptr %18, 1 -// CHECK-NEXT: %24 = extractvalue { ptr, ptr } %23, 1 -// CHECK-NEXT: %25 = extractvalue { ptr, ptr } %23, 0 -// CHECK-NEXT: %26 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %25(ptr %24, %"{{.*}}/runtime/internal/runtime.Slice" %17) -// CHECK-NEXT: %27 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %26, 0 -// CHECK-NEXT: %28 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %26, 1 -// CHECK-NEXT: %29 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %27, 0 -// CHECK-NEXT: %30 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %29, %"{{.*}}/runtime/internal/runtime.iface" %28, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %30 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %2) -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %32, 0 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %33, ptr %31, 1 -// CHECK-NEXT: %35 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %34, 0 -// CHECK-NEXT: %36 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %35, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %37 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %36, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %38 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %37, 0 -// CHECK-NEXT: %39 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %37, 1 -// CHECK-NEXT: br i1 %39, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*errorString).Error"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.errorString, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.String", ptr %1, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"unicode/utf8.init"() -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @28, i64 3 }) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %1, ptr @main.EOF, align 8 -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @29, i64 11 }) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %2, ptr @main.ErrShortWrite, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// CHECK: [[WS_TYPE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: [[WS_FAST:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.StringWriter, ptr [[WS_TYPE]]) +// CHECK: br i1 [[WS_FAST]], +// CHECK: [[WS_FAST_RESULT:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.String" %1) +// CHECK: [[WS_BYTES:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" %1) +// CHECK: [[WS_FALLBACK:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.Slice" [[WS_BYTES]]) + +// The runtime driver constructs *stringReader as Reader and feeds both ReadAll results to print. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @30, i64 11 }, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.stringReader") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: %5 = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @main.ReadAll(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 0 -// CHECK-NEXT: %7 = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } %5, 1 -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromBytes"(%"{{.*}}/runtime/internal/runtime.Slice" %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MAIN_READER_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"({{.*}}ptr @"*_llgo_main.stringReader") +// CHECK: [[MAIN_READER:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}, ptr %{{[0-9]+}}, 1 +// CHECK: [[MAIN_READ:%[0-9]+]] = call { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @main.ReadAll(%"{{.*}}/runtime/internal/runtime.iface" [[MAIN_READER]]) +// CHECK: [[MAIN_BYTES:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } [[MAIN_READ]], 0 +// CHECK: [[MAIN_ERR:%[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } [[MAIN_READ]], 1 +// CHECK: [[MAIN_STRING:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromBytes"(%"{{.*}}/runtime/internal/runtime.Slice" [[MAIN_BYTES]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" [[MAIN_STRING]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" [[MAIN_ERR]]) // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %main.errorString, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.errorString") -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %3, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %4, ptr %1, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.nopCloser.Close(%main.nopCloser %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.nopCloser.Read(%main.nopCloser %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.nopCloser, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.nopCloser %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.nopCloser, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 3 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @main.nopCloser.Read, ptr %11) -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %15 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14(ptr %13, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %12) -// CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 0 -// CHECK-NEXT: %17 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 1 -// CHECK-NEXT: %18 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %16, 0 -// CHECK-NEXT: %19 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %18, %"{{.*}}/runtime/internal/runtime.iface" %17, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %19 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*nopCloser).Close"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @53, i64 50 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 5 }) -// CHECK-NEXT: %2 = load %main.nopCloser, ptr %0, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @main.nopCloser.Close(%main.nopCloser %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*nopCloser).Read"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.nopCloser, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.(*nopCloser).Read", ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %13(ptr %12, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: %15 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14, 0 -// CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14, 1 -// CHECK-NEXT: %17 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %15, 0 -// CHECK-NEXT: %18 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %17, %"{{.*}}/runtime/internal/runtime.iface" %16, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %18 -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.nopCloserWriterTo.Close(%main.nopCloserWriterTo %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.nopCloserWriterTo.Read(%main.nopCloserWriterTo %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.nopCloserWriterTo, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.nopCloserWriterTo %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.nopCloserWriterTo, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 3 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @main.nopCloserWriterTo.Read, ptr %11) -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %15 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14(ptr %13, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %12) -// CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 0 -// CHECK-NEXT: %17 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 1 -// CHECK-NEXT: %18 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %16, 0 -// CHECK-NEXT: %19 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %18, %"{{.*}}/runtime/internal/runtime.iface" %17, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %19 -// CHECK-NEXT: } +// CHECK: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %{{[0-9]+}} +// CHECK: [[ERROR_ITAB:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"({{.*}}ptr @"*_llgo_main.errorString") +// CHECK: ret %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}} +// The WriterTo wrapper asserts its embedded Reader, dispatches WriteTo, and returns both results. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.nopCloserWriterTo.WriteTo(%main.nopCloserWriterTo %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = alloca %main.nopCloserWriterTo, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.nopCloserWriterTo %0, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.nopCloserWriterTo, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %3, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.WriterTo, ptr %5) -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 1 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr %5) -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %9, ptr %7, 1 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %10) -// CHECK-NEXT: %12 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %10, 0 -// CHECK-NEXT: %13 = getelementptr ptr, ptr %12, i64 3 -// CHECK-NEXT: %14 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } undef, ptr %14, 0 -// CHECK-NEXT: %16 = insertvalue { ptr, ptr } %15, ptr %11, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %16, 1 -// CHECK-NEXT: %18 = extractvalue { ptr, ptr } %16, 0 -// CHECK-NEXT: %19 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %18(ptr %17, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %20 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %19, 0 -// CHECK-NEXT: %21 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %19, 1 -// CHECK-NEXT: %22 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %20, 0 -// CHECK-NEXT: %23 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %22, %"{{.*}}/runtime/internal/runtime.iface" %21, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @_llgo_main.Reader, ptr %5, ptr @_llgo_main.WriterTo) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*nopCloserWriterTo).Close"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @54, i64 58 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 5 }) -// CHECK-NEXT: %2 = load %main.nopCloserWriterTo, ptr %0, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @main.nopCloserWriterTo.Close(%main.nopCloserWriterTo %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*nopCloserWriterTo).Read"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.nopCloserWriterTo, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %3) -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %3, 0 -// CHECK-NEXT: %6 = getelementptr ptr, ptr %5, i64 3 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } undef, ptr %7, 0 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } %8, ptr %4, 1 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.StartRecoverFrameAlias"(ptr @"main.(*nopCloserWriterTo).Read", ptr %10) -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %9, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %9, 0 -// CHECK-NEXT: %14 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %13(ptr %12, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrameAlias"(ptr %11) -// CHECK-NEXT: %15 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14, 0 -// CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %14, 1 -// CHECK-NEXT: %17 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %15, 0 -// CHECK-NEXT: %18 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %17, %"{{.*}}/runtime/internal/runtime.iface" %16, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %18 -// CHECK-NEXT: } +// CHECK: store %main.nopCloserWriterTo %0, ptr [[WT_RECEIVER:%[0-9]+]] +// CHECK: [[WT_READER_FIELD:%[0-9]+]] = getelementptr inbounds %main.nopCloserWriterTo, ptr [[WT_RECEIVER]], i32 0, i32 0 +// CHECK-NEXT: [[WT_READER:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr [[WT_READER_FIELD]] +// CHECK: [[WT_TYPE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" [[WT_READER]]) +// CHECK: [[WT_OK:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.WriterTo, ptr [[WT_TYPE]]) +// CHECK: br i1 [[WT_OK]], +// CHECK: [[WT_RESULT:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" %1) +// CHECK: [[WT_N:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[WT_RESULT]], 0 +// CHECK: [[WT_ERR:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[WT_RESULT]], 1 // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*nopCloserWriterTo).WriteTo"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %2, %"{{.*}}/runtime/internal/runtime.String" { ptr @54, i64 58 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 7 }) -// CHECK-NEXT: %3 = load %main.nopCloserWriterTo, ptr %0, align 8 -// CHECK-NEXT: %4 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.nopCloserWriterTo.WriteTo(%main.nopCloserWriterTo %3, %"{{.*}}/runtime/internal/runtime.iface" %1) -// CHECK-NEXT: %5 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 0 -// CHECK-NEXT: %6 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %4, 1 -// CHECK-NEXT: %7 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %8 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %7, %"{{.*}}/runtime/internal/runtime.iface" %6, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %8 -// CHECK-NEXT: } +// CHECK: [[WT_VALUE:%[0-9]+]] = load %main.nopCloserWriterTo, ptr %0 +// CHECK: [[WT_WRAPPED:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.nopCloserWriterTo.WriteTo(%main.nopCloserWriterTo [[WT_VALUE]], %"{{.*}}/runtime/internal/runtime.iface" %1) +// Len computes max(len(s)-i, 0). // CHECK-LABEL: define i64 @"main.(*stringReader).Len"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.String", ptr %3, align 8 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %4, 1 -// CHECK-NEXT: %6 = icmp sge i64 %2, %5 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret i64 0 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.String", ptr %7, align 8 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %8, 1 -// CHECK-NEXT: %10 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %11 = load i64, ptr %10, align 8 -// CHECK-NEXT: %12 = sub i64 %9, %11 -// CHECK-NEXT: ret i64 %12 -// CHECK-NEXT: } - +// CHECK: [[LEN_I_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[LEN_I:%[0-9]+]] = load i64, ptr [[LEN_I_FIELD]] +// CHECK: [[LEN_S_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[LEN_S_VALUE:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr [[LEN_S_FIELD]] +// CHECK-NEXT: [[LEN_S:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" [[LEN_S_VALUE]], 1 +// CHECK: [[LEN_DONE:%[0-9]+]] = icmp sge i64 [[LEN_I]], [[LEN_S]] +// CHECK: [[LEN_REMAIN:%[0-9]+]] = sub i64 %{{[0-9]+}}, %{{[0-9]+}} +// CHECK: ret i64 [[LEN_REMAIN]] + +// Read slices s at i, copies into b, advances i by n, and returns EOF at the end. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).Read"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %5 = load %"{{.*}}/runtime/internal/runtime.String", ptr %4, align 8 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %5, 1 -// CHECK-NEXT: %7 = icmp sge i64 %3, %6 -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: %9 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %8, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 -// CHECK-NEXT: %13 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %14 = load i64, ptr %13, align 8 -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %12, 1 -// CHECK-NEXT: %16 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}/runtime/internal/runtime.String" %12, i64 %14, i64 %15, i1 true, i1 true) -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 0 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 1 -// CHECK-NEXT: %19 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, ptr %17, i64 %18, i64 1) -// CHECK-NEXT: %20 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %21 = load i64, ptr %20, align 8 -// CHECK-NEXT: %22 = add i64 %21, %19 -// CHECK-NEXT: %23 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %22, ptr %23, align 8 -// CHECK-NEXT: %24 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %19, 0 -// CHECK-NEXT: %25 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %24, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %25 -// CHECK-NEXT: } - +// CHECK: [[R_I_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[R_I:%[0-9]+]] = load i64, ptr [[R_I_FIELD]] +// CHECK: [[R_S_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[R_S:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr [[R_S_FIELD]] +// CHECK-NEXT: [[R_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" [[R_S]], 1 +// CHECK: [[R_EOF:%[0-9]+]] = icmp sge i64 [[R_I]], [[R_LEN]] +// CHECK: load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF +// CHECK: store i64 -1, ptr %{{[0-9]+}} +// CHECK: [[R_SUFFIX:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}i64 [[R_SLICE_I:%[0-9]+]], +// CHECK: [[R_N:%[0-9]+]] = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, +// CHECK: [[R_NEXT:%[0-9]+]] = add i64 %{{[0-9]+}}, [[R_N]] +// CHECK: store i64 [[R_NEXT]], ptr %{{[0-9]+}} + +// ReadAt rejects negative/past-end offsets and reports EOF for a short copy. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).ReadAt"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = icmp slt i64 %2, 0 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @55, i64 37 }) -// CHECK-NEXT: %5 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %4, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %7 = load %"{{.*}}/runtime/internal/runtime.String", ptr %6, align 8 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %7, 1 -// CHECK-NEXT: %9 = icmp sge i64 %2, %8 -// CHECK-NEXT: br i1 %9, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %10 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: %11 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %10, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %12 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %13 = load %"{{.*}}/runtime/internal/runtime.String", ptr %12, align 8 -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %13, 1 -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}/runtime/internal/runtime.String" %13, i64 %2, i64 %14, i1 true, i1 true) -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %15, 0 -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %15, 1 -// CHECK-NEXT: %18 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, ptr %16, i64 %17, i64 1) -// CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %20 = icmp slt i64 %18, %19 -// CHECK-NEXT: br i1 %20, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %21 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %22 = phi %"{{.*}}/runtime/internal/runtime.iface" [ zeroinitializer, %_llgo_4 ], [ %21, %_llgo_5 ] -// CHECK-NEXT: %23 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %18, 0 -// CHECK-NEXT: %24 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %23, %"{{.*}}/runtime/internal/runtime.iface" %22, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %24 -// CHECK-NEXT: } - +// CHECK: [[RA_NEG:%[0-9]+]] = icmp slt i64 %2, 0 +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: [[RA_PAST:%[0-9]+]] = icmp sge i64 %2, %{{[0-9]+}} +// CHECK: load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF +// CHECK: [[RA_SUFFIX:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}i64 %2, +// CHECK: [[RA_N:%[0-9]+]] = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, +// CHECK: [[RA_TARGET_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 +// CHECK-NEXT: [[RA_SHORT:%[0-9]+]] = icmp slt i64 [[RA_N]], [[RA_TARGET_LEN]] + +// ReadByte invalidates prevRune, checks EOF, returns s[i], and increments i once. // CHECK-LABEL: define { i8, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).ReadByte"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %5 = load %"{{.*}}/runtime/internal/runtime.String", ptr %4, align 8 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %5, 1 -// CHECK-NEXT: %7 = icmp sge i64 %3, %6 -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: %9 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } { i8 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %8, 1 -// CHECK-NEXT: ret { i8, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %11 = load i64, ptr %10, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %13 = load %"{{.*}}/runtime/internal/runtime.String", ptr %12, align 8 -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %13, 0 -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %13, 1 -// CHECK-NEXT: %16 = icmp slt i64 %11, 0 -// CHECK-NEXT: %17 = icmp uge i64 %11, %15 -// CHECK-NEXT: %18 = or i1 %17, %16 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %18, i64 %11, i1 true, i64 %15) -// CHECK-NEXT: %19 = getelementptr inbounds i8, ptr %14, i64 %11 -// CHECK-NEXT: %20 = load i8, ptr %19, align 1 -// CHECK-NEXT: %21 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %22 = load i64, ptr %21, align 8 -// CHECK-NEXT: %23 = add i64 %22, 1 -// CHECK-NEXT: %24 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %23, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } undef, i8 %20, 0 -// CHECK-NEXT: %26 = insertvalue { i8, %"{{.*}}/runtime/internal/runtime.iface" } %25, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, 1 -// CHECK-NEXT: ret { i8, %"{{.*}}/runtime/internal/runtime.iface" } %26 -// CHECK-NEXT: } - +// CHECK: [[RB_PREV_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 +// CHECK-NEXT: store i64 -1, ptr [[RB_PREV_FIELD]] +// CHECK: [[RB_I_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[RB_I:%[0-9]+]] = load i64, ptr [[RB_I_FIELD]] +// CHECK: [[RB_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" %{{[0-9]+}}, 1 +// CHECK: [[RB_EOF:%[0-9]+]] = icmp sge i64 [[RB_I]], [[RB_LEN]] +// CHECK: [[RB_PTR:%[0-9]+]] = getelementptr inbounds i8, ptr %{{[0-9]+}}, i64 [[RB_INDEX:%[0-9]+]] +// CHECK: [[RB_BYTE:%[0-9]+]] = load i8, ptr [[RB_PTR]] +// CHECK: [[RB_NEXT:%[0-9]+]] = add i64 %{{[0-9]+}}, 1 +// CHECK: store i64 [[RB_NEXT]], ptr %{{[0-9]+}} + +// ReadRune records prevRune, has an ASCII fast path, and advances by the decoded UTF-8 width. // CHECK-LABEL: define { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).ReadRune"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load %"{{.*}}/runtime/internal/runtime.String", ptr %3, align 8 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %4, 1 -// CHECK-NEXT: %6 = icmp sge i64 %2, %5 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %7, align 8 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.EOF, align 8 -// CHECK-NEXT: %9 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } { i32 0, i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %8, 2 -// CHECK-NEXT: ret { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %11 = load i64, ptr %10, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 %11, ptr %12, align 8 -// CHECK-NEXT: %13 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %14 = load i64, ptr %13, align 8 -// CHECK-NEXT: %15 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %16 = load %"{{.*}}/runtime/internal/runtime.String", ptr %15, align 8 -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 0 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 1 -// CHECK-NEXT: %19 = icmp slt i64 %14, 0 -// CHECK-NEXT: %20 = icmp uge i64 %14, %18 -// CHECK-NEXT: %21 = or i1 %20, %19 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %21, i64 %14, i1 true, i64 %18) -// CHECK-NEXT: %22 = getelementptr inbounds i8, ptr %17, i64 %14 -// CHECK-NEXT: %23 = load i8, ptr %22, align 1 -// CHECK-NEXT: %24 = icmp ult i8 %23, -128 -// CHECK-NEXT: br i1 %24, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %25 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %26 = load i64, ptr %25, align 8 -// CHECK-NEXT: %27 = add i64 %26, 1 -// CHECK-NEXT: %28 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %27, ptr %28, align 8 -// CHECK-NEXT: %29 = zext i8 %23 to i32 -// CHECK-NEXT: %30 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %29, 0 -// CHECK-NEXT: %31 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %30, i64 1, 1 -// CHECK-NEXT: %32 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %31, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, 2 -// CHECK-NEXT: ret { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %32 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %33 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %34 = load %"{{.*}}/runtime/internal/runtime.String", ptr %33, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %36 = load i64, ptr %35, align 8 -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %34, 1 -// CHECK-NEXT: %38 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}/runtime/internal/runtime.String" %34, i64 %36, i64 %37, i1 true, i1 true) -// CHECK-NEXT: %39 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"{{.*}}/runtime/internal/runtime.String" %38) -// CHECK-NEXT: %40 = extractvalue { i32, i64 } %39, 0 -// CHECK-NEXT: %41 = extractvalue { i32, i64 } %39, 1 -// CHECK-NEXT: %42 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %43 = load i64, ptr %42, align 8 -// CHECK-NEXT: %44 = add i64 %43, %41 -// CHECK-NEXT: %45 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %44, ptr %45, align 8 -// CHECK-NEXT: %46 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i32 %40, 0 -// CHECK-NEXT: %47 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %46, i64 %41, 1 -// CHECK-NEXT: %48 = insertvalue { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %47, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, 2 -// CHECK-NEXT: ret { i32, i64, %"{{.*}}/runtime/internal/runtime.iface" } %48 -// CHECK-NEXT: } - +// CHECK: [[RR_I:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[RR_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" %{{[0-9]+}}, 1 +// CHECK: [[RR_EOF:%[0-9]+]] = icmp sge i64 [[RR_I]], [[RR_LEN]] +// CHECK: store i64 [[RR_PREV_I:%[0-9]+]], ptr %{{[0-9]+}} +// CHECK: [[RR_BYTE:%[0-9]+]] = load i8, ptr %{{[0-9]+}} +// CHECK: [[RR_ASCII:%[0-9]+]] = icmp ult i8 [[RR_BYTE]], -128 +// CHECK: [[RR_ASCII_NEXT:%[0-9]+]] = add i64 %{{[0-9]+}}, 1 +// CHECK: [[RR_RUNE:%[0-9]+]] = zext i8 [[RR_BYTE]] to i32 +// CHECK: [[RR_DECODE:%[0-9]+]] = call { i32, i64 } @"unicode/utf8.DecodeRuneInString" +// CHECK: [[RR_WIDTH:%[0-9]+]] = extractvalue { i32, i64 } [[RR_DECODE]], 1 +// CHECK: [[RR_NEXT:%[0-9]+]] = add i64 %{{[0-9]+}}, [[RR_WIDTH]] +// CHECK: store i64 [[RR_NEXT]], ptr %{{[0-9]+}} + +// Seek handles start/current/end, rejects invalid/negative results, and stores abs. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).Seek"(ptr %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %3, align 8 -// CHECK-NEXT: %4 = icmp eq i64 %2, 0 -// CHECK-NEXT: br i1 %4, label %_llgo_2, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 -// CHECK-NEXT: %5 = phi i64 [ %1, %_llgo_2 ], [ %9, %_llgo_3 ], [ %14, %_llgo_5 ] -// CHECK-NEXT: %6 = icmp slt i64 %5, 0 -// CHECK-NEXT: br i1 %6, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4 -// CHECK-NEXT: %7 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %8 = load i64, ptr %7, align 8 -// CHECK-NEXT: %9 = add i64 %8, %1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = icmp eq i64 %2, 1 -// CHECK-NEXT: br i1 %10, label %_llgo_3, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_6 -// CHECK-NEXT: %11 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 -// CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %12, 1 -// CHECK-NEXT: %14 = add i64 %13, %1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: %15 = icmp eq i64 %2, 2 -// CHECK-NEXT: br i1 %15, label %_llgo_5, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %16 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @56, i64 34 }) -// CHECK-NEXT: %17 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %16, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_1 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @57, i64 37 }) -// CHECK-NEXT: %19 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } { i64 0, %"{{.*}}/runtime/internal/runtime.iface" undef }, %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_1 -// CHECK-NEXT: %20 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %5, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %5, 0 -// CHECK-NEXT: %22 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %21, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %22 -// CHECK-NEXT: } +// CHECK: store i64 -1, ptr %{{[0-9]+}} +// CHECK: icmp eq i64 %2, 0 +// CHECK: [[SEEK_ABS:%[0-9]+]] = phi i64 +// CHECK: [[SEEK_NEG:%[0-9]+]] = icmp slt i64 [[SEEK_ABS]], 0 +// CHECK: [[SEEK_CURRENT:%[0-9]+]] = add i64 %{{[0-9]+}}, %1 +// CHECK: icmp eq i64 %2, 1 +// CHECK: [[SEEK_END:%[0-9]+]] = add i64 %{{[0-9]+}}, %1 +// CHECK: icmp eq i64 %2, 2 +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: store i64 [[SEEK_ABS]], ptr %{{[0-9]+}} // CHECK-LABEL: define i64 @"main.(*stringReader).Size"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.String", ptr %1, align 8 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %2, 1 -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: [[SIZE_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[SIZE_STRING:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr [[SIZE_FIELD]] +// CHECK-NEXT: [[SIZE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" [[SIZE_STRING]], 1 +// CHECK: ret i64 [[SIZE]] +// UnreadByte decrements i only after the beginning check and invalidates prevRune. // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*stringReader).UnreadByte"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: %3 = icmp sle i64 %2, 0 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @58, i64 48 }) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %7 = load i64, ptr %6, align 8 -// CHECK-NEXT: %8 = sub i64 %7, 1 -// CHECK-NEXT: %9 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %8, ptr %9, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } - +// CHECK: [[UB_I_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[UB_I:%[0-9]+]] = load i64, ptr [[UB_I_FIELD]] +// CHECK: [[UB_BAD:%[0-9]+]] = icmp sle i64 [[UB_I]], 0 +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: store i64 -1, ptr %{{[0-9]+}} +// CHECK: [[UB_PREV:%[0-9]+]] = sub i64 %{{[0-9]+}}, 1 +// CHECK: store i64 [[UB_PREV]], ptr %{{[0-9]+}} + +// UnreadRune requires both i > 0 and a recorded rune, then restores i and clears prevRune. // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.(*stringReader).UnreadRune"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: %3 = icmp sle i64 %2, 0 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @59, i64 49 }) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: %6 = load i64, ptr %5, align 8 -// CHECK-NEXT: %7 = icmp slt i64 %6, 0 -// CHECK-NEXT: br i1 %7, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.iface" @main.newError(%"{{.*}}/runtime/internal/runtime.String" { ptr @60, i64 62 }) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %9 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: %10 = load i64, ptr %9, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %10, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %12, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer -// CHECK-NEXT: } - +// CHECK: [[UR_I_FIELD:%[0-9]+]] = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[UR_I:%[0-9]+]] = load i64, ptr [[UR_I_FIELD]] +// CHECK: [[UR_BEGIN:%[0-9]+]] = icmp sle i64 [[UR_I]], 0 +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: [[UR_PREV:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[UR_INVALID:%[0-9]+]] = icmp slt i64 [[UR_PREV]], 0 +// CHECK: call %"{{.*}}/runtime/internal/runtime.iface" @main.newError( +// CHECK: store i64 [[UR_RESTORE:%[0-9]+]], ptr %{{[0-9]+}} +// CHECK: store i64 -1, ptr %{{[0-9]+}} + +// WriteTo writes exactly s[i:], advances by m, rejects over-reporting, and substitutes ErrShortWrite only for a nil short-write error. // CHECK-LABEL: define { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"main.(*stringReader).WriteTo"(ptr %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 2 -// CHECK-NEXT: store i64 -1, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %6 = load %"{{.*}}/runtime/internal/runtime.String", ptr %5, align 8 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %6, 1 -// CHECK-NEXT: %8 = icmp sge i64 %4, %7 -// CHECK-NEXT: br i1 %8, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } zeroinitializer -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %9 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %10 = load %"{{.*}}/runtime/internal/runtime.String", ptr %9, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %12 = load i64, ptr %11, align 8 -// CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %10, 1 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}/runtime/internal/runtime.String" %10, i64 %12, i64 %13, i1 true, i1 true) -// CHECK-NEXT: %15 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.WriteString(%"{{.*}}/runtime/internal/runtime.iface" %1, %"{{.*}}/runtime/internal/runtime.String" %14) -// CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 0 -// CHECK-NEXT: %17 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 1 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %14, 1 -// CHECK-NEXT: %19 = icmp sgt i64 %16, %18 -// CHECK-NEXT: br i1 %19, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @61, i64 48 }, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %20, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %22 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %23 = load i64, ptr %22, align 8 -// CHECK-NEXT: %24 = add i64 %23, %16 -// CHECK-NEXT: %25 = getelementptr inbounds %main.stringReader, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %24, ptr %25, align 8 -// CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %14, 1 -// CHECK-NEXT: %27 = icmp ne i64 %16, %26 -// CHECK-NEXT: br i1 %27, label %_llgo_7, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7 -// CHECK-NEXT: %28 = load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.ErrShortWrite, align 8 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_7, %_llgo_4 -// CHECK-NEXT: %29 = phi %"{{.*}}/runtime/internal/runtime.iface" [ %17, %_llgo_4 ], [ %17, %_llgo_7 ], [ %28, %_llgo_5 ] -// CHECK-NEXT: %30 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } undef, i64 %16, 0 -// CHECK-NEXT: %31 = insertvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %30, %"{{.*}}/runtime/internal/runtime.iface" %29, 1 -// CHECK-NEXT: ret { i64, %"{{.*}}/runtime/internal/runtime.iface" } %31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_4 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %17) -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %17, 1 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %32, 0 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %34, ptr %33, 1 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %36, 0 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %37, ptr null, 1 -// CHECK-NEXT: %39 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %35, %"{{.*}}/runtime/internal/runtime.eface" %38) -// CHECK-NEXT: br i1 %39, label %_llgo_5, label %_llgo_6 -// CHECK-NEXT: } +// CHECK: store i64 -1, ptr %{{[0-9]+}} +// CHECK: [[WTO_I:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK: [[WTO_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" %{{[0-9]+}}, 1 +// CHECK: [[WTO_DONE:%[0-9]+]] = icmp sge i64 [[WTO_I]], [[WTO_LEN]] +// CHECK: [[WTO_SUFFIX:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}i64 [[WTO_SLICE_I:%[0-9]+]], +// CHECK: [[WTO_RESULT:%[0-9]+]] = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @main.WriteString(%"{{.*}}/runtime/internal/runtime.iface" %1, %"{{.*}}/runtime/internal/runtime.String" [[WTO_SUFFIX]]) +// CHECK: [[WTO_N:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[WTO_RESULT]], 0 +// CHECK: [[WTO_ERR:%[0-9]+]] = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } [[WTO_RESULT]], 1 +// CHECK: [[WTO_OVER:%[0-9]+]] = icmp sgt i64 [[WTO_N]], %{{[0-9]+}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic" +// CHECK: [[WTO_NEXT:%[0-9]+]] = add i64 %{{[0-9]+}}, [[WTO_N]] +// CHECK: store i64 [[WTO_NEXT]], ptr %{{[0-9]+}} +// CHECK: [[WTO_SHORT:%[0-9]+]] = icmp ne i64 [[WTO_N]], %{{[0-9]+}} +// CHECK: load %"{{.*}}/runtime/internal/runtime.iface", ptr @main.ErrShortWrite diff --git a/cl/_testgo/recoverthenpanic/in.go b/cl/_testgo/recoverthenpanic/in.go index 0d1cfd8757..5007446a66 100644 --- a/cl/_testgo/recoverthenpanic/in.go +++ b/cl/_testgo/recoverthenpanic/in.go @@ -1,9 +1,66 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [19 x i8] c"will panic in defer", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"end", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"panic in main", align 1{{$}} +// Recovering and immediately deferring a new panic must bind the active frame, +// enqueue the recovered value, and rethrow through the surrounding frame. +// CHECK: [[WILL_PANIC:@[0-9]+]] = private unnamed_addr constant [19 x i8] c"will panic in defer" +// CHECK: [[END:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"end" +// CHECK: [[MAIN_PANIC:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"panic in main" +// CHECK-LABEL: define void @main.End(){{.*}} { +// CHECK: [[RECOVER_TOKEN:%.*]] = alloca i8 +// CHECK-NEXT: call void @"{{.*}}BindRecoverFrame"(ptr @main.End, ptr [[RECOVER_TOKEN]]) +// CHECK-NEXT: [[RECOVERED:%.*]] = call %"{{.*}}eface" @"{{.*}}Recover"(ptr [[RECOVER_TOKEN]]) +// CHECK-NEXT: [[RECOVER_IS_NIL:%.*]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[RECOVERED]], %"{{.*}}eface" zeroinitializer) +// CHECK-NEXT: [[RECOVER_NONNIL:%.*]] = xor i1 [[RECOVER_IS_NIL]], true +// CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) +// CHECK: [[FLAGS:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 1 +// CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 +// On a non-nil recovery, defer panic(recovered) captures that exact eface. +// CHECK: [[FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[FLAGS1:%.*]] = or i64 [[FLAGS0]], 1 +// CHECK-NEXT: store i64 [[FLAGS1]], ptr [[FLAGS]] +// CHECK: [[OLD_HEAD:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[NODE_PREV:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}eface" }, ptr [[NODE]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[OLD_HEAD]], ptr [[NODE_PREV]] +// CHECK: [[NODE_RECOVERED:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}eface" }, ptr [[NODE]], i32 0, i32 2 +// CHECK-NEXT: store %"{{.*}}eface" [[RECOVERED]], ptr [[NODE_RECOVERED]] +// CHECK-NEXT: store ptr [[NODE]], ptr [[HEAD]] +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr [[WILL_PANIC]], i64 19 }) +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr [[END]], i64 3 }) +// CHECK: br i1 [[RECOVER_NONNIL]], label %{{.*}}, label %{{.*}} +// CHECK: [[DEFER_MASK:%.*]] = and i64 {{%.*}}, 1 +// CHECK: call void @"{{.*}}Rethrow"(ptr [[PREV_DEFER]]) +// CHECK: [[NODE_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[NODE_CANDIDATE]], null +// CHECK: [[ACTIVE_NODE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: [[NODE_VALUE:%.*]] = load { ptr, i64, %"{{.*}}eface" }, ptr [[ACTIVE_NODE]] +// CHECK: [[NEXT_NODE:%.*]] = extractvalue { ptr, i64, %"{{.*}}eface" } [[NODE_VALUE]], 0 +// CHECK-NEXT: store ptr [[NEXT_NODE]], ptr [[HEAD]] +// CHECK-NEXT: [[REPANIC:%.*]] = extractvalue { ptr, i64, %"{{.*}}eface" } [[NODE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[ACTIVE_NODE]]) +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[REPANIC]]) +// CHECK-NEXT: unreachable + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[MAIN_PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[MAIN_FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[MAIN_PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[MAIN_FRAME]]) +// The deferred End call is wrapped in the recovery frame that lets End recover. +// CHECK: [[END_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @main.End) +// CHECK-NEXT: call void @main.End() +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[END_RECOVER]]) +// CHECK: call void @"{{.*}}Rethrow"(ptr [[MAIN_PREV_DEFER]]) +// The original panic value entering that cleanup is the source string. +// CHECK: [[MAIN_PANIC_BUF:%.*]] = call ptr @"{{.*}}AllocU"(i64 16) +// CHECK-NEXT: store %"{{.*}}String" { ptr [[MAIN_PANIC]], i64 13 }, ptr [[MAIN_PANIC_BUF]] +// CHECK-NEXT: [[MAIN_PANIC_EFACE:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[MAIN_PANIC_BUF]], 1 +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[MAIN_PANIC_EFACE]]) +// CHECK-NEXT: unreachable func End() { if recovered := recover(); recovered != nil { @@ -18,173 +75,3 @@ func main() { defer End() panic("panic in main") } - -// CHECK-LABEL: define void @main.End(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @main.End, ptr %0) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %0) -// CHECK-NEXT: %2 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: %3 = xor i1 %2, true -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %5 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 0 -// CHECK-NEXT: store ptr %5, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 2 -// CHECK-NEXT: store ptr %4, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.End, %_llgo_5), ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %6) -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 1 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 3 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 4 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %14, align 8 -// CHECK-NEXT: %15 = call i32 @{{(__)?}}sigsetjmp(ptr %5, i32 0) -// CHECK-NEXT: %16 = icmp eq i32 %15, 0 -// CHECK-NEXT: br i1 %16, label %_llgo_4, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4 -// CHECK-NEXT: %17 = load i64, ptr %11, align 8 -// CHECK-NEXT: %18 = or i64 %17, 1 -// CHECK-NEXT: store i64 %18, ptr %11, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" }, ptr %20, i32 0, i32 0 -// CHECK-NEXT: store ptr %19, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" }, ptr %20, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" }, ptr %20, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %1, ptr %23, align 8 -// CHECK-NEXT: store ptr %20, ptr %14, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 19 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@main.End, %_llgo_8), ptr %13, align 8 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.End, %_llgo_6), ptr %12, align 8 -// CHECK-NEXT: %24 = load i64, ptr %11, align 8 -// CHECK-NEXT: %25 = and i64 %24, 1 -// CHECK-NEXT: %26 = icmp ne i64 %25, 0 -// CHECK-NEXT: br i1 %26, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7, %_llgo_10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %4) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.End, %_llgo_6), ptr %13, align 8 -// CHECK-NEXT: %27 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %27, [label %_llgo_6, label %_llgo_5] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_5 -// CHECK-NEXT: %28 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %29 = icmp ne ptr %28, null -// CHECK-NEXT: br i1 %29, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_12, %_llgo_5 -// CHECK-NEXT: %30 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %6, align 8 -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %30, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %31) -// CHECK-NEXT: %32 = load ptr, ptr %13, align 8 -// CHECK-NEXT: indirectbr ptr %32, [label %_llgo_6, label %_llgo_8] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_9 -// CHECK-NEXT: %33 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %34 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" }, ptr %33, align 8 -// CHECK-NEXT: %35 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" } %34, 0 -// CHECK-NEXT: store ptr %35, ptr %14, align 8 -// CHECK-NEXT: %36 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.eface" } %34, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %36) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_9 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8, i64 {{.*}}, align 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_2), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %8, align 8 -// CHECK-NEXT: %13 = load i64, ptr %7, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @main.End) -// CHECK-NEXT: call void @main.End() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %14) -// CHECK-NEXT: %15 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %15, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %16) -// CHECK-NEXT: %17 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %17, [label %_llgo_3] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_3), ptr %9, align 8 -// CHECK-NEXT: %20 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %20, [label %_llgo_3, label %_llgo_2] -// CHECK-NEXT: } diff --git a/cl/_testgo/reflect/in.go b/cl/_testgo/reflect/in.go index 1f5c414dd6..b2307547f5 100644 --- a/cl/_testgo/reflect/in.go +++ b/cl/_testgo/reflect/in.go @@ -6,22 +6,6 @@ import ( "unsafe" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [11 x i8] c"call.method", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [7 x i8] c"closure", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} -// CHECK: {{^}}@9 = private unnamed_addr constant [12 x i8] c"call.closure", align 1{{$}} -// CHECK: {{^}}@10 = private unnamed_addr constant [4 x i8] c"func", align 1{{$}} -// CHECK: {{^}}@11 = private unnamed_addr constant [9 x i8] c"call.func", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [7 x i8] c"imethod", align 1{{$}} -// CHECK: {{^}}@18 = private unnamed_addr constant [6 x i8] c"method", align 1{{$}} -// CHECK: {{^}}@22 = private unnamed_addr constant [10 x i8] c"call.slice", align 1{{$}} -// CHECK: {{^}}@36 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@37 = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@38 = private unnamed_addr constant [14 x i8] c"MapIndex error", align 1{{$}} -// CHECK: {{^}}@39 = private unnamed_addr constant [4 x i8] c"todo", align 1{{$}} -// CHECK: {{^}}@40 = private unnamed_addr constant [12 x i8] c"must invalid", align 1{{$}} -// CHECK: {{^}}@41 = private unnamed_addr constant [13 x i8] c"MapIter error", align 1{{$}} - func main() { callSlice() callFunc() @@ -197,954 +181,73 @@ func mapDemo2() { } } -// CHECK-LABEL: define i64 @"main.(*T).Add"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 11 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %2 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = add i64 %3, %1 -// CHECK-NEXT: %5 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 %4, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %7 = load i64, ptr %6, align 8 -// CHECK-NEXT: ret i64 %7 -// CHECK-NEXT: } - // CHECK-LABEL: define void @main.callClosure(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 100, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.callClosure$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %6 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: %7 = call i64 @reflect.Value.Kind(%reflect.Value %6) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %8) -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %8, 0 -// CHECK-NEXT: %11 = getelementptr ptr, ptr %10, i64 41 -// CHECK-NEXT: %12 = load ptr, ptr %11, align 8 -// CHECK-NEXT: %13 = insertvalue { ptr, ptr } undef, ptr %12, 0 -// CHECK-NEXT: %14 = insertvalue { ptr, ptr } %13, ptr %9, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %14, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %14, 0 -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.String" %16(ptr %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %19 = getelementptr inbounds %reflect.Value, ptr %18, i64 0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %20, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %20, 1 -// CHECK-NEXT: %22 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: store %reflect.Value %22, ptr %19, align 8 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %18, 0 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, i64 1, 1 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, i64 1, 2 -// CHECK-NEXT: %26 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %6, %"{{.*}}/runtime/internal/runtime.Slice" %25) -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, 0 -// CHECK-NEXT: %28 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, 1 -// CHECK-NEXT: %29 = icmp uge i64 0, %28 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %29, i64 0, i1 true, i64 %28) -// CHECK-NEXT: %30 = getelementptr inbounds %reflect.Value, ptr %27, i64 0 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %30) -// CHECK-NEXT: %32 = load %reflect.Value, ptr %31, align 8 -// CHECK-NEXT: %33 = call i64 @reflect.Value.Int(%reflect.Value %32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %34 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %6) -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %34, 0 -// CHECK-NEXT: %36 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %35) -// CHECK-NEXT: br i1 %36, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %37, align 8 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %38) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %39 = extractvalue { ptr, ptr } %47, 1 -// CHECK-NEXT: %40 = extractvalue { ptr, ptr } %47, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %40) -// CHECK-NEXT: %41 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %39, i64 100) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %42 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %34, 1 -// CHECK-NEXT: %43 = load { ptr, ptr }, ptr %42, align 8 -// CHECK-NEXT: %44 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %43, 0 -// CHECK-NEXT: %45 = insertvalue { { ptr, ptr }, i1 } %44, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %46 = phi { { ptr, ptr }, i1 } [ %45, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %47 = extractvalue { { ptr, ptr }, i1 } %46, 0 -// CHECK-NEXT: %48 = extractvalue { { ptr, ptr }, i1 } %46, 1 -// CHECK-NEXT: br i1 %48, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } +// CHECK: %[[CLOSURE_VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[CLOSURE_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[CLOSURE_VALUE]], %"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}) +// CHECK: %[[CLOSURE_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[CLOSURE_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 0, i1 true, i64 %[[CLOSURE_LEN]]) +// CHECK: %[[CLOSURE_IFACE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %[[CLOSURE_VALUE]]) +// CHECK: %[[CLOSURE_TYPE:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[CLOSURE_IFACE]], 0 +// CHECK: %[[CLOSURE_MATCH:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %[[CLOSURE_TYPE]]) +// CHECK: br i1 %[[CLOSURE_MATCH]] +// CHECK: call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %{{[0-9]+}}, i64 100) // CHECK-LABEL: define i64 @"main.callClosure$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @9, i64 12 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = add i64 %4, %1 -// CHECK-NEXT: %6 = add i64 %5, 1 -// CHECK-NEXT: ret i64 %6 -// CHECK-NEXT: } +// CHECK: [[CC_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[CC_BASE_PTR:%[0-9]+]] = extractvalue { ptr } [[CC_ENV]], 0 +// CHECK-NEXT: [[CC_BASE:%[0-9]+]] = load i64, ptr [[CC_BASE_PTR]] +// CHECK-NEXT: [[CC_SUM:%[0-9]+]] = add i64 [[CC_BASE]], %1 +// CHECK-NEXT: [[CC_RESULT:%[0-9]+]] = add i64 [[CC_SUM]], 1 +// CHECK-NEXT: ret i64 [[CC_RESULT]] // CHECK-LABEL: define void @main.callFunc(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.callFunc$1", ptr null }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: %3 = call i64 @reflect.Value.Kind(%reflect.Value %2) -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %2) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 41 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" %12(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @10, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %15 = getelementptr inbounds %reflect.Value, ptr %14, i64 0 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %16, align 8 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %16, 1 -// CHECK-NEXT: %18 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %17) -// CHECK-NEXT: store %reflect.Value %18, ptr %15, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %14, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %19, i64 1, 1 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %20, i64 1, 2 -// CHECK-NEXT: %22 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"{{.*}}/runtime/internal/runtime.Slice" %21) -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, 0 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, 1 -// CHECK-NEXT: %25 = icmp uge i64 0, %24 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %25, i64 0, i1 true, i64 %24) -// CHECK-NEXT: %26 = getelementptr inbounds %reflect.Value, ptr %23, i64 0 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %26) -// CHECK-NEXT: %28 = load %reflect.Value, ptr %27, align 8 -// CHECK-NEXT: %29 = call i64 @reflect.Value.Int(%reflect.Value %28) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %30 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %2) -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %30, 0 -// CHECK-NEXT: %32 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %31) -// CHECK-NEXT: br i1 %32, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %33, align 8 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %33, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %34) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %35 = extractvalue { ptr, ptr } %43, 1 -// CHECK-NEXT: %36 = extractvalue { ptr, ptr } %43, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %36) -// CHECK-NEXT: %37 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %35, i64 100) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %30, 1 -// CHECK-NEXT: %39 = load { ptr, ptr }, ptr %38, align 8 -// CHECK-NEXT: %40 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %39, 0 -// CHECK-NEXT: %41 = insertvalue { { ptr, ptr }, i1 } %40, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %42 = phi { { ptr, ptr }, i1 } [ %41, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %43 = extractvalue { { ptr, ptr }, i1 } %42, 0 -// CHECK-NEXT: %44 = extractvalue { { ptr, ptr }, i1 } %42, 1 -// CHECK-NEXT: br i1 %44, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @"main.callFunc$1"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @11, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %1 = add i64 %0, 1 -// CHECK-NEXT: ret i64 %1 -// CHECK-NEXT: } +// CHECK: %[[FUNC_VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[FUNC_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[FUNC_VALUE]], %"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}) +// CHECK: %[[FUNC_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[FUNC_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 0, i1 true, i64 %[[FUNC_LEN]]) +// CHECK: call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %[[FUNC_VALUE]]) // CHECK-LABEL: define void @main.callIMethod(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %5, 0 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %7, ptr %6, 1 -// CHECK-NEXT: %9 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %8) -// CHECK-NEXT: %10 = call %reflect.Value @reflect.Value.Method(%reflect.Value %9, i64 0) -// CHECK-NEXT: %11 = call i64 @reflect.Value.Kind(%reflect.Value %10) -// CHECK-NEXT: %12 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %10) -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %12) -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %12, 0 -// CHECK-NEXT: %15 = getelementptr ptr, ptr %14, i64 41 -// CHECK-NEXT: %16 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 -// CHECK-NEXT: %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 -// CHECK-NEXT: %19 = extractvalue { ptr, ptr } %18, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %18, 0 -// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.String" %20(ptr %19) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %21) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %23 = getelementptr inbounds %reflect.Value, ptr %22, i64 0 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %24, 1 -// CHECK-NEXT: %26 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %25) -// CHECK-NEXT: store %reflect.Value %26, ptr %23, align 8 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %22, 0 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %27, i64 1, 1 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %28, i64 1, 2 -// CHECK-NEXT: %30 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %10, %"{{.*}}/runtime/internal/runtime.Slice" %29) -// CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, 0 -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, 1 -// CHECK-NEXT: %33 = icmp uge i64 0, %32 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %33, i64 0, i1 true, i64 %32) -// CHECK-NEXT: %34 = getelementptr inbounds %reflect.Value, ptr %31, i64 0 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %34) -// CHECK-NEXT: %36 = load %reflect.Value, ptr %35, align 8 -// CHECK-NEXT: %37 = call i64 @reflect.Value.Int(%reflect.Value %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %38 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %10) -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %38, 0 -// CHECK-NEXT: %40 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %39) -// CHECK-NEXT: br i1 %40, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %41, align 8 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %41, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %42) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %43 = extractvalue { ptr, ptr } %69, 1 -// CHECK-NEXT: %44 = extractvalue { ptr, ptr } %69, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %44) -// CHECK-NEXT: %45 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %43, i64 1) -// CHECK-NEXT: %46 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %10) -// CHECK-NEXT: %47 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %46) -// CHECK-NEXT: %48 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %49 = getelementptr inbounds %reflect.Value, ptr %48, i64 0 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %50, align 8 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %50, 1 -// CHECK-NEXT: %52 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %51) -// CHECK-NEXT: store %reflect.Value %52, ptr %49, align 8 -// CHECK-NEXT: %53 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %48, 0 -// CHECK-NEXT: %54 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %53, i64 1, 1 -// CHECK-NEXT: %55 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %54, i64 1, 2 -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %47, %"{{.*}}/runtime/internal/runtime.Slice" %55) -// CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %56, 0 -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %56, 1 -// CHECK-NEXT: %59 = icmp uge i64 0, %58 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %59, i64 0, i1 true, i64 %58) -// CHECK-NEXT: %60 = getelementptr inbounds %reflect.Value, ptr %57, i64 0 -// CHECK-NEXT: %61 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %60) -// CHECK-NEXT: %62 = load %reflect.Value, ptr %61, align 8 -// CHECK-NEXT: %63 = call i64 @reflect.Value.Int(%reflect.Value %62) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %63) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %64 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %38, 1 -// CHECK-NEXT: %65 = load { ptr, ptr }, ptr %64, align 8 -// CHECK-NEXT: %66 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %65, 0 -// CHECK-NEXT: %67 = insertvalue { { ptr, ptr }, i1 } %66, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %68 = phi { { ptr, ptr }, i1 } [ %67, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %69 = extractvalue { { ptr, ptr }, i1 } %68, 0 -// CHECK-NEXT: %70 = extractvalue { { ptr, ptr }, i1 } %68, 1 -// CHECK-NEXT: br i1 %70, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } +// CHECK: %[[IFACE_VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[IFACE_METHOD:[0-9]+]] = call %reflect.Value @reflect.Value.Method(%reflect.Value %[[IFACE_VALUE]], i64 0) +// CHECK: %[[IFACE_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[IFACE_METHOD]],{{.*}}) +// CHECK: call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %[[IFACE_METHOD]]) +// CHECK: call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %{{[0-9]+}}, i64 1) // CHECK-LABEL: define void @main.callMethod(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.T, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.T", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: %4 = call %reflect.Value @reflect.Value.Method(%reflect.Value %3, i64 0) -// CHECK-NEXT: %5 = call i64 @reflect.Value.Kind(%reflect.Value %4) -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %4) -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 41 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" %14(ptr %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %17 = getelementptr inbounds %reflect.Value, ptr %16, i64 0 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %18, 1 -// CHECK-NEXT: %20 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: store %reflect.Value %20, ptr %17, align 8 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %16, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %21, i64 1, 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, i64 1, 2 -// CHECK-NEXT: %24 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %4, %"{{.*}}/runtime/internal/runtime.Slice" %23) -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 0 -// CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 1 -// CHECK-NEXT: %27 = icmp uge i64 0, %26 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %27, i64 0, i1 true, i64 %26) -// CHECK-NEXT: %28 = getelementptr inbounds %reflect.Value, ptr %25, i64 0 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %28) -// CHECK-NEXT: %30 = load %reflect.Value, ptr %29, align 8 -// CHECK-NEXT: %31 = call i64 @reflect.Value.Int(%reflect.Value %30) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %31) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %32 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %4) -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %32, 0 -// CHECK-NEXT: %34 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %33) -// CHECK-NEXT: br i1 %34, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %35, align 8 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %35, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %36) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %37 = extractvalue { ptr, ptr } %63, 1 -// CHECK-NEXT: %38 = extractvalue { ptr, ptr } %63, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %38) -// CHECK-NEXT: %39 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %37, i64 1) -// CHECK-NEXT: %40 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %4) -// CHECK-NEXT: %41 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %40) -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %43 = getelementptr inbounds %reflect.Value, ptr %42, i64 0 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %44, 1 -// CHECK-NEXT: %46 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %45) -// CHECK-NEXT: store %reflect.Value %46, ptr %43, align 8 -// CHECK-NEXT: %47 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %42, 0 -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %47, i64 1, 1 -// CHECK-NEXT: %49 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %48, i64 1, 2 -// CHECK-NEXT: %50 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %41, %"{{.*}}/runtime/internal/runtime.Slice" %49) -// CHECK-NEXT: %51 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %50, 0 -// CHECK-NEXT: %52 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %50, 1 -// CHECK-NEXT: %53 = icmp uge i64 0, %52 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %53, i64 0, i1 true, i64 %52) -// CHECK-NEXT: %54 = getelementptr inbounds %reflect.Value, ptr %51, i64 0 -// CHECK-NEXT: %55 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %54) -// CHECK-NEXT: %56 = load %reflect.Value, ptr %55, align 8 -// CHECK-NEXT: %57 = call i64 @reflect.Value.Int(%reflect.Value %56) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %57) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %32, 1 -// CHECK-NEXT: %59 = load { ptr, ptr }, ptr %58, align 8 -// CHECK-NEXT: %60 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %59, 0 -// CHECK-NEXT: %61 = insertvalue { { ptr, ptr }, i1 } %60, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %62 = phi { { ptr, ptr }, i1 } [ %61, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %63 = extractvalue { { ptr, ptr }, i1 } %62, 0 -// CHECK-NEXT: %64 = extractvalue { { ptr, ptr }, i1 } %62, 1 -// CHECK-NEXT: br i1 %64, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } +// CHECK: %[[RECV_VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[METHOD_VALUE:[0-9]+]] = call %reflect.Value @reflect.Value.Method(%reflect.Value %[[RECV_VALUE]], i64 0) +// CHECK: %[[METHOD_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[METHOD_VALUE]],{{.*}}) +// CHECK: call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %[[METHOD_VALUE]]) // CHECK-LABEL: define void @main.callSlice(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$FjMjjQr3-2iTiWyZP1IIQFOz0hUCa0OS6pEm5uVV6Pk", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 288) -// CHECK-NEXT: %7 = getelementptr inbounds %reflect.Value, ptr %6, i64 0 -// CHECK-NEXT: store %reflect.Value %5, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %reflect.Value, ptr %6, i64 1 -// CHECK-NEXT: store %reflect.Value %5, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %reflect.Value, ptr %6, i64 2 -// CHECK-NEXT: store %reflect.Value %5, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %reflect.Value, ptr %6, i64 3 -// CHECK-NEXT: store %reflect.Value %5, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %reflect.Value, ptr %6, i64 4 -// CHECK-NEXT: store %reflect.Value %5, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %reflect.Value, ptr %6, i64 5 -// CHECK-NEXT: store %reflect.Value %5, ptr %12, align 8 -// CHECK-NEXT: %13 = getelementptr inbounds %reflect.Value, ptr %6, i64 6 -// CHECK-NEXT: store %reflect.Value %5, ptr %13, align 8 -// CHECK-NEXT: %14 = getelementptr inbounds %reflect.Value, ptr %6, i64 7 -// CHECK-NEXT: store %reflect.Value %5, ptr %14, align 8 -// CHECK-NEXT: %15 = getelementptr inbounds %reflect.Value, ptr %6, i64 8 -// CHECK-NEXT: store %reflect.Value %5, ptr %15, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds %reflect.Value, ptr %6, i64 9 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %17, 1 -// CHECK-NEXT: %19 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: store %reflect.Value %19, ptr %16, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds %reflect.Value, ptr %6, i64 10 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %21, align 8 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %21, 1 -// CHECK-NEXT: %23 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %22) -// CHECK-NEXT: store %reflect.Value %23, ptr %20, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds %reflect.Value, ptr %6, i64 11 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 3, ptr %25, align 8 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %25, 1 -// CHECK-NEXT: %27 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %26) -// CHECK-NEXT: store %reflect.Value %27, ptr %24, align 8 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %6, 0 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %28, i64 12, 1 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %29, i64 12, 2 -// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %2, %"{{.*}}/runtime/internal/runtime.Slice" %30) -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 0 -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 -// CHECK-NEXT: %34 = icmp uge i64 0, %33 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %34, i64 0, i1 true, i64 %33) -// CHECK-NEXT: %35 = getelementptr inbounds %reflect.Value, ptr %32, i64 0 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %35) -// CHECK-NEXT: %37 = load %reflect.Value, ptr %36, align 8 -// CHECK-NEXT: %38 = call i64 @reflect.Value.Int(%reflect.Value %37) -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 0 -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 -// CHECK-NEXT: %41 = icmp uge i64 1, %40 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %41, i64 1, i1 true, i64 %40) -// CHECK-NEXT: %42 = getelementptr inbounds %reflect.Value, ptr %39, i64 1 -// CHECK-NEXT: %43 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %42) -// CHECK-NEXT: %44 = load %reflect.Value, ptr %43, align 8 -// CHECK-NEXT: %45 = call i64 @reflect.Value.Int(%reflect.Value %44) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 240) -// CHECK-NEXT: %47 = getelementptr inbounds %reflect.Value, ptr %46, i64 0 -// CHECK-NEXT: store %reflect.Value %5, ptr %47, align 8 -// CHECK-NEXT: %48 = getelementptr inbounds %reflect.Value, ptr %46, i64 1 -// CHECK-NEXT: store %reflect.Value %5, ptr %48, align 8 -// CHECK-NEXT: %49 = getelementptr inbounds %reflect.Value, ptr %46, i64 2 -// CHECK-NEXT: store %reflect.Value %5, ptr %49, align 8 -// CHECK-NEXT: %50 = getelementptr inbounds %reflect.Value, ptr %46, i64 3 -// CHECK-NEXT: store %reflect.Value %5, ptr %50, align 8 -// CHECK-NEXT: %51 = getelementptr inbounds %reflect.Value, ptr %46, i64 4 -// CHECK-NEXT: store %reflect.Value %5, ptr %51, align 8 -// CHECK-NEXT: %52 = getelementptr inbounds %reflect.Value, ptr %46, i64 5 -// CHECK-NEXT: store %reflect.Value %5, ptr %52, align 8 -// CHECK-NEXT: %53 = getelementptr inbounds %reflect.Value, ptr %46, i64 6 -// CHECK-NEXT: store %reflect.Value %5, ptr %53, align 8 -// CHECK-NEXT: %54 = getelementptr inbounds %reflect.Value, ptr %46, i64 7 -// CHECK-NEXT: store %reflect.Value %5, ptr %54, align 8 -// CHECK-NEXT: %55 = getelementptr inbounds %reflect.Value, ptr %46, i64 8 -// CHECK-NEXT: store %reflect.Value %5, ptr %55, align 8 -// CHECK-NEXT: %56 = getelementptr inbounds %reflect.Value, ptr %46, i64 9 -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) -// CHECK-NEXT: %58 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %57, i64 0 -// CHECK-NEXT: %59 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %59, align 8 -// CHECK-NEXT: %60 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %59, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %60, ptr %58, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %57, i64 1 -// CHECK-NEXT: %62 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %62, align 8 -// CHECK-NEXT: %63 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %62, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %63, ptr %61, align 8 -// CHECK-NEXT: %64 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %57, i64 2 -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 3, ptr %65, align 8 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %65, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %66, ptr %64, align 8 -// CHECK-NEXT: %67 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %57, 0 -// CHECK-NEXT: %68 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %67, i64 3, 1 -// CHECK-NEXT: %69 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %68, i64 3, 2 -// CHECK-NEXT: %70 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %69, ptr %70, align 8 -// CHECK-NEXT: %71 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_any", ptr undef }, ptr %70, 1 -// CHECK-NEXT: %72 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %71) -// CHECK-NEXT: store %reflect.Value %72, ptr %56, align 8 -// CHECK-NEXT: %73 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %46, 0 -// CHECK-NEXT: %74 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %73, i64 10, 1 -// CHECK-NEXT: %75 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %74, i64 10, 2 -// CHECK-NEXT: %76 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.CallSlice(%reflect.Value %2, %"{{.*}}/runtime/internal/runtime.Slice" %75) -// CHECK-NEXT: %77 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, 0 -// CHECK-NEXT: %78 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, 1 -// CHECK-NEXT: %79 = icmp uge i64 0, %78 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %79, i64 0, i1 true, i64 %78) -// CHECK-NEXT: %80 = getelementptr inbounds %reflect.Value, ptr %77, i64 0 -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %80) -// CHECK-NEXT: %82 = load %reflect.Value, ptr %81, align 8 -// CHECK-NEXT: %83 = call i64 @reflect.Value.Int(%reflect.Value %82) -// CHECK-NEXT: %84 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, 0 -// CHECK-NEXT: %85 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, 1 -// CHECK-NEXT: %86 = icmp uge i64 1, %85 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %86, i64 1, i1 true, i64 %85) -// CHECK-NEXT: %87 = getelementptr inbounds %reflect.Value, ptr %84, i64 1 -// CHECK-NEXT: %88 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %87) -// CHECK-NEXT: %89 = load %reflect.Value, ptr %88, align 8 -// CHECK-NEXT: %90 = call i64 @reflect.Value.Int(%reflect.Value %89) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %83) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %90) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define { i64, i64 } @main.demo(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, %"{{.*}}/runtime/internal/runtime.Slice" %9){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %11 = phi i64 [ 0, %_llgo_0 ], [ %36, %_llgo_4 ] -// CHECK-NEXT: %12 = phi i64 [ -1, %_llgo_0 ], [ %13, %_llgo_4 ] -// CHECK-NEXT: %13 = add i64 %12, 1 -// CHECK-NEXT: %14 = icmp slt i64 %13, %10 -// CHECK-NEXT: br i1 %14, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, 0 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, 1 -// CHECK-NEXT: %17 = icmp slt i64 %13, 0 -// CHECK-NEXT: %18 = icmp uge i64 %13, %16 -// CHECK-NEXT: %19 = or i1 %18, %17 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %19, i64 %13, i1 true, i64 %16) -// CHECK-NEXT: %20 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %15, i64 %13 -// CHECK-NEXT: %21 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %20, align 8 -// CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %21, 0 -// CHECK-NEXT: %23 = icmp eq ptr %22, @_llgo_int -// CHECK-NEXT: br i1 %23, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %24 = add i64 %0, %1 -// CHECK-NEXT: %25 = add i64 %24, %2 -// CHECK-NEXT: %26 = add i64 %25, %3 -// CHECK-NEXT: %27 = add i64 %26, %4 -// CHECK-NEXT: %28 = add i64 %27, %5 -// CHECK-NEXT: %29 = add i64 %28, %6 -// CHECK-NEXT: %30 = add i64 %29, %7 -// CHECK-NEXT: %31 = add i64 %30, %8 -// CHECK-NEXT: %32 = insertvalue { i64, i64 } undef, i64 %31, 0 -// CHECK-NEXT: %33 = insertvalue { i64, i64 } %32, i64 %11, 1 -// CHECK-NEXT: ret { i64, i64 } %33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %21, 1 -// CHECK-NEXT: %35 = load i64, ptr %34, align 8 -// CHECK-NEXT: %36 = add i64 %11, %35 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %22, ptr @_llgo_int) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @reflect.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[SLICE_FUNC:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[SLICE_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.CallSlice(%reflect.Value %[[SLICE_FUNC]], %"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}) +// CHECK: %[[SLICE_RESULT_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 0, i1 true, i64 %[[SLICE_RESULT_LEN]]) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.callSlice() -// CHECK-NEXT: call void @main.callFunc() -// CHECK-NEXT: call void @main.callClosure() -// CHECK-NEXT: call void @main.callMethod() -// CHECK-NEXT: call void @main.callIMethod() -// CHECK-NEXT: call void @main.mapDemo1() -// CHECK-NEXT: call void @main.mapDemo2() -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.callSlice() +// CHECK: call void @main.callFunc() +// CHECK: call void @main.callClosure() +// CHECK: call void @main.callMethod() +// CHECK: call void @main.callIMethod() +// CHECK: call void @main.mapDemo1() +// CHECK: call void @main.mapDemo2() // CHECK-LABEL: define void @main.mapDemo1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 2) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %1) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @36, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %3) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @37, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_string", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %6 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: %7 = call i64 @reflect.Value.Len(%reflect.Value %6) -// CHECK-NEXT: %8 = icmp ne i64 %7, 2 -// CHECK-NEXT: br i1 %8, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_0 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %9, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %9, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %10) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %11, align 8 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %11, 1 -// CHECK-NEXT: %13 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %12) -// CHECK-NEXT: %14 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %13) -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %14) -// CHECK-NEXT: %16 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %15, %"{{.*}}/runtime/internal/runtime.String" { ptr @37, i64 5 }) -// CHECK-NEXT: %17 = xor i1 %16, true -// CHECK-NEXT: br i1 %17, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %6) -// CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %18, 1 -// CHECK-NEXT: %20 = icmp ne i64 %19, 2 -// CHECK-NEXT: br i1 %20, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @38, i64 14 }, ptr %21, align 8 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %21, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %22) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %23, align 8 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %23, 1 -// CHECK-NEXT: %25 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %24) -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @39, i64 4 }, ptr %26, align 8 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 -// CHECK-NEXT: %28 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %27) -// CHECK-NEXT: call void @reflect.Value.SetMapIndex(%reflect.Value %6, %reflect.Value %25, %reflect.Value %28) -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %29, align 8 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %29, 1 -// CHECK-NEXT: %31 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %30) -// CHECK-NEXT: %32 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %31) -// CHECK-NEXT: %33 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %32) -// CHECK-NEXT: %34 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %33, %"{{.*}}/runtime/internal/runtime.String" { ptr @39, i64 4 }) -// CHECK-NEXT: %35 = xor i1 %34, true -// CHECK-NEXT: br i1 %35, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @38, i64 14 }, ptr %36, align 8 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %37) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: %38 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %38, align 8 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %38, 1 -// CHECK-NEXT: %40 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %39) -// CHECK-NEXT: %41 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %6, %reflect.Value %40) -// CHECK-NEXT: %42 = call i1 @reflect.Value.IsValid(%reflect.Value %41) -// CHECK-NEXT: br i1 %42, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @40, i64 12 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_7 -// CHECK-NEXT: %43 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %43) -// CHECK-NEXT: %45 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %43, 0 -// CHECK-NEXT: %46 = getelementptr ptr, ptr %45, i64 22 -// CHECK-NEXT: %47 = load ptr, ptr %46, align 8 -// CHECK-NEXT: %48 = insertvalue { ptr, ptr } undef, ptr %47, 0 -// CHECK-NEXT: %49 = insertvalue { ptr, ptr } %48, ptr %44, 1 -// CHECK-NEXT: %50 = extractvalue { ptr, ptr } %49, 1 -// CHECK-NEXT: %51 = extractvalue { ptr, ptr } %49, 0 -// CHECK-NEXT: %52 = call %"{{.*}}/runtime/internal/runtime.iface" %51(ptr %50) -// CHECK-NEXT: %53 = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" %52) -// CHECK-NEXT: %54 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %53) -// CHECK-NEXT: %55 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %6) -// CHECK-NEXT: %56 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %55) -// CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %55, 0 -// CHECK-NEXT: %58 = getelementptr ptr, ptr %57, i64 11 -// CHECK-NEXT: %59 = load ptr, ptr %58, align 8 -// CHECK-NEXT: %60 = insertvalue { ptr, ptr } undef, ptr %59, 0 -// CHECK-NEXT: %61 = insertvalue { ptr, ptr } %60, ptr %56, 1 -// CHECK-NEXT: %62 = extractvalue { ptr, ptr } %61, 1 -// CHECK-NEXT: %63 = extractvalue { ptr, ptr } %61, 0 -// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.iface" %63(ptr %62) -// CHECK-NEXT: %65 = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" %64) -// CHECK-NEXT: %66 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %65) -// CHECK-NEXT: %67 = call ptr @reflect.Value.MapRange(%reflect.Value %6) -// CHECK-NEXT: br label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_12 -// CHECK-NEXT: call void @reflect.Value.SetIterKey(%reflect.Value %54, ptr %67) -// CHECK-NEXT: call void @reflect.Value.SetIterValue(%reflect.Value %66, ptr %67) -// CHECK-NEXT: %68 = call i64 @reflect.Value.Int(%reflect.Value %54) -// CHECK-NEXT: %69 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %67) -// CHECK-NEXT: %70 = call i64 @reflect.Value.Int(%reflect.Value %69) -// CHECK-NEXT: %71 = icmp ne i64 %68, %70 -// CHECK-NEXT: br i1 %71, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_12 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_14, %_llgo_9 -// CHECK-NEXT: %72 = call i1 @"reflect.(*MapIter).Next"(ptr %67) -// CHECK-NEXT: br i1 %72, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_14, %_llgo_10 -// CHECK-NEXT: %73 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @41, i64 13 }, ptr %73, align 8 -// CHECK-NEXT: %74 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %73, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %74) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_10 -// CHECK-NEXT: %75 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %66) -// CHECK-NEXT: %76 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %67) -// CHECK-NEXT: %77 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %76) -// CHECK-NEXT: %78 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %75, %"{{.*}}/runtime/internal/runtime.String" %77) -// CHECK-NEXT: %79 = xor i1 %78, true -// CHECK-NEXT: br i1 %79, label %_llgo_13, label %_llgo_12 -// CHECK-NEXT: } +// CHECK: %[[MAP_VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[MAP_ENTRY:[0-9]+]] = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %[[MAP_VALUE]], %reflect.Value %{{[0-9]+}}) +// CHECK: %[[MAP_STRING:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %[[MAP_ENTRY]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %[[MAP_STRING]],{{.*}}) +// CHECK: call void @reflect.Value.SetMapIndex(%reflect.Value %[[MAP_VALUE]], %reflect.Value %{{[0-9]+}}, %reflect.Value %{{[0-9]+}}) +// CHECK: %[[MAP_ITER:[0-9]+]] = call ptr @reflect.Value.MapRange(%reflect.Value %[[MAP_VALUE]]) +// CHECK: call void @reflect.Value.SetIterKey(%reflect.Value %{{[0-9]+}}, ptr %[[MAP_ITER]]) +// CHECK: call void @reflect.Value.SetIterValue(%reflect.Value %{{[0-9]+}}, ptr %[[MAP_ITER]]) +// CHECK: call i1 @"reflect.(*MapIter).Next"(ptr %[[MAP_ITER]]) // CHECK-LABEL: define void @main.mapDemo2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" zeroinitializer, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.MapOf(%"{{.*}}/runtime/internal/runtime.iface" %2, %"{{.*}}/runtime/internal/runtime.iface" %5) -// CHECK-NEXT: %7 = call %reflect.Value @reflect.MakeMap(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %8, 1 -// CHECK-NEXT: %10 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @36, i64 5 }, ptr %11, align 8 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %11, 1 -// CHECK-NEXT: %13 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %12) -// CHECK-NEXT: call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %10, %reflect.Value %13) -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %14, 1 -// CHECK-NEXT: %16 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @37, i64 5 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: %19 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %16, %reflect.Value %19) -// CHECK-NEXT: %20 = call i64 @reflect.Value.Len(%reflect.Value %7) -// CHECK-NEXT: %21 = icmp ne i64 %20, 2 -// CHECK-NEXT: br i1 %21, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 5 }, ptr %22, align 8 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %22, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %23) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %24, 1 -// CHECK-NEXT: %26 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %25) -// CHECK-NEXT: %27 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %26) -// CHECK-NEXT: %28 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %27) -// CHECK-NEXT: %29 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %28, %"{{.*}}/runtime/internal/runtime.String" { ptr @37, i64 5 }) -// CHECK-NEXT: %30 = xor i1 %29, true -// CHECK-NEXT: br i1 %30, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.MapKeys(%reflect.Value %7) -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 -// CHECK-NEXT: %33 = icmp ne i64 %32, 2 -// CHECK-NEXT: br i1 %33, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @38, i64 14 }, ptr %34, align 8 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %34, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %35) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %36, align 8 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %36, 1 -// CHECK-NEXT: %38 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %37) -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @39, i64 4 }, ptr %39, align 8 -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %39, 1 -// CHECK-NEXT: %41 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %40) -// CHECK-NEXT: call void @reflect.Value.SetMapIndex(%reflect.Value %7, %reflect.Value %38, %reflect.Value %41) -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %42, align 8 -// CHECK-NEXT: %43 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %42, 1 -// CHECK-NEXT: %44 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %43) -// CHECK-NEXT: %45 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %44) -// CHECK-NEXT: %46 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %45) -// CHECK-NEXT: %47 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %46, %"{{.*}}/runtime/internal/runtime.String" { ptr @39, i64 4 }) -// CHECK-NEXT: %48 = xor i1 %47, true -// CHECK-NEXT: br i1 %48, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %49 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @38, i64 14 }, ptr %49, align 8 -// CHECK-NEXT: %50 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %49, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %50) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: %51 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %51, align 8 -// CHECK-NEXT: %52 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %51, 1 -// CHECK-NEXT: %53 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %52) -// CHECK-NEXT: %54 = call %reflect.Value @reflect.Value.MapIndex(%reflect.Value %7, %reflect.Value %53) -// CHECK-NEXT: %55 = call i1 @reflect.Value.IsValid(%reflect.Value %54) -// CHECK-NEXT: br i1 %55, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @40, i64 12 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_7 -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %7) -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %56) -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %56, 0 -// CHECK-NEXT: %59 = getelementptr ptr, ptr %58, i64 22 -// CHECK-NEXT: %60 = load ptr, ptr %59, align 8 -// CHECK-NEXT: %61 = insertvalue { ptr, ptr } undef, ptr %60, 0 -// CHECK-NEXT: %62 = insertvalue { ptr, ptr } %61, ptr %57, 1 -// CHECK-NEXT: %63 = extractvalue { ptr, ptr } %62, 1 -// CHECK-NEXT: %64 = extractvalue { ptr, ptr } %62, 0 -// CHECK-NEXT: %65 = call %"{{.*}}/runtime/internal/runtime.iface" %64(ptr %63) -// CHECK-NEXT: %66 = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" %65) -// CHECK-NEXT: %67 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %66) -// CHECK-NEXT: %68 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %7) -// CHECK-NEXT: %69 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %68) -// CHECK-NEXT: %70 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %68, 0 -// CHECK-NEXT: %71 = getelementptr ptr, ptr %70, i64 11 -// CHECK-NEXT: %72 = load ptr, ptr %71, align 8 -// CHECK-NEXT: %73 = insertvalue { ptr, ptr } undef, ptr %72, 0 -// CHECK-NEXT: %74 = insertvalue { ptr, ptr } %73, ptr %69, 1 -// CHECK-NEXT: %75 = extractvalue { ptr, ptr } %74, 1 -// CHECK-NEXT: %76 = extractvalue { ptr, ptr } %74, 0 -// CHECK-NEXT: %77 = call %"{{.*}}/runtime/internal/runtime.iface" %76(ptr %75) -// CHECK-NEXT: %78 = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" %77) -// CHECK-NEXT: %79 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %78) -// CHECK-NEXT: %80 = call ptr @reflect.Value.MapRange(%reflect.Value %7) -// CHECK-NEXT: br label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_12 -// CHECK-NEXT: call void @reflect.Value.SetIterKey(%reflect.Value %67, ptr %80) -// CHECK-NEXT: call void @reflect.Value.SetIterValue(%reflect.Value %79, ptr %80) -// CHECK-NEXT: %81 = call i64 @reflect.Value.Int(%reflect.Value %67) -// CHECK-NEXT: %82 = call %reflect.Value @"reflect.(*MapIter).Key"(ptr %80) -// CHECK-NEXT: %83 = call i64 @reflect.Value.Int(%reflect.Value %82) -// CHECK-NEXT: %84 = icmp ne i64 %81, %83 -// CHECK-NEXT: br i1 %84, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_12 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_14, %_llgo_9 -// CHECK-NEXT: %85 = call i1 @"reflect.(*MapIter).Next"(ptr %80) -// CHECK-NEXT: br i1 %85, label %_llgo_10, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_14, %_llgo_10 -// CHECK-NEXT: %86 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @41, i64 13 }, ptr %86, align 8 -// CHECK-NEXT: %87 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %86, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %87) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_10 -// CHECK-NEXT: %88 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %79) -// CHECK-NEXT: %89 = call %reflect.Value @"reflect.(*MapIter).Value"(ptr %80) -// CHECK-NEXT: %90 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %89) -// CHECK-NEXT: %91 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %88, %"{{.*}}/runtime/internal/runtime.String" %90) -// CHECK-NEXT: %92 = xor i1 %91, true -// CHECK-NEXT: br i1 %92, label %_llgo_13, label %_llgo_12 -// CHECK-NEXT: } +// CHECK: %[[MAP_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.MapOf(%"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}) +// CHECK: %[[MADE_MAP:[0-9]+]] = call %reflect.Value @reflect.MakeMap(%"{{.*}}/runtime/internal/runtime.iface" %[[MAP_TYPE]]) +// CHECK: call void @reflect.Value.SetMapIndex(%reflect.Value %[[MADE_MAP]], %reflect.Value %{{[0-9]+}}, %reflect.Value %{{[0-9]+}}) +// CHECK: call i64 @reflect.Value.Len(%reflect.Value %[[MADE_MAP]]) diff --git a/cl/_testgo/reflectconv/in.go b/cl/_testgo/reflectconv/in.go index 16f210cd5d..a71442a3eb 100644 --- a/cl/_testgo/reflectconv/in.go +++ b/cl/_testgo/reflectconv/in.go @@ -11,43 +11,208 @@ import ( "unsafe" ) -// CHECK: {{^}}@30 = private unnamed_addr constant [7 x i8] c"reflect", align 1{{$}} -// CHECK: {{^}}@391 = private unnamed_addr constant [58 x i8] c"ValueOf(%T(%[1]v)).Convert(%s) = %T(%[3]v), want %T(%[4]v)", align 1{{$}} -// CHECK: {{^}}@392 = private unnamed_addr constant [59 x i8] c"ValueOf(%T(%[1]v)).Convert(%s) has internal kind %v want %v", align 1{{$}} -// CHECK: {{^}}@393 = private unnamed_addr constant [63 x i8] c"Set(ValueOf(%T(%[1]v)).Convert(%s)) = %T(%[3]v), want %T(%[4]v)", align 1{{$}} -// CHECK: {{^}}@394 = private unnamed_addr constant [35 x i8] c"table entry %v is RO, should not be", align 1{{$}} -// CHECK: {{^}}@395 = private unnamed_addr constant [46 x i8] c"self-conversion output %v is RO, should not be", align 1{{$}} -// CHECK: {{^}}@396 = private unnamed_addr constant [41 x i8] c"conversion output %v is RO, should not be", align 1{{$}} -// CHECK: {{^}}@397 = private unnamed_addr constant [46 x i8] c"set(conversion output) %v is RO, should not be", align 1{{$}} -// CHECK: {{^}}@398 = private unnamed_addr constant [41 x i8] c"(%s).ConvertibleTo(%s) = false, want true", align 1{{$}} -// CHECK: {{^}}@399 = private unnamed_addr constant [52 x i8] c"ValueOf(%T(%[1]v)).CanConvert(%s) = false, want true", align 1{{$}} -// CHECK: {{^}}@400 = private unnamed_addr constant [53 x i8] c" ValueOf(%T(%[1]v)).CanConvert(%s) = false, want true", align 1{{$}} -// CHECK: {{^}}@401 = private unnamed_addr constant [49 x i8] c"RO self-conversion output %v is not RO, should be", align 1{{$}} -// CHECK: {{^}}@402 = private unnamed_addr constant [44 x i8] c"RO conversion output %v is not RO, should be", align 1{{$}} -// CHECK: {{^}}@403 = private unnamed_addr constant [41 x i8] c"@(%s).ConvertibleTo(%s) = %v, want %v: %v", align 1{{$}} -// CHECK: {{^}}@404 = private unnamed_addr constant [47 x i8] c"store/load of sNaN not faithful, got %x want %x", align 1{{$}} -// CHECK: {{^}}@407 = private unnamed_addr constant [40 x i8] c"signaling nan conversion got %x, want %x", align 1{{$}} -// CHECK: {{^}}@408 = private unnamed_addr constant [40 x i8] c"[]byte should be convertible to *[8]byte", align 1{{$}} -// CHECK: {{^}}@409 = private unnamed_addr constant [57 x i8] c"slice with length 4 should not be convertible to *[8]byte", align 1{{$}} -// CHECK: {{^}}@410 = private unnamed_addr constant [77 x i8] c"reflect: cannot convert slice with length 4 to pointer to array with length 8", align 1{{$}} -// CHECK: {{^}}@411 = private unnamed_addr constant [56 x i8] c"slice with length 4 should not be convertible to [8]byte", align 1{{$}} -// CHECK: {{^}}@412 = private unnamed_addr constant [66 x i8] c"reflect: cannot convert slice with length 4 to array with length 8", align 1{{$}} -// CHECK: {{^}}@414 = private unnamed_addr constant [65 x i8] c"convert slice to non-empty array returns a addressable copy array", align 1{{$}} -// CHECK: {{^}}@415 = private unnamed_addr constant [52 x i8] c"slice (%v) mutation visible in converted result (%v)", align 1{{$}} -// CHECK: {{^}}@420 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@421 = private unnamed_addr constant [6 x i8] c"bytes1", align 1{{$}} -// CHECK: {{^}}@422 = private unnamed_addr constant [6 x i8] c"bytes2", align 1{{$}} -// CHECK: {{^}}@423 = private unnamed_addr constant [6 x i8] c"bytes3", align 1{{$}} -// CHECK: {{^}}@424 = private unnamed_addr constant [8 x i8] c"runes\E2\99\9D", align 1{{$}} -// CHECK: {{^}}@425 = private unnamed_addr constant [8 x i8] c"runes\E2\99\95", align 1{{$}} -// CHECK: {{^}}@426 = private unnamed_addr constant [17 x i8] c"runes\F0\9F\99\88\F0\9F\99\89\F0\9F\99\8A", align 1{{$}} -// CHECK: {{^}}@427 = private unnamed_addr constant [1 x i8] c"a", align 1{{$}} -// CHECK: {{^}}@428 = private unnamed_addr constant [3 x i8] c"\EF\BF\BD", align 1{{$}} -// CHECK: {{^}}@535 = private unnamed_addr constant [13 x i8] c"did not panic", align 1{{$}} -// CHECK: {{^}}@537 = private unnamed_addr constant [32 x i8] c"panicked with unexpected type %T", align 1{{$}} -// CHECK: {{^}}@538 = private unnamed_addr constant [44 x i8] c"panic string does not start with \22reflect\22: ", align 1{{$}} -// CHECK: {{^}}@539 = private unnamed_addr constant [31 x i8] c"panic string does not contain \22", align 1{{$}} -// CHECK: {{^}}@540 = private unnamed_addr constant [3 x i8] c"\22: ", align 1{{$}} +// Interface helper values must pass through the V function value and Elem. +// CHECK-LABEL: define %reflect.Value @main.EmptyInterfaceV(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { +// CHECK: [[EV_BOX:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr [[EV_BOX]] +// CHECK-NEXT: [[EV_V:%[0-9]+]] = load { ptr, ptr }, ptr @main.V +// CHECK-NEXT: [[EV_ARG:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_any", ptr undef }, ptr [[EV_BOX]], 1 +// CHECK-NEXT: [[EV_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[EV_V]], 1 +// CHECK-NEXT: [[EV_RAW_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[EV_V]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr [[EV_RAW_CODE]]) +// CHECK-NEXT: [[EV_PTR:%[0-9]+]] = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[EV_ENV]], %"{{.*}}/runtime/internal/runtime.eface" [[EV_ARG]]) +// CHECK: [[EV_ELEM:%[0-9]+]] = call %reflect.Value @reflect.Value.Elem(%reflect.Value [[EV_PTR]]) +// CHECK: ret %reflect.Value [[EV_ELEM]] + +// IsRO reads flagStickyRO, while MakeRO sets that exact bit and returns the copy. +// CHECK-LABEL: define i1 @main.IsRO(%reflect.Value %0){{.*}} { +// CHECK: [[RO_VALUE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: store %reflect.Value %0, ptr [[RO_VALUE]] +// CHECK-NEXT: [[RO_FLAG_PTR:%[0-9]+]] = getelementptr inbounds %main.Value, ptr [[RO_VALUE]], i32 0, i32 2 +// CHECK: [[RO_FLAGS:%[0-9]+]] = load i64, ptr [[RO_FLAG_PTR]] +// CHECK: [[RO_BIT:%[0-9]+]] = and i64 [[RO_FLAGS]], 32 +// CHECK: [[RO_SET:%[0-9]+]] = icmp ne i64 [[RO_BIT]], 0 +// CHECK: ret i1 [[RO_SET]] + +// CHECK-LABEL: define %reflect.Value @main.MakeRO(%reflect.Value %0){{.*}} { +// CHECK: [[MAKE_VALUE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: store %reflect.Value %0, ptr [[MAKE_VALUE]] +// CHECK-NEXT: [[MAKE_FLAG_PTR:%[0-9]+]] = getelementptr inbounds %main.Value, ptr [[MAKE_VALUE]], i32 0, i32 2 +// CHECK: [[MAKE_FLAGS:%[0-9]+]] = load i64, ptr [[MAKE_FLAG_PTR]] +// CHECK: [[MAKE_RO_FLAGS:%[0-9]+]] = or i64 [[MAKE_FLAGS]], 32 +// CHECK: [[MAKE_STORE_PTR:%[0-9]+]] = getelementptr inbounds %main.Value, ptr [[MAKE_VALUE]], i32 0, i32 2 +// CHECK-NEXT: store i64 [[MAKE_RO_FLAGS]], ptr [[MAKE_STORE_PTR]] +// CHECK-NEXT: [[MAKE_RESULT:%[0-9]+]] = load %reflect.Value, ptr [[MAKE_VALUE]] +// CHECK: ret %reflect.Value [[MAKE_RESULT]] + +// CHECK-LABEL: define %reflect.Value @main.ReadWriterV(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { +// CHECK: [[RW_BOX:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr [[RW_BOX]] +// CHECK-NEXT: [[RW_V:%[0-9]+]] = load { ptr, ptr }, ptr @main.V +// CHECK-NEXT: [[RW_ARG:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.ReadWriter", ptr undef }, ptr [[RW_BOX]], 1 +// CHECK-NEXT: [[RW_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[RW_V]], 1 +// CHECK-NEXT: [[RW_RAW_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[RW_V]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr [[RW_RAW_CODE]]) +// CHECK-NEXT: [[RW_PTR:%[0-9]+]] = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[RW_ENV]], %"{{.*}}/runtime/internal/runtime.eface" [[RW_ARG]]) +// CHECK: [[RW_ELEM:%[0-9]+]] = call %reflect.Value @reflect.Value.Elem(%reflect.Value [[RW_PTR]]) +// CHECK: ret %reflect.Value [[RW_ELEM]] + +// CHECK-LABEL: define %reflect.Value @main.ReaderV(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { +// CHECK: [[R_BOX:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr [[R_BOX]] +// CHECK-NEXT: [[R_V:%[0-9]+]] = load { ptr, ptr }, ptr @main.V +// CHECK-NEXT: [[R_ARG:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Reader", ptr undef }, ptr [[R_BOX]], 1 +// CHECK-NEXT: [[R_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[R_V]], 1 +// CHECK-NEXT: [[R_RAW_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[R_V]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr [[R_RAW_CODE]]) +// CHECK-NEXT: [[R_PTR:%[0-9]+]] = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[R_ENV]], %"{{.*}}/runtime/internal/runtime.eface" [[R_ARG]]) +// CHECK: [[R_ELEM:%[0-9]+]] = call %reflect.Value @reflect.Value.Elem(%reflect.Value [[R_PTR]]) +// CHECK: ret %reflect.Value [[R_ELEM]] + +// Each table entry records t1 -> t2, verifies both conversions, then proves the +// converted value can be assigned and that the read-only bit is preserved. +// CHECK-LABEL: define void @main.TestConvert(ptr %0){{.*}} { +// CHECK: [[CAN_MAP:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map{{\[\[2\]}}_llgo_reflect.Type]_llgo_bool", i64 0) +// CHECK: [[ALL_MAP:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_reflect.Type]_llgo_bool", i64 0) +// CHECK: [[CONVERT_TABLE:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr @main.convertTests +// CHECK: [[ENTRY_PTR:%[0-9]+]] = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %{{[0-9]+}}, i64 %{{[0-9]+}} +// CHECK: [[ENTRY:%[0-9]+]] = load { %reflect.Value, %reflect.Value }, ptr [[ENTRY_PTR]] +// CHECK: [[IN_VALUE:%[0-9]+]] = load %reflect.Value, ptr %{{[0-9]+}} +// CHECK: [[T1:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value [[IN_VALUE]]) +// CHECK: [[SELF_CONVERTIBLE:%[0-9]+]] = call i1 %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" [[T1]]) +// CHECK: br i1 [[SELF_CONVERTIBLE]], +// CHECK: [[OUT_VALUE:%[0-9]+]] = load %reflect.Value, ptr %{{[0-9]+}} +// CHECK: [[T2:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value [[OUT_VALUE]]) +// CHECK: [[PAIR_CONVERTIBLE:%[0-9]+]] = call i1 %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" [[T2]]) +// CHECK: br i1 [[PAIR_CONVERTIBLE]], +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr [[ALL_MAP]], +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr [[ALL_MAP]], +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map{{\[\[2\]}}_llgo_reflect.Type]_llgo_bool", ptr [[CAN_MAP]], +// CHECK: [[V1:%[0-9]+]] = load %reflect.Value, ptr %{{[0-9]+}} +// CHECK: [[V1_CAN_SELF:%[0-9]+]] = call i1 @reflect.Value.CanConvert(%reflect.Value [[V1]], %"{{.*}}/runtime/internal/runtime.iface" [[T1]]) +// CHECK: br i1 [[V1_CAN_SELF]], +// CHECK: [[VOUT1:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[V1]], %"{{.*}}/runtime/internal/runtime.iface" [[T1]]) +// CHECK: [[OUT1:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value [[VOUT1]]) +// CHECK: [[V1_CAN_OUT:%[0-9]+]] = call i1 @reflect.Value.CanConvert(%reflect.Value [[V1]], %"{{.*}}/runtime/internal/runtime.iface" [[T2]]) +// CHECK: br i1 [[V1_CAN_OUT]], +// CHECK: [[SELF_EQUAL:%[0-9]+]] = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" [[OUT1]], %"{{.*}}/runtime/internal/runtime.eface" %{{[0-9]+}}) +// CHECK: br i1 [[SELF_EQUAL]], +// CHECK: [[VOUT2:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[V1]], %"{{.*}}/runtime/internal/runtime.iface" [[T2]]) +// CHECK: [[OUT2:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value [[VOUT2]]) +// CHECK: [[OUT_KIND:%[0-9]+]] = call i64 @reflect.Value.Kind(%reflect.Value [[VOUT2]]) +// CHECK: [[TYPE_KIND:%[0-9]+]] = call i64 %{{[0-9]+}}(ptr %{{[0-9]+}}) +// CHECK: [[BAD_KIND:%[0-9]+]] = icmp ne i64 [[OUT_KIND]], [[TYPE_KIND]] +// CHECK: [[OUT_EQUAL:%[0-9]+]] = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" [[OUT2]], %"{{.*}}/runtime/internal/runtime.eface" %{{[0-9]+}}) +// CHECK: br i1 [[OUT_EQUAL]], +// CHECK: [[NEW_OUT:%[0-9]+]] = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" [[T2]]) +// CHECK: [[VOUT3:%[0-9]+]] = call %reflect.Value @reflect.Value.Elem(%reflect.Value [[NEW_OUT]]) +// CHECK: call void @reflect.Value.Set(%reflect.Value [[VOUT3]], %reflect.Value [[VOUT2]]) +// CHECK: [[OUT3:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value [[VOUT3]]) +// CHECK: call i1 @main.IsRO(%reflect.Value [[V1]]) +// CHECK: [[OUT3_EQUAL:%[0-9]+]] = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" [[OUT3]], %"{{.*}}/runtime/internal/runtime.eface" %{{[0-9]+}}) +// CHECK: br i1 [[OUT3_EQUAL]], +// CHECK: call i1 @main.IsRO(%reflect.Value [[VOUT1]]) +// CHECK: call i1 @main.IsRO(%reflect.Value [[VOUT2]]) +// CHECK: call i1 @main.IsRO(%reflect.Value [[VOUT3]]) +// CHECK: [[RO_SELF_IN:%[0-9]+]] = call %reflect.Value @main.MakeRO(%reflect.Value [[V1]]) +// CHECK: [[RO_SELF_OUT:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[RO_SELF_IN]], %"{{.*}}/runtime/internal/runtime.iface" [[T1]]) +// CHECK: [[RO_SELF_OK:%[0-9]+]] = call i1 @main.IsRO(%reflect.Value [[RO_SELF_OUT]]) +// CHECK: br i1 [[RO_SELF_OK]], +// CHECK: [[RO_PAIR_IN:%[0-9]+]] = call %reflect.Value @main.MakeRO(%reflect.Value [[V1]]) +// CHECK: [[RO_PAIR_OUT:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[RO_PAIR_IN]], %"{{.*}}/runtime/internal/runtime.iface" [[T2]]) +// CHECK: [[RO_PAIR_OK:%[0-9]+]] = call i1 @main.IsRO(%reflect.Value [[RO_PAIR_OUT]]) +// CHECK: br i1 [[RO_PAIR_OK]], +// CHECK: call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext" +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr [[ALL_MAP]]) +// CHECK: call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext" +// CHECK: [[MATRIX_OK:%[0-9]+]] = call i1 %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}) +// CHECK: [[BAD_MATRIX:%[0-9]+]] = icmp ne i1 [[MATRIX_OK]], %{{[0-9]+}} +// CHECK: [[KNOWN_PAIR_PTR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map{{\[\[2\]}}_llgo_reflect.Type]_llgo_bool", ptr [[CAN_MAP]], +// CHECK: [[KNOWN_PAIR:%[0-9]+]] = load i1, ptr [[KNOWN_PAIR_PTR]] + +// sNaN must survive both an ordinary store/load and a reflective named-float conversion. +// CHECK-LABEL: define void @main.TestConvertNaNs(ptr %0){{.*}} { +// CHECK: [[SNAN_VALUE:%[0-9]+]] = call float @math.Float32frombits(i32 2139095041) +// CHECK: store float [[SNAN_VALUE]], ptr @main.gFloat32 +// CHECK: [[SNAN_LOAD:%[0-9]+]] = load float, ptr @main.gFloat32 +// CHECK: [[SNAN_BITS:%[0-9]+]] = call i32 @math.Float32bits(float [[SNAN_LOAD]]) +// CHECK: [[SNAN_BAD:%[0-9]+]] = icmp ne i32 [[SNAN_BITS]], 2139095041 +// CHECK: [[SNAN_X:%[0-9]+]] = call %reflect.Value %{{[^ ]+}}(ptr {{(nest|swiftself)}} %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.eface" %{{[0-9]+}}) +// CHECK: [[FLOAT32_TYPE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf( +// CHECK: [[SNAN_Y:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[SNAN_X]], %"{{.*}}/runtime/internal/runtime.iface" [[FLOAT32_TYPE]]) +// CHECK: [[SNAN_ANY:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value [[SNAN_Y]]) +// CHECK: [[SNAN_TYPE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[SNAN_ANY]], 0 +// CHECK: [[SNAN_IS_FLOAT:%[0-9]+]] = icmp eq ptr [[SNAN_TYPE]], @_llgo_float32 +// CHECK: [[SNAN_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" [[SNAN_ANY]], 1 +// CHECK: [[SNAN_FLOAT:%[0-9]+]] = load float, ptr [[SNAN_DATA]] +// CHECK: [[SNAN_CONVERT_BITS:%[0-9]+]] = call i32 @math.Float32bits(float [[SNAN_FLOAT]]) +// CHECK: [[SNAN_CONVERT_BAD:%[0-9]+]] = icmp ne i32 [[SNAN_CONVERT_BITS]], 2139095041 + +// A four-byte slice is type-convertible to *[8]byte but not value-convertible; +// both pointer-to-array and array conversions must execute inside panic closures. +// CHECK-LABEL: define void @main.TestConvertPanic(ptr %0){{.*}} { +// CHECK: [[PANIC_SLICE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"({{.*}}i64 4, +// CHECK: [[PANIC_V:%[0-9]+]] = call %reflect.Value @reflect.ValueOf( +// CHECK: [[PANIC_PT:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf( +// CHECK: [[PANIC_TYPE_OK:%[0-9]+]] = call i1 %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}) +// CHECK: br i1 [[PANIC_TYPE_OK]], +// CHECK: [[PANIC_PTR_OK:%[0-9]+]] = call i1 @reflect.Value.CanConvert(%reflect.Value %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}) +// CHECK: br i1 [[PANIC_PTR_OK]], +// CHECK: [[PANIC_PTR_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.TestConvertPanic$1", ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK: call void @main.shouldPanic({{.*}}{ ptr, ptr } [[PANIC_PTR_CLOSURE]]) +// CHECK: [[PANIC_ARRAY_TYPE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}(ptr %{{[0-9]+}}) +// CHECK: [[PANIC_ARRAY_OK:%[0-9]+]] = call i1 @reflect.Value.CanConvert(%reflect.Value %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.iface" [[PANIC_ARRAY_TYPE]]) +// CHECK: br i1 [[PANIC_ARRAY_OK]], +// CHECK: [[PANIC_ARRAY_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.TestConvertPanic$2", ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK: call void @main.shouldPanic({{.*}}{ ptr, ptr } [[PANIC_ARRAY_CLOSURE]]) + +// CHECK-LABEL: define void @"main.TestConvertPanic$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[PANIC1_ENV:%[0-9]+]] = load { ptr, ptr }, ptr %0 +// CHECK-NEXT: [[PANIC1_V_PTR:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC1_ENV]], 0 +// CHECK: [[PANIC1_V_SAFE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[PANIC1_V_PTR]]) +// CHECK-NEXT: [[PANIC1_V:%[0-9]+]] = load %reflect.Value, ptr [[PANIC1_V_SAFE]] +// CHECK-NEXT: [[PANIC1_T_PTR:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC1_ENV]], 1 +// CHECK-NEXT: [[PANIC1_T:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr [[PANIC1_T_PTR]] +// CHECK-NEXT: call %reflect.Value @reflect.Value.Convert(%reflect.Value [[PANIC1_V]], %"{{.*}}/runtime/internal/runtime.iface" [[PANIC1_T]]) + +// CHECK-LABEL: define void @"main.TestConvertPanic$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[PANIC2_ENV:%[0-9]+]] = load { ptr, ptr }, ptr %0 +// CHECK-NEXT: [[PANIC2_V_PTR:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC2_ENV]], 0 +// CHECK: [[PANIC2_V_SAFE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[PANIC2_V_PTR]]) +// CHECK-NEXT: [[PANIC2_V:%[0-9]+]] = load %reflect.Value, ptr [[PANIC2_V_SAFE]] +// CHECK-NEXT: [[PANIC2_PT_PTR:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC2_ENV]], 1 +// CHECK-NEXT: [[PANIC2_PT:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr [[PANIC2_PT_PTR]] +// CHECK-NEXT: [[PANIC2_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" [[PANIC2_PT]]) +// CHECK-NEXT: [[PANIC2_TABLE:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" [[PANIC2_PT]], 0 +// CHECK-NEXT: [[PANIC2_ELEM_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[PANIC2_TABLE]], i64 11 +// CHECK-NEXT: [[PANIC2_ELEM_METHOD:%[0-9]+]] = load ptr, ptr [[PANIC2_ELEM_SLOT]] +// CHECK-NEXT: [[PANIC2_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[PANIC2_ELEM_METHOD]], 0 +// CHECK-NEXT: [[PANIC2_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[PANIC2_PAIR0]], ptr [[PANIC2_DATA]], 1 +// CHECK-NEXT: [[PANIC2_RECV:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC2_PAIR]], 1 +// CHECK-NEXT: [[PANIC2_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[PANIC2_PAIR]], 0 +// CHECK-NEXT: [[PANIC2_AT:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" [[PANIC2_CODE]](ptr [[PANIC2_RECV]]) +// CHECK-NEXT: call %reflect.Value @reflect.Value.Convert(%reflect.Value [[PANIC2_V]], %"{{.*}}/runtime/internal/runtime.iface" [[PANIC2_AT]]) + +// Slice-to-array conversion must be a non-addressable copy: mutate ov, then read zeros from v. +// CHECK-LABEL: define void @main.TestConvertSlice2Array(ptr %0){{.*}} { +// CHECK: [[ARRAY_TYPE:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf( +// CHECK: [[SLICE_VALUE:%[0-9]+]] = call %reflect.Value @reflect.ValueOf( +// CHECK: [[ARRAY_VALUE:%[0-9]+]] = call %reflect.Value @reflect.Value.Convert(%reflect.Value [[SLICE_VALUE]], %"{{.*}}/runtime/internal/runtime.iface" [[ARRAY_TYPE]]) +// CHECK: [[ARRAY_ADDR:%[0-9]+]] = call i1 @reflect.Value.CanAddr(%reflect.Value [[ARRAY_VALUE]]) +// CHECK: br i1 [[ARRAY_ADDR]], +// CHECK: [[SLICE_ELEM:%[0-9]+]] = call %reflect.Value @reflect.Value.Index(%reflect.Value [[SLICE_VALUE]], i64 [[MUT_I:%[0-9]+]]) +// CHECK: [[NEXT_I:%[0-9]+]] = add i64 [[MUT_I]], 1 +// CHECK: [[NEXT_VALUE:%[0-9]+]] = call %reflect.Value @reflect.ValueOf( +// CHECK: call void @reflect.Value.Set(%reflect.Value [[SLICE_ELEM]], %reflect.Value [[NEXT_VALUE]]) +// CHECK: [[ARRAY_ELEM:%[0-9]+]] = call %reflect.Value @reflect.Value.Index(%reflect.Value [[ARRAY_VALUE]], i64 %{{[0-9]+}}) +// CHECK: [[ARRAY_INT:%[0-9]+]] = call i64 @reflect.Value.Int(%reflect.Value [[ARRAY_ELEM]]) +// CHECK: [[ARRAY_CHANGED:%[0-9]+]] = icmp ne i64 [[ARRAY_INT]], 0 + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.TestConvert(ptr +// CHECK: call void @main.TestConvertPanic(ptr +// CHECK: call void @main.TestConvertSlice2Array(ptr +// CHECK: call void @main.TestConvertNaNs(ptr type Value struct { typ_ unsafe.Pointer @@ -786,8919 +951,3 @@ func shouldPanic(expect string, f func()) { }() f() } - -// CHECK-LABEL: define %reflect.Value @main.EmptyInterfaceV(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_any", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: %6 = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, %"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: %7 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %6) -// CHECK-NEXT: ret %reflect.Value %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define i1 @main.IsRO(%reflect.Value %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: store %reflect.Value %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Value, ptr %1, i32 0, i32 2 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = and i64 %3, 32 -// CHECK-NEXT: %5 = icmp ne i64 %4, 0 -// CHECK-NEXT: ret i1 %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define %reflect.Value @main.MakeRO(%reflect.Value %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: store %reflect.Value %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Value, ptr %1, i32 0, i32 2 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = or i64 %3, 32 -// CHECK-NEXT: %5 = getelementptr inbounds %main.Value, ptr %1, i32 0, i32 2 -// CHECK-NEXT: store i64 %4, ptr %5, align 8 -// CHECK-NEXT: %6 = load %reflect.Value, ptr %1, align 8 -// CHECK-NEXT: ret %reflect.Value %6 -// CHECK-NEXT: } - -// CHECK-LABEL: define %reflect.Value @main.ReadWriterV(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.ReadWriter", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: %6 = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, %"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: %7 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %6) -// CHECK-NEXT: ret %reflect.Value %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define %reflect.Value @main.ReaderV(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Reader", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: %6 = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, %"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: %7 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %6) -// CHECK-NEXT: ret %reflect.Value %7 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.TestConvert(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map{{\[\[}}2]_llgo_reflect.Type]_llgo_bool", i64 0) -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_reflect.Type]_llgo_bool", i64 0) -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr @main.convertTests, align 8 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_33, %_llgo_6, %_llgo_4, %_llgo_32, %_llgo_0 -// CHECK-NEXT: %5 = phi i64 [ -1, %_llgo_0 ], [ %6, %_llgo_4 ], [ %6, %_llgo_6 ], [ %6, %_llgo_32 ], [ %6, %_llgo_33 ] -// CHECK-NEXT: %6 = add i64 %5, 1 -// CHECK-NEXT: %7 = icmp slt i64 %6, %4 -// CHECK-NEXT: br i1 %7, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 0 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 1 -// CHECK-NEXT: %10 = icmp slt i64 %6, 0 -// CHECK-NEXT: %11 = icmp uge i64 %6, %9 -// CHECK-NEXT: %12 = or i1 %11, %10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %12, i64 %6, i1 true, i64 %9) -// CHECK-NEXT: %13 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %8, i64 %6 -// CHECK-NEXT: %14 = load { %reflect.Value, %reflect.Value }, ptr %13, align 8 -// CHECK-NEXT: %15 = alloca { %reflect.Value, %reflect.Value }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %15, i8 0, i64 48, i1 false) -// CHECK-NEXT: store { %reflect.Value, %reflect.Value } %14, ptr %15, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %17 = load %reflect.Value, ptr %16, align 8 -// CHECK-NEXT: %18 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %17) -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %20 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 0 -// CHECK-NEXT: %21 = getelementptr ptr, ptr %20, i64 10 -// CHECK-NEXT: %22 = load ptr, ptr %21, align 8 -// CHECK-NEXT: %23 = insertvalue { ptr, ptr } undef, ptr %22, 0 -// CHECK-NEXT: %24 = insertvalue { ptr, ptr } %23, ptr %19, 1 -// CHECK-NEXT: %25 = extractvalue { ptr, ptr } %24, 1 -// CHECK-NEXT: %26 = extractvalue { ptr, ptr } %24, 0 -// CHECK-NEXT: %27 = call i1 %26(ptr %25, %"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: br i1 %27, label %_llgo_5, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr %2) -// CHECK-NEXT: br label %_llgo_34 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %30 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %29, i64 0 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %31, 0 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %33, ptr %32, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %34, ptr %30, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %29, i64 1 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %36, 0 -// CHECK-NEXT: %39 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %38, ptr %37, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %39, ptr %35, align 8 -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %29, 0 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %40, i64 2, 1 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %41, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @398, i64 41 }, %"{{.*}}/runtime/internal/runtime.Slice" %42) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: %43 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %44 = load %reflect.Value, ptr %43, align 8 -// CHECK-NEXT: %45 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %44) -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %47 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 0 -// CHECK-NEXT: %48 = getelementptr ptr, ptr %47, i64 10 -// CHECK-NEXT: %49 = load ptr, ptr %48, align 8 -// CHECK-NEXT: %50 = insertvalue { ptr, ptr } undef, ptr %49, 0 -// CHECK-NEXT: %51 = insertvalue { ptr, ptr } %50, ptr %46, 1 -// CHECK-NEXT: %52 = extractvalue { ptr, ptr } %51, 1 -// CHECK-NEXT: %53 = extractvalue { ptr, ptr } %51, 0 -// CHECK-NEXT: %54 = call i1 %53(ptr %52, %"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: br i1 %54, label %_llgo_7, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %55 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %56 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %55, i64 0 -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %59 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %57, 0 -// CHECK-NEXT: %60 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %59, ptr %58, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %60, ptr %56, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %55, i64 1 -// CHECK-NEXT: %62 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %63 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %45, 1 -// CHECK-NEXT: %64 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %62, 0 -// CHECK-NEXT: %65 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %64, ptr %63, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %65, ptr %61, align 8 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %55, 0 -// CHECK-NEXT: %67 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %66, i64 2, 1 -// CHECK-NEXT: %68 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %67, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @398, i64 41 }, %"{{.*}}/runtime/internal/runtime.Slice" %68) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: %69 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %18, ptr %69, align 8 -// CHECK-NEXT: %70 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr %2, ptr %69) -// CHECK-NEXT: store i1 true, ptr %70, align 1 -// CHECK-NEXT: %71 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %45, ptr %71, align 8 -// CHECK-NEXT: %72 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr %2, ptr %71) -// CHECK-NEXT: store i1 true, ptr %72, align 1 -// CHECK-NEXT: %73 = alloca [2 x %"{{.*}}/runtime/internal/runtime.iface"], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %73, i8 0, i64 32, i1 false) -// CHECK-NEXT: %74 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %73, i64 0 -// CHECK-NEXT: %75 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %73, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %18, ptr %74, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %45, ptr %75, align 8 -// CHECK-NEXT: %76 = load [2 x %"{{.*}}/runtime/internal/runtime.iface"], ptr %73, align 8 -// CHECK-NEXT: %77 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: store [2 x %"{{.*}}/runtime/internal/runtime.iface"] %76, ptr %77, align 8 -// CHECK-NEXT: %78 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map{{\[\[}}2]_llgo_reflect.Type]_llgo_bool", ptr %1, ptr %77) -// CHECK-NEXT: store i1 true, ptr %78, align 1 -// CHECK-NEXT: %79 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %80 = load %reflect.Value, ptr %79, align 8 -// CHECK-NEXT: %81 = call i1 @reflect.Value.CanConvert(%reflect.Value %80, %"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: br i1 %81, label %_llgo_9, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: %82 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %83 = load %reflect.Value, ptr %82, align 8 -// CHECK-NEXT: %84 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %83) -// CHECK-NEXT: %85 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %86 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %85, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %84, ptr %86, align 8 -// CHECK-NEXT: %87 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %85, i64 1 -// CHECK-NEXT: %88 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %89 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %90 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %88, 0 -// CHECK-NEXT: %91 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %90, ptr %89, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %91, ptr %87, align 8 -// CHECK-NEXT: %92 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %85, 0 -// CHECK-NEXT: %93 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %92, i64 2, 1 -// CHECK-NEXT: %94 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %93, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @399, i64 52 }, %"{{.*}}/runtime/internal/runtime.Slice" %94) -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8, %_llgo_7 -// CHECK-NEXT: %95 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %80, %"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %96 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %95) -// CHECK-NEXT: %97 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %95) -// CHECK-NEXT: %98 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %99 = load %reflect.Value, ptr %98, align 8 -// CHECK-NEXT: %100 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %99) -// CHECK-NEXT: %101 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %97) -// CHECK-NEXT: %102 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %97, 1 -// CHECK-NEXT: %103 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %101, 0 -// CHECK-NEXT: %104 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %103, ptr %102, 1 -// CHECK-NEXT: %105 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %100) -// CHECK-NEXT: %106 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %100, 1 -// CHECK-NEXT: %107 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %105, 0 -// CHECK-NEXT: %108 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %107, ptr %106, 1 -// CHECK-NEXT: %109 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %104, %"{{.*}}/runtime/internal/runtime.eface" %108) -// CHECK-NEXT: %110 = xor i1 %109, true -// CHECK-NEXT: br i1 %110, label %_llgo_10, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_12, %_llgo_9 -// CHECK-NEXT: %111 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %112 = load %reflect.Value, ptr %111, align 8 -// CHECK-NEXT: %113 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %112) -// CHECK-NEXT: %114 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %115 = load %reflect.Value, ptr %114, align 8 -// CHECK-NEXT: %116 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %115) -// CHECK-NEXT: %117 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %118 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %117, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %113, ptr %118, align 8 -// CHECK-NEXT: %119 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %117, i64 1 -// CHECK-NEXT: %120 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %121 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %122 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %120, 0 -// CHECK-NEXT: %123 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %122, ptr %121, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %123, ptr %119, align 8 -// CHECK-NEXT: %124 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %117, i64 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %96, ptr %124, align 8 -// CHECK-NEXT: %125 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %117, i64 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %116, ptr %125, align 8 -// CHECK-NEXT: %126 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %117, 0 -// CHECK-NEXT: %127 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %126, i64 4, 1 -// CHECK-NEXT: %128 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %127, i64 4, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @391, i64 58 }, %"{{.*}}/runtime/internal/runtime.Slice" %128) -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_12, %_llgo_10 -// CHECK-NEXT: %129 = call i1 @reflect.Value.CanConvert(%reflect.Value %80, %"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: br i1 %129, label %_llgo_14, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_9 -// CHECK-NEXT: %130 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %131 = load %reflect.Value, ptr %130, align 8 -// CHECK-NEXT: %132 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %131) -// CHECK-NEXT: %133 = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" %96, %"{{.*}}/runtime/internal/runtime.eface" %132) -// CHECK-NEXT: br i1 %133, label %_llgo_11, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_11 -// CHECK-NEXT: %134 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %135 = load %reflect.Value, ptr %134, align 8 -// CHECK-NEXT: %136 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %135) -// CHECK-NEXT: %137 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %138 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %137, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %136, ptr %138, align 8 -// CHECK-NEXT: %139 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %137, i64 1 -// CHECK-NEXT: %140 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %141 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %45, 1 -// CHECK-NEXT: %142 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %140, 0 -// CHECK-NEXT: %143 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %142, ptr %141, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %143, ptr %139, align 8 -// CHECK-NEXT: %144 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %137, 0 -// CHECK-NEXT: %145 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %144, i64 2, 1 -// CHECK-NEXT: %146 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %145, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @400, i64 53 }, %"{{.*}}/runtime/internal/runtime.Slice" %146) -// CHECK-NEXT: br label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_13, %_llgo_11 -// CHECK-NEXT: %147 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %80, %"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %148 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %147) -// CHECK-NEXT: %149 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %147) -// CHECK-NEXT: %150 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %151 = load %reflect.Value, ptr %150, align 8 -// CHECK-NEXT: %152 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %151) -// CHECK-NEXT: %153 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %149) -// CHECK-NEXT: %154 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %149, 1 -// CHECK-NEXT: %155 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %153, 0 -// CHECK-NEXT: %156 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %155, ptr %154, 1 -// CHECK-NEXT: %157 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %152) -// CHECK-NEXT: %158 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %152, 1 -// CHECK-NEXT: %159 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %157, 0 -// CHECK-NEXT: %160 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %159, ptr %158, 1 -// CHECK-NEXT: %161 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %156, %"{{.*}}/runtime/internal/runtime.eface" %160) -// CHECK-NEXT: %162 = xor i1 %161, true -// CHECK-NEXT: br i1 %162, label %_llgo_15, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_17, %_llgo_14 -// CHECK-NEXT: %163 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %164 = load %reflect.Value, ptr %163, align 8 -// CHECK-NEXT: %165 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %164) -// CHECK-NEXT: %166 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %167 = load %reflect.Value, ptr %166, align 8 -// CHECK-NEXT: %168 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %167) -// CHECK-NEXT: %169 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %170 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %169, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %165, ptr %170, align 8 -// CHECK-NEXT: %171 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %169, i64 1 -// CHECK-NEXT: %172 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %173 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %45, 1 -// CHECK-NEXT: %174 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %172, 0 -// CHECK-NEXT: %175 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %174, ptr %173, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %175, ptr %171, align 8 -// CHECK-NEXT: %176 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %169, i64 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %148, ptr %176, align 8 -// CHECK-NEXT: %177 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %169, i64 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %168, ptr %177, align 8 -// CHECK-NEXT: %178 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %169, 0 -// CHECK-NEXT: %179 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %178, i64 4, 1 -// CHECK-NEXT: %180 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %179, i64 4, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @391, i64 58 }, %"{{.*}}/runtime/internal/runtime.Slice" %180) -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_17, %_llgo_15 -// CHECK-NEXT: %181 = call i64 @reflect.Value.Kind(%reflect.Value %147) -// CHECK-NEXT: %182 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %147) -// CHECK-NEXT: %183 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %182) -// CHECK-NEXT: %184 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %182, 0 -// CHECK-NEXT: %185 = getelementptr ptr, ptr %184, i64 23 -// CHECK-NEXT: %186 = load ptr, ptr %185, align 8 -// CHECK-NEXT: %187 = insertvalue { ptr, ptr } undef, ptr %186, 0 -// CHECK-NEXT: %188 = insertvalue { ptr, ptr } %187, ptr %183, 1 -// CHECK-NEXT: %189 = extractvalue { ptr, ptr } %188, 1 -// CHECK-NEXT: %190 = extractvalue { ptr, ptr } %188, 0 -// CHECK-NEXT: %191 = call i64 %190(ptr %189) -// CHECK-NEXT: %192 = icmp ne i64 %181, %191 -// CHECK-NEXT: br i1 %192, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_14 -// CHECK-NEXT: %193 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %194 = load %reflect.Value, ptr %193, align 8 -// CHECK-NEXT: %195 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %194) -// CHECK-NEXT: %196 = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" %148, %"{{.*}}/runtime/internal/runtime.eface" %195) -// CHECK-NEXT: br i1 %196, label %_llgo_16, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: %197 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %198 = load %reflect.Value, ptr %197, align 8 -// CHECK-NEXT: %199 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %198) -// CHECK-NEXT: %200 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %201 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %200, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %199, ptr %201, align 8 -// CHECK-NEXT: %202 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %200, i64 1 -// CHECK-NEXT: %203 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %204 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %18, 1 -// CHECK-NEXT: %205 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %203, 0 -// CHECK-NEXT: %206 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %205, ptr %204, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %206, ptr %202, align 8 -// CHECK-NEXT: %207 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %200, i64 2 -// CHECK-NEXT: %208 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %181, ptr %208, align 8 -// CHECK-NEXT: %209 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Kind, ptr undef }, ptr %208, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %209, ptr %207, align 8 -// CHECK-NEXT: %210 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %200, i64 3 -// CHECK-NEXT: %211 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %191, ptr %211, align 8 -// CHECK-NEXT: %212 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Kind, ptr undef }, ptr %211, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %212, ptr %210, align 8 -// CHECK-NEXT: %213 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %200, 0 -// CHECK-NEXT: %214 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %213, i64 4, 1 -// CHECK-NEXT: %215 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %214, i64 4, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @392, i64 59 }, %"{{.*}}/runtime/internal/runtime.Slice" %215) -// CHECK-NEXT: br label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18, %_llgo_16 -// CHECK-NEXT: %216 = call %reflect.Value @reflect.New(%"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %217 = call %reflect.Value @reflect.Value.Elem(%reflect.Value %216) -// CHECK-NEXT: call void @reflect.Value.Set(%reflect.Value %217, %reflect.Value %147) -// CHECK-NEXT: %218 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %217) -// CHECK-NEXT: %219 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %217) -// CHECK-NEXT: %220 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %221 = load %reflect.Value, ptr %220, align 8 -// CHECK-NEXT: %222 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %221) -// CHECK-NEXT: %223 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %219) -// CHECK-NEXT: %224 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %219, 1 -// CHECK-NEXT: %225 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %223, 0 -// CHECK-NEXT: %226 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %225, ptr %224, 1 -// CHECK-NEXT: %227 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %222) -// CHECK-NEXT: %228 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %222, 1 -// CHECK-NEXT: %229 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %227, 0 -// CHECK-NEXT: %230 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %229, ptr %228, 1 -// CHECK-NEXT: %231 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %226, %"{{.*}}/runtime/internal/runtime.eface" %230) -// CHECK-NEXT: %232 = xor i1 %231, true -// CHECK-NEXT: br i1 %232, label %_llgo_20, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_22, %_llgo_19 -// CHECK-NEXT: %233 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 0 -// CHECK-NEXT: %234 = load %reflect.Value, ptr %233, align 8 -// CHECK-NEXT: %235 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %234) -// CHECK-NEXT: %236 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %237 = load %reflect.Value, ptr %236, align 8 -// CHECK-NEXT: %238 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %237) -// CHECK-NEXT: %239 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %240 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %239, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %235, ptr %240, align 8 -// CHECK-NEXT: %241 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %239, i64 1 -// CHECK-NEXT: %242 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %243 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %45, 1 -// CHECK-NEXT: %244 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %242, 0 -// CHECK-NEXT: %245 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %244, ptr %243, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %245, ptr %241, align 8 -// CHECK-NEXT: %246 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %239, i64 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %218, ptr %246, align 8 -// CHECK-NEXT: %247 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %239, i64 3 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %238, ptr %247, align 8 -// CHECK-NEXT: %248 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %239, 0 -// CHECK-NEXT: %249 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %248, i64 4, 1 -// CHECK-NEXT: %250 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %249, i64 4, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @393, i64 63 }, %"{{.*}}/runtime/internal/runtime.Slice" %250) -// CHECK-NEXT: br label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_22, %_llgo_20 -// CHECK-NEXT: %251 = call i1 @main.IsRO(%reflect.Value %80) -// CHECK-NEXT: br i1 %251, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_19 -// CHECK-NEXT: %252 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %15, i32 0, i32 1 -// CHECK-NEXT: %253 = load %reflect.Value, ptr %252, align 8 -// CHECK-NEXT: %254 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %253) -// CHECK-NEXT: %255 = call i1 @reflect.DeepEqual(%"{{.*}}/runtime/internal/runtime.eface" %218, %"{{.*}}/runtime/internal/runtime.eface" %254) -// CHECK-NEXT: br i1 %255, label %_llgo_21, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_21 -// CHECK-NEXT: %256 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %257 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %256, i64 0 -// CHECK-NEXT: %258 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %80, ptr %258, align 8 -// CHECK-NEXT: %259 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %258, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %259, ptr %257, align 8 -// CHECK-NEXT: %260 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %256, 0 -// CHECK-NEXT: %261 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %260, i64 1, 1 -// CHECK-NEXT: %262 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %261, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @394, i64 35 }, %"{{.*}}/runtime/internal/runtime.Slice" %262) -// CHECK-NEXT: br label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_23, %_llgo_21 -// CHECK-NEXT: %263 = call i1 @main.IsRO(%reflect.Value %95) -// CHECK-NEXT: br i1 %263, label %_llgo_25, label %_llgo_26 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_24 -// CHECK-NEXT: %264 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %265 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %264, i64 0 -// CHECK-NEXT: %266 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %95, ptr %266, align 8 -// CHECK-NEXT: %267 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %266, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %267, ptr %265, align 8 -// CHECK-NEXT: %268 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %264, 0 -// CHECK-NEXT: %269 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %268, i64 1, 1 -// CHECK-NEXT: %270 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %269, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @395, i64 46 }, %"{{.*}}/runtime/internal/runtime.Slice" %270) -// CHECK-NEXT: br label %_llgo_26 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_25, %_llgo_24 -// CHECK-NEXT: %271 = call i1 @main.IsRO(%reflect.Value %147) -// CHECK-NEXT: br i1 %271, label %_llgo_27, label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_26 -// CHECK-NEXT: %272 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %273 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %272, i64 0 -// CHECK-NEXT: %274 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %147, ptr %274, align 8 -// CHECK-NEXT: %275 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %274, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %275, ptr %273, align 8 -// CHECK-NEXT: %276 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %272, 0 -// CHECK-NEXT: %277 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %276, i64 1, 1 -// CHECK-NEXT: %278 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %277, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @396, i64 41 }, %"{{.*}}/runtime/internal/runtime.Slice" %278) -// CHECK-NEXT: br label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_27, %_llgo_26 -// CHECK-NEXT: %279 = call i1 @main.IsRO(%reflect.Value %217) -// CHECK-NEXT: br i1 %279, label %_llgo_29, label %_llgo_30 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_28 -// CHECK-NEXT: %280 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %281 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %280, i64 0 -// CHECK-NEXT: %282 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %217, ptr %282, align 8 -// CHECK-NEXT: %283 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %282, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %283, ptr %281, align 8 -// CHECK-NEXT: %284 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %280, 0 -// CHECK-NEXT: %285 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %284, i64 1, 1 -// CHECK-NEXT: %286 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %285, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @397, i64 46 }, %"{{.*}}/runtime/internal/runtime.Slice" %286) -// CHECK-NEXT: br label %_llgo_30 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_29, %_llgo_28 -// CHECK-NEXT: %287 = call %reflect.Value @main.MakeRO(%reflect.Value %80) -// CHECK-NEXT: %288 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %287, %"{{.*}}/runtime/internal/runtime.iface" %18) -// CHECK-NEXT: %289 = call i1 @main.IsRO(%reflect.Value %288) -// CHECK-NEXT: br i1 %289, label %_llgo_32, label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_30 -// CHECK-NEXT: %290 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %291 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %290, i64 0 -// CHECK-NEXT: %292 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %80, ptr %292, align 8 -// CHECK-NEXT: %293 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %292, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %293, ptr %291, align 8 -// CHECK-NEXT: %294 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %290, 0 -// CHECK-NEXT: %295 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %294, i64 1, 1 -// CHECK-NEXT: %296 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %295, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @401, i64 49 }, %"{{.*}}/runtime/internal/runtime.Slice" %296) -// CHECK-NEXT: br label %_llgo_32 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_31, %_llgo_30 -// CHECK-NEXT: %297 = call %reflect.Value @main.MakeRO(%reflect.Value %80) -// CHECK-NEXT: %298 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %297, %"{{.*}}/runtime/internal/runtime.iface" %45) -// CHECK-NEXT: %299 = call i1 @main.IsRO(%reflect.Value %298) -// CHECK-NEXT: br i1 %299, label %_llgo_1, label %_llgo_33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_32 -// CHECK-NEXT: %300 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %301 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %300, i64 0 -// CHECK-NEXT: %302 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %80, ptr %302, align 8 -// CHECK-NEXT: %303 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %302, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %303, ptr %301, align 8 -// CHECK-NEXT: %304 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %300, 0 -// CHECK-NEXT: %305 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %304, i64 1, 1 -// CHECK-NEXT: %306 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %305, i64 1, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @402, i64 44 }, %"{{.*}}/runtime/internal/runtime.Slice" %306) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_34: ; preds = %_llgo_50, %_llgo_3 -// CHECK-NEXT: %307 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %28) -// CHECK-NEXT: %308 = extractvalue { i1, ptr, ptr } %307, 0 -// CHECK-NEXT: br i1 %308, label %_llgo_45, label %_llgo_46 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_35: ; preds = %_llgo_47 -// CHECK-NEXT: %309 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %398, 1 -// CHECK-NEXT: %310 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_reflect.Type]_llgo_bool", ptr %2) -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_36: ; preds = %_llgo_47 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_37: ; preds = %_llgo_44, %_llgo_40, %_llgo_35 -// CHECK-NEXT: %311 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %310) -// CHECK-NEXT: %312 = extractvalue { i1, ptr, ptr } %311, 0 -// CHECK-NEXT: br i1 %312, label %_llgo_48, label %_llgo_49 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_38: ; preds = %_llgo_50 -// CHECK-NEXT: %313 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %406, 1 -// CHECK-NEXT: %314 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %309) -// CHECK-NEXT: %315 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %309, 1 -// CHECK-NEXT: %316 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %314, 0 -// CHECK-NEXT: %317 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %316, ptr %315, 1 -// CHECK-NEXT: %318 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %313) -// CHECK-NEXT: %319 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %313, 1 -// CHECK-NEXT: %320 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %318, 0 -// CHECK-NEXT: %321 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %320, ptr %319, 1 -// CHECK-NEXT: %322 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %317, %"{{.*}}/runtime/internal/runtime.eface" %321) -// CHECK-NEXT: br i1 %322, label %_llgo_40, label %_llgo_41 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_39: ; preds = %_llgo_41 -// CHECK-NEXT: %323 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %313) -// CHECK-NEXT: %324 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %313, 0 -// CHECK-NEXT: %325 = getelementptr ptr, ptr %324, i64 23 -// CHECK-NEXT: %326 = load ptr, ptr %325, align 8 -// CHECK-NEXT: %327 = insertvalue { ptr, ptr } undef, ptr %326, 0 -// CHECK-NEXT: %328 = insertvalue { ptr, ptr } %327, ptr %323, 1 -// CHECK-NEXT: %329 = extractvalue { ptr, ptr } %328, 1 -// CHECK-NEXT: %330 = extractvalue { ptr, ptr } %328, 0 -// CHECK-NEXT: %331 = call i64 %330(ptr %329) -// CHECK-NEXT: %332 = icmp eq i64 %331, 20 -// CHECK-NEXT: br i1 %332, label %_llgo_42, label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_40: ; preds = %_llgo_43, %_llgo_41, %_llgo_38 -// CHECK-NEXT: %333 = phi i1 [ true, %_llgo_38 ], [ true, %_llgo_41 ], [ %361, %_llgo_43 ] -// CHECK-NEXT: %334 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %309) -// CHECK-NEXT: %335 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %309, 0 -// CHECK-NEXT: %336 = getelementptr ptr, ptr %335, i64 10 -// CHECK-NEXT: %337 = load ptr, ptr %336, align 8 -// CHECK-NEXT: %338 = insertvalue { ptr, ptr } undef, ptr %337, 0 -// CHECK-NEXT: %339 = insertvalue { ptr, ptr } %338, ptr %334, 1 -// CHECK-NEXT: %340 = extractvalue { ptr, ptr } %339, 1 -// CHECK-NEXT: %341 = extractvalue { ptr, ptr } %339, 0 -// CHECK-NEXT: %342 = call i1 %341(ptr %340, %"{{.*}}/runtime/internal/runtime.iface" %313) -// CHECK-NEXT: %343 = icmp ne i1 %342, %333 -// CHECK-NEXT: br i1 %343, label %_llgo_44, label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_41: ; preds = %_llgo_38 -// CHECK-NEXT: %344 = alloca [2 x %"{{.*}}/runtime/internal/runtime.iface"], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %344, i8 0, i64 32, i1 false) -// CHECK-NEXT: %345 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %344, i64 0 -// CHECK-NEXT: %346 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %344, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %309, ptr %345, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %313, ptr %346, align 8 -// CHECK-NEXT: %347 = load [2 x %"{{.*}}/runtime/internal/runtime.iface"], ptr %344, align 8 -// CHECK-NEXT: %348 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: store [2 x %"{{.*}}/runtime/internal/runtime.iface"] %347, ptr %348, align 8 -// CHECK-NEXT: %349 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map{{\[\[}}2]_llgo_reflect.Type]_llgo_bool", ptr %1, ptr %348) -// CHECK-NEXT: %350 = load i1, ptr %349, align 1 -// CHECK-NEXT: br i1 %350, label %_llgo_40, label %_llgo_39 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_42: ; preds = %_llgo_39 -// CHECK-NEXT: %351 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %313) -// CHECK-NEXT: %352 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %313, 0 -// CHECK-NEXT: %353 = getelementptr ptr, ptr %352, i64 31 -// CHECK-NEXT: %354 = load ptr, ptr %353, align 8 -// CHECK-NEXT: %355 = insertvalue { ptr, ptr } undef, ptr %354, 0 -// CHECK-NEXT: %356 = insertvalue { ptr, ptr } %355, ptr %351, 1 -// CHECK-NEXT: %357 = extractvalue { ptr, ptr } %356, 1 -// CHECK-NEXT: %358 = extractvalue { ptr, ptr } %356, 0 -// CHECK-NEXT: %359 = call i64 %358(ptr %357) -// CHECK-NEXT: %360 = icmp eq i64 %359, 0 -// CHECK-NEXT: br label %_llgo_43 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_43: ; preds = %_llgo_42, %_llgo_39 -// CHECK-NEXT: %361 = phi i1 [ false, %_llgo_39 ], [ %360, %_llgo_42 ] -// CHECK-NEXT: br label %_llgo_40 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_44: ; preds = %_llgo_40 -// CHECK-NEXT: %362 = alloca [2 x %"{{.*}}/runtime/internal/runtime.iface"], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %362, i8 0, i64 32, i1 false) -// CHECK-NEXT: %363 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %362, i64 0 -// CHECK-NEXT: %364 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %362, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %309, ptr %363, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %313, ptr %364, align 8 -// CHECK-NEXT: %365 = load [2 x %"{{.*}}/runtime/internal/runtime.iface"], ptr %362, align 8 -// CHECK-NEXT: %366 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: store [2 x %"{{.*}}/runtime/internal/runtime.iface"] %365, ptr %366, align 8 -// CHECK-NEXT: %367 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map{{\[\[}}2]_llgo_reflect.Type]_llgo_bool", ptr %1, ptr %366) -// CHECK-NEXT: %368 = load i1, ptr %367, align 1 -// CHECK-NEXT: %369 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 80) -// CHECK-NEXT: %370 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %369, i64 0 -// CHECK-NEXT: %371 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %309) -// CHECK-NEXT: %372 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %309, 1 -// CHECK-NEXT: %373 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %371, 0 -// CHECK-NEXT: %374 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %373, ptr %372, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %374, ptr %370, align 8 -// CHECK-NEXT: %375 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %369, i64 1 -// CHECK-NEXT: %376 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %313) -// CHECK-NEXT: %377 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %313, 1 -// CHECK-NEXT: %378 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %376, 0 -// CHECK-NEXT: %379 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %378, ptr %377, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %379, ptr %375, align 8 -// CHECK-NEXT: %380 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %369, i64 2 -// CHECK-NEXT: %381 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 %342, ptr %381, align 1 -// CHECK-NEXT: %382 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %381, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %382, ptr %380, align 8 -// CHECK-NEXT: %383 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %369, i64 3 -// CHECK-NEXT: %384 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 %333, ptr %384, align 1 -// CHECK-NEXT: %385 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %384, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %385, ptr %383, align 8 -// CHECK-NEXT: %386 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %369, i64 4 -// CHECK-NEXT: %387 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 %368, ptr %387, align 1 -// CHECK-NEXT: %388 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %387, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %388, ptr %386, align 8 -// CHECK-NEXT: %389 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %369, 0 -// CHECK-NEXT: %390 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %389, i64 5, 1 -// CHECK-NEXT: %391 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %390, i64 5, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @403, i64 41 }, %"{{.*}}/runtime/internal/runtime.Slice" %391) -// CHECK-NEXT: br label %_llgo_37 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_45: ; preds = %_llgo_34 -// CHECK-NEXT: %392 = extractvalue { i1, ptr, ptr } %307, 1 -// CHECK-NEXT: %393 = extractvalue { i1, ptr, ptr } %307, 2 -// CHECK-NEXT: %394 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %392, align 8 -// CHECK-NEXT: %395 = load i1, ptr %393, align 1 -// CHECK-NEXT: %396 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } { i1 true, %"{{.*}}/runtime/internal/runtime.iface" undef, i1 undef }, %"{{.*}}/runtime/internal/runtime.iface" %394, 1 -// CHECK-NEXT: %397 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %396, i1 %395, 2 -// CHECK-NEXT: br label %_llgo_47 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_46: ; preds = %_llgo_34 -// CHECK-NEXT: br label %_llgo_47 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_47: ; preds = %_llgo_46, %_llgo_45 -// CHECK-NEXT: %398 = phi { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %397, %_llgo_45 ], [ zeroinitializer, %_llgo_46 ] -// CHECK-NEXT: %399 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %398, 0 -// CHECK-NEXT: br i1 %399, label %_llgo_35, label %_llgo_36 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_48: ; preds = %_llgo_37 -// CHECK-NEXT: %400 = extractvalue { i1, ptr, ptr } %311, 1 -// CHECK-NEXT: %401 = extractvalue { i1, ptr, ptr } %311, 2 -// CHECK-NEXT: %402 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %400, align 8 -// CHECK-NEXT: %403 = load i1, ptr %401, align 1 -// CHECK-NEXT: %404 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } { i1 true, %"{{.*}}/runtime/internal/runtime.iface" undef, i1 undef }, %"{{.*}}/runtime/internal/runtime.iface" %402, 1 -// CHECK-NEXT: %405 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %404, i1 %403, 2 -// CHECK-NEXT: br label %_llgo_50 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_49: ; preds = %_llgo_37 -// CHECK-NEXT: br label %_llgo_50 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_50: ; preds = %_llgo_49, %_llgo_48 -// CHECK-NEXT: %406 = phi { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %405, %_llgo_48 ], [ zeroinitializer, %_llgo_49 ] -// CHECK-NEXT: %407 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.iface", i1 } %406, 0 -// CHECK-NEXT: br i1 %407, label %_llgo_38, label %_llgo_34 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.TestConvertNaNs(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call float @math.Float32frombits(i32 2139095041) -// CHECK-NEXT: store float %1, ptr @main.gFloat32, align 4 -// CHECK-NEXT: %2 = load float, ptr @main.gFloat32, align 4 -// CHECK-NEXT: %3 = call i32 @math.Float32bits(float %2) -// CHECK-NEXT: %4 = icmp ne i32 %3, 2139095041 -// CHECK-NEXT: br i1 %4, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %5, i64 0 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 %3, ptr %7, align 4 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %7, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %8, ptr %6, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %5, i64 1 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 2139095041, ptr %10, align 4 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %10, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %11, ptr %9, align 8 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %5, 0 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %12, i64 2, 1 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %13, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @404, i64 47 }, %"{{.*}}/runtime/internal/runtime.Slice" %14) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %15 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %16 = call float @math.Float32frombits(i32 2139095041) -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float %16, ptr %17, align 4 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.myFloat32.14.0, ptr undef }, ptr %17, 1 -// CHECK-NEXT: %19 = extractvalue { ptr, ptr } %15, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %15, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %20) -// CHECK-NEXT: %21 = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} %19, %"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 0.000000e+00, ptr %22, align 4 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %22, 1 -// CHECK-NEXT: %24 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" %23) -// CHECK-NEXT: %25 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %21, %"{{.*}}/runtime/internal/runtime.iface" %24) -// CHECK-NEXT: %26 = call %"{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %25) -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %26, 0 -// CHECK-NEXT: %28 = icmp eq ptr %27, @_llgo_float32 -// CHECK-NEXT: br i1 %28, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %30 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %29, i64 0 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 %41, ptr %31, align 4 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %31, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %32, ptr %30, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %29, i64 1 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 2139095041, ptr %34, align 4 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %34, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %35, ptr %33, align 8 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %29, 0 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %36, i64 2, 1 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %37, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @407, i64 40 }, %"{{.*}}/runtime/internal/runtime.Slice" %38) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3, %_llgo_5 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %26, 1 -// CHECK-NEXT: %40 = load float, ptr %39, align 4 -// CHECK-NEXT: %41 = call i32 @math.Float32bits(float %40) -// CHECK-NEXT: %42 = icmp ne i32 %41, 2139095041 -// CHECK-NEXT: br i1 %42, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %27, ptr @_llgo_float32) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.TestConvertPanic(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %1, i64 1, i64 4, i64 0, i64 4, i1 true, i1 true, i1 true) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %5, 1 -// CHECK-NEXT: %7 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %6) -// CHECK-NEXT: store %reflect.Value %7, ptr %4, align 8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[8]_llgo_uint8", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %10, ptr %8, align 8 -// CHECK-NEXT: %11 = load %reflect.Value, ptr %4, align 8 -// CHECK-NEXT: %12 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.Value.Type(%reflect.Value %11) -// CHECK-NEXT: %13 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %8, align 8 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %12) -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %12, 0 -// CHECK-NEXT: %16 = getelementptr ptr, ptr %15, i64 10 -// CHECK-NEXT: %17 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %18 = insertvalue { ptr, ptr } undef, ptr %17, 0 -// CHECK-NEXT: %19 = insertvalue { ptr, ptr } %18, ptr %14, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %19, 1 -// CHECK-NEXT: %21 = extractvalue { ptr, ptr } %19, 0 -// CHECK-NEXT: %22 = call i1 %21(ptr %20, %"{{.*}}/runtime/internal/runtime.iface" %13) -// CHECK-NEXT: br i1 %22, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @408, i64 40 }, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %23 = load %reflect.Value, ptr %4, align 8 -// CHECK-NEXT: %24 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %8, align 8 -// CHECK-NEXT: %25 = call i1 @reflect.Value.CanConvert(%reflect.Value %23, %"{{.*}}/runtime/internal/runtime.iface" %24) -// CHECK-NEXT: br i1 %25, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @409, i64 57 }, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3, %_llgo_2 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, ptr }, ptr %26, i32 0, i32 0 -// CHECK-NEXT: store ptr %4, ptr %27, align 8 -// CHECK-NEXT: %28 = getelementptr inbounds { ptr, ptr }, ptr %26, i32 0, i32 1 -// CHECK-NEXT: store ptr %8, ptr %28, align 8 -// CHECK-NEXT: %29 = insertvalue { ptr, ptr } { ptr @"main.TestConvertPanic$1", ptr undef }, ptr %26, 1 -// CHECK-NEXT: call void @main.shouldPanic(%"{{.*}}/runtime/internal/runtime.String" { ptr @410, i64 77 }, { ptr, ptr } %29) -// CHECK-NEXT: %30 = load %reflect.Value, ptr %4, align 8 -// CHECK-NEXT: %31 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %8, align 8 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %31) -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %31, 0 -// CHECK-NEXT: %34 = getelementptr ptr, ptr %33, i64 11 -// CHECK-NEXT: %35 = load ptr, ptr %34, align 8 -// CHECK-NEXT: %36 = insertvalue { ptr, ptr } undef, ptr %35, 0 -// CHECK-NEXT: %37 = insertvalue { ptr, ptr } %36, ptr %32, 1 -// CHECK-NEXT: %38 = extractvalue { ptr, ptr } %37, 1 -// CHECK-NEXT: %39 = extractvalue { ptr, ptr } %37, 0 -// CHECK-NEXT: %40 = call %"{{.*}}/runtime/internal/runtime.iface" %39(ptr %38) -// CHECK-NEXT: %41 = call i1 @reflect.Value.CanConvert(%reflect.Value %30, %"{{.*}}/runtime/internal/runtime.iface" %40) -// CHECK-NEXT: br i1 %41, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: call void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @411, i64 56 }, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: %43 = getelementptr inbounds { ptr, ptr }, ptr %42, i32 0, i32 0 -// CHECK-NEXT: store ptr %4, ptr %43, align 8 -// CHECK-NEXT: %44 = getelementptr inbounds { ptr, ptr }, ptr %42, i32 0, i32 1 -// CHECK-NEXT: store ptr %8, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue { ptr, ptr } { ptr @"main.TestConvertPanic$2", ptr undef }, ptr %42, 1 -// CHECK-NEXT: call void @main.shouldPanic(%"{{.*}}/runtime/internal/runtime.String" { ptr @412, i64 66 }, { ptr, ptr } %45) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.TestConvertPanic$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr, ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %2) -// CHECK-NEXT: %4 = load %reflect.Value, ptr %3, align 8 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %6 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %5, align 8 -// CHECK-NEXT: %7 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %4, %"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.TestConvertPanic$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr, ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %2) -// CHECK-NEXT: %4 = load %reflect.Value, ptr %3, align 8 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %6 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %5, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %6) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %6, 0 -// CHECK-NEXT: %9 = getelementptr ptr, ptr %8, i64 11 -// CHECK-NEXT: %10 = load ptr, ptr %9, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } undef, ptr %10, 0 -// CHECK-NEXT: %12 = insertvalue { ptr, ptr } %11, ptr %7, 1 -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.iface" %14(ptr %13) -// CHECK-NEXT: %16 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %4, %"{{.*}}/runtime/internal/runtime.iface" %15) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.TestConvertSlice2Array(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr %1, i64 8, i64 4, i64 0, i64 4, i1 true, i1 true, i1 true) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: store [4 x i64] zeroinitializer, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[4]_llgo_int", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int", ptr undef }, ptr %6, 1 -// CHECK-NEXT: %8 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %7) -// CHECK-NEXT: %9 = call %reflect.Value @reflect.Value.Convert(%reflect.Value %8, %"{{.*}}/runtime/internal/runtime.iface" %5) -// CHECK-NEXT: %10 = call i1 @reflect.Value.CanAddr(%reflect.Value %9) -// CHECK-NEXT: br i1 %10, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"main.(*testingT).Fatalf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @414, i64 65 }, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %2, 1 -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: %12 = phi i64 [ -1, %_llgo_2 ], [ %13, %_llgo_4 ] -// CHECK-NEXT: %13 = add i64 %12, 1 -// CHECK-NEXT: %14 = icmp slt i64 %13, %11 -// CHECK-NEXT: br i1 %14, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3 -// CHECK-NEXT: %15 = call %reflect.Value @reflect.Value.Index(%reflect.Value %8, i64 %13) -// CHECK-NEXT: %16 = add i64 %13, 1 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %16, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %17, 1 -// CHECK-NEXT: %19 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: call void @reflect.Value.Set(%reflect.Value %15, %reflect.Value %19) -// CHECK-NEXT: br label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: %20 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %2, 1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_9, %_llgo_7, %_llgo_5 -// CHECK-NEXT: %21 = phi i64 [ -1, %_llgo_5 ], [ %22, %_llgo_7 ], [ %22, %_llgo_9 ] -// CHECK-NEXT: %22 = add i64 %21, 1 -// CHECK-NEXT: %23 = icmp slt i64 %22, %20 -// CHECK-NEXT: br i1 %23, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %24 = call %reflect.Value @reflect.Value.Index(%reflect.Value %9, i64 %22) -// CHECK-NEXT: %25 = call i64 @reflect.Value.Int(%reflect.Value %24) -// CHECK-NEXT: %26 = icmp ne i64 %25, 0 -// CHECK-NEXT: br i1 %26, label %_llgo_9, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_7 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %28 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 0 -// CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %8, ptr %29, align 8 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %29, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %30, ptr %28, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %27, i64 1 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %reflect.Value %9, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_reflect.Value, ptr undef }, ptr %32, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %33, ptr %31, align 8 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %27, 0 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, i64 2, 1 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, i64 2, 2 -// CHECK-NEXT: call void @"main.(*testingT).Fatalf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @415, i64 52 }, %"{{.*}}/runtime/internal/runtime.Slice" %36) -// CHECK-NEXT: br label %_llgo_6 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @bytes.init() -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @io.init() -// CHECK-NEXT: call void @math.init() -// CHECK-NEXT: call void @reflect.init() -// CHECK-NEXT: call void @strings.init() -// CHECK-NEXT: store { ptr, ptr } { ptr @reflect.ValueOf, ptr null }, ptr @main.V, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 17808) -// CHECK-NEXT: %2 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 0, ptr %5, align 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %5, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %8) -// CHECK-NEXT: %9 = call %reflect.Value %__llgo_funcval_code(ptr {{(nest|swiftself)}} %7, %"{{.*}}/runtime/internal/runtime.eface" %6) -// CHECK-NEXT: %10 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %11 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 0, ptr %12, align 1 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %12, 1 -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %11, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %11, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %15) -// CHECK-NEXT: %16 = call %reflect.Value %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %14, %"{{.*}}/runtime/internal/runtime.eface" %13) -// CHECK-NEXT: store %reflect.Value %9, ptr %3, align 8 -// CHECK-NEXT: store %reflect.Value %16, ptr %10, align 8 -// CHECK-NEXT: %17 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 1 -// CHECK-NEXT: %18 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %17, i32 0, i32 0 -// CHECK-NEXT: %19 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 1, ptr %20, align 1 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %20, 1 -// CHECK-NEXT: %22 = extractvalue { ptr, ptr } %19, 1 -// CHECK-NEXT: %23 = extractvalue { ptr, ptr } %19, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %23) -// CHECK-NEXT: %24 = call %reflect.Value %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %22, %"{{.*}}/runtime/internal/runtime.eface" %21) -// CHECK-NEXT: %25 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %17, i32 0, i32 1 -// CHECK-NEXT: %26 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 1, ptr %27, align 1 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %27, 1 -// CHECK-NEXT: %29 = extractvalue { ptr, ptr } %26, 1 -// CHECK-NEXT: %30 = extractvalue { ptr, ptr } %26, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %30) -// CHECK-NEXT: %31 = call %reflect.Value %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %29, %"{{.*}}/runtime/internal/runtime.eface" %28) -// CHECK-NEXT: store %reflect.Value %24, ptr %18, align 8 -// CHECK-NEXT: store %reflect.Value %31, ptr %25, align 8 -// CHECK-NEXT: %32 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 2 -// CHECK-NEXT: %33 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %32, i32 0, i32 0 -// CHECK-NEXT: %34 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %35 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 2, ptr %35, align 1 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %35, 1 -// CHECK-NEXT: %37 = extractvalue { ptr, ptr } %34, 1 -// CHECK-NEXT: %38 = extractvalue { ptr, ptr } %34, 0 -// CHECK-NEXT: %__llgo_funcval_code4 = call ptr asm "", "=r,0"(ptr %38) -// CHECK-NEXT: %39 = call %reflect.Value %__llgo_funcval_code4(ptr {{(nest|swiftself)}} %37, %"{{.*}}/runtime/internal/runtime.eface" %36) -// CHECK-NEXT: %40 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %32, i32 0, i32 1 -// CHECK-NEXT: %41 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 2, ptr %42, align 1 -// CHECK-NEXT: %43 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %42, 1 -// CHECK-NEXT: %44 = extractvalue { ptr, ptr } %41, 1 -// CHECK-NEXT: %45 = extractvalue { ptr, ptr } %41, 0 -// CHECK-NEXT: %__llgo_funcval_code5 = call ptr asm "", "=r,0"(ptr %45) -// CHECK-NEXT: %46 = call %reflect.Value %__llgo_funcval_code5(ptr {{(nest|swiftself)}} %44, %"{{.*}}/runtime/internal/runtime.eface" %43) -// CHECK-NEXT: store %reflect.Value %39, ptr %33, align 8 -// CHECK-NEXT: store %reflect.Value %46, ptr %40, align 8 -// CHECK-NEXT: %47 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 3 -// CHECK-NEXT: %48 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %47, i32 0, i32 0 -// CHECK-NEXT: %49 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 3, ptr %50, align 1 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %50, 1 -// CHECK-NEXT: %52 = extractvalue { ptr, ptr } %49, 1 -// CHECK-NEXT: %53 = extractvalue { ptr, ptr } %49, 0 -// CHECK-NEXT: %__llgo_funcval_code6 = call ptr asm "", "=r,0"(ptr %53) -// CHECK-NEXT: %54 = call %reflect.Value %__llgo_funcval_code6(ptr {{(nest|swiftself)}} %52, %"{{.*}}/runtime/internal/runtime.eface" %51) -// CHECK-NEXT: %55 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %47, i32 0, i32 1 -// CHECK-NEXT: %56 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 3, ptr %57, align 1 -// CHECK-NEXT: %58 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %57, 1 -// CHECK-NEXT: %59 = extractvalue { ptr, ptr } %56, 1 -// CHECK-NEXT: %60 = extractvalue { ptr, ptr } %56, 0 -// CHECK-NEXT: %__llgo_funcval_code7 = call ptr asm "", "=r,0"(ptr %60) -// CHECK-NEXT: %61 = call %reflect.Value %__llgo_funcval_code7(ptr {{(nest|swiftself)}} %59, %"{{.*}}/runtime/internal/runtime.eface" %58) -// CHECK-NEXT: store %reflect.Value %54, ptr %48, align 8 -// CHECK-NEXT: store %reflect.Value %61, ptr %55, align 8 -// CHECK-NEXT: %62 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 4 -// CHECK-NEXT: %63 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %62, i32 0, i32 0 -// CHECK-NEXT: %64 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 4, ptr %65, align 1 -// CHECK-NEXT: %66 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %65, 1 -// CHECK-NEXT: %67 = extractvalue { ptr, ptr } %64, 1 -// CHECK-NEXT: %68 = extractvalue { ptr, ptr } %64, 0 -// CHECK-NEXT: %__llgo_funcval_code8 = call ptr asm "", "=r,0"(ptr %68) -// CHECK-NEXT: %69 = call %reflect.Value %__llgo_funcval_code8(ptr {{(nest|swiftself)}} %67, %"{{.*}}/runtime/internal/runtime.eface" %66) -// CHECK-NEXT: %70 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %62, i32 0, i32 1 -// CHECK-NEXT: %71 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %72 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 4, ptr %72, align 2 -// CHECK-NEXT: %73 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %72, 1 -// CHECK-NEXT: %74 = extractvalue { ptr, ptr } %71, 1 -// CHECK-NEXT: %75 = extractvalue { ptr, ptr } %71, 0 -// CHECK-NEXT: %__llgo_funcval_code9 = call ptr asm "", "=r,0"(ptr %75) -// CHECK-NEXT: %76 = call %reflect.Value %__llgo_funcval_code9(ptr {{(nest|swiftself)}} %74, %"{{.*}}/runtime/internal/runtime.eface" %73) -// CHECK-NEXT: store %reflect.Value %69, ptr %63, align 8 -// CHECK-NEXT: store %reflect.Value %76, ptr %70, align 8 -// CHECK-NEXT: %77 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 5 -// CHECK-NEXT: %78 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %77, i32 0, i32 0 -// CHECK-NEXT: %79 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %80 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 5, ptr %80, align 2 -// CHECK-NEXT: %81 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %80, 1 -// CHECK-NEXT: %82 = extractvalue { ptr, ptr } %79, 1 -// CHECK-NEXT: %83 = extractvalue { ptr, ptr } %79, 0 -// CHECK-NEXT: %__llgo_funcval_code10 = call ptr asm "", "=r,0"(ptr %83) -// CHECK-NEXT: %84 = call %reflect.Value %__llgo_funcval_code10(ptr {{(nest|swiftself)}} %82, %"{{.*}}/runtime/internal/runtime.eface" %81) -// CHECK-NEXT: %85 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %77, i32 0, i32 1 -// CHECK-NEXT: %86 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %87 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 5, ptr %87, align 1 -// CHECK-NEXT: %88 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %87, 1 -// CHECK-NEXT: %89 = extractvalue { ptr, ptr } %86, 1 -// CHECK-NEXT: %90 = extractvalue { ptr, ptr } %86, 0 -// CHECK-NEXT: %__llgo_funcval_code11 = call ptr asm "", "=r,0"(ptr %90) -// CHECK-NEXT: %91 = call %reflect.Value %__llgo_funcval_code11(ptr {{(nest|swiftself)}} %89, %"{{.*}}/runtime/internal/runtime.eface" %88) -// CHECK-NEXT: store %reflect.Value %84, ptr %78, align 8 -// CHECK-NEXT: store %reflect.Value %91, ptr %85, align 8 -// CHECK-NEXT: %92 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 6 -// CHECK-NEXT: %93 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %92, i32 0, i32 0 -// CHECK-NEXT: %94 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %95 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 6, ptr %95, align 1 -// CHECK-NEXT: %96 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %95, 1 -// CHECK-NEXT: %97 = extractvalue { ptr, ptr } %94, 1 -// CHECK-NEXT: %98 = extractvalue { ptr, ptr } %94, 0 -// CHECK-NEXT: %__llgo_funcval_code12 = call ptr asm "", "=r,0"(ptr %98) -// CHECK-NEXT: %99 = call %reflect.Value %__llgo_funcval_code12(ptr {{(nest|swiftself)}} %97, %"{{.*}}/runtime/internal/runtime.eface" %96) -// CHECK-NEXT: %100 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %92, i32 0, i32 1 -// CHECK-NEXT: %101 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %102 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 6, ptr %102, align 2 -// CHECK-NEXT: %103 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %102, 1 -// CHECK-NEXT: %104 = extractvalue { ptr, ptr } %101, 1 -// CHECK-NEXT: %105 = extractvalue { ptr, ptr } %101, 0 -// CHECK-NEXT: %__llgo_funcval_code13 = call ptr asm "", "=r,0"(ptr %105) -// CHECK-NEXT: %106 = call %reflect.Value %__llgo_funcval_code13(ptr {{(nest|swiftself)}} %104, %"{{.*}}/runtime/internal/runtime.eface" %103) -// CHECK-NEXT: store %reflect.Value %99, ptr %93, align 8 -// CHECK-NEXT: store %reflect.Value %106, ptr %100, align 8 -// CHECK-NEXT: %107 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 7 -// CHECK-NEXT: %108 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %107, i32 0, i32 0 -// CHECK-NEXT: %109 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %110 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 7, ptr %110, align 2 -// CHECK-NEXT: %111 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %110, 1 -// CHECK-NEXT: %112 = extractvalue { ptr, ptr } %109, 1 -// CHECK-NEXT: %113 = extractvalue { ptr, ptr } %109, 0 -// CHECK-NEXT: %__llgo_funcval_code14 = call ptr asm "", "=r,0"(ptr %113) -// CHECK-NEXT: %114 = call %reflect.Value %__llgo_funcval_code14(ptr {{(nest|swiftself)}} %112, %"{{.*}}/runtime/internal/runtime.eface" %111) -// CHECK-NEXT: %115 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %107, i32 0, i32 1 -// CHECK-NEXT: %116 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %117 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 7, ptr %117, align 1 -// CHECK-NEXT: %118 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %117, 1 -// CHECK-NEXT: %119 = extractvalue { ptr, ptr } %116, 1 -// CHECK-NEXT: %120 = extractvalue { ptr, ptr } %116, 0 -// CHECK-NEXT: %__llgo_funcval_code15 = call ptr asm "", "=r,0"(ptr %120) -// CHECK-NEXT: %121 = call %reflect.Value %__llgo_funcval_code15(ptr {{(nest|swiftself)}} %119, %"{{.*}}/runtime/internal/runtime.eface" %118) -// CHECK-NEXT: store %reflect.Value %114, ptr %108, align 8 -// CHECK-NEXT: store %reflect.Value %121, ptr %115, align 8 -// CHECK-NEXT: %122 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 8 -// CHECK-NEXT: %123 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %122, i32 0, i32 0 -// CHECK-NEXT: %124 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %125 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 8, ptr %125, align 1 -// CHECK-NEXT: %126 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %125, 1 -// CHECK-NEXT: %127 = extractvalue { ptr, ptr } %124, 1 -// CHECK-NEXT: %128 = extractvalue { ptr, ptr } %124, 0 -// CHECK-NEXT: %__llgo_funcval_code16 = call ptr asm "", "=r,0"(ptr %128) -// CHECK-NEXT: %129 = call %reflect.Value %__llgo_funcval_code16(ptr {{(nest|swiftself)}} %127, %"{{.*}}/runtime/internal/runtime.eface" %126) -// CHECK-NEXT: %130 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %122, i32 0, i32 1 -// CHECK-NEXT: %131 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %132 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 8, ptr %132, align 4 -// CHECK-NEXT: %133 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %132, 1 -// CHECK-NEXT: %134 = extractvalue { ptr, ptr } %131, 1 -// CHECK-NEXT: %135 = extractvalue { ptr, ptr } %131, 0 -// CHECK-NEXT: %__llgo_funcval_code17 = call ptr asm "", "=r,0"(ptr %135) -// CHECK-NEXT: %136 = call %reflect.Value %__llgo_funcval_code17(ptr {{(nest|swiftself)}} %134, %"{{.*}}/runtime/internal/runtime.eface" %133) -// CHECK-NEXT: store %reflect.Value %129, ptr %123, align 8 -// CHECK-NEXT: store %reflect.Value %136, ptr %130, align 8 -// CHECK-NEXT: %137 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 9 -// CHECK-NEXT: %138 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %137, i32 0, i32 0 -// CHECK-NEXT: %139 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %140 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 9, ptr %140, align 4 -// CHECK-NEXT: %141 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %140, 1 -// CHECK-NEXT: %142 = extractvalue { ptr, ptr } %139, 1 -// CHECK-NEXT: %143 = extractvalue { ptr, ptr } %139, 0 -// CHECK-NEXT: %__llgo_funcval_code18 = call ptr asm "", "=r,0"(ptr %143) -// CHECK-NEXT: %144 = call %reflect.Value %__llgo_funcval_code18(ptr {{(nest|swiftself)}} %142, %"{{.*}}/runtime/internal/runtime.eface" %141) -// CHECK-NEXT: %145 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %137, i32 0, i32 1 -// CHECK-NEXT: %146 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %147 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 9, ptr %147, align 1 -// CHECK-NEXT: %148 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %147, 1 -// CHECK-NEXT: %149 = extractvalue { ptr, ptr } %146, 1 -// CHECK-NEXT: %150 = extractvalue { ptr, ptr } %146, 0 -// CHECK-NEXT: %__llgo_funcval_code19 = call ptr asm "", "=r,0"(ptr %150) -// CHECK-NEXT: %151 = call %reflect.Value %__llgo_funcval_code19(ptr {{(nest|swiftself)}} %149, %"{{.*}}/runtime/internal/runtime.eface" %148) -// CHECK-NEXT: store %reflect.Value %144, ptr %138, align 8 -// CHECK-NEXT: store %reflect.Value %151, ptr %145, align 8 -// CHECK-NEXT: %152 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 10 -// CHECK-NEXT: %153 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %152, i32 0, i32 0 -// CHECK-NEXT: %154 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %155 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 10, ptr %155, align 1 -// CHECK-NEXT: %156 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %155, 1 -// CHECK-NEXT: %157 = extractvalue { ptr, ptr } %154, 1 -// CHECK-NEXT: %158 = extractvalue { ptr, ptr } %154, 0 -// CHECK-NEXT: %__llgo_funcval_code20 = call ptr asm "", "=r,0"(ptr %158) -// CHECK-NEXT: %159 = call %reflect.Value %__llgo_funcval_code20(ptr {{(nest|swiftself)}} %157, %"{{.*}}/runtime/internal/runtime.eface" %156) -// CHECK-NEXT: %160 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %152, i32 0, i32 1 -// CHECK-NEXT: %161 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %162 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 10, ptr %162, align 4 -// CHECK-NEXT: %163 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %162, 1 -// CHECK-NEXT: %164 = extractvalue { ptr, ptr } %161, 1 -// CHECK-NEXT: %165 = extractvalue { ptr, ptr } %161, 0 -// CHECK-NEXT: %__llgo_funcval_code21 = call ptr asm "", "=r,0"(ptr %165) -// CHECK-NEXT: %166 = call %reflect.Value %__llgo_funcval_code21(ptr {{(nest|swiftself)}} %164, %"{{.*}}/runtime/internal/runtime.eface" %163) -// CHECK-NEXT: store %reflect.Value %159, ptr %153, align 8 -// CHECK-NEXT: store %reflect.Value %166, ptr %160, align 8 -// CHECK-NEXT: %167 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 11 -// CHECK-NEXT: %168 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %167, i32 0, i32 0 -// CHECK-NEXT: %169 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %170 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 11, ptr %170, align 4 -// CHECK-NEXT: %171 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %170, 1 -// CHECK-NEXT: %172 = extractvalue { ptr, ptr } %169, 1 -// CHECK-NEXT: %173 = extractvalue { ptr, ptr } %169, 0 -// CHECK-NEXT: %__llgo_funcval_code22 = call ptr asm "", "=r,0"(ptr %173) -// CHECK-NEXT: %174 = call %reflect.Value %__llgo_funcval_code22(ptr {{(nest|swiftself)}} %172, %"{{.*}}/runtime/internal/runtime.eface" %171) -// CHECK-NEXT: %175 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %167, i32 0, i32 1 -// CHECK-NEXT: %176 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %177 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 11, ptr %177, align 1 -// CHECK-NEXT: %178 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %177, 1 -// CHECK-NEXT: %179 = extractvalue { ptr, ptr } %176, 1 -// CHECK-NEXT: %180 = extractvalue { ptr, ptr } %176, 0 -// CHECK-NEXT: %__llgo_funcval_code23 = call ptr asm "", "=r,0"(ptr %180) -// CHECK-NEXT: %181 = call %reflect.Value %__llgo_funcval_code23(ptr {{(nest|swiftself)}} %179, %"{{.*}}/runtime/internal/runtime.eface" %178) -// CHECK-NEXT: store %reflect.Value %174, ptr %168, align 8 -// CHECK-NEXT: store %reflect.Value %181, ptr %175, align 8 -// CHECK-NEXT: %182 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 12 -// CHECK-NEXT: %183 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %182, i32 0, i32 0 -// CHECK-NEXT: %184 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %185 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 12, ptr %185, align 1 -// CHECK-NEXT: %186 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %185, 1 -// CHECK-NEXT: %187 = extractvalue { ptr, ptr } %184, 1 -// CHECK-NEXT: %188 = extractvalue { ptr, ptr } %184, 0 -// CHECK-NEXT: %__llgo_funcval_code24 = call ptr asm "", "=r,0"(ptr %188) -// CHECK-NEXT: %189 = call %reflect.Value %__llgo_funcval_code24(ptr {{(nest|swiftself)}} %187, %"{{.*}}/runtime/internal/runtime.eface" %186) -// CHECK-NEXT: %190 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %182, i32 0, i32 1 -// CHECK-NEXT: %191 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %192 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 12, ptr %192, align 8 -// CHECK-NEXT: %193 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %192, 1 -// CHECK-NEXT: %194 = extractvalue { ptr, ptr } %191, 1 -// CHECK-NEXT: %195 = extractvalue { ptr, ptr } %191, 0 -// CHECK-NEXT: %__llgo_funcval_code25 = call ptr asm "", "=r,0"(ptr %195) -// CHECK-NEXT: %196 = call %reflect.Value %__llgo_funcval_code25(ptr {{(nest|swiftself)}} %194, %"{{.*}}/runtime/internal/runtime.eface" %193) -// CHECK-NEXT: store %reflect.Value %189, ptr %183, align 8 -// CHECK-NEXT: store %reflect.Value %196, ptr %190, align 8 -// CHECK-NEXT: %197 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 13 -// CHECK-NEXT: %198 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %197, i32 0, i32 0 -// CHECK-NEXT: %199 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %200 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 13, ptr %200, align 8 -// CHECK-NEXT: %201 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %200, 1 -// CHECK-NEXT: %202 = extractvalue { ptr, ptr } %199, 1 -// CHECK-NEXT: %203 = extractvalue { ptr, ptr } %199, 0 -// CHECK-NEXT: %__llgo_funcval_code26 = call ptr asm "", "=r,0"(ptr %203) -// CHECK-NEXT: %204 = call %reflect.Value %__llgo_funcval_code26(ptr {{(nest|swiftself)}} %202, %"{{.*}}/runtime/internal/runtime.eface" %201) -// CHECK-NEXT: %205 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %197, i32 0, i32 1 -// CHECK-NEXT: %206 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %207 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 13, ptr %207, align 1 -// CHECK-NEXT: %208 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %207, 1 -// CHECK-NEXT: %209 = extractvalue { ptr, ptr } %206, 1 -// CHECK-NEXT: %210 = extractvalue { ptr, ptr } %206, 0 -// CHECK-NEXT: %__llgo_funcval_code27 = call ptr asm "", "=r,0"(ptr %210) -// CHECK-NEXT: %211 = call %reflect.Value %__llgo_funcval_code27(ptr {{(nest|swiftself)}} %209, %"{{.*}}/runtime/internal/runtime.eface" %208) -// CHECK-NEXT: store %reflect.Value %204, ptr %198, align 8 -// CHECK-NEXT: store %reflect.Value %211, ptr %205, align 8 -// CHECK-NEXT: %212 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 14 -// CHECK-NEXT: %213 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %212, i32 0, i32 0 -// CHECK-NEXT: %214 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %215 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 14, ptr %215, align 1 -// CHECK-NEXT: %216 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %215, 1 -// CHECK-NEXT: %217 = extractvalue { ptr, ptr } %214, 1 -// CHECK-NEXT: %218 = extractvalue { ptr, ptr } %214, 0 -// CHECK-NEXT: %__llgo_funcval_code28 = call ptr asm "", "=r,0"(ptr %218) -// CHECK-NEXT: %219 = call %reflect.Value %__llgo_funcval_code28(ptr {{(nest|swiftself)}} %217, %"{{.*}}/runtime/internal/runtime.eface" %216) -// CHECK-NEXT: %220 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %212, i32 0, i32 1 -// CHECK-NEXT: %221 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %222 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 14, ptr %222, align 8 -// CHECK-NEXT: %223 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %222, 1 -// CHECK-NEXT: %224 = extractvalue { ptr, ptr } %221, 1 -// CHECK-NEXT: %225 = extractvalue { ptr, ptr } %221, 0 -// CHECK-NEXT: %__llgo_funcval_code29 = call ptr asm "", "=r,0"(ptr %225) -// CHECK-NEXT: %226 = call %reflect.Value %__llgo_funcval_code29(ptr {{(nest|swiftself)}} %224, %"{{.*}}/runtime/internal/runtime.eface" %223) -// CHECK-NEXT: store %reflect.Value %219, ptr %213, align 8 -// CHECK-NEXT: store %reflect.Value %226, ptr %220, align 8 -// CHECK-NEXT: %227 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 15 -// CHECK-NEXT: %228 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %227, i32 0, i32 0 -// CHECK-NEXT: %229 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %230 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 15, ptr %230, align 8 -// CHECK-NEXT: %231 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %230, 1 -// CHECK-NEXT: %232 = extractvalue { ptr, ptr } %229, 1 -// CHECK-NEXT: %233 = extractvalue { ptr, ptr } %229, 0 -// CHECK-NEXT: %__llgo_funcval_code30 = call ptr asm "", "=r,0"(ptr %233) -// CHECK-NEXT: %234 = call %reflect.Value %__llgo_funcval_code30(ptr {{(nest|swiftself)}} %232, %"{{.*}}/runtime/internal/runtime.eface" %231) -// CHECK-NEXT: %235 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %227, i32 0, i32 1 -// CHECK-NEXT: %236 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %237 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 15, ptr %237, align 1 -// CHECK-NEXT: %238 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %237, 1 -// CHECK-NEXT: %239 = extractvalue { ptr, ptr } %236, 1 -// CHECK-NEXT: %240 = extractvalue { ptr, ptr } %236, 0 -// CHECK-NEXT: %__llgo_funcval_code31 = call ptr asm "", "=r,0"(ptr %240) -// CHECK-NEXT: %241 = call %reflect.Value %__llgo_funcval_code31(ptr {{(nest|swiftself)}} %239, %"{{.*}}/runtime/internal/runtime.eface" %238) -// CHECK-NEXT: store %reflect.Value %234, ptr %228, align 8 -// CHECK-NEXT: store %reflect.Value %241, ptr %235, align 8 -// CHECK-NEXT: %242 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 16 -// CHECK-NEXT: %243 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %242, i32 0, i32 0 -// CHECK-NEXT: %244 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %245 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 16, ptr %245, align 1 -// CHECK-NEXT: %246 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %245, 1 -// CHECK-NEXT: %247 = extractvalue { ptr, ptr } %244, 1 -// CHECK-NEXT: %248 = extractvalue { ptr, ptr } %244, 0 -// CHECK-NEXT: %__llgo_funcval_code32 = call ptr asm "", "=r,0"(ptr %248) -// CHECK-NEXT: %249 = call %reflect.Value %__llgo_funcval_code32(ptr {{(nest|swiftself)}} %247, %"{{.*}}/runtime/internal/runtime.eface" %246) -// CHECK-NEXT: %250 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %242, i32 0, i32 1 -// CHECK-NEXT: %251 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %252 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 16, ptr %252, align 8 -// CHECK-NEXT: %253 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %252, 1 -// CHECK-NEXT: %254 = extractvalue { ptr, ptr } %251, 1 -// CHECK-NEXT: %255 = extractvalue { ptr, ptr } %251, 0 -// CHECK-NEXT: %__llgo_funcval_code33 = call ptr asm "", "=r,0"(ptr %255) -// CHECK-NEXT: %256 = call %reflect.Value %__llgo_funcval_code33(ptr {{(nest|swiftself)}} %254, %"{{.*}}/runtime/internal/runtime.eface" %253) -// CHECK-NEXT: store %reflect.Value %249, ptr %243, align 8 -// CHECK-NEXT: store %reflect.Value %256, ptr %250, align 8 -// CHECK-NEXT: %257 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 17 -// CHECK-NEXT: %258 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %257, i32 0, i32 0 -// CHECK-NEXT: %259 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %260 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 17, ptr %260, align 8 -// CHECK-NEXT: %261 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %260, 1 -// CHECK-NEXT: %262 = extractvalue { ptr, ptr } %259, 1 -// CHECK-NEXT: %263 = extractvalue { ptr, ptr } %259, 0 -// CHECK-NEXT: %__llgo_funcval_code34 = call ptr asm "", "=r,0"(ptr %263) -// CHECK-NEXT: %264 = call %reflect.Value %__llgo_funcval_code34(ptr {{(nest|swiftself)}} %262, %"{{.*}}/runtime/internal/runtime.eface" %261) -// CHECK-NEXT: %265 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %257, i32 0, i32 1 -// CHECK-NEXT: %266 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %267 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 17, ptr %267, align 1 -// CHECK-NEXT: %268 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %267, 1 -// CHECK-NEXT: %269 = extractvalue { ptr, ptr } %266, 1 -// CHECK-NEXT: %270 = extractvalue { ptr, ptr } %266, 0 -// CHECK-NEXT: %__llgo_funcval_code35 = call ptr asm "", "=r,0"(ptr %270) -// CHECK-NEXT: %271 = call %reflect.Value %__llgo_funcval_code35(ptr {{(nest|swiftself)}} %269, %"{{.*}}/runtime/internal/runtime.eface" %268) -// CHECK-NEXT: store %reflect.Value %264, ptr %258, align 8 -// CHECK-NEXT: store %reflect.Value %271, ptr %265, align 8 -// CHECK-NEXT: %272 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 18 -// CHECK-NEXT: %273 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %272, i32 0, i32 0 -// CHECK-NEXT: %274 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %275 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 18, ptr %275, align 1 -// CHECK-NEXT: %276 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %275, 1 -// CHECK-NEXT: %277 = extractvalue { ptr, ptr } %274, 1 -// CHECK-NEXT: %278 = extractvalue { ptr, ptr } %274, 0 -// CHECK-NEXT: %__llgo_funcval_code36 = call ptr asm "", "=r,0"(ptr %278) -// CHECK-NEXT: %279 = call %reflect.Value %__llgo_funcval_code36(ptr {{(nest|swiftself)}} %277, %"{{.*}}/runtime/internal/runtime.eface" %276) -// CHECK-NEXT: %280 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %272, i32 0, i32 1 -// CHECK-NEXT: %281 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %282 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 18, ptr %282, align 8 -// CHECK-NEXT: %283 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %282, 1 -// CHECK-NEXT: %284 = extractvalue { ptr, ptr } %281, 1 -// CHECK-NEXT: %285 = extractvalue { ptr, ptr } %281, 0 -// CHECK-NEXT: %__llgo_funcval_code37 = call ptr asm "", "=r,0"(ptr %285) -// CHECK-NEXT: %286 = call %reflect.Value %__llgo_funcval_code37(ptr {{(nest|swiftself)}} %284, %"{{.*}}/runtime/internal/runtime.eface" %283) -// CHECK-NEXT: store %reflect.Value %279, ptr %273, align 8 -// CHECK-NEXT: store %reflect.Value %286, ptr %280, align 8 -// CHECK-NEXT: %287 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 19 -// CHECK-NEXT: %288 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %287, i32 0, i32 0 -// CHECK-NEXT: %289 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %290 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 19, ptr %290, align 8 -// CHECK-NEXT: %291 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %290, 1 -// CHECK-NEXT: %292 = extractvalue { ptr, ptr } %289, 1 -// CHECK-NEXT: %293 = extractvalue { ptr, ptr } %289, 0 -// CHECK-NEXT: %__llgo_funcval_code38 = call ptr asm "", "=r,0"(ptr %293) -// CHECK-NEXT: %294 = call %reflect.Value %__llgo_funcval_code38(ptr {{(nest|swiftself)}} %292, %"{{.*}}/runtime/internal/runtime.eface" %291) -// CHECK-NEXT: %295 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %287, i32 0, i32 1 -// CHECK-NEXT: %296 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %297 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 19, ptr %297, align 1 -// CHECK-NEXT: %298 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %297, 1 -// CHECK-NEXT: %299 = extractvalue { ptr, ptr } %296, 1 -// CHECK-NEXT: %300 = extractvalue { ptr, ptr } %296, 0 -// CHECK-NEXT: %__llgo_funcval_code39 = call ptr asm "", "=r,0"(ptr %300) -// CHECK-NEXT: %301 = call %reflect.Value %__llgo_funcval_code39(ptr {{(nest|swiftself)}} %299, %"{{.*}}/runtime/internal/runtime.eface" %298) -// CHECK-NEXT: store %reflect.Value %294, ptr %288, align 8 -// CHECK-NEXT: store %reflect.Value %301, ptr %295, align 8 -// CHECK-NEXT: %302 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 20 -// CHECK-NEXT: %303 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %302, i32 0, i32 0 -// CHECK-NEXT: %304 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %305 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 20, ptr %305, align 1 -// CHECK-NEXT: %306 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %305, 1 -// CHECK-NEXT: %307 = extractvalue { ptr, ptr } %304, 1 -// CHECK-NEXT: %308 = extractvalue { ptr, ptr } %304, 0 -// CHECK-NEXT: %__llgo_funcval_code40 = call ptr asm "", "=r,0"(ptr %308) -// CHECK-NEXT: %309 = call %reflect.Value %__llgo_funcval_code40(ptr {{(nest|swiftself)}} %307, %"{{.*}}/runtime/internal/runtime.eface" %306) -// CHECK-NEXT: %310 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %302, i32 0, i32 1 -// CHECK-NEXT: %311 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %312 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 20, ptr %312, align 8 -// CHECK-NEXT: %313 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %312, 1 -// CHECK-NEXT: %314 = extractvalue { ptr, ptr } %311, 1 -// CHECK-NEXT: %315 = extractvalue { ptr, ptr } %311, 0 -// CHECK-NEXT: %__llgo_funcval_code41 = call ptr asm "", "=r,0"(ptr %315) -// CHECK-NEXT: %316 = call %reflect.Value %__llgo_funcval_code41(ptr {{(nest|swiftself)}} %314, %"{{.*}}/runtime/internal/runtime.eface" %313) -// CHECK-NEXT: store %reflect.Value %309, ptr %303, align 8 -// CHECK-NEXT: store %reflect.Value %316, ptr %310, align 8 -// CHECK-NEXT: %317 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 21 -// CHECK-NEXT: %318 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %317, i32 0, i32 0 -// CHECK-NEXT: %319 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %320 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 21, ptr %320, align 8 -// CHECK-NEXT: %321 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %320, 1 -// CHECK-NEXT: %322 = extractvalue { ptr, ptr } %319, 1 -// CHECK-NEXT: %323 = extractvalue { ptr, ptr } %319, 0 -// CHECK-NEXT: %__llgo_funcval_code42 = call ptr asm "", "=r,0"(ptr %323) -// CHECK-NEXT: %324 = call %reflect.Value %__llgo_funcval_code42(ptr {{(nest|swiftself)}} %322, %"{{.*}}/runtime/internal/runtime.eface" %321) -// CHECK-NEXT: %325 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %317, i32 0, i32 1 -// CHECK-NEXT: %326 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %327 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 21, ptr %327, align 1 -// CHECK-NEXT: %328 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %327, 1 -// CHECK-NEXT: %329 = extractvalue { ptr, ptr } %326, 1 -// CHECK-NEXT: %330 = extractvalue { ptr, ptr } %326, 0 -// CHECK-NEXT: %__llgo_funcval_code43 = call ptr asm "", "=r,0"(ptr %330) -// CHECK-NEXT: %331 = call %reflect.Value %__llgo_funcval_code43(ptr {{(nest|swiftself)}} %329, %"{{.*}}/runtime/internal/runtime.eface" %328) -// CHECK-NEXT: store %reflect.Value %324, ptr %318, align 8 -// CHECK-NEXT: store %reflect.Value %331, ptr %325, align 8 -// CHECK-NEXT: %332 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 22 -// CHECK-NEXT: %333 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %332, i32 0, i32 0 -// CHECK-NEXT: %334 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %335 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 22, ptr %335, align 1 -// CHECK-NEXT: %336 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %335, 1 -// CHECK-NEXT: %337 = extractvalue { ptr, ptr } %334, 1 -// CHECK-NEXT: %338 = extractvalue { ptr, ptr } %334, 0 -// CHECK-NEXT: %__llgo_funcval_code44 = call ptr asm "", "=r,0"(ptr %338) -// CHECK-NEXT: %339 = call %reflect.Value %__llgo_funcval_code44(ptr {{(nest|swiftself)}} %337, %"{{.*}}/runtime/internal/runtime.eface" %336) -// CHECK-NEXT: %340 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %332, i32 0, i32 1 -// CHECK-NEXT: %341 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %342 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 2.200000e+01, ptr %342, align 4 -// CHECK-NEXT: %343 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %342, 1 -// CHECK-NEXT: %344 = extractvalue { ptr, ptr } %341, 1 -// CHECK-NEXT: %345 = extractvalue { ptr, ptr } %341, 0 -// CHECK-NEXT: %__llgo_funcval_code45 = call ptr asm "", "=r,0"(ptr %345) -// CHECK-NEXT: %346 = call %reflect.Value %__llgo_funcval_code45(ptr {{(nest|swiftself)}} %344, %"{{.*}}/runtime/internal/runtime.eface" %343) -// CHECK-NEXT: store %reflect.Value %339, ptr %333, align 8 -// CHECK-NEXT: store %reflect.Value %346, ptr %340, align 8 -// CHECK-NEXT: %347 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 23 -// CHECK-NEXT: %348 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %347, i32 0, i32 0 -// CHECK-NEXT: %349 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %350 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 2.300000e+01, ptr %350, align 4 -// CHECK-NEXT: %351 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %350, 1 -// CHECK-NEXT: %352 = extractvalue { ptr, ptr } %349, 1 -// CHECK-NEXT: %353 = extractvalue { ptr, ptr } %349, 0 -// CHECK-NEXT: %__llgo_funcval_code46 = call ptr asm "", "=r,0"(ptr %353) -// CHECK-NEXT: %354 = call %reflect.Value %__llgo_funcval_code46(ptr {{(nest|swiftself)}} %352, %"{{.*}}/runtime/internal/runtime.eface" %351) -// CHECK-NEXT: %355 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %347, i32 0, i32 1 -// CHECK-NEXT: %356 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %357 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 23, ptr %357, align 1 -// CHECK-NEXT: %358 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %357, 1 -// CHECK-NEXT: %359 = extractvalue { ptr, ptr } %356, 1 -// CHECK-NEXT: %360 = extractvalue { ptr, ptr } %356, 0 -// CHECK-NEXT: %__llgo_funcval_code47 = call ptr asm "", "=r,0"(ptr %360) -// CHECK-NEXT: %361 = call %reflect.Value %__llgo_funcval_code47(ptr {{(nest|swiftself)}} %359, %"{{.*}}/runtime/internal/runtime.eface" %358) -// CHECK-NEXT: store %reflect.Value %354, ptr %348, align 8 -// CHECK-NEXT: store %reflect.Value %361, ptr %355, align 8 -// CHECK-NEXT: %362 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 24 -// CHECK-NEXT: %363 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %362, i32 0, i32 0 -// CHECK-NEXT: %364 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %365 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 24, ptr %365, align 1 -// CHECK-NEXT: %366 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %365, 1 -// CHECK-NEXT: %367 = extractvalue { ptr, ptr } %364, 1 -// CHECK-NEXT: %368 = extractvalue { ptr, ptr } %364, 0 -// CHECK-NEXT: %__llgo_funcval_code48 = call ptr asm "", "=r,0"(ptr %368) -// CHECK-NEXT: %369 = call %reflect.Value %__llgo_funcval_code48(ptr {{(nest|swiftself)}} %367, %"{{.*}}/runtime/internal/runtime.eface" %366) -// CHECK-NEXT: %370 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %362, i32 0, i32 1 -// CHECK-NEXT: %371 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %372 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 2.400000e+01, ptr %372, align 8 -// CHECK-NEXT: %373 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %372, 1 -// CHECK-NEXT: %374 = extractvalue { ptr, ptr } %371, 1 -// CHECK-NEXT: %375 = extractvalue { ptr, ptr } %371, 0 -// CHECK-NEXT: %__llgo_funcval_code49 = call ptr asm "", "=r,0"(ptr %375) -// CHECK-NEXT: %376 = call %reflect.Value %__llgo_funcval_code49(ptr {{(nest|swiftself)}} %374, %"{{.*}}/runtime/internal/runtime.eface" %373) -// CHECK-NEXT: store %reflect.Value %369, ptr %363, align 8 -// CHECK-NEXT: store %reflect.Value %376, ptr %370, align 8 -// CHECK-NEXT: %377 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 25 -// CHECK-NEXT: %378 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %377, i32 0, i32 0 -// CHECK-NEXT: %379 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %380 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 2.500000e+01, ptr %380, align 8 -// CHECK-NEXT: %381 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %380, 1 -// CHECK-NEXT: %382 = extractvalue { ptr, ptr } %379, 1 -// CHECK-NEXT: %383 = extractvalue { ptr, ptr } %379, 0 -// CHECK-NEXT: %__llgo_funcval_code50 = call ptr asm "", "=r,0"(ptr %383) -// CHECK-NEXT: %384 = call %reflect.Value %__llgo_funcval_code50(ptr {{(nest|swiftself)}} %382, %"{{.*}}/runtime/internal/runtime.eface" %381) -// CHECK-NEXT: %385 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %377, i32 0, i32 1 -// CHECK-NEXT: %386 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %387 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 25, ptr %387, align 1 -// CHECK-NEXT: %388 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %387, 1 -// CHECK-NEXT: %389 = extractvalue { ptr, ptr } %386, 1 -// CHECK-NEXT: %390 = extractvalue { ptr, ptr } %386, 0 -// CHECK-NEXT: %__llgo_funcval_code51 = call ptr asm "", "=r,0"(ptr %390) -// CHECK-NEXT: %391 = call %reflect.Value %__llgo_funcval_code51(ptr {{(nest|swiftself)}} %389, %"{{.*}}/runtime/internal/runtime.eface" %388) -// CHECK-NEXT: store %reflect.Value %384, ptr %378, align 8 -// CHECK-NEXT: store %reflect.Value %391, ptr %385, align 8 -// CHECK-NEXT: %392 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 26 -// CHECK-NEXT: %393 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %392, i32 0, i32 0 -// CHECK-NEXT: %394 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %395 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 26, ptr %395, align 1 -// CHECK-NEXT: %396 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %395, 1 -// CHECK-NEXT: %397 = extractvalue { ptr, ptr } %394, 1 -// CHECK-NEXT: %398 = extractvalue { ptr, ptr } %394, 0 -// CHECK-NEXT: %__llgo_funcval_code52 = call ptr asm "", "=r,0"(ptr %398) -// CHECK-NEXT: %399 = call %reflect.Value %__llgo_funcval_code52(ptr {{(nest|swiftself)}} %397, %"{{.*}}/runtime/internal/runtime.eface" %396) -// CHECK-NEXT: %400 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %392, i32 0, i32 1 -// CHECK-NEXT: %401 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %402 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 26, ptr %402, align 1 -// CHECK-NEXT: %403 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %402, 1 -// CHECK-NEXT: %404 = extractvalue { ptr, ptr } %401, 1 -// CHECK-NEXT: %405 = extractvalue { ptr, ptr } %401, 0 -// CHECK-NEXT: %__llgo_funcval_code53 = call ptr asm "", "=r,0"(ptr %405) -// CHECK-NEXT: %406 = call %reflect.Value %__llgo_funcval_code53(ptr {{(nest|swiftself)}} %404, %"{{.*}}/runtime/internal/runtime.eface" %403) -// CHECK-NEXT: store %reflect.Value %399, ptr %393, align 8 -// CHECK-NEXT: store %reflect.Value %406, ptr %400, align 8 -// CHECK-NEXT: %407 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 27 -// CHECK-NEXT: %408 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %407, i32 0, i32 0 -// CHECK-NEXT: %409 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %410 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 27, ptr %410, align 1 -// CHECK-NEXT: %411 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %410, 1 -// CHECK-NEXT: %412 = extractvalue { ptr, ptr } %409, 1 -// CHECK-NEXT: %413 = extractvalue { ptr, ptr } %409, 0 -// CHECK-NEXT: %__llgo_funcval_code54 = call ptr asm "", "=r,0"(ptr %413) -// CHECK-NEXT: %414 = call %reflect.Value %__llgo_funcval_code54(ptr {{(nest|swiftself)}} %412, %"{{.*}}/runtime/internal/runtime.eface" %411) -// CHECK-NEXT: %415 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %407, i32 0, i32 1 -// CHECK-NEXT: %416 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %417 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 27, ptr %417, align 2 -// CHECK-NEXT: %418 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %417, 1 -// CHECK-NEXT: %419 = extractvalue { ptr, ptr } %416, 1 -// CHECK-NEXT: %420 = extractvalue { ptr, ptr } %416, 0 -// CHECK-NEXT: %__llgo_funcval_code55 = call ptr asm "", "=r,0"(ptr %420) -// CHECK-NEXT: %421 = call %reflect.Value %__llgo_funcval_code55(ptr {{(nest|swiftself)}} %419, %"{{.*}}/runtime/internal/runtime.eface" %418) -// CHECK-NEXT: store %reflect.Value %414, ptr %408, align 8 -// CHECK-NEXT: store %reflect.Value %421, ptr %415, align 8 -// CHECK-NEXT: %422 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 28 -// CHECK-NEXT: %423 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %422, i32 0, i32 0 -// CHECK-NEXT: %424 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %425 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 28, ptr %425, align 2 -// CHECK-NEXT: %426 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %425, 1 -// CHECK-NEXT: %427 = extractvalue { ptr, ptr } %424, 1 -// CHECK-NEXT: %428 = extractvalue { ptr, ptr } %424, 0 -// CHECK-NEXT: %__llgo_funcval_code56 = call ptr asm "", "=r,0"(ptr %428) -// CHECK-NEXT: %429 = call %reflect.Value %__llgo_funcval_code56(ptr {{(nest|swiftself)}} %427, %"{{.*}}/runtime/internal/runtime.eface" %426) -// CHECK-NEXT: %430 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %422, i32 0, i32 1 -// CHECK-NEXT: %431 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %432 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 28, ptr %432, align 1 -// CHECK-NEXT: %433 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %432, 1 -// CHECK-NEXT: %434 = extractvalue { ptr, ptr } %431, 1 -// CHECK-NEXT: %435 = extractvalue { ptr, ptr } %431, 0 -// CHECK-NEXT: %__llgo_funcval_code57 = call ptr asm "", "=r,0"(ptr %435) -// CHECK-NEXT: %436 = call %reflect.Value %__llgo_funcval_code57(ptr {{(nest|swiftself)}} %434, %"{{.*}}/runtime/internal/runtime.eface" %433) -// CHECK-NEXT: store %reflect.Value %429, ptr %423, align 8 -// CHECK-NEXT: store %reflect.Value %436, ptr %430, align 8 -// CHECK-NEXT: %437 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 29 -// CHECK-NEXT: %438 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %437, i32 0, i32 0 -// CHECK-NEXT: %439 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %440 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 29, ptr %440, align 1 -// CHECK-NEXT: %441 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %440, 1 -// CHECK-NEXT: %442 = extractvalue { ptr, ptr } %439, 1 -// CHECK-NEXT: %443 = extractvalue { ptr, ptr } %439, 0 -// CHECK-NEXT: %__llgo_funcval_code58 = call ptr asm "", "=r,0"(ptr %443) -// CHECK-NEXT: %444 = call %reflect.Value %__llgo_funcval_code58(ptr {{(nest|swiftself)}} %442, %"{{.*}}/runtime/internal/runtime.eface" %441) -// CHECK-NEXT: %445 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %437, i32 0, i32 1 -// CHECK-NEXT: %446 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %447 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 29, ptr %447, align 2 -// CHECK-NEXT: %448 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %447, 1 -// CHECK-NEXT: %449 = extractvalue { ptr, ptr } %446, 1 -// CHECK-NEXT: %450 = extractvalue { ptr, ptr } %446, 0 -// CHECK-NEXT: %__llgo_funcval_code59 = call ptr asm "", "=r,0"(ptr %450) -// CHECK-NEXT: %451 = call %reflect.Value %__llgo_funcval_code59(ptr {{(nest|swiftself)}} %449, %"{{.*}}/runtime/internal/runtime.eface" %448) -// CHECK-NEXT: store %reflect.Value %444, ptr %438, align 8 -// CHECK-NEXT: store %reflect.Value %451, ptr %445, align 8 -// CHECK-NEXT: %452 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 30 -// CHECK-NEXT: %453 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %452, i32 0, i32 0 -// CHECK-NEXT: %454 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %455 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 30, ptr %455, align 2 -// CHECK-NEXT: %456 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %455, 1 -// CHECK-NEXT: %457 = extractvalue { ptr, ptr } %454, 1 -// CHECK-NEXT: %458 = extractvalue { ptr, ptr } %454, 0 -// CHECK-NEXT: %__llgo_funcval_code60 = call ptr asm "", "=r,0"(ptr %458) -// CHECK-NEXT: %459 = call %reflect.Value %__llgo_funcval_code60(ptr {{(nest|swiftself)}} %457, %"{{.*}}/runtime/internal/runtime.eface" %456) -// CHECK-NEXT: %460 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %452, i32 0, i32 1 -// CHECK-NEXT: %461 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %462 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 30, ptr %462, align 1 -// CHECK-NEXT: %463 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %462, 1 -// CHECK-NEXT: %464 = extractvalue { ptr, ptr } %461, 1 -// CHECK-NEXT: %465 = extractvalue { ptr, ptr } %461, 0 -// CHECK-NEXT: %__llgo_funcval_code61 = call ptr asm "", "=r,0"(ptr %465) -// CHECK-NEXT: %466 = call %reflect.Value %__llgo_funcval_code61(ptr {{(nest|swiftself)}} %464, %"{{.*}}/runtime/internal/runtime.eface" %463) -// CHECK-NEXT: store %reflect.Value %459, ptr %453, align 8 -// CHECK-NEXT: store %reflect.Value %466, ptr %460, align 8 -// CHECK-NEXT: %467 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 31 -// CHECK-NEXT: %468 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %467, i32 0, i32 0 -// CHECK-NEXT: %469 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %470 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 31, ptr %470, align 1 -// CHECK-NEXT: %471 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %470, 1 -// CHECK-NEXT: %472 = extractvalue { ptr, ptr } %469, 1 -// CHECK-NEXT: %473 = extractvalue { ptr, ptr } %469, 0 -// CHECK-NEXT: %__llgo_funcval_code62 = call ptr asm "", "=r,0"(ptr %473) -// CHECK-NEXT: %474 = call %reflect.Value %__llgo_funcval_code62(ptr {{(nest|swiftself)}} %472, %"{{.*}}/runtime/internal/runtime.eface" %471) -// CHECK-NEXT: %475 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %467, i32 0, i32 1 -// CHECK-NEXT: %476 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %477 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 31, ptr %477, align 4 -// CHECK-NEXT: %478 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %477, 1 -// CHECK-NEXT: %479 = extractvalue { ptr, ptr } %476, 1 -// CHECK-NEXT: %480 = extractvalue { ptr, ptr } %476, 0 -// CHECK-NEXT: %__llgo_funcval_code63 = call ptr asm "", "=r,0"(ptr %480) -// CHECK-NEXT: %481 = call %reflect.Value %__llgo_funcval_code63(ptr {{(nest|swiftself)}} %479, %"{{.*}}/runtime/internal/runtime.eface" %478) -// CHECK-NEXT: store %reflect.Value %474, ptr %468, align 8 -// CHECK-NEXT: store %reflect.Value %481, ptr %475, align 8 -// CHECK-NEXT: %482 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 32 -// CHECK-NEXT: %483 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %482, i32 0, i32 0 -// CHECK-NEXT: %484 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %485 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 32, ptr %485, align 4 -// CHECK-NEXT: %486 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %485, 1 -// CHECK-NEXT: %487 = extractvalue { ptr, ptr } %484, 1 -// CHECK-NEXT: %488 = extractvalue { ptr, ptr } %484, 0 -// CHECK-NEXT: %__llgo_funcval_code64 = call ptr asm "", "=r,0"(ptr %488) -// CHECK-NEXT: %489 = call %reflect.Value %__llgo_funcval_code64(ptr {{(nest|swiftself)}} %487, %"{{.*}}/runtime/internal/runtime.eface" %486) -// CHECK-NEXT: %490 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %482, i32 0, i32 1 -// CHECK-NEXT: %491 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %492 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 32, ptr %492, align 1 -// CHECK-NEXT: %493 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %492, 1 -// CHECK-NEXT: %494 = extractvalue { ptr, ptr } %491, 1 -// CHECK-NEXT: %495 = extractvalue { ptr, ptr } %491, 0 -// CHECK-NEXT: %__llgo_funcval_code65 = call ptr asm "", "=r,0"(ptr %495) -// CHECK-NEXT: %496 = call %reflect.Value %__llgo_funcval_code65(ptr {{(nest|swiftself)}} %494, %"{{.*}}/runtime/internal/runtime.eface" %493) -// CHECK-NEXT: store %reflect.Value %489, ptr %483, align 8 -// CHECK-NEXT: store %reflect.Value %496, ptr %490, align 8 -// CHECK-NEXT: %497 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 33 -// CHECK-NEXT: %498 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %497, i32 0, i32 0 -// CHECK-NEXT: %499 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %500 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 33, ptr %500, align 1 -// CHECK-NEXT: %501 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %500, 1 -// CHECK-NEXT: %502 = extractvalue { ptr, ptr } %499, 1 -// CHECK-NEXT: %503 = extractvalue { ptr, ptr } %499, 0 -// CHECK-NEXT: %__llgo_funcval_code66 = call ptr asm "", "=r,0"(ptr %503) -// CHECK-NEXT: %504 = call %reflect.Value %__llgo_funcval_code66(ptr {{(nest|swiftself)}} %502, %"{{.*}}/runtime/internal/runtime.eface" %501) -// CHECK-NEXT: %505 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %497, i32 0, i32 1 -// CHECK-NEXT: %506 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %507 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 33, ptr %507, align 4 -// CHECK-NEXT: %508 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %507, 1 -// CHECK-NEXT: %509 = extractvalue { ptr, ptr } %506, 1 -// CHECK-NEXT: %510 = extractvalue { ptr, ptr } %506, 0 -// CHECK-NEXT: %__llgo_funcval_code67 = call ptr asm "", "=r,0"(ptr %510) -// CHECK-NEXT: %511 = call %reflect.Value %__llgo_funcval_code67(ptr {{(nest|swiftself)}} %509, %"{{.*}}/runtime/internal/runtime.eface" %508) -// CHECK-NEXT: store %reflect.Value %504, ptr %498, align 8 -// CHECK-NEXT: store %reflect.Value %511, ptr %505, align 8 -// CHECK-NEXT: %512 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 34 -// CHECK-NEXT: %513 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %512, i32 0, i32 0 -// CHECK-NEXT: %514 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %515 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 34, ptr %515, align 4 -// CHECK-NEXT: %516 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %515, 1 -// CHECK-NEXT: %517 = extractvalue { ptr, ptr } %514, 1 -// CHECK-NEXT: %518 = extractvalue { ptr, ptr } %514, 0 -// CHECK-NEXT: %__llgo_funcval_code68 = call ptr asm "", "=r,0"(ptr %518) -// CHECK-NEXT: %519 = call %reflect.Value %__llgo_funcval_code68(ptr {{(nest|swiftself)}} %517, %"{{.*}}/runtime/internal/runtime.eface" %516) -// CHECK-NEXT: %520 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %512, i32 0, i32 1 -// CHECK-NEXT: %521 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %522 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 34, ptr %522, align 1 -// CHECK-NEXT: %523 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %522, 1 -// CHECK-NEXT: %524 = extractvalue { ptr, ptr } %521, 1 -// CHECK-NEXT: %525 = extractvalue { ptr, ptr } %521, 0 -// CHECK-NEXT: %__llgo_funcval_code69 = call ptr asm "", "=r,0"(ptr %525) -// CHECK-NEXT: %526 = call %reflect.Value %__llgo_funcval_code69(ptr {{(nest|swiftself)}} %524, %"{{.*}}/runtime/internal/runtime.eface" %523) -// CHECK-NEXT: store %reflect.Value %519, ptr %513, align 8 -// CHECK-NEXT: store %reflect.Value %526, ptr %520, align 8 -// CHECK-NEXT: %527 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 35 -// CHECK-NEXT: %528 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %527, i32 0, i32 0 -// CHECK-NEXT: %529 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %530 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 35, ptr %530, align 1 -// CHECK-NEXT: %531 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %530, 1 -// CHECK-NEXT: %532 = extractvalue { ptr, ptr } %529, 1 -// CHECK-NEXT: %533 = extractvalue { ptr, ptr } %529, 0 -// CHECK-NEXT: %__llgo_funcval_code70 = call ptr asm "", "=r,0"(ptr %533) -// CHECK-NEXT: %534 = call %reflect.Value %__llgo_funcval_code70(ptr {{(nest|swiftself)}} %532, %"{{.*}}/runtime/internal/runtime.eface" %531) -// CHECK-NEXT: %535 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %527, i32 0, i32 1 -// CHECK-NEXT: %536 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %537 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 35, ptr %537, align 8 -// CHECK-NEXT: %538 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %537, 1 -// CHECK-NEXT: %539 = extractvalue { ptr, ptr } %536, 1 -// CHECK-NEXT: %540 = extractvalue { ptr, ptr } %536, 0 -// CHECK-NEXT: %__llgo_funcval_code71 = call ptr asm "", "=r,0"(ptr %540) -// CHECK-NEXT: %541 = call %reflect.Value %__llgo_funcval_code71(ptr {{(nest|swiftself)}} %539, %"{{.*}}/runtime/internal/runtime.eface" %538) -// CHECK-NEXT: store %reflect.Value %534, ptr %528, align 8 -// CHECK-NEXT: store %reflect.Value %541, ptr %535, align 8 -// CHECK-NEXT: %542 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 36 -// CHECK-NEXT: %543 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %542, i32 0, i32 0 -// CHECK-NEXT: %544 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %545 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 36, ptr %545, align 8 -// CHECK-NEXT: %546 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %545, 1 -// CHECK-NEXT: %547 = extractvalue { ptr, ptr } %544, 1 -// CHECK-NEXT: %548 = extractvalue { ptr, ptr } %544, 0 -// CHECK-NEXT: %__llgo_funcval_code72 = call ptr asm "", "=r,0"(ptr %548) -// CHECK-NEXT: %549 = call %reflect.Value %__llgo_funcval_code72(ptr {{(nest|swiftself)}} %547, %"{{.*}}/runtime/internal/runtime.eface" %546) -// CHECK-NEXT: %550 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %542, i32 0, i32 1 -// CHECK-NEXT: %551 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %552 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 36, ptr %552, align 1 -// CHECK-NEXT: %553 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %552, 1 -// CHECK-NEXT: %554 = extractvalue { ptr, ptr } %551, 1 -// CHECK-NEXT: %555 = extractvalue { ptr, ptr } %551, 0 -// CHECK-NEXT: %__llgo_funcval_code73 = call ptr asm "", "=r,0"(ptr %555) -// CHECK-NEXT: %556 = call %reflect.Value %__llgo_funcval_code73(ptr {{(nest|swiftself)}} %554, %"{{.*}}/runtime/internal/runtime.eface" %553) -// CHECK-NEXT: store %reflect.Value %549, ptr %543, align 8 -// CHECK-NEXT: store %reflect.Value %556, ptr %550, align 8 -// CHECK-NEXT: %557 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 37 -// CHECK-NEXT: %558 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %557, i32 0, i32 0 -// CHECK-NEXT: %559 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %560 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 37, ptr %560, align 1 -// CHECK-NEXT: %561 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %560, 1 -// CHECK-NEXT: %562 = extractvalue { ptr, ptr } %559, 1 -// CHECK-NEXT: %563 = extractvalue { ptr, ptr } %559, 0 -// CHECK-NEXT: %__llgo_funcval_code74 = call ptr asm "", "=r,0"(ptr %563) -// CHECK-NEXT: %564 = call %reflect.Value %__llgo_funcval_code74(ptr {{(nest|swiftself)}} %562, %"{{.*}}/runtime/internal/runtime.eface" %561) -// CHECK-NEXT: %565 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %557, i32 0, i32 1 -// CHECK-NEXT: %566 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %567 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 37, ptr %567, align 8 -// CHECK-NEXT: %568 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %567, 1 -// CHECK-NEXT: %569 = extractvalue { ptr, ptr } %566, 1 -// CHECK-NEXT: %570 = extractvalue { ptr, ptr } %566, 0 -// CHECK-NEXT: %__llgo_funcval_code75 = call ptr asm "", "=r,0"(ptr %570) -// CHECK-NEXT: %571 = call %reflect.Value %__llgo_funcval_code75(ptr {{(nest|swiftself)}} %569, %"{{.*}}/runtime/internal/runtime.eface" %568) -// CHECK-NEXT: store %reflect.Value %564, ptr %558, align 8 -// CHECK-NEXT: store %reflect.Value %571, ptr %565, align 8 -// CHECK-NEXT: %572 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 38 -// CHECK-NEXT: %573 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %572, i32 0, i32 0 -// CHECK-NEXT: %574 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %575 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 38, ptr %575, align 8 -// CHECK-NEXT: %576 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %575, 1 -// CHECK-NEXT: %577 = extractvalue { ptr, ptr } %574, 1 -// CHECK-NEXT: %578 = extractvalue { ptr, ptr } %574, 0 -// CHECK-NEXT: %__llgo_funcval_code76 = call ptr asm "", "=r,0"(ptr %578) -// CHECK-NEXT: %579 = call %reflect.Value %__llgo_funcval_code76(ptr {{(nest|swiftself)}} %577, %"{{.*}}/runtime/internal/runtime.eface" %576) -// CHECK-NEXT: %580 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %572, i32 0, i32 1 -// CHECK-NEXT: %581 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %582 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 38, ptr %582, align 1 -// CHECK-NEXT: %583 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %582, 1 -// CHECK-NEXT: %584 = extractvalue { ptr, ptr } %581, 1 -// CHECK-NEXT: %585 = extractvalue { ptr, ptr } %581, 0 -// CHECK-NEXT: %__llgo_funcval_code77 = call ptr asm "", "=r,0"(ptr %585) -// CHECK-NEXT: %586 = call %reflect.Value %__llgo_funcval_code77(ptr {{(nest|swiftself)}} %584, %"{{.*}}/runtime/internal/runtime.eface" %583) -// CHECK-NEXT: store %reflect.Value %579, ptr %573, align 8 -// CHECK-NEXT: store %reflect.Value %586, ptr %580, align 8 -// CHECK-NEXT: %587 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 39 -// CHECK-NEXT: %588 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %587, i32 0, i32 0 -// CHECK-NEXT: %589 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %590 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 39, ptr %590, align 1 -// CHECK-NEXT: %591 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %590, 1 -// CHECK-NEXT: %592 = extractvalue { ptr, ptr } %589, 1 -// CHECK-NEXT: %593 = extractvalue { ptr, ptr } %589, 0 -// CHECK-NEXT: %__llgo_funcval_code78 = call ptr asm "", "=r,0"(ptr %593) -// CHECK-NEXT: %594 = call %reflect.Value %__llgo_funcval_code78(ptr {{(nest|swiftself)}} %592, %"{{.*}}/runtime/internal/runtime.eface" %591) -// CHECK-NEXT: %595 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %587, i32 0, i32 1 -// CHECK-NEXT: %596 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %597 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 39, ptr %597, align 8 -// CHECK-NEXT: %598 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %597, 1 -// CHECK-NEXT: %599 = extractvalue { ptr, ptr } %596, 1 -// CHECK-NEXT: %600 = extractvalue { ptr, ptr } %596, 0 -// CHECK-NEXT: %__llgo_funcval_code79 = call ptr asm "", "=r,0"(ptr %600) -// CHECK-NEXT: %601 = call %reflect.Value %__llgo_funcval_code79(ptr {{(nest|swiftself)}} %599, %"{{.*}}/runtime/internal/runtime.eface" %598) -// CHECK-NEXT: store %reflect.Value %594, ptr %588, align 8 -// CHECK-NEXT: store %reflect.Value %601, ptr %595, align 8 -// CHECK-NEXT: %602 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 40 -// CHECK-NEXT: %603 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %602, i32 0, i32 0 -// CHECK-NEXT: %604 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %605 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 40, ptr %605, align 8 -// CHECK-NEXT: %606 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %605, 1 -// CHECK-NEXT: %607 = extractvalue { ptr, ptr } %604, 1 -// CHECK-NEXT: %608 = extractvalue { ptr, ptr } %604, 0 -// CHECK-NEXT: %__llgo_funcval_code80 = call ptr asm "", "=r,0"(ptr %608) -// CHECK-NEXT: %609 = call %reflect.Value %__llgo_funcval_code80(ptr {{(nest|swiftself)}} %607, %"{{.*}}/runtime/internal/runtime.eface" %606) -// CHECK-NEXT: %610 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %602, i32 0, i32 1 -// CHECK-NEXT: %611 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %612 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 40, ptr %612, align 1 -// CHECK-NEXT: %613 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %612, 1 -// CHECK-NEXT: %614 = extractvalue { ptr, ptr } %611, 1 -// CHECK-NEXT: %615 = extractvalue { ptr, ptr } %611, 0 -// CHECK-NEXT: %__llgo_funcval_code81 = call ptr asm "", "=r,0"(ptr %615) -// CHECK-NEXT: %616 = call %reflect.Value %__llgo_funcval_code81(ptr {{(nest|swiftself)}} %614, %"{{.*}}/runtime/internal/runtime.eface" %613) -// CHECK-NEXT: store %reflect.Value %609, ptr %603, align 8 -// CHECK-NEXT: store %reflect.Value %616, ptr %610, align 8 -// CHECK-NEXT: %617 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 41 -// CHECK-NEXT: %618 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %617, i32 0, i32 0 -// CHECK-NEXT: %619 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %620 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 41, ptr %620, align 1 -// CHECK-NEXT: %621 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %620, 1 -// CHECK-NEXT: %622 = extractvalue { ptr, ptr } %619, 1 -// CHECK-NEXT: %623 = extractvalue { ptr, ptr } %619, 0 -// CHECK-NEXT: %__llgo_funcval_code82 = call ptr asm "", "=r,0"(ptr %623) -// CHECK-NEXT: %624 = call %reflect.Value %__llgo_funcval_code82(ptr {{(nest|swiftself)}} %622, %"{{.*}}/runtime/internal/runtime.eface" %621) -// CHECK-NEXT: %625 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %617, i32 0, i32 1 -// CHECK-NEXT: %626 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %627 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 41, ptr %627, align 8 -// CHECK-NEXT: %628 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %627, 1 -// CHECK-NEXT: %629 = extractvalue { ptr, ptr } %626, 1 -// CHECK-NEXT: %630 = extractvalue { ptr, ptr } %626, 0 -// CHECK-NEXT: %__llgo_funcval_code83 = call ptr asm "", "=r,0"(ptr %630) -// CHECK-NEXT: %631 = call %reflect.Value %__llgo_funcval_code83(ptr {{(nest|swiftself)}} %629, %"{{.*}}/runtime/internal/runtime.eface" %628) -// CHECK-NEXT: store %reflect.Value %624, ptr %618, align 8 -// CHECK-NEXT: store %reflect.Value %631, ptr %625, align 8 -// CHECK-NEXT: %632 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 42 -// CHECK-NEXT: %633 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %632, i32 0, i32 0 -// CHECK-NEXT: %634 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %635 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 42, ptr %635, align 8 -// CHECK-NEXT: %636 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %635, 1 -// CHECK-NEXT: %637 = extractvalue { ptr, ptr } %634, 1 -// CHECK-NEXT: %638 = extractvalue { ptr, ptr } %634, 0 -// CHECK-NEXT: %__llgo_funcval_code84 = call ptr asm "", "=r,0"(ptr %638) -// CHECK-NEXT: %639 = call %reflect.Value %__llgo_funcval_code84(ptr {{(nest|swiftself)}} %637, %"{{.*}}/runtime/internal/runtime.eface" %636) -// CHECK-NEXT: %640 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %632, i32 0, i32 1 -// CHECK-NEXT: %641 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %642 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 42, ptr %642, align 1 -// CHECK-NEXT: %643 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %642, 1 -// CHECK-NEXT: %644 = extractvalue { ptr, ptr } %641, 1 -// CHECK-NEXT: %645 = extractvalue { ptr, ptr } %641, 0 -// CHECK-NEXT: %__llgo_funcval_code85 = call ptr asm "", "=r,0"(ptr %645) -// CHECK-NEXT: %646 = call %reflect.Value %__llgo_funcval_code85(ptr {{(nest|swiftself)}} %644, %"{{.*}}/runtime/internal/runtime.eface" %643) -// CHECK-NEXT: store %reflect.Value %639, ptr %633, align 8 -// CHECK-NEXT: store %reflect.Value %646, ptr %640, align 8 -// CHECK-NEXT: %647 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 43 -// CHECK-NEXT: %648 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %647, i32 0, i32 0 -// CHECK-NEXT: %649 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %650 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 43, ptr %650, align 1 -// CHECK-NEXT: %651 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %650, 1 -// CHECK-NEXT: %652 = extractvalue { ptr, ptr } %649, 1 -// CHECK-NEXT: %653 = extractvalue { ptr, ptr } %649, 0 -// CHECK-NEXT: %__llgo_funcval_code86 = call ptr asm "", "=r,0"(ptr %653) -// CHECK-NEXT: %654 = call %reflect.Value %__llgo_funcval_code86(ptr {{(nest|swiftself)}} %652, %"{{.*}}/runtime/internal/runtime.eface" %651) -// CHECK-NEXT: %655 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %647, i32 0, i32 1 -// CHECK-NEXT: %656 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %657 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 43, ptr %657, align 8 -// CHECK-NEXT: %658 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %657, 1 -// CHECK-NEXT: %659 = extractvalue { ptr, ptr } %656, 1 -// CHECK-NEXT: %660 = extractvalue { ptr, ptr } %656, 0 -// CHECK-NEXT: %__llgo_funcval_code87 = call ptr asm "", "=r,0"(ptr %660) -// CHECK-NEXT: %661 = call %reflect.Value %__llgo_funcval_code87(ptr {{(nest|swiftself)}} %659, %"{{.*}}/runtime/internal/runtime.eface" %658) -// CHECK-NEXT: store %reflect.Value %654, ptr %648, align 8 -// CHECK-NEXT: store %reflect.Value %661, ptr %655, align 8 -// CHECK-NEXT: %662 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 44 -// CHECK-NEXT: %663 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %662, i32 0, i32 0 -// CHECK-NEXT: %664 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %665 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 44, ptr %665, align 8 -// CHECK-NEXT: %666 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %665, 1 -// CHECK-NEXT: %667 = extractvalue { ptr, ptr } %664, 1 -// CHECK-NEXT: %668 = extractvalue { ptr, ptr } %664, 0 -// CHECK-NEXT: %__llgo_funcval_code88 = call ptr asm "", "=r,0"(ptr %668) -// CHECK-NEXT: %669 = call %reflect.Value %__llgo_funcval_code88(ptr {{(nest|swiftself)}} %667, %"{{.*}}/runtime/internal/runtime.eface" %666) -// CHECK-NEXT: %670 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %662, i32 0, i32 1 -// CHECK-NEXT: %671 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %672 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 44, ptr %672, align 1 -// CHECK-NEXT: %673 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %672, 1 -// CHECK-NEXT: %674 = extractvalue { ptr, ptr } %671, 1 -// CHECK-NEXT: %675 = extractvalue { ptr, ptr } %671, 0 -// CHECK-NEXT: %__llgo_funcval_code89 = call ptr asm "", "=r,0"(ptr %675) -// CHECK-NEXT: %676 = call %reflect.Value %__llgo_funcval_code89(ptr {{(nest|swiftself)}} %674, %"{{.*}}/runtime/internal/runtime.eface" %673) -// CHECK-NEXT: store %reflect.Value %669, ptr %663, align 8 -// CHECK-NEXT: store %reflect.Value %676, ptr %670, align 8 -// CHECK-NEXT: %677 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 45 -// CHECK-NEXT: %678 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %677, i32 0, i32 0 -// CHECK-NEXT: %679 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %680 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 45, ptr %680, align 1 -// CHECK-NEXT: %681 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %680, 1 -// CHECK-NEXT: %682 = extractvalue { ptr, ptr } %679, 1 -// CHECK-NEXT: %683 = extractvalue { ptr, ptr } %679, 0 -// CHECK-NEXT: %__llgo_funcval_code90 = call ptr asm "", "=r,0"(ptr %683) -// CHECK-NEXT: %684 = call %reflect.Value %__llgo_funcval_code90(ptr {{(nest|swiftself)}} %682, %"{{.*}}/runtime/internal/runtime.eface" %681) -// CHECK-NEXT: %685 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %677, i32 0, i32 1 -// CHECK-NEXT: %686 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %687 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 4.500000e+01, ptr %687, align 4 -// CHECK-NEXT: %688 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %687, 1 -// CHECK-NEXT: %689 = extractvalue { ptr, ptr } %686, 1 -// CHECK-NEXT: %690 = extractvalue { ptr, ptr } %686, 0 -// CHECK-NEXT: %__llgo_funcval_code91 = call ptr asm "", "=r,0"(ptr %690) -// CHECK-NEXT: %691 = call %reflect.Value %__llgo_funcval_code91(ptr {{(nest|swiftself)}} %689, %"{{.*}}/runtime/internal/runtime.eface" %688) -// CHECK-NEXT: store %reflect.Value %684, ptr %678, align 8 -// CHECK-NEXT: store %reflect.Value %691, ptr %685, align 8 -// CHECK-NEXT: %692 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 46 -// CHECK-NEXT: %693 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %692, i32 0, i32 0 -// CHECK-NEXT: %694 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %695 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 4.600000e+01, ptr %695, align 4 -// CHECK-NEXT: %696 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %695, 1 -// CHECK-NEXT: %697 = extractvalue { ptr, ptr } %694, 1 -// CHECK-NEXT: %698 = extractvalue { ptr, ptr } %694, 0 -// CHECK-NEXT: %__llgo_funcval_code92 = call ptr asm "", "=r,0"(ptr %698) -// CHECK-NEXT: %699 = call %reflect.Value %__llgo_funcval_code92(ptr {{(nest|swiftself)}} %697, %"{{.*}}/runtime/internal/runtime.eface" %696) -// CHECK-NEXT: %700 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %692, i32 0, i32 1 -// CHECK-NEXT: %701 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %702 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 46, ptr %702, align 1 -// CHECK-NEXT: %703 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %702, 1 -// CHECK-NEXT: %704 = extractvalue { ptr, ptr } %701, 1 -// CHECK-NEXT: %705 = extractvalue { ptr, ptr } %701, 0 -// CHECK-NEXT: %__llgo_funcval_code93 = call ptr asm "", "=r,0"(ptr %705) -// CHECK-NEXT: %706 = call %reflect.Value %__llgo_funcval_code93(ptr {{(nest|swiftself)}} %704, %"{{.*}}/runtime/internal/runtime.eface" %703) -// CHECK-NEXT: store %reflect.Value %699, ptr %693, align 8 -// CHECK-NEXT: store %reflect.Value %706, ptr %700, align 8 -// CHECK-NEXT: %707 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 47 -// CHECK-NEXT: %708 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %707, i32 0, i32 0 -// CHECK-NEXT: %709 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %710 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 47, ptr %710, align 1 -// CHECK-NEXT: %711 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %710, 1 -// CHECK-NEXT: %712 = extractvalue { ptr, ptr } %709, 1 -// CHECK-NEXT: %713 = extractvalue { ptr, ptr } %709, 0 -// CHECK-NEXT: %__llgo_funcval_code94 = call ptr asm "", "=r,0"(ptr %713) -// CHECK-NEXT: %714 = call %reflect.Value %__llgo_funcval_code94(ptr {{(nest|swiftself)}} %712, %"{{.*}}/runtime/internal/runtime.eface" %711) -// CHECK-NEXT: %715 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %707, i32 0, i32 1 -// CHECK-NEXT: %716 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %717 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 4.700000e+01, ptr %717, align 8 -// CHECK-NEXT: %718 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %717, 1 -// CHECK-NEXT: %719 = extractvalue { ptr, ptr } %716, 1 -// CHECK-NEXT: %720 = extractvalue { ptr, ptr } %716, 0 -// CHECK-NEXT: %__llgo_funcval_code95 = call ptr asm "", "=r,0"(ptr %720) -// CHECK-NEXT: %721 = call %reflect.Value %__llgo_funcval_code95(ptr {{(nest|swiftself)}} %719, %"{{.*}}/runtime/internal/runtime.eface" %718) -// CHECK-NEXT: store %reflect.Value %714, ptr %708, align 8 -// CHECK-NEXT: store %reflect.Value %721, ptr %715, align 8 -// CHECK-NEXT: %722 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 48 -// CHECK-NEXT: %723 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %722, i32 0, i32 0 -// CHECK-NEXT: %724 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %725 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 4.800000e+01, ptr %725, align 8 -// CHECK-NEXT: %726 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %725, 1 -// CHECK-NEXT: %727 = extractvalue { ptr, ptr } %724, 1 -// CHECK-NEXT: %728 = extractvalue { ptr, ptr } %724, 0 -// CHECK-NEXT: %__llgo_funcval_code96 = call ptr asm "", "=r,0"(ptr %728) -// CHECK-NEXT: %729 = call %reflect.Value %__llgo_funcval_code96(ptr {{(nest|swiftself)}} %727, %"{{.*}}/runtime/internal/runtime.eface" %726) -// CHECK-NEXT: %730 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %722, i32 0, i32 1 -// CHECK-NEXT: %731 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %732 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 48, ptr %732, align 1 -// CHECK-NEXT: %733 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %732, 1 -// CHECK-NEXT: %734 = extractvalue { ptr, ptr } %731, 1 -// CHECK-NEXT: %735 = extractvalue { ptr, ptr } %731, 0 -// CHECK-NEXT: %__llgo_funcval_code97 = call ptr asm "", "=r,0"(ptr %735) -// CHECK-NEXT: %736 = call %reflect.Value %__llgo_funcval_code97(ptr {{(nest|swiftself)}} %734, %"{{.*}}/runtime/internal/runtime.eface" %733) -// CHECK-NEXT: store %reflect.Value %729, ptr %723, align 8 -// CHECK-NEXT: store %reflect.Value %736, ptr %730, align 8 -// CHECK-NEXT: %737 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 49 -// CHECK-NEXT: %738 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %737, i32 0, i32 0 -// CHECK-NEXT: %739 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %740 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 49, ptr %740, align 2 -// CHECK-NEXT: %741 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %740, 1 -// CHECK-NEXT: %742 = extractvalue { ptr, ptr } %739, 1 -// CHECK-NEXT: %743 = extractvalue { ptr, ptr } %739, 0 -// CHECK-NEXT: %__llgo_funcval_code98 = call ptr asm "", "=r,0"(ptr %743) -// CHECK-NEXT: %744 = call %reflect.Value %__llgo_funcval_code98(ptr {{(nest|swiftself)}} %742, %"{{.*}}/runtime/internal/runtime.eface" %741) -// CHECK-NEXT: %745 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %737, i32 0, i32 1 -// CHECK-NEXT: %746 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %747 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 49, ptr %747, align 2 -// CHECK-NEXT: %748 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %747, 1 -// CHECK-NEXT: %749 = extractvalue { ptr, ptr } %746, 1 -// CHECK-NEXT: %750 = extractvalue { ptr, ptr } %746, 0 -// CHECK-NEXT: %__llgo_funcval_code99 = call ptr asm "", "=r,0"(ptr %750) -// CHECK-NEXT: %751 = call %reflect.Value %__llgo_funcval_code99(ptr {{(nest|swiftself)}} %749, %"{{.*}}/runtime/internal/runtime.eface" %748) -// CHECK-NEXT: store %reflect.Value %744, ptr %738, align 8 -// CHECK-NEXT: store %reflect.Value %751, ptr %745, align 8 -// CHECK-NEXT: %752 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 50 -// CHECK-NEXT: %753 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %752, i32 0, i32 0 -// CHECK-NEXT: %754 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %755 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 50, ptr %755, align 2 -// CHECK-NEXT: %756 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %755, 1 -// CHECK-NEXT: %757 = extractvalue { ptr, ptr } %754, 1 -// CHECK-NEXT: %758 = extractvalue { ptr, ptr } %754, 0 -// CHECK-NEXT: %__llgo_funcval_code100 = call ptr asm "", "=r,0"(ptr %758) -// CHECK-NEXT: %759 = call %reflect.Value %__llgo_funcval_code100(ptr {{(nest|swiftself)}} %757, %"{{.*}}/runtime/internal/runtime.eface" %756) -// CHECK-NEXT: %760 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %752, i32 0, i32 1 -// CHECK-NEXT: %761 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %762 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 50, ptr %762, align 2 -// CHECK-NEXT: %763 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %762, 1 -// CHECK-NEXT: %764 = extractvalue { ptr, ptr } %761, 1 -// CHECK-NEXT: %765 = extractvalue { ptr, ptr } %761, 0 -// CHECK-NEXT: %__llgo_funcval_code101 = call ptr asm "", "=r,0"(ptr %765) -// CHECK-NEXT: %766 = call %reflect.Value %__llgo_funcval_code101(ptr {{(nest|swiftself)}} %764, %"{{.*}}/runtime/internal/runtime.eface" %763) -// CHECK-NEXT: store %reflect.Value %759, ptr %753, align 8 -// CHECK-NEXT: store %reflect.Value %766, ptr %760, align 8 -// CHECK-NEXT: %767 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 51 -// CHECK-NEXT: %768 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %767, i32 0, i32 0 -// CHECK-NEXT: %769 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %770 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 51, ptr %770, align 2 -// CHECK-NEXT: %771 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %770, 1 -// CHECK-NEXT: %772 = extractvalue { ptr, ptr } %769, 1 -// CHECK-NEXT: %773 = extractvalue { ptr, ptr } %769, 0 -// CHECK-NEXT: %__llgo_funcval_code102 = call ptr asm "", "=r,0"(ptr %773) -// CHECK-NEXT: %774 = call %reflect.Value %__llgo_funcval_code102(ptr {{(nest|swiftself)}} %772, %"{{.*}}/runtime/internal/runtime.eface" %771) -// CHECK-NEXT: %775 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %767, i32 0, i32 1 -// CHECK-NEXT: %776 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %777 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 51, ptr %777, align 2 -// CHECK-NEXT: %778 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %777, 1 -// CHECK-NEXT: %779 = extractvalue { ptr, ptr } %776, 1 -// CHECK-NEXT: %780 = extractvalue { ptr, ptr } %776, 0 -// CHECK-NEXT: %__llgo_funcval_code103 = call ptr asm "", "=r,0"(ptr %780) -// CHECK-NEXT: %781 = call %reflect.Value %__llgo_funcval_code103(ptr {{(nest|swiftself)}} %779, %"{{.*}}/runtime/internal/runtime.eface" %778) -// CHECK-NEXT: store %reflect.Value %774, ptr %768, align 8 -// CHECK-NEXT: store %reflect.Value %781, ptr %775, align 8 -// CHECK-NEXT: %782 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 52 -// CHECK-NEXT: %783 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %782, i32 0, i32 0 -// CHECK-NEXT: %784 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %785 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 52, ptr %785, align 2 -// CHECK-NEXT: %786 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %785, 1 -// CHECK-NEXT: %787 = extractvalue { ptr, ptr } %784, 1 -// CHECK-NEXT: %788 = extractvalue { ptr, ptr } %784, 0 -// CHECK-NEXT: %__llgo_funcval_code104 = call ptr asm "", "=r,0"(ptr %788) -// CHECK-NEXT: %789 = call %reflect.Value %__llgo_funcval_code104(ptr {{(nest|swiftself)}} %787, %"{{.*}}/runtime/internal/runtime.eface" %786) -// CHECK-NEXT: %790 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %782, i32 0, i32 1 -// CHECK-NEXT: %791 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %792 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 52, ptr %792, align 4 -// CHECK-NEXT: %793 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %792, 1 -// CHECK-NEXT: %794 = extractvalue { ptr, ptr } %791, 1 -// CHECK-NEXT: %795 = extractvalue { ptr, ptr } %791, 0 -// CHECK-NEXT: %__llgo_funcval_code105 = call ptr asm "", "=r,0"(ptr %795) -// CHECK-NEXT: %796 = call %reflect.Value %__llgo_funcval_code105(ptr {{(nest|swiftself)}} %794, %"{{.*}}/runtime/internal/runtime.eface" %793) -// CHECK-NEXT: store %reflect.Value %789, ptr %783, align 8 -// CHECK-NEXT: store %reflect.Value %796, ptr %790, align 8 -// CHECK-NEXT: %797 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 53 -// CHECK-NEXT: %798 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %797, i32 0, i32 0 -// CHECK-NEXT: %799 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %800 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 53, ptr %800, align 4 -// CHECK-NEXT: %801 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %800, 1 -// CHECK-NEXT: %802 = extractvalue { ptr, ptr } %799, 1 -// CHECK-NEXT: %803 = extractvalue { ptr, ptr } %799, 0 -// CHECK-NEXT: %__llgo_funcval_code106 = call ptr asm "", "=r,0"(ptr %803) -// CHECK-NEXT: %804 = call %reflect.Value %__llgo_funcval_code106(ptr {{(nest|swiftself)}} %802, %"{{.*}}/runtime/internal/runtime.eface" %801) -// CHECK-NEXT: %805 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %797, i32 0, i32 1 -// CHECK-NEXT: %806 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %807 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 53, ptr %807, align 2 -// CHECK-NEXT: %808 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %807, 1 -// CHECK-NEXT: %809 = extractvalue { ptr, ptr } %806, 1 -// CHECK-NEXT: %810 = extractvalue { ptr, ptr } %806, 0 -// CHECK-NEXT: %__llgo_funcval_code107 = call ptr asm "", "=r,0"(ptr %810) -// CHECK-NEXT: %811 = call %reflect.Value %__llgo_funcval_code107(ptr {{(nest|swiftself)}} %809, %"{{.*}}/runtime/internal/runtime.eface" %808) -// CHECK-NEXT: store %reflect.Value %804, ptr %798, align 8 -// CHECK-NEXT: store %reflect.Value %811, ptr %805, align 8 -// CHECK-NEXT: %812 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 54 -// CHECK-NEXT: %813 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %812, i32 0, i32 0 -// CHECK-NEXT: %814 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %815 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 54, ptr %815, align 2 -// CHECK-NEXT: %816 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %815, 1 -// CHECK-NEXT: %817 = extractvalue { ptr, ptr } %814, 1 -// CHECK-NEXT: %818 = extractvalue { ptr, ptr } %814, 0 -// CHECK-NEXT: %__llgo_funcval_code108 = call ptr asm "", "=r,0"(ptr %818) -// CHECK-NEXT: %819 = call %reflect.Value %__llgo_funcval_code108(ptr {{(nest|swiftself)}} %817, %"{{.*}}/runtime/internal/runtime.eface" %816) -// CHECK-NEXT: %820 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %812, i32 0, i32 1 -// CHECK-NEXT: %821 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %822 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 54, ptr %822, align 4 -// CHECK-NEXT: %823 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %822, 1 -// CHECK-NEXT: %824 = extractvalue { ptr, ptr } %821, 1 -// CHECK-NEXT: %825 = extractvalue { ptr, ptr } %821, 0 -// CHECK-NEXT: %__llgo_funcval_code109 = call ptr asm "", "=r,0"(ptr %825) -// CHECK-NEXT: %826 = call %reflect.Value %__llgo_funcval_code109(ptr {{(nest|swiftself)}} %824, %"{{.*}}/runtime/internal/runtime.eface" %823) -// CHECK-NEXT: store %reflect.Value %819, ptr %813, align 8 -// CHECK-NEXT: store %reflect.Value %826, ptr %820, align 8 -// CHECK-NEXT: %827 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 55 -// CHECK-NEXT: %828 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %827, i32 0, i32 0 -// CHECK-NEXT: %829 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %830 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 55, ptr %830, align 4 -// CHECK-NEXT: %831 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %830, 1 -// CHECK-NEXT: %832 = extractvalue { ptr, ptr } %829, 1 -// CHECK-NEXT: %833 = extractvalue { ptr, ptr } %829, 0 -// CHECK-NEXT: %__llgo_funcval_code110 = call ptr asm "", "=r,0"(ptr %833) -// CHECK-NEXT: %834 = call %reflect.Value %__llgo_funcval_code110(ptr {{(nest|swiftself)}} %832, %"{{.*}}/runtime/internal/runtime.eface" %831) -// CHECK-NEXT: %835 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %827, i32 0, i32 1 -// CHECK-NEXT: %836 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %837 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 55, ptr %837, align 2 -// CHECK-NEXT: %838 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %837, 1 -// CHECK-NEXT: %839 = extractvalue { ptr, ptr } %836, 1 -// CHECK-NEXT: %840 = extractvalue { ptr, ptr } %836, 0 -// CHECK-NEXT: %__llgo_funcval_code111 = call ptr asm "", "=r,0"(ptr %840) -// CHECK-NEXT: %841 = call %reflect.Value %__llgo_funcval_code111(ptr {{(nest|swiftself)}} %839, %"{{.*}}/runtime/internal/runtime.eface" %838) -// CHECK-NEXT: store %reflect.Value %834, ptr %828, align 8 -// CHECK-NEXT: store %reflect.Value %841, ptr %835, align 8 -// CHECK-NEXT: %842 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 56 -// CHECK-NEXT: %843 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %842, i32 0, i32 0 -// CHECK-NEXT: %844 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %845 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 56, ptr %845, align 2 -// CHECK-NEXT: %846 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %845, 1 -// CHECK-NEXT: %847 = extractvalue { ptr, ptr } %844, 1 -// CHECK-NEXT: %848 = extractvalue { ptr, ptr } %844, 0 -// CHECK-NEXT: %__llgo_funcval_code112 = call ptr asm "", "=r,0"(ptr %848) -// CHECK-NEXT: %849 = call %reflect.Value %__llgo_funcval_code112(ptr {{(nest|swiftself)}} %847, %"{{.*}}/runtime/internal/runtime.eface" %846) -// CHECK-NEXT: %850 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %842, i32 0, i32 1 -// CHECK-NEXT: %851 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %852 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 56, ptr %852, align 8 -// CHECK-NEXT: %853 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %852, 1 -// CHECK-NEXT: %854 = extractvalue { ptr, ptr } %851, 1 -// CHECK-NEXT: %855 = extractvalue { ptr, ptr } %851, 0 -// CHECK-NEXT: %__llgo_funcval_code113 = call ptr asm "", "=r,0"(ptr %855) -// CHECK-NEXT: %856 = call %reflect.Value %__llgo_funcval_code113(ptr {{(nest|swiftself)}} %854, %"{{.*}}/runtime/internal/runtime.eface" %853) -// CHECK-NEXT: store %reflect.Value %849, ptr %843, align 8 -// CHECK-NEXT: store %reflect.Value %856, ptr %850, align 8 -// CHECK-NEXT: %857 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 57 -// CHECK-NEXT: %858 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %857, i32 0, i32 0 -// CHECK-NEXT: %859 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %860 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 57, ptr %860, align 8 -// CHECK-NEXT: %861 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %860, 1 -// CHECK-NEXT: %862 = extractvalue { ptr, ptr } %859, 1 -// CHECK-NEXT: %863 = extractvalue { ptr, ptr } %859, 0 -// CHECK-NEXT: %__llgo_funcval_code114 = call ptr asm "", "=r,0"(ptr %863) -// CHECK-NEXT: %864 = call %reflect.Value %__llgo_funcval_code114(ptr {{(nest|swiftself)}} %862, %"{{.*}}/runtime/internal/runtime.eface" %861) -// CHECK-NEXT: %865 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %857, i32 0, i32 1 -// CHECK-NEXT: %866 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %867 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 57, ptr %867, align 2 -// CHECK-NEXT: %868 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %867, 1 -// CHECK-NEXT: %869 = extractvalue { ptr, ptr } %866, 1 -// CHECK-NEXT: %870 = extractvalue { ptr, ptr } %866, 0 -// CHECK-NEXT: %__llgo_funcval_code115 = call ptr asm "", "=r,0"(ptr %870) -// CHECK-NEXT: %871 = call %reflect.Value %__llgo_funcval_code115(ptr {{(nest|swiftself)}} %869, %"{{.*}}/runtime/internal/runtime.eface" %868) -// CHECK-NEXT: store %reflect.Value %864, ptr %858, align 8 -// CHECK-NEXT: store %reflect.Value %871, ptr %865, align 8 -// CHECK-NEXT: %872 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 58 -// CHECK-NEXT: %873 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %872, i32 0, i32 0 -// CHECK-NEXT: %874 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %875 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 58, ptr %875, align 2 -// CHECK-NEXT: %876 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %875, 1 -// CHECK-NEXT: %877 = extractvalue { ptr, ptr } %874, 1 -// CHECK-NEXT: %878 = extractvalue { ptr, ptr } %874, 0 -// CHECK-NEXT: %__llgo_funcval_code116 = call ptr asm "", "=r,0"(ptr %878) -// CHECK-NEXT: %879 = call %reflect.Value %__llgo_funcval_code116(ptr {{(nest|swiftself)}} %877, %"{{.*}}/runtime/internal/runtime.eface" %876) -// CHECK-NEXT: %880 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %872, i32 0, i32 1 -// CHECK-NEXT: %881 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %882 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 58, ptr %882, align 8 -// CHECK-NEXT: %883 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %882, 1 -// CHECK-NEXT: %884 = extractvalue { ptr, ptr } %881, 1 -// CHECK-NEXT: %885 = extractvalue { ptr, ptr } %881, 0 -// CHECK-NEXT: %__llgo_funcval_code117 = call ptr asm "", "=r,0"(ptr %885) -// CHECK-NEXT: %886 = call %reflect.Value %__llgo_funcval_code117(ptr {{(nest|swiftself)}} %884, %"{{.*}}/runtime/internal/runtime.eface" %883) -// CHECK-NEXT: store %reflect.Value %879, ptr %873, align 8 -// CHECK-NEXT: store %reflect.Value %886, ptr %880, align 8 -// CHECK-NEXT: %887 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 59 -// CHECK-NEXT: %888 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %887, i32 0, i32 0 -// CHECK-NEXT: %889 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %890 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 59, ptr %890, align 8 -// CHECK-NEXT: %891 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %890, 1 -// CHECK-NEXT: %892 = extractvalue { ptr, ptr } %889, 1 -// CHECK-NEXT: %893 = extractvalue { ptr, ptr } %889, 0 -// CHECK-NEXT: %__llgo_funcval_code118 = call ptr asm "", "=r,0"(ptr %893) -// CHECK-NEXT: %894 = call %reflect.Value %__llgo_funcval_code118(ptr {{(nest|swiftself)}} %892, %"{{.*}}/runtime/internal/runtime.eface" %891) -// CHECK-NEXT: %895 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %887, i32 0, i32 1 -// CHECK-NEXT: %896 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %897 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 59, ptr %897, align 2 -// CHECK-NEXT: %898 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %897, 1 -// CHECK-NEXT: %899 = extractvalue { ptr, ptr } %896, 1 -// CHECK-NEXT: %900 = extractvalue { ptr, ptr } %896, 0 -// CHECK-NEXT: %__llgo_funcval_code119 = call ptr asm "", "=r,0"(ptr %900) -// CHECK-NEXT: %901 = call %reflect.Value %__llgo_funcval_code119(ptr {{(nest|swiftself)}} %899, %"{{.*}}/runtime/internal/runtime.eface" %898) -// CHECK-NEXT: store %reflect.Value %894, ptr %888, align 8 -// CHECK-NEXT: store %reflect.Value %901, ptr %895, align 8 -// CHECK-NEXT: %902 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 60 -// CHECK-NEXT: %903 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %902, i32 0, i32 0 -// CHECK-NEXT: %904 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %905 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 60, ptr %905, align 2 -// CHECK-NEXT: %906 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %905, 1 -// CHECK-NEXT: %907 = extractvalue { ptr, ptr } %904, 1 -// CHECK-NEXT: %908 = extractvalue { ptr, ptr } %904, 0 -// CHECK-NEXT: %__llgo_funcval_code120 = call ptr asm "", "=r,0"(ptr %908) -// CHECK-NEXT: %909 = call %reflect.Value %__llgo_funcval_code120(ptr {{(nest|swiftself)}} %907, %"{{.*}}/runtime/internal/runtime.eface" %906) -// CHECK-NEXT: %910 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %902, i32 0, i32 1 -// CHECK-NEXT: %911 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %912 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 60, ptr %912, align 8 -// CHECK-NEXT: %913 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %912, 1 -// CHECK-NEXT: %914 = extractvalue { ptr, ptr } %911, 1 -// CHECK-NEXT: %915 = extractvalue { ptr, ptr } %911, 0 -// CHECK-NEXT: %__llgo_funcval_code121 = call ptr asm "", "=r,0"(ptr %915) -// CHECK-NEXT: %916 = call %reflect.Value %__llgo_funcval_code121(ptr {{(nest|swiftself)}} %914, %"{{.*}}/runtime/internal/runtime.eface" %913) -// CHECK-NEXT: store %reflect.Value %909, ptr %903, align 8 -// CHECK-NEXT: store %reflect.Value %916, ptr %910, align 8 -// CHECK-NEXT: %917 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 61 -// CHECK-NEXT: %918 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %917, i32 0, i32 0 -// CHECK-NEXT: %919 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %920 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 61, ptr %920, align 8 -// CHECK-NEXT: %921 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %920, 1 -// CHECK-NEXT: %922 = extractvalue { ptr, ptr } %919, 1 -// CHECK-NEXT: %923 = extractvalue { ptr, ptr } %919, 0 -// CHECK-NEXT: %__llgo_funcval_code122 = call ptr asm "", "=r,0"(ptr %923) -// CHECK-NEXT: %924 = call %reflect.Value %__llgo_funcval_code122(ptr {{(nest|swiftself)}} %922, %"{{.*}}/runtime/internal/runtime.eface" %921) -// CHECK-NEXT: %925 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %917, i32 0, i32 1 -// CHECK-NEXT: %926 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %927 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 61, ptr %927, align 2 -// CHECK-NEXT: %928 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %927, 1 -// CHECK-NEXT: %929 = extractvalue { ptr, ptr } %926, 1 -// CHECK-NEXT: %930 = extractvalue { ptr, ptr } %926, 0 -// CHECK-NEXT: %__llgo_funcval_code123 = call ptr asm "", "=r,0"(ptr %930) -// CHECK-NEXT: %931 = call %reflect.Value %__llgo_funcval_code123(ptr {{(nest|swiftself)}} %929, %"{{.*}}/runtime/internal/runtime.eface" %928) -// CHECK-NEXT: store %reflect.Value %924, ptr %918, align 8 -// CHECK-NEXT: store %reflect.Value %931, ptr %925, align 8 -// CHECK-NEXT: %932 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 62 -// CHECK-NEXT: %933 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %932, i32 0, i32 0 -// CHECK-NEXT: %934 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %935 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 62, ptr %935, align 2 -// CHECK-NEXT: %936 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %935, 1 -// CHECK-NEXT: %937 = extractvalue { ptr, ptr } %934, 1 -// CHECK-NEXT: %938 = extractvalue { ptr, ptr } %934, 0 -// CHECK-NEXT: %__llgo_funcval_code124 = call ptr asm "", "=r,0"(ptr %938) -// CHECK-NEXT: %939 = call %reflect.Value %__llgo_funcval_code124(ptr {{(nest|swiftself)}} %937, %"{{.*}}/runtime/internal/runtime.eface" %936) -// CHECK-NEXT: %940 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %932, i32 0, i32 1 -// CHECK-NEXT: %941 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %942 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 62, ptr %942, align 8 -// CHECK-NEXT: %943 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %942, 1 -// CHECK-NEXT: %944 = extractvalue { ptr, ptr } %941, 1 -// CHECK-NEXT: %945 = extractvalue { ptr, ptr } %941, 0 -// CHECK-NEXT: %__llgo_funcval_code125 = call ptr asm "", "=r,0"(ptr %945) -// CHECK-NEXT: %946 = call %reflect.Value %__llgo_funcval_code125(ptr {{(nest|swiftself)}} %944, %"{{.*}}/runtime/internal/runtime.eface" %943) -// CHECK-NEXT: store %reflect.Value %939, ptr %933, align 8 -// CHECK-NEXT: store %reflect.Value %946, ptr %940, align 8 -// CHECK-NEXT: %947 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 63 -// CHECK-NEXT: %948 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %947, i32 0, i32 0 -// CHECK-NEXT: %949 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %950 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 63, ptr %950, align 8 -// CHECK-NEXT: %951 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %950, 1 -// CHECK-NEXT: %952 = extractvalue { ptr, ptr } %949, 1 -// CHECK-NEXT: %953 = extractvalue { ptr, ptr } %949, 0 -// CHECK-NEXT: %__llgo_funcval_code126 = call ptr asm "", "=r,0"(ptr %953) -// CHECK-NEXT: %954 = call %reflect.Value %__llgo_funcval_code126(ptr {{(nest|swiftself)}} %952, %"{{.*}}/runtime/internal/runtime.eface" %951) -// CHECK-NEXT: %955 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %947, i32 0, i32 1 -// CHECK-NEXT: %956 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %957 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 63, ptr %957, align 2 -// CHECK-NEXT: %958 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %957, 1 -// CHECK-NEXT: %959 = extractvalue { ptr, ptr } %956, 1 -// CHECK-NEXT: %960 = extractvalue { ptr, ptr } %956, 0 -// CHECK-NEXT: %__llgo_funcval_code127 = call ptr asm "", "=r,0"(ptr %960) -// CHECK-NEXT: %961 = call %reflect.Value %__llgo_funcval_code127(ptr {{(nest|swiftself)}} %959, %"{{.*}}/runtime/internal/runtime.eface" %958) -// CHECK-NEXT: store %reflect.Value %954, ptr %948, align 8 -// CHECK-NEXT: store %reflect.Value %961, ptr %955, align 8 -// CHECK-NEXT: %962 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 64 -// CHECK-NEXT: %963 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %962, i32 0, i32 0 -// CHECK-NEXT: %964 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %965 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 64, ptr %965, align 2 -// CHECK-NEXT: %966 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %965, 1 -// CHECK-NEXT: %967 = extractvalue { ptr, ptr } %964, 1 -// CHECK-NEXT: %968 = extractvalue { ptr, ptr } %964, 0 -// CHECK-NEXT: %__llgo_funcval_code128 = call ptr asm "", "=r,0"(ptr %968) -// CHECK-NEXT: %969 = call %reflect.Value %__llgo_funcval_code128(ptr {{(nest|swiftself)}} %967, %"{{.*}}/runtime/internal/runtime.eface" %966) -// CHECK-NEXT: %970 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %962, i32 0, i32 1 -// CHECK-NEXT: %971 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %972 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 64, ptr %972, align 8 -// CHECK-NEXT: %973 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %972, 1 -// CHECK-NEXT: %974 = extractvalue { ptr, ptr } %971, 1 -// CHECK-NEXT: %975 = extractvalue { ptr, ptr } %971, 0 -// CHECK-NEXT: %__llgo_funcval_code129 = call ptr asm "", "=r,0"(ptr %975) -// CHECK-NEXT: %976 = call %reflect.Value %__llgo_funcval_code129(ptr {{(nest|swiftself)}} %974, %"{{.*}}/runtime/internal/runtime.eface" %973) -// CHECK-NEXT: store %reflect.Value %969, ptr %963, align 8 -// CHECK-NEXT: store %reflect.Value %976, ptr %970, align 8 -// CHECK-NEXT: %977 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 65 -// CHECK-NEXT: %978 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %977, i32 0, i32 0 -// CHECK-NEXT: %979 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %980 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 65, ptr %980, align 8 -// CHECK-NEXT: %981 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %980, 1 -// CHECK-NEXT: %982 = extractvalue { ptr, ptr } %979, 1 -// CHECK-NEXT: %983 = extractvalue { ptr, ptr } %979, 0 -// CHECK-NEXT: %__llgo_funcval_code130 = call ptr asm "", "=r,0"(ptr %983) -// CHECK-NEXT: %984 = call %reflect.Value %__llgo_funcval_code130(ptr {{(nest|swiftself)}} %982, %"{{.*}}/runtime/internal/runtime.eface" %981) -// CHECK-NEXT: %985 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %977, i32 0, i32 1 -// CHECK-NEXT: %986 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %987 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 65, ptr %987, align 2 -// CHECK-NEXT: %988 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %987, 1 -// CHECK-NEXT: %989 = extractvalue { ptr, ptr } %986, 1 -// CHECK-NEXT: %990 = extractvalue { ptr, ptr } %986, 0 -// CHECK-NEXT: %__llgo_funcval_code131 = call ptr asm "", "=r,0"(ptr %990) -// CHECK-NEXT: %991 = call %reflect.Value %__llgo_funcval_code131(ptr {{(nest|swiftself)}} %989, %"{{.*}}/runtime/internal/runtime.eface" %988) -// CHECK-NEXT: store %reflect.Value %984, ptr %978, align 8 -// CHECK-NEXT: store %reflect.Value %991, ptr %985, align 8 -// CHECK-NEXT: %992 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 66 -// CHECK-NEXT: %993 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %992, i32 0, i32 0 -// CHECK-NEXT: %994 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %995 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 66, ptr %995, align 2 -// CHECK-NEXT: %996 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %995, 1 -// CHECK-NEXT: %997 = extractvalue { ptr, ptr } %994, 1 -// CHECK-NEXT: %998 = extractvalue { ptr, ptr } %994, 0 -// CHECK-NEXT: %__llgo_funcval_code132 = call ptr asm "", "=r,0"(ptr %998) -// CHECK-NEXT: %999 = call %reflect.Value %__llgo_funcval_code132(ptr {{(nest|swiftself)}} %997, %"{{.*}}/runtime/internal/runtime.eface" %996) -// CHECK-NEXT: %1000 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %992, i32 0, i32 1 -// CHECK-NEXT: %1001 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1002 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 6.600000e+01, ptr %1002, align 4 -// CHECK-NEXT: %1003 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1002, 1 -// CHECK-NEXT: %1004 = extractvalue { ptr, ptr } %1001, 1 -// CHECK-NEXT: %1005 = extractvalue { ptr, ptr } %1001, 0 -// CHECK-NEXT: %__llgo_funcval_code133 = call ptr asm "", "=r,0"(ptr %1005) -// CHECK-NEXT: %1006 = call %reflect.Value %__llgo_funcval_code133(ptr {{(nest|swiftself)}} %1004, %"{{.*}}/runtime/internal/runtime.eface" %1003) -// CHECK-NEXT: store %reflect.Value %999, ptr %993, align 8 -// CHECK-NEXT: store %reflect.Value %1006, ptr %1000, align 8 -// CHECK-NEXT: %1007 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 67 -// CHECK-NEXT: %1008 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1007, i32 0, i32 0 -// CHECK-NEXT: %1009 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1010 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 6.700000e+01, ptr %1010, align 4 -// CHECK-NEXT: %1011 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1010, 1 -// CHECK-NEXT: %1012 = extractvalue { ptr, ptr } %1009, 1 -// CHECK-NEXT: %1013 = extractvalue { ptr, ptr } %1009, 0 -// CHECK-NEXT: %__llgo_funcval_code134 = call ptr asm "", "=r,0"(ptr %1013) -// CHECK-NEXT: %1014 = call %reflect.Value %__llgo_funcval_code134(ptr {{(nest|swiftself)}} %1012, %"{{.*}}/runtime/internal/runtime.eface" %1011) -// CHECK-NEXT: %1015 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1007, i32 0, i32 1 -// CHECK-NEXT: %1016 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1017 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 67, ptr %1017, align 2 -// CHECK-NEXT: %1018 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %1017, 1 -// CHECK-NEXT: %1019 = extractvalue { ptr, ptr } %1016, 1 -// CHECK-NEXT: %1020 = extractvalue { ptr, ptr } %1016, 0 -// CHECK-NEXT: %__llgo_funcval_code135 = call ptr asm "", "=r,0"(ptr %1020) -// CHECK-NEXT: %1021 = call %reflect.Value %__llgo_funcval_code135(ptr {{(nest|swiftself)}} %1019, %"{{.*}}/runtime/internal/runtime.eface" %1018) -// CHECK-NEXT: store %reflect.Value %1014, ptr %1008, align 8 -// CHECK-NEXT: store %reflect.Value %1021, ptr %1015, align 8 -// CHECK-NEXT: %1022 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 68 -// CHECK-NEXT: %1023 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1022, i32 0, i32 0 -// CHECK-NEXT: %1024 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1025 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 68, ptr %1025, align 2 -// CHECK-NEXT: %1026 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %1025, 1 -// CHECK-NEXT: %1027 = extractvalue { ptr, ptr } %1024, 1 -// CHECK-NEXT: %1028 = extractvalue { ptr, ptr } %1024, 0 -// CHECK-NEXT: %__llgo_funcval_code136 = call ptr asm "", "=r,0"(ptr %1028) -// CHECK-NEXT: %1029 = call %reflect.Value %__llgo_funcval_code136(ptr {{(nest|swiftself)}} %1027, %"{{.*}}/runtime/internal/runtime.eface" %1026) -// CHECK-NEXT: %1030 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1022, i32 0, i32 1 -// CHECK-NEXT: %1031 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1032 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 6.800000e+01, ptr %1032, align 8 -// CHECK-NEXT: %1033 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1032, 1 -// CHECK-NEXT: %1034 = extractvalue { ptr, ptr } %1031, 1 -// CHECK-NEXT: %1035 = extractvalue { ptr, ptr } %1031, 0 -// CHECK-NEXT: %__llgo_funcval_code137 = call ptr asm "", "=r,0"(ptr %1035) -// CHECK-NEXT: %1036 = call %reflect.Value %__llgo_funcval_code137(ptr {{(nest|swiftself)}} %1034, %"{{.*}}/runtime/internal/runtime.eface" %1033) -// CHECK-NEXT: store %reflect.Value %1029, ptr %1023, align 8 -// CHECK-NEXT: store %reflect.Value %1036, ptr %1030, align 8 -// CHECK-NEXT: %1037 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 69 -// CHECK-NEXT: %1038 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1037, i32 0, i32 0 -// CHECK-NEXT: %1039 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1040 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 6.900000e+01, ptr %1040, align 8 -// CHECK-NEXT: %1041 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1040, 1 -// CHECK-NEXT: %1042 = extractvalue { ptr, ptr } %1039, 1 -// CHECK-NEXT: %1043 = extractvalue { ptr, ptr } %1039, 0 -// CHECK-NEXT: %__llgo_funcval_code138 = call ptr asm "", "=r,0"(ptr %1043) -// CHECK-NEXT: %1044 = call %reflect.Value %__llgo_funcval_code138(ptr {{(nest|swiftself)}} %1042, %"{{.*}}/runtime/internal/runtime.eface" %1041) -// CHECK-NEXT: %1045 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1037, i32 0, i32 1 -// CHECK-NEXT: %1046 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1047 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 69, ptr %1047, align 2 -// CHECK-NEXT: %1048 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %1047, 1 -// CHECK-NEXT: %1049 = extractvalue { ptr, ptr } %1046, 1 -// CHECK-NEXT: %1050 = extractvalue { ptr, ptr } %1046, 0 -// CHECK-NEXT: %__llgo_funcval_code139 = call ptr asm "", "=r,0"(ptr %1050) -// CHECK-NEXT: %1051 = call %reflect.Value %__llgo_funcval_code139(ptr {{(nest|swiftself)}} %1049, %"{{.*}}/runtime/internal/runtime.eface" %1048) -// CHECK-NEXT: store %reflect.Value %1044, ptr %1038, align 8 -// CHECK-NEXT: store %reflect.Value %1051, ptr %1045, align 8 -// CHECK-NEXT: %1052 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 70 -// CHECK-NEXT: %1053 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1052, i32 0, i32 0 -// CHECK-NEXT: %1054 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1055 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 70, ptr %1055, align 2 -// CHECK-NEXT: %1056 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1055, 1 -// CHECK-NEXT: %1057 = extractvalue { ptr, ptr } %1054, 1 -// CHECK-NEXT: %1058 = extractvalue { ptr, ptr } %1054, 0 -// CHECK-NEXT: %__llgo_funcval_code140 = call ptr asm "", "=r,0"(ptr %1058) -// CHECK-NEXT: %1059 = call %reflect.Value %__llgo_funcval_code140(ptr {{(nest|swiftself)}} %1057, %"{{.*}}/runtime/internal/runtime.eface" %1056) -// CHECK-NEXT: %1060 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1052, i32 0, i32 1 -// CHECK-NEXT: %1061 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1062 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 70, ptr %1062, align 2 -// CHECK-NEXT: %1063 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1062, 1 -// CHECK-NEXT: %1064 = extractvalue { ptr, ptr } %1061, 1 -// CHECK-NEXT: %1065 = extractvalue { ptr, ptr } %1061, 0 -// CHECK-NEXT: %__llgo_funcval_code141 = call ptr asm "", "=r,0"(ptr %1065) -// CHECK-NEXT: %1066 = call %reflect.Value %__llgo_funcval_code141(ptr {{(nest|swiftself)}} %1064, %"{{.*}}/runtime/internal/runtime.eface" %1063) -// CHECK-NEXT: store %reflect.Value %1059, ptr %1053, align 8 -// CHECK-NEXT: store %reflect.Value %1066, ptr %1060, align 8 -// CHECK-NEXT: %1067 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 71 -// CHECK-NEXT: %1068 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1067, i32 0, i32 0 -// CHECK-NEXT: %1069 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1070 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 71, ptr %1070, align 2 -// CHECK-NEXT: %1071 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1070, 1 -// CHECK-NEXT: %1072 = extractvalue { ptr, ptr } %1069, 1 -// CHECK-NEXT: %1073 = extractvalue { ptr, ptr } %1069, 0 -// CHECK-NEXT: %__llgo_funcval_code142 = call ptr asm "", "=r,0"(ptr %1073) -// CHECK-NEXT: %1074 = call %reflect.Value %__llgo_funcval_code142(ptr {{(nest|swiftself)}} %1072, %"{{.*}}/runtime/internal/runtime.eface" %1071) -// CHECK-NEXT: %1075 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1067, i32 0, i32 1 -// CHECK-NEXT: %1076 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1077 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 71, ptr %1077, align 4 -// CHECK-NEXT: %1078 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1077, 1 -// CHECK-NEXT: %1079 = extractvalue { ptr, ptr } %1076, 1 -// CHECK-NEXT: %1080 = extractvalue { ptr, ptr } %1076, 0 -// CHECK-NEXT: %__llgo_funcval_code143 = call ptr asm "", "=r,0"(ptr %1080) -// CHECK-NEXT: %1081 = call %reflect.Value %__llgo_funcval_code143(ptr {{(nest|swiftself)}} %1079, %"{{.*}}/runtime/internal/runtime.eface" %1078) -// CHECK-NEXT: store %reflect.Value %1074, ptr %1068, align 8 -// CHECK-NEXT: store %reflect.Value %1081, ptr %1075, align 8 -// CHECK-NEXT: %1082 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 72 -// CHECK-NEXT: %1083 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1082, i32 0, i32 0 -// CHECK-NEXT: %1084 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1085 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 72, ptr %1085, align 4 -// CHECK-NEXT: %1086 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1085, 1 -// CHECK-NEXT: %1087 = extractvalue { ptr, ptr } %1084, 1 -// CHECK-NEXT: %1088 = extractvalue { ptr, ptr } %1084, 0 -// CHECK-NEXT: %__llgo_funcval_code144 = call ptr asm "", "=r,0"(ptr %1088) -// CHECK-NEXT: %1089 = call %reflect.Value %__llgo_funcval_code144(ptr {{(nest|swiftself)}} %1087, %"{{.*}}/runtime/internal/runtime.eface" %1086) -// CHECK-NEXT: %1090 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1082, i32 0, i32 1 -// CHECK-NEXT: %1091 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1092 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 72, ptr %1092, align 2 -// CHECK-NEXT: %1093 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1092, 1 -// CHECK-NEXT: %1094 = extractvalue { ptr, ptr } %1091, 1 -// CHECK-NEXT: %1095 = extractvalue { ptr, ptr } %1091, 0 -// CHECK-NEXT: %__llgo_funcval_code145 = call ptr asm "", "=r,0"(ptr %1095) -// CHECK-NEXT: %1096 = call %reflect.Value %__llgo_funcval_code145(ptr {{(nest|swiftself)}} %1094, %"{{.*}}/runtime/internal/runtime.eface" %1093) -// CHECK-NEXT: store %reflect.Value %1089, ptr %1083, align 8 -// CHECK-NEXT: store %reflect.Value %1096, ptr %1090, align 8 -// CHECK-NEXT: %1097 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 73 -// CHECK-NEXT: %1098 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1097, i32 0, i32 0 -// CHECK-NEXT: %1099 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1100 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 73, ptr %1100, align 2 -// CHECK-NEXT: %1101 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1100, 1 -// CHECK-NEXT: %1102 = extractvalue { ptr, ptr } %1099, 1 -// CHECK-NEXT: %1103 = extractvalue { ptr, ptr } %1099, 0 -// CHECK-NEXT: %__llgo_funcval_code146 = call ptr asm "", "=r,0"(ptr %1103) -// CHECK-NEXT: %1104 = call %reflect.Value %__llgo_funcval_code146(ptr {{(nest|swiftself)}} %1102, %"{{.*}}/runtime/internal/runtime.eface" %1101) -// CHECK-NEXT: %1105 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1097, i32 0, i32 1 -// CHECK-NEXT: %1106 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1107 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 73, ptr %1107, align 4 -// CHECK-NEXT: %1108 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1107, 1 -// CHECK-NEXT: %1109 = extractvalue { ptr, ptr } %1106, 1 -// CHECK-NEXT: %1110 = extractvalue { ptr, ptr } %1106, 0 -// CHECK-NEXT: %__llgo_funcval_code147 = call ptr asm "", "=r,0"(ptr %1110) -// CHECK-NEXT: %1111 = call %reflect.Value %__llgo_funcval_code147(ptr {{(nest|swiftself)}} %1109, %"{{.*}}/runtime/internal/runtime.eface" %1108) -// CHECK-NEXT: store %reflect.Value %1104, ptr %1098, align 8 -// CHECK-NEXT: store %reflect.Value %1111, ptr %1105, align 8 -// CHECK-NEXT: %1112 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 74 -// CHECK-NEXT: %1113 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1112, i32 0, i32 0 -// CHECK-NEXT: %1114 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1115 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 74, ptr %1115, align 4 -// CHECK-NEXT: %1116 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1115, 1 -// CHECK-NEXT: %1117 = extractvalue { ptr, ptr } %1114, 1 -// CHECK-NEXT: %1118 = extractvalue { ptr, ptr } %1114, 0 -// CHECK-NEXT: %__llgo_funcval_code148 = call ptr asm "", "=r,0"(ptr %1118) -// CHECK-NEXT: %1119 = call %reflect.Value %__llgo_funcval_code148(ptr {{(nest|swiftself)}} %1117, %"{{.*}}/runtime/internal/runtime.eface" %1116) -// CHECK-NEXT: %1120 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1112, i32 0, i32 1 -// CHECK-NEXT: %1121 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1122 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 74, ptr %1122, align 2 -// CHECK-NEXT: %1123 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1122, 1 -// CHECK-NEXT: %1124 = extractvalue { ptr, ptr } %1121, 1 -// CHECK-NEXT: %1125 = extractvalue { ptr, ptr } %1121, 0 -// CHECK-NEXT: %__llgo_funcval_code149 = call ptr asm "", "=r,0"(ptr %1125) -// CHECK-NEXT: %1126 = call %reflect.Value %__llgo_funcval_code149(ptr {{(nest|swiftself)}} %1124, %"{{.*}}/runtime/internal/runtime.eface" %1123) -// CHECK-NEXT: store %reflect.Value %1119, ptr %1113, align 8 -// CHECK-NEXT: store %reflect.Value %1126, ptr %1120, align 8 -// CHECK-NEXT: %1127 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 75 -// CHECK-NEXT: %1128 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1127, i32 0, i32 0 -// CHECK-NEXT: %1129 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1130 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 75, ptr %1130, align 2 -// CHECK-NEXT: %1131 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1130, 1 -// CHECK-NEXT: %1132 = extractvalue { ptr, ptr } %1129, 1 -// CHECK-NEXT: %1133 = extractvalue { ptr, ptr } %1129, 0 -// CHECK-NEXT: %__llgo_funcval_code150 = call ptr asm "", "=r,0"(ptr %1133) -// CHECK-NEXT: %1134 = call %reflect.Value %__llgo_funcval_code150(ptr {{(nest|swiftself)}} %1132, %"{{.*}}/runtime/internal/runtime.eface" %1131) -// CHECK-NEXT: %1135 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1127, i32 0, i32 1 -// CHECK-NEXT: %1136 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1137 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 75, ptr %1137, align 8 -// CHECK-NEXT: %1138 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1137, 1 -// CHECK-NEXT: %1139 = extractvalue { ptr, ptr } %1136, 1 -// CHECK-NEXT: %1140 = extractvalue { ptr, ptr } %1136, 0 -// CHECK-NEXT: %__llgo_funcval_code151 = call ptr asm "", "=r,0"(ptr %1140) -// CHECK-NEXT: %1141 = call %reflect.Value %__llgo_funcval_code151(ptr {{(nest|swiftself)}} %1139, %"{{.*}}/runtime/internal/runtime.eface" %1138) -// CHECK-NEXT: store %reflect.Value %1134, ptr %1128, align 8 -// CHECK-NEXT: store %reflect.Value %1141, ptr %1135, align 8 -// CHECK-NEXT: %1142 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 76 -// CHECK-NEXT: %1143 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1142, i32 0, i32 0 -// CHECK-NEXT: %1144 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1145 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 76, ptr %1145, align 8 -// CHECK-NEXT: %1146 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1145, 1 -// CHECK-NEXT: %1147 = extractvalue { ptr, ptr } %1144, 1 -// CHECK-NEXT: %1148 = extractvalue { ptr, ptr } %1144, 0 -// CHECK-NEXT: %__llgo_funcval_code152 = call ptr asm "", "=r,0"(ptr %1148) -// CHECK-NEXT: %1149 = call %reflect.Value %__llgo_funcval_code152(ptr {{(nest|swiftself)}} %1147, %"{{.*}}/runtime/internal/runtime.eface" %1146) -// CHECK-NEXT: %1150 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1142, i32 0, i32 1 -// CHECK-NEXT: %1151 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1152 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 76, ptr %1152, align 2 -// CHECK-NEXT: %1153 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1152, 1 -// CHECK-NEXT: %1154 = extractvalue { ptr, ptr } %1151, 1 -// CHECK-NEXT: %1155 = extractvalue { ptr, ptr } %1151, 0 -// CHECK-NEXT: %__llgo_funcval_code153 = call ptr asm "", "=r,0"(ptr %1155) -// CHECK-NEXT: %1156 = call %reflect.Value %__llgo_funcval_code153(ptr {{(nest|swiftself)}} %1154, %"{{.*}}/runtime/internal/runtime.eface" %1153) -// CHECK-NEXT: store %reflect.Value %1149, ptr %1143, align 8 -// CHECK-NEXT: store %reflect.Value %1156, ptr %1150, align 8 -// CHECK-NEXT: %1157 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 77 -// CHECK-NEXT: %1158 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1157, i32 0, i32 0 -// CHECK-NEXT: %1159 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1160 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 77, ptr %1160, align 2 -// CHECK-NEXT: %1161 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1160, 1 -// CHECK-NEXT: %1162 = extractvalue { ptr, ptr } %1159, 1 -// CHECK-NEXT: %1163 = extractvalue { ptr, ptr } %1159, 0 -// CHECK-NEXT: %__llgo_funcval_code154 = call ptr asm "", "=r,0"(ptr %1163) -// CHECK-NEXT: %1164 = call %reflect.Value %__llgo_funcval_code154(ptr {{(nest|swiftself)}} %1162, %"{{.*}}/runtime/internal/runtime.eface" %1161) -// CHECK-NEXT: %1165 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1157, i32 0, i32 1 -// CHECK-NEXT: %1166 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1167 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 77, ptr %1167, align 8 -// CHECK-NEXT: %1168 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1167, 1 -// CHECK-NEXT: %1169 = extractvalue { ptr, ptr } %1166, 1 -// CHECK-NEXT: %1170 = extractvalue { ptr, ptr } %1166, 0 -// CHECK-NEXT: %__llgo_funcval_code155 = call ptr asm "", "=r,0"(ptr %1170) -// CHECK-NEXT: %1171 = call %reflect.Value %__llgo_funcval_code155(ptr {{(nest|swiftself)}} %1169, %"{{.*}}/runtime/internal/runtime.eface" %1168) -// CHECK-NEXT: store %reflect.Value %1164, ptr %1158, align 8 -// CHECK-NEXT: store %reflect.Value %1171, ptr %1165, align 8 -// CHECK-NEXT: %1172 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 78 -// CHECK-NEXT: %1173 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1172, i32 0, i32 0 -// CHECK-NEXT: %1174 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1175 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 78, ptr %1175, align 8 -// CHECK-NEXT: %1176 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1175, 1 -// CHECK-NEXT: %1177 = extractvalue { ptr, ptr } %1174, 1 -// CHECK-NEXT: %1178 = extractvalue { ptr, ptr } %1174, 0 -// CHECK-NEXT: %__llgo_funcval_code156 = call ptr asm "", "=r,0"(ptr %1178) -// CHECK-NEXT: %1179 = call %reflect.Value %__llgo_funcval_code156(ptr {{(nest|swiftself)}} %1177, %"{{.*}}/runtime/internal/runtime.eface" %1176) -// CHECK-NEXT: %1180 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1172, i32 0, i32 1 -// CHECK-NEXT: %1181 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1182 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 78, ptr %1182, align 2 -// CHECK-NEXT: %1183 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1182, 1 -// CHECK-NEXT: %1184 = extractvalue { ptr, ptr } %1181, 1 -// CHECK-NEXT: %1185 = extractvalue { ptr, ptr } %1181, 0 -// CHECK-NEXT: %__llgo_funcval_code157 = call ptr asm "", "=r,0"(ptr %1185) -// CHECK-NEXT: %1186 = call %reflect.Value %__llgo_funcval_code157(ptr {{(nest|swiftself)}} %1184, %"{{.*}}/runtime/internal/runtime.eface" %1183) -// CHECK-NEXT: store %reflect.Value %1179, ptr %1173, align 8 -// CHECK-NEXT: store %reflect.Value %1186, ptr %1180, align 8 -// CHECK-NEXT: %1187 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 79 -// CHECK-NEXT: %1188 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1187, i32 0, i32 0 -// CHECK-NEXT: %1189 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1190 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 79, ptr %1190, align 2 -// CHECK-NEXT: %1191 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1190, 1 -// CHECK-NEXT: %1192 = extractvalue { ptr, ptr } %1189, 1 -// CHECK-NEXT: %1193 = extractvalue { ptr, ptr } %1189, 0 -// CHECK-NEXT: %__llgo_funcval_code158 = call ptr asm "", "=r,0"(ptr %1193) -// CHECK-NEXT: %1194 = call %reflect.Value %__llgo_funcval_code158(ptr {{(nest|swiftself)}} %1192, %"{{.*}}/runtime/internal/runtime.eface" %1191) -// CHECK-NEXT: %1195 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1187, i32 0, i32 1 -// CHECK-NEXT: %1196 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1197 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 79, ptr %1197, align 8 -// CHECK-NEXT: %1198 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1197, 1 -// CHECK-NEXT: %1199 = extractvalue { ptr, ptr } %1196, 1 -// CHECK-NEXT: %1200 = extractvalue { ptr, ptr } %1196, 0 -// CHECK-NEXT: %__llgo_funcval_code159 = call ptr asm "", "=r,0"(ptr %1200) -// CHECK-NEXT: %1201 = call %reflect.Value %__llgo_funcval_code159(ptr {{(nest|swiftself)}} %1199, %"{{.*}}/runtime/internal/runtime.eface" %1198) -// CHECK-NEXT: store %reflect.Value %1194, ptr %1188, align 8 -// CHECK-NEXT: store %reflect.Value %1201, ptr %1195, align 8 -// CHECK-NEXT: %1202 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 80 -// CHECK-NEXT: %1203 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1202, i32 0, i32 0 -// CHECK-NEXT: %1204 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1205 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 80, ptr %1205, align 8 -// CHECK-NEXT: %1206 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1205, 1 -// CHECK-NEXT: %1207 = extractvalue { ptr, ptr } %1204, 1 -// CHECK-NEXT: %1208 = extractvalue { ptr, ptr } %1204, 0 -// CHECK-NEXT: %__llgo_funcval_code160 = call ptr asm "", "=r,0"(ptr %1208) -// CHECK-NEXT: %1209 = call %reflect.Value %__llgo_funcval_code160(ptr {{(nest|swiftself)}} %1207, %"{{.*}}/runtime/internal/runtime.eface" %1206) -// CHECK-NEXT: %1210 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1202, i32 0, i32 1 -// CHECK-NEXT: %1211 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1212 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 80, ptr %1212, align 2 -// CHECK-NEXT: %1213 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1212, 1 -// CHECK-NEXT: %1214 = extractvalue { ptr, ptr } %1211, 1 -// CHECK-NEXT: %1215 = extractvalue { ptr, ptr } %1211, 0 -// CHECK-NEXT: %__llgo_funcval_code161 = call ptr asm "", "=r,0"(ptr %1215) -// CHECK-NEXT: %1216 = call %reflect.Value %__llgo_funcval_code161(ptr {{(nest|swiftself)}} %1214, %"{{.*}}/runtime/internal/runtime.eface" %1213) -// CHECK-NEXT: store %reflect.Value %1209, ptr %1203, align 8 -// CHECK-NEXT: store %reflect.Value %1216, ptr %1210, align 8 -// CHECK-NEXT: %1217 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 81 -// CHECK-NEXT: %1218 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1217, i32 0, i32 0 -// CHECK-NEXT: %1219 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1220 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 81, ptr %1220, align 2 -// CHECK-NEXT: %1221 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1220, 1 -// CHECK-NEXT: %1222 = extractvalue { ptr, ptr } %1219, 1 -// CHECK-NEXT: %1223 = extractvalue { ptr, ptr } %1219, 0 -// CHECK-NEXT: %__llgo_funcval_code162 = call ptr asm "", "=r,0"(ptr %1223) -// CHECK-NEXT: %1224 = call %reflect.Value %__llgo_funcval_code162(ptr {{(nest|swiftself)}} %1222, %"{{.*}}/runtime/internal/runtime.eface" %1221) -// CHECK-NEXT: %1225 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1217, i32 0, i32 1 -// CHECK-NEXT: %1226 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1227 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 81, ptr %1227, align 8 -// CHECK-NEXT: %1228 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1227, 1 -// CHECK-NEXT: %1229 = extractvalue { ptr, ptr } %1226, 1 -// CHECK-NEXT: %1230 = extractvalue { ptr, ptr } %1226, 0 -// CHECK-NEXT: %__llgo_funcval_code163 = call ptr asm "", "=r,0"(ptr %1230) -// CHECK-NEXT: %1231 = call %reflect.Value %__llgo_funcval_code163(ptr {{(nest|swiftself)}} %1229, %"{{.*}}/runtime/internal/runtime.eface" %1228) -// CHECK-NEXT: store %reflect.Value %1224, ptr %1218, align 8 -// CHECK-NEXT: store %reflect.Value %1231, ptr %1225, align 8 -// CHECK-NEXT: %1232 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 82 -// CHECK-NEXT: %1233 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1232, i32 0, i32 0 -// CHECK-NEXT: %1234 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1235 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 82, ptr %1235, align 8 -// CHECK-NEXT: %1236 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1235, 1 -// CHECK-NEXT: %1237 = extractvalue { ptr, ptr } %1234, 1 -// CHECK-NEXT: %1238 = extractvalue { ptr, ptr } %1234, 0 -// CHECK-NEXT: %__llgo_funcval_code164 = call ptr asm "", "=r,0"(ptr %1238) -// CHECK-NEXT: %1239 = call %reflect.Value %__llgo_funcval_code164(ptr {{(nest|swiftself)}} %1237, %"{{.*}}/runtime/internal/runtime.eface" %1236) -// CHECK-NEXT: %1240 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1232, i32 0, i32 1 -// CHECK-NEXT: %1241 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1242 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 82, ptr %1242, align 2 -// CHECK-NEXT: %1243 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1242, 1 -// CHECK-NEXT: %1244 = extractvalue { ptr, ptr } %1241, 1 -// CHECK-NEXT: %1245 = extractvalue { ptr, ptr } %1241, 0 -// CHECK-NEXT: %__llgo_funcval_code165 = call ptr asm "", "=r,0"(ptr %1245) -// CHECK-NEXT: %1246 = call %reflect.Value %__llgo_funcval_code165(ptr {{(nest|swiftself)}} %1244, %"{{.*}}/runtime/internal/runtime.eface" %1243) -// CHECK-NEXT: store %reflect.Value %1239, ptr %1233, align 8 -// CHECK-NEXT: store %reflect.Value %1246, ptr %1240, align 8 -// CHECK-NEXT: %1247 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 83 -// CHECK-NEXT: %1248 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1247, i32 0, i32 0 -// CHECK-NEXT: %1249 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1250 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 83, ptr %1250, align 2 -// CHECK-NEXT: %1251 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1250, 1 -// CHECK-NEXT: %1252 = extractvalue { ptr, ptr } %1249, 1 -// CHECK-NEXT: %1253 = extractvalue { ptr, ptr } %1249, 0 -// CHECK-NEXT: %__llgo_funcval_code166 = call ptr asm "", "=r,0"(ptr %1253) -// CHECK-NEXT: %1254 = call %reflect.Value %__llgo_funcval_code166(ptr {{(nest|swiftself)}} %1252, %"{{.*}}/runtime/internal/runtime.eface" %1251) -// CHECK-NEXT: %1255 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1247, i32 0, i32 1 -// CHECK-NEXT: %1256 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1257 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 83, ptr %1257, align 8 -// CHECK-NEXT: %1258 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1257, 1 -// CHECK-NEXT: %1259 = extractvalue { ptr, ptr } %1256, 1 -// CHECK-NEXT: %1260 = extractvalue { ptr, ptr } %1256, 0 -// CHECK-NEXT: %__llgo_funcval_code167 = call ptr asm "", "=r,0"(ptr %1260) -// CHECK-NEXT: %1261 = call %reflect.Value %__llgo_funcval_code167(ptr {{(nest|swiftself)}} %1259, %"{{.*}}/runtime/internal/runtime.eface" %1258) -// CHECK-NEXT: store %reflect.Value %1254, ptr %1248, align 8 -// CHECK-NEXT: store %reflect.Value %1261, ptr %1255, align 8 -// CHECK-NEXT: %1262 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 84 -// CHECK-NEXT: %1263 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1262, i32 0, i32 0 -// CHECK-NEXT: %1264 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1265 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 84, ptr %1265, align 8 -// CHECK-NEXT: %1266 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1265, 1 -// CHECK-NEXT: %1267 = extractvalue { ptr, ptr } %1264, 1 -// CHECK-NEXT: %1268 = extractvalue { ptr, ptr } %1264, 0 -// CHECK-NEXT: %__llgo_funcval_code168 = call ptr asm "", "=r,0"(ptr %1268) -// CHECK-NEXT: %1269 = call %reflect.Value %__llgo_funcval_code168(ptr {{(nest|swiftself)}} %1267, %"{{.*}}/runtime/internal/runtime.eface" %1266) -// CHECK-NEXT: %1270 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1262, i32 0, i32 1 -// CHECK-NEXT: %1271 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1272 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 84, ptr %1272, align 2 -// CHECK-NEXT: %1273 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1272, 1 -// CHECK-NEXT: %1274 = extractvalue { ptr, ptr } %1271, 1 -// CHECK-NEXT: %1275 = extractvalue { ptr, ptr } %1271, 0 -// CHECK-NEXT: %__llgo_funcval_code169 = call ptr asm "", "=r,0"(ptr %1275) -// CHECK-NEXT: %1276 = call %reflect.Value %__llgo_funcval_code169(ptr {{(nest|swiftself)}} %1274, %"{{.*}}/runtime/internal/runtime.eface" %1273) -// CHECK-NEXT: store %reflect.Value %1269, ptr %1263, align 8 -// CHECK-NEXT: store %reflect.Value %1276, ptr %1270, align 8 -// CHECK-NEXT: %1277 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 85 -// CHECK-NEXT: %1278 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1277, i32 0, i32 0 -// CHECK-NEXT: %1279 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1280 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 85, ptr %1280, align 2 -// CHECK-NEXT: %1281 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1280, 1 -// CHECK-NEXT: %1282 = extractvalue { ptr, ptr } %1279, 1 -// CHECK-NEXT: %1283 = extractvalue { ptr, ptr } %1279, 0 -// CHECK-NEXT: %__llgo_funcval_code170 = call ptr asm "", "=r,0"(ptr %1283) -// CHECK-NEXT: %1284 = call %reflect.Value %__llgo_funcval_code170(ptr {{(nest|swiftself)}} %1282, %"{{.*}}/runtime/internal/runtime.eface" %1281) -// CHECK-NEXT: %1285 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1277, i32 0, i32 1 -// CHECK-NEXT: %1286 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1287 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 8.500000e+01, ptr %1287, align 4 -// CHECK-NEXT: %1288 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1287, 1 -// CHECK-NEXT: %1289 = extractvalue { ptr, ptr } %1286, 1 -// CHECK-NEXT: %1290 = extractvalue { ptr, ptr } %1286, 0 -// CHECK-NEXT: %__llgo_funcval_code171 = call ptr asm "", "=r,0"(ptr %1290) -// CHECK-NEXT: %1291 = call %reflect.Value %__llgo_funcval_code171(ptr {{(nest|swiftself)}} %1289, %"{{.*}}/runtime/internal/runtime.eface" %1288) -// CHECK-NEXT: store %reflect.Value %1284, ptr %1278, align 8 -// CHECK-NEXT: store %reflect.Value %1291, ptr %1285, align 8 -// CHECK-NEXT: %1292 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 86 -// CHECK-NEXT: %1293 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1292, i32 0, i32 0 -// CHECK-NEXT: %1294 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1295 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 8.600000e+01, ptr %1295, align 4 -// CHECK-NEXT: %1296 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1295, 1 -// CHECK-NEXT: %1297 = extractvalue { ptr, ptr } %1294, 1 -// CHECK-NEXT: %1298 = extractvalue { ptr, ptr } %1294, 0 -// CHECK-NEXT: %__llgo_funcval_code172 = call ptr asm "", "=r,0"(ptr %1298) -// CHECK-NEXT: %1299 = call %reflect.Value %__llgo_funcval_code172(ptr {{(nest|swiftself)}} %1297, %"{{.*}}/runtime/internal/runtime.eface" %1296) -// CHECK-NEXT: %1300 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1292, i32 0, i32 1 -// CHECK-NEXT: %1301 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1302 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 86, ptr %1302, align 2 -// CHECK-NEXT: %1303 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1302, 1 -// CHECK-NEXT: %1304 = extractvalue { ptr, ptr } %1301, 1 -// CHECK-NEXT: %1305 = extractvalue { ptr, ptr } %1301, 0 -// CHECK-NEXT: %__llgo_funcval_code173 = call ptr asm "", "=r,0"(ptr %1305) -// CHECK-NEXT: %1306 = call %reflect.Value %__llgo_funcval_code173(ptr {{(nest|swiftself)}} %1304, %"{{.*}}/runtime/internal/runtime.eface" %1303) -// CHECK-NEXT: store %reflect.Value %1299, ptr %1293, align 8 -// CHECK-NEXT: store %reflect.Value %1306, ptr %1300, align 8 -// CHECK-NEXT: %1307 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 87 -// CHECK-NEXT: %1308 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1307, i32 0, i32 0 -// CHECK-NEXT: %1309 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1310 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 87, ptr %1310, align 2 -// CHECK-NEXT: %1311 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1310, 1 -// CHECK-NEXT: %1312 = extractvalue { ptr, ptr } %1309, 1 -// CHECK-NEXT: %1313 = extractvalue { ptr, ptr } %1309, 0 -// CHECK-NEXT: %__llgo_funcval_code174 = call ptr asm "", "=r,0"(ptr %1313) -// CHECK-NEXT: %1314 = call %reflect.Value %__llgo_funcval_code174(ptr {{(nest|swiftself)}} %1312, %"{{.*}}/runtime/internal/runtime.eface" %1311) -// CHECK-NEXT: %1315 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1307, i32 0, i32 1 -// CHECK-NEXT: %1316 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1317 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 8.700000e+01, ptr %1317, align 8 -// CHECK-NEXT: %1318 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1317, 1 -// CHECK-NEXT: %1319 = extractvalue { ptr, ptr } %1316, 1 -// CHECK-NEXT: %1320 = extractvalue { ptr, ptr } %1316, 0 -// CHECK-NEXT: %__llgo_funcval_code175 = call ptr asm "", "=r,0"(ptr %1320) -// CHECK-NEXT: %1321 = call %reflect.Value %__llgo_funcval_code175(ptr {{(nest|swiftself)}} %1319, %"{{.*}}/runtime/internal/runtime.eface" %1318) -// CHECK-NEXT: store %reflect.Value %1314, ptr %1308, align 8 -// CHECK-NEXT: store %reflect.Value %1321, ptr %1315, align 8 -// CHECK-NEXT: %1322 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 88 -// CHECK-NEXT: %1323 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1322, i32 0, i32 0 -// CHECK-NEXT: %1324 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1325 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 8.800000e+01, ptr %1325, align 8 -// CHECK-NEXT: %1326 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1325, 1 -// CHECK-NEXT: %1327 = extractvalue { ptr, ptr } %1324, 1 -// CHECK-NEXT: %1328 = extractvalue { ptr, ptr } %1324, 0 -// CHECK-NEXT: %__llgo_funcval_code176 = call ptr asm "", "=r,0"(ptr %1328) -// CHECK-NEXT: %1329 = call %reflect.Value %__llgo_funcval_code176(ptr {{(nest|swiftself)}} %1327, %"{{.*}}/runtime/internal/runtime.eface" %1326) -// CHECK-NEXT: %1330 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1322, i32 0, i32 1 -// CHECK-NEXT: %1331 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1332 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 88, ptr %1332, align 2 -// CHECK-NEXT: %1333 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %1332, 1 -// CHECK-NEXT: %1334 = extractvalue { ptr, ptr } %1331, 1 -// CHECK-NEXT: %1335 = extractvalue { ptr, ptr } %1331, 0 -// CHECK-NEXT: %__llgo_funcval_code177 = call ptr asm "", "=r,0"(ptr %1335) -// CHECK-NEXT: %1336 = call %reflect.Value %__llgo_funcval_code177(ptr {{(nest|swiftself)}} %1334, %"{{.*}}/runtime/internal/runtime.eface" %1333) -// CHECK-NEXT: store %reflect.Value %1329, ptr %1323, align 8 -// CHECK-NEXT: store %reflect.Value %1336, ptr %1330, align 8 -// CHECK-NEXT: %1337 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 89 -// CHECK-NEXT: %1338 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1337, i32 0, i32 0 -// CHECK-NEXT: %1339 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1340 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 89, ptr %1340, align 4 -// CHECK-NEXT: %1341 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1340, 1 -// CHECK-NEXT: %1342 = extractvalue { ptr, ptr } %1339, 1 -// CHECK-NEXT: %1343 = extractvalue { ptr, ptr } %1339, 0 -// CHECK-NEXT: %__llgo_funcval_code178 = call ptr asm "", "=r,0"(ptr %1343) -// CHECK-NEXT: %1344 = call %reflect.Value %__llgo_funcval_code178(ptr {{(nest|swiftself)}} %1342, %"{{.*}}/runtime/internal/runtime.eface" %1341) -// CHECK-NEXT: %1345 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1337, i32 0, i32 1 -// CHECK-NEXT: %1346 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1347 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 89, ptr %1347, align 4 -// CHECK-NEXT: %1348 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1347, 1 -// CHECK-NEXT: %1349 = extractvalue { ptr, ptr } %1346, 1 -// CHECK-NEXT: %1350 = extractvalue { ptr, ptr } %1346, 0 -// CHECK-NEXT: %__llgo_funcval_code179 = call ptr asm "", "=r,0"(ptr %1350) -// CHECK-NEXT: %1351 = call %reflect.Value %__llgo_funcval_code179(ptr {{(nest|swiftself)}} %1349, %"{{.*}}/runtime/internal/runtime.eface" %1348) -// CHECK-NEXT: store %reflect.Value %1344, ptr %1338, align 8 -// CHECK-NEXT: store %reflect.Value %1351, ptr %1345, align 8 -// CHECK-NEXT: %1352 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 90 -// CHECK-NEXT: %1353 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1352, i32 0, i32 0 -// CHECK-NEXT: %1354 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1355 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 90, ptr %1355, align 4 -// CHECK-NEXT: %1356 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1355, 1 -// CHECK-NEXT: %1357 = extractvalue { ptr, ptr } %1354, 1 -// CHECK-NEXT: %1358 = extractvalue { ptr, ptr } %1354, 0 -// CHECK-NEXT: %__llgo_funcval_code180 = call ptr asm "", "=r,0"(ptr %1358) -// CHECK-NEXT: %1359 = call %reflect.Value %__llgo_funcval_code180(ptr {{(nest|swiftself)}} %1357, %"{{.*}}/runtime/internal/runtime.eface" %1356) -// CHECK-NEXT: %1360 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1352, i32 0, i32 1 -// CHECK-NEXT: %1361 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1362 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 90, ptr %1362, align 4 -// CHECK-NEXT: %1363 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1362, 1 -// CHECK-NEXT: %1364 = extractvalue { ptr, ptr } %1361, 1 -// CHECK-NEXT: %1365 = extractvalue { ptr, ptr } %1361, 0 -// CHECK-NEXT: %__llgo_funcval_code181 = call ptr asm "", "=r,0"(ptr %1365) -// CHECK-NEXT: %1366 = call %reflect.Value %__llgo_funcval_code181(ptr {{(nest|swiftself)}} %1364, %"{{.*}}/runtime/internal/runtime.eface" %1363) -// CHECK-NEXT: store %reflect.Value %1359, ptr %1353, align 8 -// CHECK-NEXT: store %reflect.Value %1366, ptr %1360, align 8 -// CHECK-NEXT: %1367 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 91 -// CHECK-NEXT: %1368 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1367, i32 0, i32 0 -// CHECK-NEXT: %1369 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1370 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 91, ptr %1370, align 4 -// CHECK-NEXT: %1371 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1370, 1 -// CHECK-NEXT: %1372 = extractvalue { ptr, ptr } %1369, 1 -// CHECK-NEXT: %1373 = extractvalue { ptr, ptr } %1369, 0 -// CHECK-NEXT: %__llgo_funcval_code182 = call ptr asm "", "=r,0"(ptr %1373) -// CHECK-NEXT: %1374 = call %reflect.Value %__llgo_funcval_code182(ptr {{(nest|swiftself)}} %1372, %"{{.*}}/runtime/internal/runtime.eface" %1371) -// CHECK-NEXT: %1375 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1367, i32 0, i32 1 -// CHECK-NEXT: %1376 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1377 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 91, ptr %1377, align 4 -// CHECK-NEXT: %1378 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1377, 1 -// CHECK-NEXT: %1379 = extractvalue { ptr, ptr } %1376, 1 -// CHECK-NEXT: %1380 = extractvalue { ptr, ptr } %1376, 0 -// CHECK-NEXT: %__llgo_funcval_code183 = call ptr asm "", "=r,0"(ptr %1380) -// CHECK-NEXT: %1381 = call %reflect.Value %__llgo_funcval_code183(ptr {{(nest|swiftself)}} %1379, %"{{.*}}/runtime/internal/runtime.eface" %1378) -// CHECK-NEXT: store %reflect.Value %1374, ptr %1368, align 8 -// CHECK-NEXT: store %reflect.Value %1381, ptr %1375, align 8 -// CHECK-NEXT: %1382 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 92 -// CHECK-NEXT: %1383 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1382, i32 0, i32 0 -// CHECK-NEXT: %1384 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1385 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 92, ptr %1385, align 4 -// CHECK-NEXT: %1386 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1385, 1 -// CHECK-NEXT: %1387 = extractvalue { ptr, ptr } %1384, 1 -// CHECK-NEXT: %1388 = extractvalue { ptr, ptr } %1384, 0 -// CHECK-NEXT: %__llgo_funcval_code184 = call ptr asm "", "=r,0"(ptr %1388) -// CHECK-NEXT: %1389 = call %reflect.Value %__llgo_funcval_code184(ptr {{(nest|swiftself)}} %1387, %"{{.*}}/runtime/internal/runtime.eface" %1386) -// CHECK-NEXT: %1390 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1382, i32 0, i32 1 -// CHECK-NEXT: %1391 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1392 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 92, ptr %1392, align 8 -// CHECK-NEXT: %1393 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1392, 1 -// CHECK-NEXT: %1394 = extractvalue { ptr, ptr } %1391, 1 -// CHECK-NEXT: %1395 = extractvalue { ptr, ptr } %1391, 0 -// CHECK-NEXT: %__llgo_funcval_code185 = call ptr asm "", "=r,0"(ptr %1395) -// CHECK-NEXT: %1396 = call %reflect.Value %__llgo_funcval_code185(ptr {{(nest|swiftself)}} %1394, %"{{.*}}/runtime/internal/runtime.eface" %1393) -// CHECK-NEXT: store %reflect.Value %1389, ptr %1383, align 8 -// CHECK-NEXT: store %reflect.Value %1396, ptr %1390, align 8 -// CHECK-NEXT: %1397 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 93 -// CHECK-NEXT: %1398 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1397, i32 0, i32 0 -// CHECK-NEXT: %1399 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1400 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 93, ptr %1400, align 8 -// CHECK-NEXT: %1401 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1400, 1 -// CHECK-NEXT: %1402 = extractvalue { ptr, ptr } %1399, 1 -// CHECK-NEXT: %1403 = extractvalue { ptr, ptr } %1399, 0 -// CHECK-NEXT: %__llgo_funcval_code186 = call ptr asm "", "=r,0"(ptr %1403) -// CHECK-NEXT: %1404 = call %reflect.Value %__llgo_funcval_code186(ptr {{(nest|swiftself)}} %1402, %"{{.*}}/runtime/internal/runtime.eface" %1401) -// CHECK-NEXT: %1405 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1397, i32 0, i32 1 -// CHECK-NEXT: %1406 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1407 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 93, ptr %1407, align 4 -// CHECK-NEXT: %1408 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1407, 1 -// CHECK-NEXT: %1409 = extractvalue { ptr, ptr } %1406, 1 -// CHECK-NEXT: %1410 = extractvalue { ptr, ptr } %1406, 0 -// CHECK-NEXT: %__llgo_funcval_code187 = call ptr asm "", "=r,0"(ptr %1410) -// CHECK-NEXT: %1411 = call %reflect.Value %__llgo_funcval_code187(ptr {{(nest|swiftself)}} %1409, %"{{.*}}/runtime/internal/runtime.eface" %1408) -// CHECK-NEXT: store %reflect.Value %1404, ptr %1398, align 8 -// CHECK-NEXT: store %reflect.Value %1411, ptr %1405, align 8 -// CHECK-NEXT: %1412 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 94 -// CHECK-NEXT: %1413 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1412, i32 0, i32 0 -// CHECK-NEXT: %1414 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1415 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 94, ptr %1415, align 4 -// CHECK-NEXT: %1416 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1415, 1 -// CHECK-NEXT: %1417 = extractvalue { ptr, ptr } %1414, 1 -// CHECK-NEXT: %1418 = extractvalue { ptr, ptr } %1414, 0 -// CHECK-NEXT: %__llgo_funcval_code188 = call ptr asm "", "=r,0"(ptr %1418) -// CHECK-NEXT: %1419 = call %reflect.Value %__llgo_funcval_code188(ptr {{(nest|swiftself)}} %1417, %"{{.*}}/runtime/internal/runtime.eface" %1416) -// CHECK-NEXT: %1420 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1412, i32 0, i32 1 -// CHECK-NEXT: %1421 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1422 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 94, ptr %1422, align 8 -// CHECK-NEXT: %1423 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1422, 1 -// CHECK-NEXT: %1424 = extractvalue { ptr, ptr } %1421, 1 -// CHECK-NEXT: %1425 = extractvalue { ptr, ptr } %1421, 0 -// CHECK-NEXT: %__llgo_funcval_code189 = call ptr asm "", "=r,0"(ptr %1425) -// CHECK-NEXT: %1426 = call %reflect.Value %__llgo_funcval_code189(ptr {{(nest|swiftself)}} %1424, %"{{.*}}/runtime/internal/runtime.eface" %1423) -// CHECK-NEXT: store %reflect.Value %1419, ptr %1413, align 8 -// CHECK-NEXT: store %reflect.Value %1426, ptr %1420, align 8 -// CHECK-NEXT: %1427 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 95 -// CHECK-NEXT: %1428 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1427, i32 0, i32 0 -// CHECK-NEXT: %1429 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1430 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 95, ptr %1430, align 8 -// CHECK-NEXT: %1431 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1430, 1 -// CHECK-NEXT: %1432 = extractvalue { ptr, ptr } %1429, 1 -// CHECK-NEXT: %1433 = extractvalue { ptr, ptr } %1429, 0 -// CHECK-NEXT: %__llgo_funcval_code190 = call ptr asm "", "=r,0"(ptr %1433) -// CHECK-NEXT: %1434 = call %reflect.Value %__llgo_funcval_code190(ptr {{(nest|swiftself)}} %1432, %"{{.*}}/runtime/internal/runtime.eface" %1431) -// CHECK-NEXT: %1435 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1427, i32 0, i32 1 -// CHECK-NEXT: %1436 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1437 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 95, ptr %1437, align 4 -// CHECK-NEXT: %1438 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1437, 1 -// CHECK-NEXT: %1439 = extractvalue { ptr, ptr } %1436, 1 -// CHECK-NEXT: %1440 = extractvalue { ptr, ptr } %1436, 0 -// CHECK-NEXT: %__llgo_funcval_code191 = call ptr asm "", "=r,0"(ptr %1440) -// CHECK-NEXT: %1441 = call %reflect.Value %__llgo_funcval_code191(ptr {{(nest|swiftself)}} %1439, %"{{.*}}/runtime/internal/runtime.eface" %1438) -// CHECK-NEXT: store %reflect.Value %1434, ptr %1428, align 8 -// CHECK-NEXT: store %reflect.Value %1441, ptr %1435, align 8 -// CHECK-NEXT: %1442 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 96 -// CHECK-NEXT: %1443 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1442, i32 0, i32 0 -// CHECK-NEXT: %1444 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1445 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 96, ptr %1445, align 4 -// CHECK-NEXT: %1446 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1445, 1 -// CHECK-NEXT: %1447 = extractvalue { ptr, ptr } %1444, 1 -// CHECK-NEXT: %1448 = extractvalue { ptr, ptr } %1444, 0 -// CHECK-NEXT: %__llgo_funcval_code192 = call ptr asm "", "=r,0"(ptr %1448) -// CHECK-NEXT: %1449 = call %reflect.Value %__llgo_funcval_code192(ptr {{(nest|swiftself)}} %1447, %"{{.*}}/runtime/internal/runtime.eface" %1446) -// CHECK-NEXT: %1450 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1442, i32 0, i32 1 -// CHECK-NEXT: %1451 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1452 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 96, ptr %1452, align 8 -// CHECK-NEXT: %1453 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1452, 1 -// CHECK-NEXT: %1454 = extractvalue { ptr, ptr } %1451, 1 -// CHECK-NEXT: %1455 = extractvalue { ptr, ptr } %1451, 0 -// CHECK-NEXT: %__llgo_funcval_code193 = call ptr asm "", "=r,0"(ptr %1455) -// CHECK-NEXT: %1456 = call %reflect.Value %__llgo_funcval_code193(ptr {{(nest|swiftself)}} %1454, %"{{.*}}/runtime/internal/runtime.eface" %1453) -// CHECK-NEXT: store %reflect.Value %1449, ptr %1443, align 8 -// CHECK-NEXT: store %reflect.Value %1456, ptr %1450, align 8 -// CHECK-NEXT: %1457 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 97 -// CHECK-NEXT: %1458 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1457, i32 0, i32 0 -// CHECK-NEXT: %1459 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1460 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %1460, align 8 -// CHECK-NEXT: %1461 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1460, 1 -// CHECK-NEXT: %1462 = extractvalue { ptr, ptr } %1459, 1 -// CHECK-NEXT: %1463 = extractvalue { ptr, ptr } %1459, 0 -// CHECK-NEXT: %__llgo_funcval_code194 = call ptr asm "", "=r,0"(ptr %1463) -// CHECK-NEXT: %1464 = call %reflect.Value %__llgo_funcval_code194(ptr {{(nest|swiftself)}} %1462, %"{{.*}}/runtime/internal/runtime.eface" %1461) -// CHECK-NEXT: %1465 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1457, i32 0, i32 1 -// CHECK-NEXT: %1466 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1467 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %1467, align 4 -// CHECK-NEXT: %1468 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1467, 1 -// CHECK-NEXT: %1469 = extractvalue { ptr, ptr } %1466, 1 -// CHECK-NEXT: %1470 = extractvalue { ptr, ptr } %1466, 0 -// CHECK-NEXT: %__llgo_funcval_code195 = call ptr asm "", "=r,0"(ptr %1470) -// CHECK-NEXT: %1471 = call %reflect.Value %__llgo_funcval_code195(ptr {{(nest|swiftself)}} %1469, %"{{.*}}/runtime/internal/runtime.eface" %1468) -// CHECK-NEXT: store %reflect.Value %1464, ptr %1458, align 8 -// CHECK-NEXT: store %reflect.Value %1471, ptr %1465, align 8 -// CHECK-NEXT: %1472 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 98 -// CHECK-NEXT: %1473 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1472, i32 0, i32 0 -// CHECK-NEXT: %1474 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1475 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 98, ptr %1475, align 4 -// CHECK-NEXT: %1476 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1475, 1 -// CHECK-NEXT: %1477 = extractvalue { ptr, ptr } %1474, 1 -// CHECK-NEXT: %1478 = extractvalue { ptr, ptr } %1474, 0 -// CHECK-NEXT: %__llgo_funcval_code196 = call ptr asm "", "=r,0"(ptr %1478) -// CHECK-NEXT: %1479 = call %reflect.Value %__llgo_funcval_code196(ptr {{(nest|swiftself)}} %1477, %"{{.*}}/runtime/internal/runtime.eface" %1476) -// CHECK-NEXT: %1480 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1472, i32 0, i32 1 -// CHECK-NEXT: %1481 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1482 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 98, ptr %1482, align 8 -// CHECK-NEXT: %1483 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1482, 1 -// CHECK-NEXT: %1484 = extractvalue { ptr, ptr } %1481, 1 -// CHECK-NEXT: %1485 = extractvalue { ptr, ptr } %1481, 0 -// CHECK-NEXT: %__llgo_funcval_code197 = call ptr asm "", "=r,0"(ptr %1485) -// CHECK-NEXT: %1486 = call %reflect.Value %__llgo_funcval_code197(ptr {{(nest|swiftself)}} %1484, %"{{.*}}/runtime/internal/runtime.eface" %1483) -// CHECK-NEXT: store %reflect.Value %1479, ptr %1473, align 8 -// CHECK-NEXT: store %reflect.Value %1486, ptr %1480, align 8 -// CHECK-NEXT: %1487 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 99 -// CHECK-NEXT: %1488 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1487, i32 0, i32 0 -// CHECK-NEXT: %1489 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1490 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 99, ptr %1490, align 8 -// CHECK-NEXT: %1491 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1490, 1 -// CHECK-NEXT: %1492 = extractvalue { ptr, ptr } %1489, 1 -// CHECK-NEXT: %1493 = extractvalue { ptr, ptr } %1489, 0 -// CHECK-NEXT: %__llgo_funcval_code198 = call ptr asm "", "=r,0"(ptr %1493) -// CHECK-NEXT: %1494 = call %reflect.Value %__llgo_funcval_code198(ptr {{(nest|swiftself)}} %1492, %"{{.*}}/runtime/internal/runtime.eface" %1491) -// CHECK-NEXT: %1495 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1487, i32 0, i32 1 -// CHECK-NEXT: %1496 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1497 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 99, ptr %1497, align 4 -// CHECK-NEXT: %1498 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1497, 1 -// CHECK-NEXT: %1499 = extractvalue { ptr, ptr } %1496, 1 -// CHECK-NEXT: %1500 = extractvalue { ptr, ptr } %1496, 0 -// CHECK-NEXT: %__llgo_funcval_code199 = call ptr asm "", "=r,0"(ptr %1500) -// CHECK-NEXT: %1501 = call %reflect.Value %__llgo_funcval_code199(ptr {{(nest|swiftself)}} %1499, %"{{.*}}/runtime/internal/runtime.eface" %1498) -// CHECK-NEXT: store %reflect.Value %1494, ptr %1488, align 8 -// CHECK-NEXT: store %reflect.Value %1501, ptr %1495, align 8 -// CHECK-NEXT: %1502 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 100 -// CHECK-NEXT: %1503 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1502, i32 0, i32 0 -// CHECK-NEXT: %1504 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1505 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 100, ptr %1505, align 4 -// CHECK-NEXT: %1506 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1505, 1 -// CHECK-NEXT: %1507 = extractvalue { ptr, ptr } %1504, 1 -// CHECK-NEXT: %1508 = extractvalue { ptr, ptr } %1504, 0 -// CHECK-NEXT: %__llgo_funcval_code200 = call ptr asm "", "=r,0"(ptr %1508) -// CHECK-NEXT: %1509 = call %reflect.Value %__llgo_funcval_code200(ptr {{(nest|swiftself)}} %1507, %"{{.*}}/runtime/internal/runtime.eface" %1506) -// CHECK-NEXT: %1510 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1502, i32 0, i32 1 -// CHECK-NEXT: %1511 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1512 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %1512, align 8 -// CHECK-NEXT: %1513 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1512, 1 -// CHECK-NEXT: %1514 = extractvalue { ptr, ptr } %1511, 1 -// CHECK-NEXT: %1515 = extractvalue { ptr, ptr } %1511, 0 -// CHECK-NEXT: %__llgo_funcval_code201 = call ptr asm "", "=r,0"(ptr %1515) -// CHECK-NEXT: %1516 = call %reflect.Value %__llgo_funcval_code201(ptr {{(nest|swiftself)}} %1514, %"{{.*}}/runtime/internal/runtime.eface" %1513) -// CHECK-NEXT: store %reflect.Value %1509, ptr %1503, align 8 -// CHECK-NEXT: store %reflect.Value %1516, ptr %1510, align 8 -// CHECK-NEXT: %1517 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 101 -// CHECK-NEXT: %1518 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1517, i32 0, i32 0 -// CHECK-NEXT: %1519 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1520 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 101, ptr %1520, align 8 -// CHECK-NEXT: %1521 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1520, 1 -// CHECK-NEXT: %1522 = extractvalue { ptr, ptr } %1519, 1 -// CHECK-NEXT: %1523 = extractvalue { ptr, ptr } %1519, 0 -// CHECK-NEXT: %__llgo_funcval_code202 = call ptr asm "", "=r,0"(ptr %1523) -// CHECK-NEXT: %1524 = call %reflect.Value %__llgo_funcval_code202(ptr {{(nest|swiftself)}} %1522, %"{{.*}}/runtime/internal/runtime.eface" %1521) -// CHECK-NEXT: %1525 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1517, i32 0, i32 1 -// CHECK-NEXT: %1526 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1527 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 101, ptr %1527, align 4 -// CHECK-NEXT: %1528 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1527, 1 -// CHECK-NEXT: %1529 = extractvalue { ptr, ptr } %1526, 1 -// CHECK-NEXT: %1530 = extractvalue { ptr, ptr } %1526, 0 -// CHECK-NEXT: %__llgo_funcval_code203 = call ptr asm "", "=r,0"(ptr %1530) -// CHECK-NEXT: %1531 = call %reflect.Value %__llgo_funcval_code203(ptr {{(nest|swiftself)}} %1529, %"{{.*}}/runtime/internal/runtime.eface" %1528) -// CHECK-NEXT: store %reflect.Value %1524, ptr %1518, align 8 -// CHECK-NEXT: store %reflect.Value %1531, ptr %1525, align 8 -// CHECK-NEXT: %1532 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 102 -// CHECK-NEXT: %1533 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1532, i32 0, i32 0 -// CHECK-NEXT: %1534 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1535 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 102, ptr %1535, align 4 -// CHECK-NEXT: %1536 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1535, 1 -// CHECK-NEXT: %1537 = extractvalue { ptr, ptr } %1534, 1 -// CHECK-NEXT: %1538 = extractvalue { ptr, ptr } %1534, 0 -// CHECK-NEXT: %__llgo_funcval_code204 = call ptr asm "", "=r,0"(ptr %1538) -// CHECK-NEXT: %1539 = call %reflect.Value %__llgo_funcval_code204(ptr {{(nest|swiftself)}} %1537, %"{{.*}}/runtime/internal/runtime.eface" %1536) -// CHECK-NEXT: %1540 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1532, i32 0, i32 1 -// CHECK-NEXT: %1541 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1542 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.020000e+02, ptr %1542, align 4 -// CHECK-NEXT: %1543 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1542, 1 -// CHECK-NEXT: %1544 = extractvalue { ptr, ptr } %1541, 1 -// CHECK-NEXT: %1545 = extractvalue { ptr, ptr } %1541, 0 -// CHECK-NEXT: %__llgo_funcval_code205 = call ptr asm "", "=r,0"(ptr %1545) -// CHECK-NEXT: %1546 = call %reflect.Value %__llgo_funcval_code205(ptr {{(nest|swiftself)}} %1544, %"{{.*}}/runtime/internal/runtime.eface" %1543) -// CHECK-NEXT: store %reflect.Value %1539, ptr %1533, align 8 -// CHECK-NEXT: store %reflect.Value %1546, ptr %1540, align 8 -// CHECK-NEXT: %1547 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 103 -// CHECK-NEXT: %1548 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1547, i32 0, i32 0 -// CHECK-NEXT: %1549 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1550 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.030000e+02, ptr %1550, align 4 -// CHECK-NEXT: %1551 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1550, 1 -// CHECK-NEXT: %1552 = extractvalue { ptr, ptr } %1549, 1 -// CHECK-NEXT: %1553 = extractvalue { ptr, ptr } %1549, 0 -// CHECK-NEXT: %__llgo_funcval_code206 = call ptr asm "", "=r,0"(ptr %1553) -// CHECK-NEXT: %1554 = call %reflect.Value %__llgo_funcval_code206(ptr {{(nest|swiftself)}} %1552, %"{{.*}}/runtime/internal/runtime.eface" %1551) -// CHECK-NEXT: %1555 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1547, i32 0, i32 1 -// CHECK-NEXT: %1556 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1557 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 103, ptr %1557, align 4 -// CHECK-NEXT: %1558 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1557, 1 -// CHECK-NEXT: %1559 = extractvalue { ptr, ptr } %1556, 1 -// CHECK-NEXT: %1560 = extractvalue { ptr, ptr } %1556, 0 -// CHECK-NEXT: %__llgo_funcval_code207 = call ptr asm "", "=r,0"(ptr %1560) -// CHECK-NEXT: %1561 = call %reflect.Value %__llgo_funcval_code207(ptr {{(nest|swiftself)}} %1559, %"{{.*}}/runtime/internal/runtime.eface" %1558) -// CHECK-NEXT: store %reflect.Value %1554, ptr %1548, align 8 -// CHECK-NEXT: store %reflect.Value %1561, ptr %1555, align 8 -// CHECK-NEXT: %1562 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 104 -// CHECK-NEXT: %1563 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1562, i32 0, i32 0 -// CHECK-NEXT: %1564 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1565 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 104, ptr %1565, align 4 -// CHECK-NEXT: %1566 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1565, 1 -// CHECK-NEXT: %1567 = extractvalue { ptr, ptr } %1564, 1 -// CHECK-NEXT: %1568 = extractvalue { ptr, ptr } %1564, 0 -// CHECK-NEXT: %__llgo_funcval_code208 = call ptr asm "", "=r,0"(ptr %1568) -// CHECK-NEXT: %1569 = call %reflect.Value %__llgo_funcval_code208(ptr {{(nest|swiftself)}} %1567, %"{{.*}}/runtime/internal/runtime.eface" %1566) -// CHECK-NEXT: %1570 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1562, i32 0, i32 1 -// CHECK-NEXT: %1571 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1572 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.040000e+02, ptr %1572, align 8 -// CHECK-NEXT: %1573 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1572, 1 -// CHECK-NEXT: %1574 = extractvalue { ptr, ptr } %1571, 1 -// CHECK-NEXT: %1575 = extractvalue { ptr, ptr } %1571, 0 -// CHECK-NEXT: %__llgo_funcval_code209 = call ptr asm "", "=r,0"(ptr %1575) -// CHECK-NEXT: %1576 = call %reflect.Value %__llgo_funcval_code209(ptr {{(nest|swiftself)}} %1574, %"{{.*}}/runtime/internal/runtime.eface" %1573) -// CHECK-NEXT: store %reflect.Value %1569, ptr %1563, align 8 -// CHECK-NEXT: store %reflect.Value %1576, ptr %1570, align 8 -// CHECK-NEXT: %1577 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 105 -// CHECK-NEXT: %1578 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1577, i32 0, i32 0 -// CHECK-NEXT: %1579 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1580 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.050000e+02, ptr %1580, align 8 -// CHECK-NEXT: %1581 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1580, 1 -// CHECK-NEXT: %1582 = extractvalue { ptr, ptr } %1579, 1 -// CHECK-NEXT: %1583 = extractvalue { ptr, ptr } %1579, 0 -// CHECK-NEXT: %__llgo_funcval_code210 = call ptr asm "", "=r,0"(ptr %1583) -// CHECK-NEXT: %1584 = call %reflect.Value %__llgo_funcval_code210(ptr {{(nest|swiftself)}} %1582, %"{{.*}}/runtime/internal/runtime.eface" %1581) -// CHECK-NEXT: %1585 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1577, i32 0, i32 1 -// CHECK-NEXT: %1586 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1587 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 105, ptr %1587, align 4 -// CHECK-NEXT: %1588 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1587, 1 -// CHECK-NEXT: %1589 = extractvalue { ptr, ptr } %1586, 1 -// CHECK-NEXT: %1590 = extractvalue { ptr, ptr } %1586, 0 -// CHECK-NEXT: %__llgo_funcval_code211 = call ptr asm "", "=r,0"(ptr %1590) -// CHECK-NEXT: %1591 = call %reflect.Value %__llgo_funcval_code211(ptr {{(nest|swiftself)}} %1589, %"{{.*}}/runtime/internal/runtime.eface" %1588) -// CHECK-NEXT: store %reflect.Value %1584, ptr %1578, align 8 -// CHECK-NEXT: store %reflect.Value %1591, ptr %1585, align 8 -// CHECK-NEXT: %1592 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 106 -// CHECK-NEXT: %1593 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1592, i32 0, i32 0 -// CHECK-NEXT: %1594 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1595 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 106, ptr %1595, align 4 -// CHECK-NEXT: %1596 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1595, 1 -// CHECK-NEXT: %1597 = extractvalue { ptr, ptr } %1594, 1 -// CHECK-NEXT: %1598 = extractvalue { ptr, ptr } %1594, 0 -// CHECK-NEXT: %__llgo_funcval_code212 = call ptr asm "", "=r,0"(ptr %1598) -// CHECK-NEXT: %1599 = call %reflect.Value %__llgo_funcval_code212(ptr {{(nest|swiftself)}} %1597, %"{{.*}}/runtime/internal/runtime.eface" %1596) -// CHECK-NEXT: %1600 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1592, i32 0, i32 1 -// CHECK-NEXT: %1601 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1602 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 106, ptr %1602, align 4 -// CHECK-NEXT: %1603 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1602, 1 -// CHECK-NEXT: %1604 = extractvalue { ptr, ptr } %1601, 1 -// CHECK-NEXT: %1605 = extractvalue { ptr, ptr } %1601, 0 -// CHECK-NEXT: %__llgo_funcval_code213 = call ptr asm "", "=r,0"(ptr %1605) -// CHECK-NEXT: %1606 = call %reflect.Value %__llgo_funcval_code213(ptr {{(nest|swiftself)}} %1604, %"{{.*}}/runtime/internal/runtime.eface" %1603) -// CHECK-NEXT: store %reflect.Value %1599, ptr %1593, align 8 -// CHECK-NEXT: store %reflect.Value %1606, ptr %1600, align 8 -// CHECK-NEXT: %1607 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 107 -// CHECK-NEXT: %1608 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1607, i32 0, i32 0 -// CHECK-NEXT: %1609 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1610 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 107, ptr %1610, align 4 -// CHECK-NEXT: %1611 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1610, 1 -// CHECK-NEXT: %1612 = extractvalue { ptr, ptr } %1609, 1 -// CHECK-NEXT: %1613 = extractvalue { ptr, ptr } %1609, 0 -// CHECK-NEXT: %__llgo_funcval_code214 = call ptr asm "", "=r,0"(ptr %1613) -// CHECK-NEXT: %1614 = call %reflect.Value %__llgo_funcval_code214(ptr {{(nest|swiftself)}} %1612, %"{{.*}}/runtime/internal/runtime.eface" %1611) -// CHECK-NEXT: %1615 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1607, i32 0, i32 1 -// CHECK-NEXT: %1616 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1617 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 107, ptr %1617, align 8 -// CHECK-NEXT: %1618 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1617, 1 -// CHECK-NEXT: %1619 = extractvalue { ptr, ptr } %1616, 1 -// CHECK-NEXT: %1620 = extractvalue { ptr, ptr } %1616, 0 -// CHECK-NEXT: %__llgo_funcval_code215 = call ptr asm "", "=r,0"(ptr %1620) -// CHECK-NEXT: %1621 = call %reflect.Value %__llgo_funcval_code215(ptr {{(nest|swiftself)}} %1619, %"{{.*}}/runtime/internal/runtime.eface" %1618) -// CHECK-NEXT: store %reflect.Value %1614, ptr %1608, align 8 -// CHECK-NEXT: store %reflect.Value %1621, ptr %1615, align 8 -// CHECK-NEXT: %1622 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 108 -// CHECK-NEXT: %1623 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1622, i32 0, i32 0 -// CHECK-NEXT: %1624 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1625 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 108, ptr %1625, align 8 -// CHECK-NEXT: %1626 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1625, 1 -// CHECK-NEXT: %1627 = extractvalue { ptr, ptr } %1624, 1 -// CHECK-NEXT: %1628 = extractvalue { ptr, ptr } %1624, 0 -// CHECK-NEXT: %__llgo_funcval_code216 = call ptr asm "", "=r,0"(ptr %1628) -// CHECK-NEXT: %1629 = call %reflect.Value %__llgo_funcval_code216(ptr {{(nest|swiftself)}} %1627, %"{{.*}}/runtime/internal/runtime.eface" %1626) -// CHECK-NEXT: %1630 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1622, i32 0, i32 1 -// CHECK-NEXT: %1631 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1632 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 108, ptr %1632, align 4 -// CHECK-NEXT: %1633 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1632, 1 -// CHECK-NEXT: %1634 = extractvalue { ptr, ptr } %1631, 1 -// CHECK-NEXT: %1635 = extractvalue { ptr, ptr } %1631, 0 -// CHECK-NEXT: %__llgo_funcval_code217 = call ptr asm "", "=r,0"(ptr %1635) -// CHECK-NEXT: %1636 = call %reflect.Value %__llgo_funcval_code217(ptr {{(nest|swiftself)}} %1634, %"{{.*}}/runtime/internal/runtime.eface" %1633) -// CHECK-NEXT: store %reflect.Value %1629, ptr %1623, align 8 -// CHECK-NEXT: store %reflect.Value %1636, ptr %1630, align 8 -// CHECK-NEXT: %1637 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 109 -// CHECK-NEXT: %1638 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1637, i32 0, i32 0 -// CHECK-NEXT: %1639 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1640 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 109, ptr %1640, align 4 -// CHECK-NEXT: %1641 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1640, 1 -// CHECK-NEXT: %1642 = extractvalue { ptr, ptr } %1639, 1 -// CHECK-NEXT: %1643 = extractvalue { ptr, ptr } %1639, 0 -// CHECK-NEXT: %__llgo_funcval_code218 = call ptr asm "", "=r,0"(ptr %1643) -// CHECK-NEXT: %1644 = call %reflect.Value %__llgo_funcval_code218(ptr {{(nest|swiftself)}} %1642, %"{{.*}}/runtime/internal/runtime.eface" %1641) -// CHECK-NEXT: %1645 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1637, i32 0, i32 1 -// CHECK-NEXT: %1646 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1647 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 109, ptr %1647, align 8 -// CHECK-NEXT: %1648 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1647, 1 -// CHECK-NEXT: %1649 = extractvalue { ptr, ptr } %1646, 1 -// CHECK-NEXT: %1650 = extractvalue { ptr, ptr } %1646, 0 -// CHECK-NEXT: %__llgo_funcval_code219 = call ptr asm "", "=r,0"(ptr %1650) -// CHECK-NEXT: %1651 = call %reflect.Value %__llgo_funcval_code219(ptr {{(nest|swiftself)}} %1649, %"{{.*}}/runtime/internal/runtime.eface" %1648) -// CHECK-NEXT: store %reflect.Value %1644, ptr %1638, align 8 -// CHECK-NEXT: store %reflect.Value %1651, ptr %1645, align 8 -// CHECK-NEXT: %1652 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 110 -// CHECK-NEXT: %1653 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1652, i32 0, i32 0 -// CHECK-NEXT: %1654 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1655 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 110, ptr %1655, align 8 -// CHECK-NEXT: %1656 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1655, 1 -// CHECK-NEXT: %1657 = extractvalue { ptr, ptr } %1654, 1 -// CHECK-NEXT: %1658 = extractvalue { ptr, ptr } %1654, 0 -// CHECK-NEXT: %__llgo_funcval_code220 = call ptr asm "", "=r,0"(ptr %1658) -// CHECK-NEXT: %1659 = call %reflect.Value %__llgo_funcval_code220(ptr {{(nest|swiftself)}} %1657, %"{{.*}}/runtime/internal/runtime.eface" %1656) -// CHECK-NEXT: %1660 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1652, i32 0, i32 1 -// CHECK-NEXT: %1661 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1662 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 110, ptr %1662, align 4 -// CHECK-NEXT: %1663 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1662, 1 -// CHECK-NEXT: %1664 = extractvalue { ptr, ptr } %1661, 1 -// CHECK-NEXT: %1665 = extractvalue { ptr, ptr } %1661, 0 -// CHECK-NEXT: %__llgo_funcval_code221 = call ptr asm "", "=r,0"(ptr %1665) -// CHECK-NEXT: %1666 = call %reflect.Value %__llgo_funcval_code221(ptr {{(nest|swiftself)}} %1664, %"{{.*}}/runtime/internal/runtime.eface" %1663) -// CHECK-NEXT: store %reflect.Value %1659, ptr %1653, align 8 -// CHECK-NEXT: store %reflect.Value %1666, ptr %1660, align 8 -// CHECK-NEXT: %1667 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 111 -// CHECK-NEXT: %1668 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1667, i32 0, i32 0 -// CHECK-NEXT: %1669 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1670 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 111, ptr %1670, align 4 -// CHECK-NEXT: %1671 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1670, 1 -// CHECK-NEXT: %1672 = extractvalue { ptr, ptr } %1669, 1 -// CHECK-NEXT: %1673 = extractvalue { ptr, ptr } %1669, 0 -// CHECK-NEXT: %__llgo_funcval_code222 = call ptr asm "", "=r,0"(ptr %1673) -// CHECK-NEXT: %1674 = call %reflect.Value %__llgo_funcval_code222(ptr {{(nest|swiftself)}} %1672, %"{{.*}}/runtime/internal/runtime.eface" %1671) -// CHECK-NEXT: %1675 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1667, i32 0, i32 1 -// CHECK-NEXT: %1676 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1677 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 111, ptr %1677, align 8 -// CHECK-NEXT: %1678 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1677, 1 -// CHECK-NEXT: %1679 = extractvalue { ptr, ptr } %1676, 1 -// CHECK-NEXT: %1680 = extractvalue { ptr, ptr } %1676, 0 -// CHECK-NEXT: %__llgo_funcval_code223 = call ptr asm "", "=r,0"(ptr %1680) -// CHECK-NEXT: %1681 = call %reflect.Value %__llgo_funcval_code223(ptr {{(nest|swiftself)}} %1679, %"{{.*}}/runtime/internal/runtime.eface" %1678) -// CHECK-NEXT: store %reflect.Value %1674, ptr %1668, align 8 -// CHECK-NEXT: store %reflect.Value %1681, ptr %1675, align 8 -// CHECK-NEXT: %1682 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 112 -// CHECK-NEXT: %1683 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1682, i32 0, i32 0 -// CHECK-NEXT: %1684 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1685 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 112, ptr %1685, align 8 -// CHECK-NEXT: %1686 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1685, 1 -// CHECK-NEXT: %1687 = extractvalue { ptr, ptr } %1684, 1 -// CHECK-NEXT: %1688 = extractvalue { ptr, ptr } %1684, 0 -// CHECK-NEXT: %__llgo_funcval_code224 = call ptr asm "", "=r,0"(ptr %1688) -// CHECK-NEXT: %1689 = call %reflect.Value %__llgo_funcval_code224(ptr {{(nest|swiftself)}} %1687, %"{{.*}}/runtime/internal/runtime.eface" %1686) -// CHECK-NEXT: %1690 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1682, i32 0, i32 1 -// CHECK-NEXT: %1691 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1692 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 112, ptr %1692, align 4 -// CHECK-NEXT: %1693 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1692, 1 -// CHECK-NEXT: %1694 = extractvalue { ptr, ptr } %1691, 1 -// CHECK-NEXT: %1695 = extractvalue { ptr, ptr } %1691, 0 -// CHECK-NEXT: %__llgo_funcval_code225 = call ptr asm "", "=r,0"(ptr %1695) -// CHECK-NEXT: %1696 = call %reflect.Value %__llgo_funcval_code225(ptr {{(nest|swiftself)}} %1694, %"{{.*}}/runtime/internal/runtime.eface" %1693) -// CHECK-NEXT: store %reflect.Value %1689, ptr %1683, align 8 -// CHECK-NEXT: store %reflect.Value %1696, ptr %1690, align 8 -// CHECK-NEXT: %1697 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 113 -// CHECK-NEXT: %1698 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1697, i32 0, i32 0 -// CHECK-NEXT: %1699 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1700 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 113, ptr %1700, align 4 -// CHECK-NEXT: %1701 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1700, 1 -// CHECK-NEXT: %1702 = extractvalue { ptr, ptr } %1699, 1 -// CHECK-NEXT: %1703 = extractvalue { ptr, ptr } %1699, 0 -// CHECK-NEXT: %__llgo_funcval_code226 = call ptr asm "", "=r,0"(ptr %1703) -// CHECK-NEXT: %1704 = call %reflect.Value %__llgo_funcval_code226(ptr {{(nest|swiftself)}} %1702, %"{{.*}}/runtime/internal/runtime.eface" %1701) -// CHECK-NEXT: %1705 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1697, i32 0, i32 1 -// CHECK-NEXT: %1706 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1707 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 113, ptr %1707, align 8 -// CHECK-NEXT: %1708 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1707, 1 -// CHECK-NEXT: %1709 = extractvalue { ptr, ptr } %1706, 1 -// CHECK-NEXT: %1710 = extractvalue { ptr, ptr } %1706, 0 -// CHECK-NEXT: %__llgo_funcval_code227 = call ptr asm "", "=r,0"(ptr %1710) -// CHECK-NEXT: %1711 = call %reflect.Value %__llgo_funcval_code227(ptr {{(nest|swiftself)}} %1709, %"{{.*}}/runtime/internal/runtime.eface" %1708) -// CHECK-NEXT: store %reflect.Value %1704, ptr %1698, align 8 -// CHECK-NEXT: store %reflect.Value %1711, ptr %1705, align 8 -// CHECK-NEXT: %1712 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 114 -// CHECK-NEXT: %1713 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1712, i32 0, i32 0 -// CHECK-NEXT: %1714 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1715 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 114, ptr %1715, align 8 -// CHECK-NEXT: %1716 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1715, 1 -// CHECK-NEXT: %1717 = extractvalue { ptr, ptr } %1714, 1 -// CHECK-NEXT: %1718 = extractvalue { ptr, ptr } %1714, 0 -// CHECK-NEXT: %__llgo_funcval_code228 = call ptr asm "", "=r,0"(ptr %1718) -// CHECK-NEXT: %1719 = call %reflect.Value %__llgo_funcval_code228(ptr {{(nest|swiftself)}} %1717, %"{{.*}}/runtime/internal/runtime.eface" %1716) -// CHECK-NEXT: %1720 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1712, i32 0, i32 1 -// CHECK-NEXT: %1721 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1722 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 114, ptr %1722, align 4 -// CHECK-NEXT: %1723 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1722, 1 -// CHECK-NEXT: %1724 = extractvalue { ptr, ptr } %1721, 1 -// CHECK-NEXT: %1725 = extractvalue { ptr, ptr } %1721, 0 -// CHECK-NEXT: %__llgo_funcval_code229 = call ptr asm "", "=r,0"(ptr %1725) -// CHECK-NEXT: %1726 = call %reflect.Value %__llgo_funcval_code229(ptr {{(nest|swiftself)}} %1724, %"{{.*}}/runtime/internal/runtime.eface" %1723) -// CHECK-NEXT: store %reflect.Value %1719, ptr %1713, align 8 -// CHECK-NEXT: store %reflect.Value %1726, ptr %1720, align 8 -// CHECK-NEXT: %1727 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 115 -// CHECK-NEXT: %1728 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1727, i32 0, i32 0 -// CHECK-NEXT: %1729 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1730 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 115, ptr %1730, align 4 -// CHECK-NEXT: %1731 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1730, 1 -// CHECK-NEXT: %1732 = extractvalue { ptr, ptr } %1729, 1 -// CHECK-NEXT: %1733 = extractvalue { ptr, ptr } %1729, 0 -// CHECK-NEXT: %__llgo_funcval_code230 = call ptr asm "", "=r,0"(ptr %1733) -// CHECK-NEXT: %1734 = call %reflect.Value %__llgo_funcval_code230(ptr {{(nest|swiftself)}} %1732, %"{{.*}}/runtime/internal/runtime.eface" %1731) -// CHECK-NEXT: %1735 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1727, i32 0, i32 1 -// CHECK-NEXT: %1736 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1737 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 115, ptr %1737, align 8 -// CHECK-NEXT: %1738 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1737, 1 -// CHECK-NEXT: %1739 = extractvalue { ptr, ptr } %1736, 1 -// CHECK-NEXT: %1740 = extractvalue { ptr, ptr } %1736, 0 -// CHECK-NEXT: %__llgo_funcval_code231 = call ptr asm "", "=r,0"(ptr %1740) -// CHECK-NEXT: %1741 = call %reflect.Value %__llgo_funcval_code231(ptr {{(nest|swiftself)}} %1739, %"{{.*}}/runtime/internal/runtime.eface" %1738) -// CHECK-NEXT: store %reflect.Value %1734, ptr %1728, align 8 -// CHECK-NEXT: store %reflect.Value %1741, ptr %1735, align 8 -// CHECK-NEXT: %1742 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 116 -// CHECK-NEXT: %1743 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1742, i32 0, i32 0 -// CHECK-NEXT: %1744 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1745 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 116, ptr %1745, align 8 -// CHECK-NEXT: %1746 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1745, 1 -// CHECK-NEXT: %1747 = extractvalue { ptr, ptr } %1744, 1 -// CHECK-NEXT: %1748 = extractvalue { ptr, ptr } %1744, 0 -// CHECK-NEXT: %__llgo_funcval_code232 = call ptr asm "", "=r,0"(ptr %1748) -// CHECK-NEXT: %1749 = call %reflect.Value %__llgo_funcval_code232(ptr {{(nest|swiftself)}} %1747, %"{{.*}}/runtime/internal/runtime.eface" %1746) -// CHECK-NEXT: %1750 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1742, i32 0, i32 1 -// CHECK-NEXT: %1751 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1752 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 116, ptr %1752, align 4 -// CHECK-NEXT: %1753 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1752, 1 -// CHECK-NEXT: %1754 = extractvalue { ptr, ptr } %1751, 1 -// CHECK-NEXT: %1755 = extractvalue { ptr, ptr } %1751, 0 -// CHECK-NEXT: %__llgo_funcval_code233 = call ptr asm "", "=r,0"(ptr %1755) -// CHECK-NEXT: %1756 = call %reflect.Value %__llgo_funcval_code233(ptr {{(nest|swiftself)}} %1754, %"{{.*}}/runtime/internal/runtime.eface" %1753) -// CHECK-NEXT: store %reflect.Value %1749, ptr %1743, align 8 -// CHECK-NEXT: store %reflect.Value %1756, ptr %1750, align 8 -// CHECK-NEXT: %1757 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 117 -// CHECK-NEXT: %1758 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1757, i32 0, i32 0 -// CHECK-NEXT: %1759 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1760 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 117, ptr %1760, align 4 -// CHECK-NEXT: %1761 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1760, 1 -// CHECK-NEXT: %1762 = extractvalue { ptr, ptr } %1759, 1 -// CHECK-NEXT: %1763 = extractvalue { ptr, ptr } %1759, 0 -// CHECK-NEXT: %__llgo_funcval_code234 = call ptr asm "", "=r,0"(ptr %1763) -// CHECK-NEXT: %1764 = call %reflect.Value %__llgo_funcval_code234(ptr {{(nest|swiftself)}} %1762, %"{{.*}}/runtime/internal/runtime.eface" %1761) -// CHECK-NEXT: %1765 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1757, i32 0, i32 1 -// CHECK-NEXT: %1766 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1767 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.170000e+02, ptr %1767, align 4 -// CHECK-NEXT: %1768 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1767, 1 -// CHECK-NEXT: %1769 = extractvalue { ptr, ptr } %1766, 1 -// CHECK-NEXT: %1770 = extractvalue { ptr, ptr } %1766, 0 -// CHECK-NEXT: %__llgo_funcval_code235 = call ptr asm "", "=r,0"(ptr %1770) -// CHECK-NEXT: %1771 = call %reflect.Value %__llgo_funcval_code235(ptr {{(nest|swiftself)}} %1769, %"{{.*}}/runtime/internal/runtime.eface" %1768) -// CHECK-NEXT: store %reflect.Value %1764, ptr %1758, align 8 -// CHECK-NEXT: store %reflect.Value %1771, ptr %1765, align 8 -// CHECK-NEXT: %1772 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 118 -// CHECK-NEXT: %1773 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1772, i32 0, i32 0 -// CHECK-NEXT: %1774 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1775 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.180000e+02, ptr %1775, align 4 -// CHECK-NEXT: %1776 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1775, 1 -// CHECK-NEXT: %1777 = extractvalue { ptr, ptr } %1774, 1 -// CHECK-NEXT: %1778 = extractvalue { ptr, ptr } %1774, 0 -// CHECK-NEXT: %__llgo_funcval_code236 = call ptr asm "", "=r,0"(ptr %1778) -// CHECK-NEXT: %1779 = call %reflect.Value %__llgo_funcval_code236(ptr {{(nest|swiftself)}} %1777, %"{{.*}}/runtime/internal/runtime.eface" %1776) -// CHECK-NEXT: %1780 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1772, i32 0, i32 1 -// CHECK-NEXT: %1781 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1782 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 118, ptr %1782, align 4 -// CHECK-NEXT: %1783 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1782, 1 -// CHECK-NEXT: %1784 = extractvalue { ptr, ptr } %1781, 1 -// CHECK-NEXT: %1785 = extractvalue { ptr, ptr } %1781, 0 -// CHECK-NEXT: %__llgo_funcval_code237 = call ptr asm "", "=r,0"(ptr %1785) -// CHECK-NEXT: %1786 = call %reflect.Value %__llgo_funcval_code237(ptr {{(nest|swiftself)}} %1784, %"{{.*}}/runtime/internal/runtime.eface" %1783) -// CHECK-NEXT: store %reflect.Value %1779, ptr %1773, align 8 -// CHECK-NEXT: store %reflect.Value %1786, ptr %1780, align 8 -// CHECK-NEXT: %1787 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 119 -// CHECK-NEXT: %1788 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1787, i32 0, i32 0 -// CHECK-NEXT: %1789 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1790 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 119, ptr %1790, align 4 -// CHECK-NEXT: %1791 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1790, 1 -// CHECK-NEXT: %1792 = extractvalue { ptr, ptr } %1789, 1 -// CHECK-NEXT: %1793 = extractvalue { ptr, ptr } %1789, 0 -// CHECK-NEXT: %__llgo_funcval_code238 = call ptr asm "", "=r,0"(ptr %1793) -// CHECK-NEXT: %1794 = call %reflect.Value %__llgo_funcval_code238(ptr {{(nest|swiftself)}} %1792, %"{{.*}}/runtime/internal/runtime.eface" %1791) -// CHECK-NEXT: %1795 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1787, i32 0, i32 1 -// CHECK-NEXT: %1796 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1797 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.190000e+02, ptr %1797, align 8 -// CHECK-NEXT: %1798 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1797, 1 -// CHECK-NEXT: %1799 = extractvalue { ptr, ptr } %1796, 1 -// CHECK-NEXT: %1800 = extractvalue { ptr, ptr } %1796, 0 -// CHECK-NEXT: %__llgo_funcval_code239 = call ptr asm "", "=r,0"(ptr %1800) -// CHECK-NEXT: %1801 = call %reflect.Value %__llgo_funcval_code239(ptr {{(nest|swiftself)}} %1799, %"{{.*}}/runtime/internal/runtime.eface" %1798) -// CHECK-NEXT: store %reflect.Value %1794, ptr %1788, align 8 -// CHECK-NEXT: store %reflect.Value %1801, ptr %1795, align 8 -// CHECK-NEXT: %1802 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 120 -// CHECK-NEXT: %1803 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1802, i32 0, i32 0 -// CHECK-NEXT: %1804 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1805 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.200000e+02, ptr %1805, align 8 -// CHECK-NEXT: %1806 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1805, 1 -// CHECK-NEXT: %1807 = extractvalue { ptr, ptr } %1804, 1 -// CHECK-NEXT: %1808 = extractvalue { ptr, ptr } %1804, 0 -// CHECK-NEXT: %__llgo_funcval_code240 = call ptr asm "", "=r,0"(ptr %1808) -// CHECK-NEXT: %1809 = call %reflect.Value %__llgo_funcval_code240(ptr {{(nest|swiftself)}} %1807, %"{{.*}}/runtime/internal/runtime.eface" %1806) -// CHECK-NEXT: %1810 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1802, i32 0, i32 1 -// CHECK-NEXT: %1811 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1812 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 120, ptr %1812, align 4 -// CHECK-NEXT: %1813 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %1812, 1 -// CHECK-NEXT: %1814 = extractvalue { ptr, ptr } %1811, 1 -// CHECK-NEXT: %1815 = extractvalue { ptr, ptr } %1811, 0 -// CHECK-NEXT: %__llgo_funcval_code241 = call ptr asm "", "=r,0"(ptr %1815) -// CHECK-NEXT: %1816 = call %reflect.Value %__llgo_funcval_code241(ptr {{(nest|swiftself)}} %1814, %"{{.*}}/runtime/internal/runtime.eface" %1813) -// CHECK-NEXT: store %reflect.Value %1809, ptr %1803, align 8 -// CHECK-NEXT: store %reflect.Value %1816, ptr %1810, align 8 -// CHECK-NEXT: %1817 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 121 -// CHECK-NEXT: %1818 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1817, i32 0, i32 0 -// CHECK-NEXT: %1819 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1820 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 121, ptr %1820, align 8 -// CHECK-NEXT: %1821 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1820, 1 -// CHECK-NEXT: %1822 = extractvalue { ptr, ptr } %1819, 1 -// CHECK-NEXT: %1823 = extractvalue { ptr, ptr } %1819, 0 -// CHECK-NEXT: %__llgo_funcval_code242 = call ptr asm "", "=r,0"(ptr %1823) -// CHECK-NEXT: %1824 = call %reflect.Value %__llgo_funcval_code242(ptr {{(nest|swiftself)}} %1822, %"{{.*}}/runtime/internal/runtime.eface" %1821) -// CHECK-NEXT: %1825 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1817, i32 0, i32 1 -// CHECK-NEXT: %1826 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1827 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 121, ptr %1827, align 8 -// CHECK-NEXT: %1828 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1827, 1 -// CHECK-NEXT: %1829 = extractvalue { ptr, ptr } %1826, 1 -// CHECK-NEXT: %1830 = extractvalue { ptr, ptr } %1826, 0 -// CHECK-NEXT: %__llgo_funcval_code243 = call ptr asm "", "=r,0"(ptr %1830) -// CHECK-NEXT: %1831 = call %reflect.Value %__llgo_funcval_code243(ptr {{(nest|swiftself)}} %1829, %"{{.*}}/runtime/internal/runtime.eface" %1828) -// CHECK-NEXT: store %reflect.Value %1824, ptr %1818, align 8 -// CHECK-NEXT: store %reflect.Value %1831, ptr %1825, align 8 -// CHECK-NEXT: %1832 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 122 -// CHECK-NEXT: %1833 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1832, i32 0, i32 0 -// CHECK-NEXT: %1834 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1835 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 122, ptr %1835, align 8 -// CHECK-NEXT: %1836 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1835, 1 -// CHECK-NEXT: %1837 = extractvalue { ptr, ptr } %1834, 1 -// CHECK-NEXT: %1838 = extractvalue { ptr, ptr } %1834, 0 -// CHECK-NEXT: %__llgo_funcval_code244 = call ptr asm "", "=r,0"(ptr %1838) -// CHECK-NEXT: %1839 = call %reflect.Value %__llgo_funcval_code244(ptr {{(nest|swiftself)}} %1837, %"{{.*}}/runtime/internal/runtime.eface" %1836) -// CHECK-NEXT: %1840 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1832, i32 0, i32 1 -// CHECK-NEXT: %1841 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1842 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 122, ptr %1842, align 8 -// CHECK-NEXT: %1843 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1842, 1 -// CHECK-NEXT: %1844 = extractvalue { ptr, ptr } %1841, 1 -// CHECK-NEXT: %1845 = extractvalue { ptr, ptr } %1841, 0 -// CHECK-NEXT: %__llgo_funcval_code245 = call ptr asm "", "=r,0"(ptr %1845) -// CHECK-NEXT: %1846 = call %reflect.Value %__llgo_funcval_code245(ptr {{(nest|swiftself)}} %1844, %"{{.*}}/runtime/internal/runtime.eface" %1843) -// CHECK-NEXT: store %reflect.Value %1839, ptr %1833, align 8 -// CHECK-NEXT: store %reflect.Value %1846, ptr %1840, align 8 -// CHECK-NEXT: %1847 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 123 -// CHECK-NEXT: %1848 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1847, i32 0, i32 0 -// CHECK-NEXT: %1849 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1850 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 123, ptr %1850, align 8 -// CHECK-NEXT: %1851 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %1850, 1 -// CHECK-NEXT: %1852 = extractvalue { ptr, ptr } %1849, 1 -// CHECK-NEXT: %1853 = extractvalue { ptr, ptr } %1849, 0 -// CHECK-NEXT: %__llgo_funcval_code246 = call ptr asm "", "=r,0"(ptr %1853) -// CHECK-NEXT: %1854 = call %reflect.Value %__llgo_funcval_code246(ptr {{(nest|swiftself)}} %1852, %"{{.*}}/runtime/internal/runtime.eface" %1851) -// CHECK-NEXT: %1855 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1847, i32 0, i32 1 -// CHECK-NEXT: %1856 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1857 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 123, ptr %1857, align 8 -// CHECK-NEXT: %1858 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1857, 1 -// CHECK-NEXT: %1859 = extractvalue { ptr, ptr } %1856, 1 -// CHECK-NEXT: %1860 = extractvalue { ptr, ptr } %1856, 0 -// CHECK-NEXT: %__llgo_funcval_code247 = call ptr asm "", "=r,0"(ptr %1860) -// CHECK-NEXT: %1861 = call %reflect.Value %__llgo_funcval_code247(ptr {{(nest|swiftself)}} %1859, %"{{.*}}/runtime/internal/runtime.eface" %1858) -// CHECK-NEXT: store %reflect.Value %1854, ptr %1848, align 8 -// CHECK-NEXT: store %reflect.Value %1861, ptr %1855, align 8 -// CHECK-NEXT: %1862 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 124 -// CHECK-NEXT: %1863 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1862, i32 0, i32 0 -// CHECK-NEXT: %1864 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1865 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 124, ptr %1865, align 8 -// CHECK-NEXT: %1866 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1865, 1 -// CHECK-NEXT: %1867 = extractvalue { ptr, ptr } %1864, 1 -// CHECK-NEXT: %1868 = extractvalue { ptr, ptr } %1864, 0 -// CHECK-NEXT: %__llgo_funcval_code248 = call ptr asm "", "=r,0"(ptr %1868) -// CHECK-NEXT: %1869 = call %reflect.Value %__llgo_funcval_code248(ptr {{(nest|swiftself)}} %1867, %"{{.*}}/runtime/internal/runtime.eface" %1866) -// CHECK-NEXT: %1870 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1862, i32 0, i32 1 -// CHECK-NEXT: %1871 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1872 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 124, ptr %1872, align 8 -// CHECK-NEXT: %1873 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1872, 1 -// CHECK-NEXT: %1874 = extractvalue { ptr, ptr } %1871, 1 -// CHECK-NEXT: %1875 = extractvalue { ptr, ptr } %1871, 0 -// CHECK-NEXT: %__llgo_funcval_code249 = call ptr asm "", "=r,0"(ptr %1875) -// CHECK-NEXT: %1876 = call %reflect.Value %__llgo_funcval_code249(ptr {{(nest|swiftself)}} %1874, %"{{.*}}/runtime/internal/runtime.eface" %1873) -// CHECK-NEXT: store %reflect.Value %1869, ptr %1863, align 8 -// CHECK-NEXT: store %reflect.Value %1876, ptr %1870, align 8 -// CHECK-NEXT: %1877 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 125 -// CHECK-NEXT: %1878 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1877, i32 0, i32 0 -// CHECK-NEXT: %1879 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1880 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 125, ptr %1880, align 8 -// CHECK-NEXT: %1881 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1880, 1 -// CHECK-NEXT: %1882 = extractvalue { ptr, ptr } %1879, 1 -// CHECK-NEXT: %1883 = extractvalue { ptr, ptr } %1879, 0 -// CHECK-NEXT: %__llgo_funcval_code250 = call ptr asm "", "=r,0"(ptr %1883) -// CHECK-NEXT: %1884 = call %reflect.Value %__llgo_funcval_code250(ptr {{(nest|swiftself)}} %1882, %"{{.*}}/runtime/internal/runtime.eface" %1881) -// CHECK-NEXT: %1885 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1877, i32 0, i32 1 -// CHECK-NEXT: %1886 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1887 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 125, ptr %1887, align 8 -// CHECK-NEXT: %1888 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1887, 1 -// CHECK-NEXT: %1889 = extractvalue { ptr, ptr } %1886, 1 -// CHECK-NEXT: %1890 = extractvalue { ptr, ptr } %1886, 0 -// CHECK-NEXT: %__llgo_funcval_code251 = call ptr asm "", "=r,0"(ptr %1890) -// CHECK-NEXT: %1891 = call %reflect.Value %__llgo_funcval_code251(ptr {{(nest|swiftself)}} %1889, %"{{.*}}/runtime/internal/runtime.eface" %1888) -// CHECK-NEXT: store %reflect.Value %1884, ptr %1878, align 8 -// CHECK-NEXT: store %reflect.Value %1891, ptr %1885, align 8 -// CHECK-NEXT: %1892 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 126 -// CHECK-NEXT: %1893 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1892, i32 0, i32 0 -// CHECK-NEXT: %1894 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1895 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 126, ptr %1895, align 8 -// CHECK-NEXT: %1896 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1895, 1 -// CHECK-NEXT: %1897 = extractvalue { ptr, ptr } %1894, 1 -// CHECK-NEXT: %1898 = extractvalue { ptr, ptr } %1894, 0 -// CHECK-NEXT: %__llgo_funcval_code252 = call ptr asm "", "=r,0"(ptr %1898) -// CHECK-NEXT: %1899 = call %reflect.Value %__llgo_funcval_code252(ptr {{(nest|swiftself)}} %1897, %"{{.*}}/runtime/internal/runtime.eface" %1896) -// CHECK-NEXT: %1900 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1892, i32 0, i32 1 -// CHECK-NEXT: %1901 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1902 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 126, ptr %1902, align 8 -// CHECK-NEXT: %1903 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1902, 1 -// CHECK-NEXT: %1904 = extractvalue { ptr, ptr } %1901, 1 -// CHECK-NEXT: %1905 = extractvalue { ptr, ptr } %1901, 0 -// CHECK-NEXT: %__llgo_funcval_code253 = call ptr asm "", "=r,0"(ptr %1905) -// CHECK-NEXT: %1906 = call %reflect.Value %__llgo_funcval_code253(ptr {{(nest|swiftself)}} %1904, %"{{.*}}/runtime/internal/runtime.eface" %1903) -// CHECK-NEXT: store %reflect.Value %1899, ptr %1893, align 8 -// CHECK-NEXT: store %reflect.Value %1906, ptr %1900, align 8 -// CHECK-NEXT: %1907 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 127 -// CHECK-NEXT: %1908 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1907, i32 0, i32 0 -// CHECK-NEXT: %1909 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1910 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 127, ptr %1910, align 8 -// CHECK-NEXT: %1911 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %1910, 1 -// CHECK-NEXT: %1912 = extractvalue { ptr, ptr } %1909, 1 -// CHECK-NEXT: %1913 = extractvalue { ptr, ptr } %1909, 0 -// CHECK-NEXT: %__llgo_funcval_code254 = call ptr asm "", "=r,0"(ptr %1913) -// CHECK-NEXT: %1914 = call %reflect.Value %__llgo_funcval_code254(ptr {{(nest|swiftself)}} %1912, %"{{.*}}/runtime/internal/runtime.eface" %1911) -// CHECK-NEXT: %1915 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1907, i32 0, i32 1 -// CHECK-NEXT: %1916 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1917 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 127, ptr %1917, align 8 -// CHECK-NEXT: %1918 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1917, 1 -// CHECK-NEXT: %1919 = extractvalue { ptr, ptr } %1916, 1 -// CHECK-NEXT: %1920 = extractvalue { ptr, ptr } %1916, 0 -// CHECK-NEXT: %__llgo_funcval_code255 = call ptr asm "", "=r,0"(ptr %1920) -// CHECK-NEXT: %1921 = call %reflect.Value %__llgo_funcval_code255(ptr {{(nest|swiftself)}} %1919, %"{{.*}}/runtime/internal/runtime.eface" %1918) -// CHECK-NEXT: store %reflect.Value %1914, ptr %1908, align 8 -// CHECK-NEXT: store %reflect.Value %1921, ptr %1915, align 8 -// CHECK-NEXT: %1922 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 128 -// CHECK-NEXT: %1923 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1922, i32 0, i32 0 -// CHECK-NEXT: %1924 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1925 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 128, ptr %1925, align 8 -// CHECK-NEXT: %1926 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1925, 1 -// CHECK-NEXT: %1927 = extractvalue { ptr, ptr } %1924, 1 -// CHECK-NEXT: %1928 = extractvalue { ptr, ptr } %1924, 0 -// CHECK-NEXT: %__llgo_funcval_code256 = call ptr asm "", "=r,0"(ptr %1928) -// CHECK-NEXT: %1929 = call %reflect.Value %__llgo_funcval_code256(ptr {{(nest|swiftself)}} %1927, %"{{.*}}/runtime/internal/runtime.eface" %1926) -// CHECK-NEXT: %1930 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1922, i32 0, i32 1 -// CHECK-NEXT: %1931 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1932 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 128, ptr %1932, align 8 -// CHECK-NEXT: %1933 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1932, 1 -// CHECK-NEXT: %1934 = extractvalue { ptr, ptr } %1931, 1 -// CHECK-NEXT: %1935 = extractvalue { ptr, ptr } %1931, 0 -// CHECK-NEXT: %__llgo_funcval_code257 = call ptr asm "", "=r,0"(ptr %1935) -// CHECK-NEXT: %1936 = call %reflect.Value %__llgo_funcval_code257(ptr {{(nest|swiftself)}} %1934, %"{{.*}}/runtime/internal/runtime.eface" %1933) -// CHECK-NEXT: store %reflect.Value %1929, ptr %1923, align 8 -// CHECK-NEXT: store %reflect.Value %1936, ptr %1930, align 8 -// CHECK-NEXT: %1937 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 129 -// CHECK-NEXT: %1938 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1937, i32 0, i32 0 -// CHECK-NEXT: %1939 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1940 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 129, ptr %1940, align 8 -// CHECK-NEXT: %1941 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %1940, 1 -// CHECK-NEXT: %1942 = extractvalue { ptr, ptr } %1939, 1 -// CHECK-NEXT: %1943 = extractvalue { ptr, ptr } %1939, 0 -// CHECK-NEXT: %__llgo_funcval_code258 = call ptr asm "", "=r,0"(ptr %1943) -// CHECK-NEXT: %1944 = call %reflect.Value %__llgo_funcval_code258(ptr {{(nest|swiftself)}} %1942, %"{{.*}}/runtime/internal/runtime.eface" %1941) -// CHECK-NEXT: %1945 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1937, i32 0, i32 1 -// CHECK-NEXT: %1946 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1947 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 129, ptr %1947, align 8 -// CHECK-NEXT: %1948 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1947, 1 -// CHECK-NEXT: %1949 = extractvalue { ptr, ptr } %1946, 1 -// CHECK-NEXT: %1950 = extractvalue { ptr, ptr } %1946, 0 -// CHECK-NEXT: %__llgo_funcval_code259 = call ptr asm "", "=r,0"(ptr %1950) -// CHECK-NEXT: %1951 = call %reflect.Value %__llgo_funcval_code259(ptr {{(nest|swiftself)}} %1949, %"{{.*}}/runtime/internal/runtime.eface" %1948) -// CHECK-NEXT: store %reflect.Value %1944, ptr %1938, align 8 -// CHECK-NEXT: store %reflect.Value %1951, ptr %1945, align 8 -// CHECK-NEXT: %1952 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 130 -// CHECK-NEXT: %1953 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1952, i32 0, i32 0 -// CHECK-NEXT: %1954 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1955 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 130, ptr %1955, align 8 -// CHECK-NEXT: %1956 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1955, 1 -// CHECK-NEXT: %1957 = extractvalue { ptr, ptr } %1954, 1 -// CHECK-NEXT: %1958 = extractvalue { ptr, ptr } %1954, 0 -// CHECK-NEXT: %__llgo_funcval_code260 = call ptr asm "", "=r,0"(ptr %1958) -// CHECK-NEXT: %1959 = call %reflect.Value %__llgo_funcval_code260(ptr {{(nest|swiftself)}} %1957, %"{{.*}}/runtime/internal/runtime.eface" %1956) -// CHECK-NEXT: %1960 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1952, i32 0, i32 1 -// CHECK-NEXT: %1961 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1962 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.300000e+02, ptr %1962, align 4 -// CHECK-NEXT: %1963 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1962, 1 -// CHECK-NEXT: %1964 = extractvalue { ptr, ptr } %1961, 1 -// CHECK-NEXT: %1965 = extractvalue { ptr, ptr } %1961, 0 -// CHECK-NEXT: %__llgo_funcval_code261 = call ptr asm "", "=r,0"(ptr %1965) -// CHECK-NEXT: %1966 = call %reflect.Value %__llgo_funcval_code261(ptr {{(nest|swiftself)}} %1964, %"{{.*}}/runtime/internal/runtime.eface" %1963) -// CHECK-NEXT: store %reflect.Value %1959, ptr %1953, align 8 -// CHECK-NEXT: store %reflect.Value %1966, ptr %1960, align 8 -// CHECK-NEXT: %1967 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 131 -// CHECK-NEXT: %1968 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1967, i32 0, i32 0 -// CHECK-NEXT: %1969 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1970 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.310000e+02, ptr %1970, align 4 -// CHECK-NEXT: %1971 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1970, 1 -// CHECK-NEXT: %1972 = extractvalue { ptr, ptr } %1969, 1 -// CHECK-NEXT: %1973 = extractvalue { ptr, ptr } %1969, 0 -// CHECK-NEXT: %__llgo_funcval_code262 = call ptr asm "", "=r,0"(ptr %1973) -// CHECK-NEXT: %1974 = call %reflect.Value %__llgo_funcval_code262(ptr {{(nest|swiftself)}} %1972, %"{{.*}}/runtime/internal/runtime.eface" %1971) -// CHECK-NEXT: %1975 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1967, i32 0, i32 1 -// CHECK-NEXT: %1976 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1977 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 131, ptr %1977, align 8 -// CHECK-NEXT: %1978 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1977, 1 -// CHECK-NEXT: %1979 = extractvalue { ptr, ptr } %1976, 1 -// CHECK-NEXT: %1980 = extractvalue { ptr, ptr } %1976, 0 -// CHECK-NEXT: %__llgo_funcval_code263 = call ptr asm "", "=r,0"(ptr %1980) -// CHECK-NEXT: %1981 = call %reflect.Value %__llgo_funcval_code263(ptr {{(nest|swiftself)}} %1979, %"{{.*}}/runtime/internal/runtime.eface" %1978) -// CHECK-NEXT: store %reflect.Value %1974, ptr %1968, align 8 -// CHECK-NEXT: store %reflect.Value %1981, ptr %1975, align 8 -// CHECK-NEXT: %1982 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 132 -// CHECK-NEXT: %1983 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1982, i32 0, i32 0 -// CHECK-NEXT: %1984 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1985 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 132, ptr %1985, align 8 -// CHECK-NEXT: %1986 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %1985, 1 -// CHECK-NEXT: %1987 = extractvalue { ptr, ptr } %1984, 1 -// CHECK-NEXT: %1988 = extractvalue { ptr, ptr } %1984, 0 -// CHECK-NEXT: %__llgo_funcval_code264 = call ptr asm "", "=r,0"(ptr %1988) -// CHECK-NEXT: %1989 = call %reflect.Value %__llgo_funcval_code264(ptr {{(nest|swiftself)}} %1987, %"{{.*}}/runtime/internal/runtime.eface" %1986) -// CHECK-NEXT: %1990 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1982, i32 0, i32 1 -// CHECK-NEXT: %1991 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %1992 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.320000e+02, ptr %1992, align 8 -// CHECK-NEXT: %1993 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %1992, 1 -// CHECK-NEXT: %1994 = extractvalue { ptr, ptr } %1991, 1 -// CHECK-NEXT: %1995 = extractvalue { ptr, ptr } %1991, 0 -// CHECK-NEXT: %__llgo_funcval_code265 = call ptr asm "", "=r,0"(ptr %1995) -// CHECK-NEXT: %1996 = call %reflect.Value %__llgo_funcval_code265(ptr {{(nest|swiftself)}} %1994, %"{{.*}}/runtime/internal/runtime.eface" %1993) -// CHECK-NEXT: store %reflect.Value %1989, ptr %1983, align 8 -// CHECK-NEXT: store %reflect.Value %1996, ptr %1990, align 8 -// CHECK-NEXT: %1997 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 133 -// CHECK-NEXT: %1998 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1997, i32 0, i32 0 -// CHECK-NEXT: %1999 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2000 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.330000e+02, ptr %2000, align 8 -// CHECK-NEXT: %2001 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2000, 1 -// CHECK-NEXT: %2002 = extractvalue { ptr, ptr } %1999, 1 -// CHECK-NEXT: %2003 = extractvalue { ptr, ptr } %1999, 0 -// CHECK-NEXT: %__llgo_funcval_code266 = call ptr asm "", "=r,0"(ptr %2003) -// CHECK-NEXT: %2004 = call %reflect.Value %__llgo_funcval_code266(ptr {{(nest|swiftself)}} %2002, %"{{.*}}/runtime/internal/runtime.eface" %2001) -// CHECK-NEXT: %2005 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1997, i32 0, i32 1 -// CHECK-NEXT: %2006 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2007 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 133, ptr %2007, align 8 -// CHECK-NEXT: %2008 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %2007, 1 -// CHECK-NEXT: %2009 = extractvalue { ptr, ptr } %2006, 1 -// CHECK-NEXT: %2010 = extractvalue { ptr, ptr } %2006, 0 -// CHECK-NEXT: %__llgo_funcval_code267 = call ptr asm "", "=r,0"(ptr %2010) -// CHECK-NEXT: %2011 = call %reflect.Value %__llgo_funcval_code267(ptr {{(nest|swiftself)}} %2009, %"{{.*}}/runtime/internal/runtime.eface" %2008) -// CHECK-NEXT: store %reflect.Value %2004, ptr %1998, align 8 -// CHECK-NEXT: store %reflect.Value %2011, ptr %2005, align 8 -// CHECK-NEXT: %2012 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 134 -// CHECK-NEXT: %2013 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2012, i32 0, i32 0 -// CHECK-NEXT: %2014 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2015 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 134, ptr %2015, align 8 -// CHECK-NEXT: %2016 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2015, 1 -// CHECK-NEXT: %2017 = extractvalue { ptr, ptr } %2014, 1 -// CHECK-NEXT: %2018 = extractvalue { ptr, ptr } %2014, 0 -// CHECK-NEXT: %__llgo_funcval_code268 = call ptr asm "", "=r,0"(ptr %2018) -// CHECK-NEXT: %2019 = call %reflect.Value %__llgo_funcval_code268(ptr {{(nest|swiftself)}} %2017, %"{{.*}}/runtime/internal/runtime.eface" %2016) -// CHECK-NEXT: %2020 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2012, i32 0, i32 1 -// CHECK-NEXT: %2021 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2022 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 134, ptr %2022, align 8 -// CHECK-NEXT: %2023 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2022, 1 -// CHECK-NEXT: %2024 = extractvalue { ptr, ptr } %2021, 1 -// CHECK-NEXT: %2025 = extractvalue { ptr, ptr } %2021, 0 -// CHECK-NEXT: %__llgo_funcval_code269 = call ptr asm "", "=r,0"(ptr %2025) -// CHECK-NEXT: %2026 = call %reflect.Value %__llgo_funcval_code269(ptr {{(nest|swiftself)}} %2024, %"{{.*}}/runtime/internal/runtime.eface" %2023) -// CHECK-NEXT: store %reflect.Value %2019, ptr %2013, align 8 -// CHECK-NEXT: store %reflect.Value %2026, ptr %2020, align 8 -// CHECK-NEXT: %2027 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 135 -// CHECK-NEXT: %2028 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2027, i32 0, i32 0 -// CHECK-NEXT: %2029 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2030 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 135, ptr %2030, align 8 -// CHECK-NEXT: %2031 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2030, 1 -// CHECK-NEXT: %2032 = extractvalue { ptr, ptr } %2029, 1 -// CHECK-NEXT: %2033 = extractvalue { ptr, ptr } %2029, 0 -// CHECK-NEXT: %__llgo_funcval_code270 = call ptr asm "", "=r,0"(ptr %2033) -// CHECK-NEXT: %2034 = call %reflect.Value %__llgo_funcval_code270(ptr {{(nest|swiftself)}} %2032, %"{{.*}}/runtime/internal/runtime.eface" %2031) -// CHECK-NEXT: %2035 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2027, i32 0, i32 1 -// CHECK-NEXT: %2036 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2037 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 135, ptr %2037, align 8 -// CHECK-NEXT: %2038 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2037, 1 -// CHECK-NEXT: %2039 = extractvalue { ptr, ptr } %2036, 1 -// CHECK-NEXT: %2040 = extractvalue { ptr, ptr } %2036, 0 -// CHECK-NEXT: %__llgo_funcval_code271 = call ptr asm "", "=r,0"(ptr %2040) -// CHECK-NEXT: %2041 = call %reflect.Value %__llgo_funcval_code271(ptr {{(nest|swiftself)}} %2039, %"{{.*}}/runtime/internal/runtime.eface" %2038) -// CHECK-NEXT: store %reflect.Value %2034, ptr %2028, align 8 -// CHECK-NEXT: store %reflect.Value %2041, ptr %2035, align 8 -// CHECK-NEXT: %2042 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 136 -// CHECK-NEXT: %2043 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2042, i32 0, i32 0 -// CHECK-NEXT: %2044 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2045 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 136, ptr %2045, align 8 -// CHECK-NEXT: %2046 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2045, 1 -// CHECK-NEXT: %2047 = extractvalue { ptr, ptr } %2044, 1 -// CHECK-NEXT: %2048 = extractvalue { ptr, ptr } %2044, 0 -// CHECK-NEXT: %__llgo_funcval_code272 = call ptr asm "", "=r,0"(ptr %2048) -// CHECK-NEXT: %2049 = call %reflect.Value %__llgo_funcval_code272(ptr {{(nest|swiftself)}} %2047, %"{{.*}}/runtime/internal/runtime.eface" %2046) -// CHECK-NEXT: %2050 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2042, i32 0, i32 1 -// CHECK-NEXT: %2051 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2052 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 136, ptr %2052, align 8 -// CHECK-NEXT: %2053 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2052, 1 -// CHECK-NEXT: %2054 = extractvalue { ptr, ptr } %2051, 1 -// CHECK-NEXT: %2055 = extractvalue { ptr, ptr } %2051, 0 -// CHECK-NEXT: %__llgo_funcval_code273 = call ptr asm "", "=r,0"(ptr %2055) -// CHECK-NEXT: %2056 = call %reflect.Value %__llgo_funcval_code273(ptr {{(nest|swiftself)}} %2054, %"{{.*}}/runtime/internal/runtime.eface" %2053) -// CHECK-NEXT: store %reflect.Value %2049, ptr %2043, align 8 -// CHECK-NEXT: store %reflect.Value %2056, ptr %2050, align 8 -// CHECK-NEXT: %2057 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 137 -// CHECK-NEXT: %2058 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2057, i32 0, i32 0 -// CHECK-NEXT: %2059 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2060 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 137, ptr %2060, align 8 -// CHECK-NEXT: %2061 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2060, 1 -// CHECK-NEXT: %2062 = extractvalue { ptr, ptr } %2059, 1 -// CHECK-NEXT: %2063 = extractvalue { ptr, ptr } %2059, 0 -// CHECK-NEXT: %__llgo_funcval_code274 = call ptr asm "", "=r,0"(ptr %2063) -// CHECK-NEXT: %2064 = call %reflect.Value %__llgo_funcval_code274(ptr {{(nest|swiftself)}} %2062, %"{{.*}}/runtime/internal/runtime.eface" %2061) -// CHECK-NEXT: %2065 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2057, i32 0, i32 1 -// CHECK-NEXT: %2066 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2067 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 137, ptr %2067, align 8 -// CHECK-NEXT: %2068 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2067, 1 -// CHECK-NEXT: %2069 = extractvalue { ptr, ptr } %2066, 1 -// CHECK-NEXT: %2070 = extractvalue { ptr, ptr } %2066, 0 -// CHECK-NEXT: %__llgo_funcval_code275 = call ptr asm "", "=r,0"(ptr %2070) -// CHECK-NEXT: %2071 = call %reflect.Value %__llgo_funcval_code275(ptr {{(nest|swiftself)}} %2069, %"{{.*}}/runtime/internal/runtime.eface" %2068) -// CHECK-NEXT: store %reflect.Value %2064, ptr %2058, align 8 -// CHECK-NEXT: store %reflect.Value %2071, ptr %2065, align 8 -// CHECK-NEXT: %2072 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 138 -// CHECK-NEXT: %2073 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2072, i32 0, i32 0 -// CHECK-NEXT: %2074 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2075 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 138, ptr %2075, align 8 -// CHECK-NEXT: %2076 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2075, 1 -// CHECK-NEXT: %2077 = extractvalue { ptr, ptr } %2074, 1 -// CHECK-NEXT: %2078 = extractvalue { ptr, ptr } %2074, 0 -// CHECK-NEXT: %__llgo_funcval_code276 = call ptr asm "", "=r,0"(ptr %2078) -// CHECK-NEXT: %2079 = call %reflect.Value %__llgo_funcval_code276(ptr {{(nest|swiftself)}} %2077, %"{{.*}}/runtime/internal/runtime.eface" %2076) -// CHECK-NEXT: %2080 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2072, i32 0, i32 1 -// CHECK-NEXT: %2081 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2082 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 138, ptr %2082, align 8 -// CHECK-NEXT: %2083 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2082, 1 -// CHECK-NEXT: %2084 = extractvalue { ptr, ptr } %2081, 1 -// CHECK-NEXT: %2085 = extractvalue { ptr, ptr } %2081, 0 -// CHECK-NEXT: %__llgo_funcval_code277 = call ptr asm "", "=r,0"(ptr %2085) -// CHECK-NEXT: %2086 = call %reflect.Value %__llgo_funcval_code277(ptr {{(nest|swiftself)}} %2084, %"{{.*}}/runtime/internal/runtime.eface" %2083) -// CHECK-NEXT: store %reflect.Value %2079, ptr %2073, align 8 -// CHECK-NEXT: store %reflect.Value %2086, ptr %2080, align 8 -// CHECK-NEXT: %2087 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 139 -// CHECK-NEXT: %2088 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2087, i32 0, i32 0 -// CHECK-NEXT: %2089 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2090 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 139, ptr %2090, align 8 -// CHECK-NEXT: %2091 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2090, 1 -// CHECK-NEXT: %2092 = extractvalue { ptr, ptr } %2089, 1 -// CHECK-NEXT: %2093 = extractvalue { ptr, ptr } %2089, 0 -// CHECK-NEXT: %__llgo_funcval_code278 = call ptr asm "", "=r,0"(ptr %2093) -// CHECK-NEXT: %2094 = call %reflect.Value %__llgo_funcval_code278(ptr {{(nest|swiftself)}} %2092, %"{{.*}}/runtime/internal/runtime.eface" %2091) -// CHECK-NEXT: %2095 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2087, i32 0, i32 1 -// CHECK-NEXT: %2096 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2097 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 139, ptr %2097, align 8 -// CHECK-NEXT: %2098 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2097, 1 -// CHECK-NEXT: %2099 = extractvalue { ptr, ptr } %2096, 1 -// CHECK-NEXT: %2100 = extractvalue { ptr, ptr } %2096, 0 -// CHECK-NEXT: %__llgo_funcval_code279 = call ptr asm "", "=r,0"(ptr %2100) -// CHECK-NEXT: %2101 = call %reflect.Value %__llgo_funcval_code279(ptr {{(nest|swiftself)}} %2099, %"{{.*}}/runtime/internal/runtime.eface" %2098) -// CHECK-NEXT: store %reflect.Value %2094, ptr %2088, align 8 -// CHECK-NEXT: store %reflect.Value %2101, ptr %2095, align 8 -// CHECK-NEXT: %2102 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 140 -// CHECK-NEXT: %2103 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2102, i32 0, i32 0 -// CHECK-NEXT: %2104 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2105 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 140, ptr %2105, align 8 -// CHECK-NEXT: %2106 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2105, 1 -// CHECK-NEXT: %2107 = extractvalue { ptr, ptr } %2104, 1 -// CHECK-NEXT: %2108 = extractvalue { ptr, ptr } %2104, 0 -// CHECK-NEXT: %__llgo_funcval_code280 = call ptr asm "", "=r,0"(ptr %2108) -// CHECK-NEXT: %2109 = call %reflect.Value %__llgo_funcval_code280(ptr {{(nest|swiftself)}} %2107, %"{{.*}}/runtime/internal/runtime.eface" %2106) -// CHECK-NEXT: %2110 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2102, i32 0, i32 1 -// CHECK-NEXT: %2111 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2112 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 140, ptr %2112, align 8 -// CHECK-NEXT: %2113 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2112, 1 -// CHECK-NEXT: %2114 = extractvalue { ptr, ptr } %2111, 1 -// CHECK-NEXT: %2115 = extractvalue { ptr, ptr } %2111, 0 -// CHECK-NEXT: %__llgo_funcval_code281 = call ptr asm "", "=r,0"(ptr %2115) -// CHECK-NEXT: %2116 = call %reflect.Value %__llgo_funcval_code281(ptr {{(nest|swiftself)}} %2114, %"{{.*}}/runtime/internal/runtime.eface" %2113) -// CHECK-NEXT: store %reflect.Value %2109, ptr %2103, align 8 -// CHECK-NEXT: store %reflect.Value %2116, ptr %2110, align 8 -// CHECK-NEXT: %2117 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 141 -// CHECK-NEXT: %2118 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2117, i32 0, i32 0 -// CHECK-NEXT: %2119 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2120 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 141, ptr %2120, align 8 -// CHECK-NEXT: %2121 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2120, 1 -// CHECK-NEXT: %2122 = extractvalue { ptr, ptr } %2119, 1 -// CHECK-NEXT: %2123 = extractvalue { ptr, ptr } %2119, 0 -// CHECK-NEXT: %__llgo_funcval_code282 = call ptr asm "", "=r,0"(ptr %2123) -// CHECK-NEXT: %2124 = call %reflect.Value %__llgo_funcval_code282(ptr {{(nest|swiftself)}} %2122, %"{{.*}}/runtime/internal/runtime.eface" %2121) -// CHECK-NEXT: %2125 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2117, i32 0, i32 1 -// CHECK-NEXT: %2126 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2127 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.410000e+02, ptr %2127, align 4 -// CHECK-NEXT: %2128 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2127, 1 -// CHECK-NEXT: %2129 = extractvalue { ptr, ptr } %2126, 1 -// CHECK-NEXT: %2130 = extractvalue { ptr, ptr } %2126, 0 -// CHECK-NEXT: %__llgo_funcval_code283 = call ptr asm "", "=r,0"(ptr %2130) -// CHECK-NEXT: %2131 = call %reflect.Value %__llgo_funcval_code283(ptr {{(nest|swiftself)}} %2129, %"{{.*}}/runtime/internal/runtime.eface" %2128) -// CHECK-NEXT: store %reflect.Value %2124, ptr %2118, align 8 -// CHECK-NEXT: store %reflect.Value %2131, ptr %2125, align 8 -// CHECK-NEXT: %2132 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 142 -// CHECK-NEXT: %2133 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2132, i32 0, i32 0 -// CHECK-NEXT: %2134 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2135 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.420000e+02, ptr %2135, align 4 -// CHECK-NEXT: %2136 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2135, 1 -// CHECK-NEXT: %2137 = extractvalue { ptr, ptr } %2134, 1 -// CHECK-NEXT: %2138 = extractvalue { ptr, ptr } %2134, 0 -// CHECK-NEXT: %__llgo_funcval_code284 = call ptr asm "", "=r,0"(ptr %2138) -// CHECK-NEXT: %2139 = call %reflect.Value %__llgo_funcval_code284(ptr {{(nest|swiftself)}} %2137, %"{{.*}}/runtime/internal/runtime.eface" %2136) -// CHECK-NEXT: %2140 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2132, i32 0, i32 1 -// CHECK-NEXT: %2141 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2142 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 142, ptr %2142, align 8 -// CHECK-NEXT: %2143 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2142, 1 -// CHECK-NEXT: %2144 = extractvalue { ptr, ptr } %2141, 1 -// CHECK-NEXT: %2145 = extractvalue { ptr, ptr } %2141, 0 -// CHECK-NEXT: %__llgo_funcval_code285 = call ptr asm "", "=r,0"(ptr %2145) -// CHECK-NEXT: %2146 = call %reflect.Value %__llgo_funcval_code285(ptr {{(nest|swiftself)}} %2144, %"{{.*}}/runtime/internal/runtime.eface" %2143) -// CHECK-NEXT: store %reflect.Value %2139, ptr %2133, align 8 -// CHECK-NEXT: store %reflect.Value %2146, ptr %2140, align 8 -// CHECK-NEXT: %2147 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 143 -// CHECK-NEXT: %2148 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2147, i32 0, i32 0 -// CHECK-NEXT: %2149 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2150 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 143, ptr %2150, align 8 -// CHECK-NEXT: %2151 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2150, 1 -// CHECK-NEXT: %2152 = extractvalue { ptr, ptr } %2149, 1 -// CHECK-NEXT: %2153 = extractvalue { ptr, ptr } %2149, 0 -// CHECK-NEXT: %__llgo_funcval_code286 = call ptr asm "", "=r,0"(ptr %2153) -// CHECK-NEXT: %2154 = call %reflect.Value %__llgo_funcval_code286(ptr {{(nest|swiftself)}} %2152, %"{{.*}}/runtime/internal/runtime.eface" %2151) -// CHECK-NEXT: %2155 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2147, i32 0, i32 1 -// CHECK-NEXT: %2156 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2157 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.430000e+02, ptr %2157, align 8 -// CHECK-NEXT: %2158 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2157, 1 -// CHECK-NEXT: %2159 = extractvalue { ptr, ptr } %2156, 1 -// CHECK-NEXT: %2160 = extractvalue { ptr, ptr } %2156, 0 -// CHECK-NEXT: %__llgo_funcval_code287 = call ptr asm "", "=r,0"(ptr %2160) -// CHECK-NEXT: %2161 = call %reflect.Value %__llgo_funcval_code287(ptr {{(nest|swiftself)}} %2159, %"{{.*}}/runtime/internal/runtime.eface" %2158) -// CHECK-NEXT: store %reflect.Value %2154, ptr %2148, align 8 -// CHECK-NEXT: store %reflect.Value %2161, ptr %2155, align 8 -// CHECK-NEXT: %2162 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 144 -// CHECK-NEXT: %2163 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2162, i32 0, i32 0 -// CHECK-NEXT: %2164 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2165 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.440000e+02, ptr %2165, align 8 -// CHECK-NEXT: %2166 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2165, 1 -// CHECK-NEXT: %2167 = extractvalue { ptr, ptr } %2164, 1 -// CHECK-NEXT: %2168 = extractvalue { ptr, ptr } %2164, 0 -// CHECK-NEXT: %__llgo_funcval_code288 = call ptr asm "", "=r,0"(ptr %2168) -// CHECK-NEXT: %2169 = call %reflect.Value %__llgo_funcval_code288(ptr {{(nest|swiftself)}} %2167, %"{{.*}}/runtime/internal/runtime.eface" %2166) -// CHECK-NEXT: %2170 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2162, i32 0, i32 1 -// CHECK-NEXT: %2171 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2172 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 144, ptr %2172, align 8 -// CHECK-NEXT: %2173 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2172, 1 -// CHECK-NEXT: %2174 = extractvalue { ptr, ptr } %2171, 1 -// CHECK-NEXT: %2175 = extractvalue { ptr, ptr } %2171, 0 -// CHECK-NEXT: %__llgo_funcval_code289 = call ptr asm "", "=r,0"(ptr %2175) -// CHECK-NEXT: %2176 = call %reflect.Value %__llgo_funcval_code289(ptr {{(nest|swiftself)}} %2174, %"{{.*}}/runtime/internal/runtime.eface" %2173) -// CHECK-NEXT: store %reflect.Value %2169, ptr %2163, align 8 -// CHECK-NEXT: store %reflect.Value %2176, ptr %2170, align 8 -// CHECK-NEXT: %2177 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 145 -// CHECK-NEXT: %2178 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2177, i32 0, i32 0 -// CHECK-NEXT: %2179 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2180 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 145, ptr %2180, align 8 -// CHECK-NEXT: %2181 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2180, 1 -// CHECK-NEXT: %2182 = extractvalue { ptr, ptr } %2179, 1 -// CHECK-NEXT: %2183 = extractvalue { ptr, ptr } %2179, 0 -// CHECK-NEXT: %__llgo_funcval_code290 = call ptr asm "", "=r,0"(ptr %2183) -// CHECK-NEXT: %2184 = call %reflect.Value %__llgo_funcval_code290(ptr {{(nest|swiftself)}} %2182, %"{{.*}}/runtime/internal/runtime.eface" %2181) -// CHECK-NEXT: %2185 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2177, i32 0, i32 1 -// CHECK-NEXT: %2186 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2187 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 145, ptr %2187, align 8 -// CHECK-NEXT: %2188 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2187, 1 -// CHECK-NEXT: %2189 = extractvalue { ptr, ptr } %2186, 1 -// CHECK-NEXT: %2190 = extractvalue { ptr, ptr } %2186, 0 -// CHECK-NEXT: %__llgo_funcval_code291 = call ptr asm "", "=r,0"(ptr %2190) -// CHECK-NEXT: %2191 = call %reflect.Value %__llgo_funcval_code291(ptr {{(nest|swiftself)}} %2189, %"{{.*}}/runtime/internal/runtime.eface" %2188) -// CHECK-NEXT: store %reflect.Value %2184, ptr %2178, align 8 -// CHECK-NEXT: store %reflect.Value %2191, ptr %2185, align 8 -// CHECK-NEXT: %2192 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 146 -// CHECK-NEXT: %2193 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2192, i32 0, i32 0 -// CHECK-NEXT: %2194 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2195 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 146, ptr %2195, align 8 -// CHECK-NEXT: %2196 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2195, 1 -// CHECK-NEXT: %2197 = extractvalue { ptr, ptr } %2194, 1 -// CHECK-NEXT: %2198 = extractvalue { ptr, ptr } %2194, 0 -// CHECK-NEXT: %__llgo_funcval_code292 = call ptr asm "", "=r,0"(ptr %2198) -// CHECK-NEXT: %2199 = call %reflect.Value %__llgo_funcval_code292(ptr {{(nest|swiftself)}} %2197, %"{{.*}}/runtime/internal/runtime.eface" %2196) -// CHECK-NEXT: %2200 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2192, i32 0, i32 1 -// CHECK-NEXT: %2201 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2202 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 146, ptr %2202, align 8 -// CHECK-NEXT: %2203 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2202, 1 -// CHECK-NEXT: %2204 = extractvalue { ptr, ptr } %2201, 1 -// CHECK-NEXT: %2205 = extractvalue { ptr, ptr } %2201, 0 -// CHECK-NEXT: %__llgo_funcval_code293 = call ptr asm "", "=r,0"(ptr %2205) -// CHECK-NEXT: %2206 = call %reflect.Value %__llgo_funcval_code293(ptr {{(nest|swiftself)}} %2204, %"{{.*}}/runtime/internal/runtime.eface" %2203) -// CHECK-NEXT: store %reflect.Value %2199, ptr %2193, align 8 -// CHECK-NEXT: store %reflect.Value %2206, ptr %2200, align 8 -// CHECK-NEXT: %2207 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 147 -// CHECK-NEXT: %2208 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2207, i32 0, i32 0 -// CHECK-NEXT: %2209 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2210 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 147, ptr %2210, align 8 -// CHECK-NEXT: %2211 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2210, 1 -// CHECK-NEXT: %2212 = extractvalue { ptr, ptr } %2209, 1 -// CHECK-NEXT: %2213 = extractvalue { ptr, ptr } %2209, 0 -// CHECK-NEXT: %__llgo_funcval_code294 = call ptr asm "", "=r,0"(ptr %2213) -// CHECK-NEXT: %2214 = call %reflect.Value %__llgo_funcval_code294(ptr {{(nest|swiftself)}} %2212, %"{{.*}}/runtime/internal/runtime.eface" %2211) -// CHECK-NEXT: %2215 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2207, i32 0, i32 1 -// CHECK-NEXT: %2216 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2217 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 147, ptr %2217, align 8 -// CHECK-NEXT: %2218 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2217, 1 -// CHECK-NEXT: %2219 = extractvalue { ptr, ptr } %2216, 1 -// CHECK-NEXT: %2220 = extractvalue { ptr, ptr } %2216, 0 -// CHECK-NEXT: %__llgo_funcval_code295 = call ptr asm "", "=r,0"(ptr %2220) -// CHECK-NEXT: %2221 = call %reflect.Value %__llgo_funcval_code295(ptr {{(nest|swiftself)}} %2219, %"{{.*}}/runtime/internal/runtime.eface" %2218) -// CHECK-NEXT: store %reflect.Value %2214, ptr %2208, align 8 -// CHECK-NEXT: store %reflect.Value %2221, ptr %2215, align 8 -// CHECK-NEXT: %2222 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 148 -// CHECK-NEXT: %2223 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2222, i32 0, i32 0 -// CHECK-NEXT: %2224 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2225 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 148, ptr %2225, align 8 -// CHECK-NEXT: %2226 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2225, 1 -// CHECK-NEXT: %2227 = extractvalue { ptr, ptr } %2224, 1 -// CHECK-NEXT: %2228 = extractvalue { ptr, ptr } %2224, 0 -// CHECK-NEXT: %__llgo_funcval_code296 = call ptr asm "", "=r,0"(ptr %2228) -// CHECK-NEXT: %2229 = call %reflect.Value %__llgo_funcval_code296(ptr {{(nest|swiftself)}} %2227, %"{{.*}}/runtime/internal/runtime.eface" %2226) -// CHECK-NEXT: %2230 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2222, i32 0, i32 1 -// CHECK-NEXT: %2231 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2232 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 148, ptr %2232, align 8 -// CHECK-NEXT: %2233 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2232, 1 -// CHECK-NEXT: %2234 = extractvalue { ptr, ptr } %2231, 1 -// CHECK-NEXT: %2235 = extractvalue { ptr, ptr } %2231, 0 -// CHECK-NEXT: %__llgo_funcval_code297 = call ptr asm "", "=r,0"(ptr %2235) -// CHECK-NEXT: %2236 = call %reflect.Value %__llgo_funcval_code297(ptr {{(nest|swiftself)}} %2234, %"{{.*}}/runtime/internal/runtime.eface" %2233) -// CHECK-NEXT: store %reflect.Value %2229, ptr %2223, align 8 -// CHECK-NEXT: store %reflect.Value %2236, ptr %2230, align 8 -// CHECK-NEXT: %2237 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 149 -// CHECK-NEXT: %2238 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2237, i32 0, i32 0 -// CHECK-NEXT: %2239 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2240 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 149, ptr %2240, align 8 -// CHECK-NEXT: %2241 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2240, 1 -// CHECK-NEXT: %2242 = extractvalue { ptr, ptr } %2239, 1 -// CHECK-NEXT: %2243 = extractvalue { ptr, ptr } %2239, 0 -// CHECK-NEXT: %__llgo_funcval_code298 = call ptr asm "", "=r,0"(ptr %2243) -// CHECK-NEXT: %2244 = call %reflect.Value %__llgo_funcval_code298(ptr {{(nest|swiftself)}} %2242, %"{{.*}}/runtime/internal/runtime.eface" %2241) -// CHECK-NEXT: %2245 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2237, i32 0, i32 1 -// CHECK-NEXT: %2246 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2247 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 149, ptr %2247, align 8 -// CHECK-NEXT: %2248 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2247, 1 -// CHECK-NEXT: %2249 = extractvalue { ptr, ptr } %2246, 1 -// CHECK-NEXT: %2250 = extractvalue { ptr, ptr } %2246, 0 -// CHECK-NEXT: %__llgo_funcval_code299 = call ptr asm "", "=r,0"(ptr %2250) -// CHECK-NEXT: %2251 = call %reflect.Value %__llgo_funcval_code299(ptr {{(nest|swiftself)}} %2249, %"{{.*}}/runtime/internal/runtime.eface" %2248) -// CHECK-NEXT: store %reflect.Value %2244, ptr %2238, align 8 -// CHECK-NEXT: store %reflect.Value %2251, ptr %2245, align 8 -// CHECK-NEXT: %2252 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 150 -// CHECK-NEXT: %2253 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2252, i32 0, i32 0 -// CHECK-NEXT: %2254 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2255 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 150, ptr %2255, align 8 -// CHECK-NEXT: %2256 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2255, 1 -// CHECK-NEXT: %2257 = extractvalue { ptr, ptr } %2254, 1 -// CHECK-NEXT: %2258 = extractvalue { ptr, ptr } %2254, 0 -// CHECK-NEXT: %__llgo_funcval_code300 = call ptr asm "", "=r,0"(ptr %2258) -// CHECK-NEXT: %2259 = call %reflect.Value %__llgo_funcval_code300(ptr {{(nest|swiftself)}} %2257, %"{{.*}}/runtime/internal/runtime.eface" %2256) -// CHECK-NEXT: %2260 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2252, i32 0, i32 1 -// CHECK-NEXT: %2261 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2262 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.500000e+02, ptr %2262, align 4 -// CHECK-NEXT: %2263 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2262, 1 -// CHECK-NEXT: %2264 = extractvalue { ptr, ptr } %2261, 1 -// CHECK-NEXT: %2265 = extractvalue { ptr, ptr } %2261, 0 -// CHECK-NEXT: %__llgo_funcval_code301 = call ptr asm "", "=r,0"(ptr %2265) -// CHECK-NEXT: %2266 = call %reflect.Value %__llgo_funcval_code301(ptr {{(nest|swiftself)}} %2264, %"{{.*}}/runtime/internal/runtime.eface" %2263) -// CHECK-NEXT: store %reflect.Value %2259, ptr %2253, align 8 -// CHECK-NEXT: store %reflect.Value %2266, ptr %2260, align 8 -// CHECK-NEXT: %2267 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 151 -// CHECK-NEXT: %2268 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2267, i32 0, i32 0 -// CHECK-NEXT: %2269 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2270 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.510000e+02, ptr %2270, align 4 -// CHECK-NEXT: %2271 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2270, 1 -// CHECK-NEXT: %2272 = extractvalue { ptr, ptr } %2269, 1 -// CHECK-NEXT: %2273 = extractvalue { ptr, ptr } %2269, 0 -// CHECK-NEXT: %__llgo_funcval_code302 = call ptr asm "", "=r,0"(ptr %2273) -// CHECK-NEXT: %2274 = call %reflect.Value %__llgo_funcval_code302(ptr {{(nest|swiftself)}} %2272, %"{{.*}}/runtime/internal/runtime.eface" %2271) -// CHECK-NEXT: %2275 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2267, i32 0, i32 1 -// CHECK-NEXT: %2276 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2277 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 151, ptr %2277, align 8 -// CHECK-NEXT: %2278 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2277, 1 -// CHECK-NEXT: %2279 = extractvalue { ptr, ptr } %2276, 1 -// CHECK-NEXT: %2280 = extractvalue { ptr, ptr } %2276, 0 -// CHECK-NEXT: %__llgo_funcval_code303 = call ptr asm "", "=r,0"(ptr %2280) -// CHECK-NEXT: %2281 = call %reflect.Value %__llgo_funcval_code303(ptr {{(nest|swiftself)}} %2279, %"{{.*}}/runtime/internal/runtime.eface" %2278) -// CHECK-NEXT: store %reflect.Value %2274, ptr %2268, align 8 -// CHECK-NEXT: store %reflect.Value %2281, ptr %2275, align 8 -// CHECK-NEXT: %2282 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 152 -// CHECK-NEXT: %2283 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2282, i32 0, i32 0 -// CHECK-NEXT: %2284 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2285 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 152, ptr %2285, align 8 -// CHECK-NEXT: %2286 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2285, 1 -// CHECK-NEXT: %2287 = extractvalue { ptr, ptr } %2284, 1 -// CHECK-NEXT: %2288 = extractvalue { ptr, ptr } %2284, 0 -// CHECK-NEXT: %__llgo_funcval_code304 = call ptr asm "", "=r,0"(ptr %2288) -// CHECK-NEXT: %2289 = call %reflect.Value %__llgo_funcval_code304(ptr {{(nest|swiftself)}} %2287, %"{{.*}}/runtime/internal/runtime.eface" %2286) -// CHECK-NEXT: %2290 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2282, i32 0, i32 1 -// CHECK-NEXT: %2291 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2292 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.520000e+02, ptr %2292, align 8 -// CHECK-NEXT: %2293 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2292, 1 -// CHECK-NEXT: %2294 = extractvalue { ptr, ptr } %2291, 1 -// CHECK-NEXT: %2295 = extractvalue { ptr, ptr } %2291, 0 -// CHECK-NEXT: %__llgo_funcval_code305 = call ptr asm "", "=r,0"(ptr %2295) -// CHECK-NEXT: %2296 = call %reflect.Value %__llgo_funcval_code305(ptr {{(nest|swiftself)}} %2294, %"{{.*}}/runtime/internal/runtime.eface" %2293) -// CHECK-NEXT: store %reflect.Value %2289, ptr %2283, align 8 -// CHECK-NEXT: store %reflect.Value %2296, ptr %2290, align 8 -// CHECK-NEXT: %2297 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 153 -// CHECK-NEXT: %2298 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2297, i32 0, i32 0 -// CHECK-NEXT: %2299 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2300 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.530000e+02, ptr %2300, align 8 -// CHECK-NEXT: %2301 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2300, 1 -// CHECK-NEXT: %2302 = extractvalue { ptr, ptr } %2299, 1 -// CHECK-NEXT: %2303 = extractvalue { ptr, ptr } %2299, 0 -// CHECK-NEXT: %__llgo_funcval_code306 = call ptr asm "", "=r,0"(ptr %2303) -// CHECK-NEXT: %2304 = call %reflect.Value %__llgo_funcval_code306(ptr {{(nest|swiftself)}} %2302, %"{{.*}}/runtime/internal/runtime.eface" %2301) -// CHECK-NEXT: %2305 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2297, i32 0, i32 1 -// CHECK-NEXT: %2306 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2307 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 153, ptr %2307, align 8 -// CHECK-NEXT: %2308 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2307, 1 -// CHECK-NEXT: %2309 = extractvalue { ptr, ptr } %2306, 1 -// CHECK-NEXT: %2310 = extractvalue { ptr, ptr } %2306, 0 -// CHECK-NEXT: %__llgo_funcval_code307 = call ptr asm "", "=r,0"(ptr %2310) -// CHECK-NEXT: %2311 = call %reflect.Value %__llgo_funcval_code307(ptr {{(nest|swiftself)}} %2309, %"{{.*}}/runtime/internal/runtime.eface" %2308) -// CHECK-NEXT: store %reflect.Value %2304, ptr %2298, align 8 -// CHECK-NEXT: store %reflect.Value %2311, ptr %2305, align 8 -// CHECK-NEXT: %2312 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 154 -// CHECK-NEXT: %2313 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2312, i32 0, i32 0 -// CHECK-NEXT: %2314 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2315 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 154, ptr %2315, align 8 -// CHECK-NEXT: %2316 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2315, 1 -// CHECK-NEXT: %2317 = extractvalue { ptr, ptr } %2314, 1 -// CHECK-NEXT: %2318 = extractvalue { ptr, ptr } %2314, 0 -// CHECK-NEXT: %__llgo_funcval_code308 = call ptr asm "", "=r,0"(ptr %2318) -// CHECK-NEXT: %2319 = call %reflect.Value %__llgo_funcval_code308(ptr {{(nest|swiftself)}} %2317, %"{{.*}}/runtime/internal/runtime.eface" %2316) -// CHECK-NEXT: %2320 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2312, i32 0, i32 1 -// CHECK-NEXT: %2321 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2322 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 154, ptr %2322, align 8 -// CHECK-NEXT: %2323 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2322, 1 -// CHECK-NEXT: %2324 = extractvalue { ptr, ptr } %2321, 1 -// CHECK-NEXT: %2325 = extractvalue { ptr, ptr } %2321, 0 -// CHECK-NEXT: %__llgo_funcval_code309 = call ptr asm "", "=r,0"(ptr %2325) -// CHECK-NEXT: %2326 = call %reflect.Value %__llgo_funcval_code309(ptr {{(nest|swiftself)}} %2324, %"{{.*}}/runtime/internal/runtime.eface" %2323) -// CHECK-NEXT: store %reflect.Value %2319, ptr %2313, align 8 -// CHECK-NEXT: store %reflect.Value %2326, ptr %2320, align 8 -// CHECK-NEXT: %2327 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 155 -// CHECK-NEXT: %2328 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2327, i32 0, i32 0 -// CHECK-NEXT: %2329 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2330 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 155, ptr %2330, align 8 -// CHECK-NEXT: %2331 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2330, 1 -// CHECK-NEXT: %2332 = extractvalue { ptr, ptr } %2329, 1 -// CHECK-NEXT: %2333 = extractvalue { ptr, ptr } %2329, 0 -// CHECK-NEXT: %__llgo_funcval_code310 = call ptr asm "", "=r,0"(ptr %2333) -// CHECK-NEXT: %2334 = call %reflect.Value %__llgo_funcval_code310(ptr {{(nest|swiftself)}} %2332, %"{{.*}}/runtime/internal/runtime.eface" %2331) -// CHECK-NEXT: %2335 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2327, i32 0, i32 1 -// CHECK-NEXT: %2336 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2337 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 155, ptr %2337, align 8 -// CHECK-NEXT: %2338 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2337, 1 -// CHECK-NEXT: %2339 = extractvalue { ptr, ptr } %2336, 1 -// CHECK-NEXT: %2340 = extractvalue { ptr, ptr } %2336, 0 -// CHECK-NEXT: %__llgo_funcval_code311 = call ptr asm "", "=r,0"(ptr %2340) -// CHECK-NEXT: %2341 = call %reflect.Value %__llgo_funcval_code311(ptr {{(nest|swiftself)}} %2339, %"{{.*}}/runtime/internal/runtime.eface" %2338) -// CHECK-NEXT: store %reflect.Value %2334, ptr %2328, align 8 -// CHECK-NEXT: store %reflect.Value %2341, ptr %2335, align 8 -// CHECK-NEXT: %2342 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 156 -// CHECK-NEXT: %2343 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2342, i32 0, i32 0 -// CHECK-NEXT: %2344 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2345 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 156, ptr %2345, align 8 -// CHECK-NEXT: %2346 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2345, 1 -// CHECK-NEXT: %2347 = extractvalue { ptr, ptr } %2344, 1 -// CHECK-NEXT: %2348 = extractvalue { ptr, ptr } %2344, 0 -// CHECK-NEXT: %__llgo_funcval_code312 = call ptr asm "", "=r,0"(ptr %2348) -// CHECK-NEXT: %2349 = call %reflect.Value %__llgo_funcval_code312(ptr {{(nest|swiftself)}} %2347, %"{{.*}}/runtime/internal/runtime.eface" %2346) -// CHECK-NEXT: %2350 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2342, i32 0, i32 1 -// CHECK-NEXT: %2351 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2352 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 156, ptr %2352, align 8 -// CHECK-NEXT: %2353 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2352, 1 -// CHECK-NEXT: %2354 = extractvalue { ptr, ptr } %2351, 1 -// CHECK-NEXT: %2355 = extractvalue { ptr, ptr } %2351, 0 -// CHECK-NEXT: %__llgo_funcval_code313 = call ptr asm "", "=r,0"(ptr %2355) -// CHECK-NEXT: %2356 = call %reflect.Value %__llgo_funcval_code313(ptr {{(nest|swiftself)}} %2354, %"{{.*}}/runtime/internal/runtime.eface" %2353) -// CHECK-NEXT: store %reflect.Value %2349, ptr %2343, align 8 -// CHECK-NEXT: store %reflect.Value %2356, ptr %2350, align 8 -// CHECK-NEXT: %2357 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 157 -// CHECK-NEXT: %2358 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2357, i32 0, i32 0 -// CHECK-NEXT: %2359 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2360 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 157, ptr %2360, align 8 -// CHECK-NEXT: %2361 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2360, 1 -// CHECK-NEXT: %2362 = extractvalue { ptr, ptr } %2359, 1 -// CHECK-NEXT: %2363 = extractvalue { ptr, ptr } %2359, 0 -// CHECK-NEXT: %__llgo_funcval_code314 = call ptr asm "", "=r,0"(ptr %2363) -// CHECK-NEXT: %2364 = call %reflect.Value %__llgo_funcval_code314(ptr {{(nest|swiftself)}} %2362, %"{{.*}}/runtime/internal/runtime.eface" %2361) -// CHECK-NEXT: %2365 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2357, i32 0, i32 1 -// CHECK-NEXT: %2366 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2367 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.570000e+02, ptr %2367, align 4 -// CHECK-NEXT: %2368 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2367, 1 -// CHECK-NEXT: %2369 = extractvalue { ptr, ptr } %2366, 1 -// CHECK-NEXT: %2370 = extractvalue { ptr, ptr } %2366, 0 -// CHECK-NEXT: %__llgo_funcval_code315 = call ptr asm "", "=r,0"(ptr %2370) -// CHECK-NEXT: %2371 = call %reflect.Value %__llgo_funcval_code315(ptr {{(nest|swiftself)}} %2369, %"{{.*}}/runtime/internal/runtime.eface" %2368) -// CHECK-NEXT: store %reflect.Value %2364, ptr %2358, align 8 -// CHECK-NEXT: store %reflect.Value %2371, ptr %2365, align 8 -// CHECK-NEXT: %2372 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 158 -// CHECK-NEXT: %2373 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2372, i32 0, i32 0 -// CHECK-NEXT: %2374 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2375 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.580000e+02, ptr %2375, align 4 -// CHECK-NEXT: %2376 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2375, 1 -// CHECK-NEXT: %2377 = extractvalue { ptr, ptr } %2374, 1 -// CHECK-NEXT: %2378 = extractvalue { ptr, ptr } %2374, 0 -// CHECK-NEXT: %__llgo_funcval_code316 = call ptr asm "", "=r,0"(ptr %2378) -// CHECK-NEXT: %2379 = call %reflect.Value %__llgo_funcval_code316(ptr {{(nest|swiftself)}} %2377, %"{{.*}}/runtime/internal/runtime.eface" %2376) -// CHECK-NEXT: %2380 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2372, i32 0, i32 1 -// CHECK-NEXT: %2381 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2382 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 158, ptr %2382, align 8 -// CHECK-NEXT: %2383 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2382, 1 -// CHECK-NEXT: %2384 = extractvalue { ptr, ptr } %2381, 1 -// CHECK-NEXT: %2385 = extractvalue { ptr, ptr } %2381, 0 -// CHECK-NEXT: %__llgo_funcval_code317 = call ptr asm "", "=r,0"(ptr %2385) -// CHECK-NEXT: %2386 = call %reflect.Value %__llgo_funcval_code317(ptr {{(nest|swiftself)}} %2384, %"{{.*}}/runtime/internal/runtime.eface" %2383) -// CHECK-NEXT: store %reflect.Value %2379, ptr %2373, align 8 -// CHECK-NEXT: store %reflect.Value %2386, ptr %2380, align 8 -// CHECK-NEXT: %2387 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 159 -// CHECK-NEXT: %2388 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2387, i32 0, i32 0 -// CHECK-NEXT: %2389 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2390 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 159, ptr %2390, align 8 -// CHECK-NEXT: %2391 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2390, 1 -// CHECK-NEXT: %2392 = extractvalue { ptr, ptr } %2389, 1 -// CHECK-NEXT: %2393 = extractvalue { ptr, ptr } %2389, 0 -// CHECK-NEXT: %__llgo_funcval_code318 = call ptr asm "", "=r,0"(ptr %2393) -// CHECK-NEXT: %2394 = call %reflect.Value %__llgo_funcval_code318(ptr {{(nest|swiftself)}} %2392, %"{{.*}}/runtime/internal/runtime.eface" %2391) -// CHECK-NEXT: %2395 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2387, i32 0, i32 1 -// CHECK-NEXT: %2396 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2397 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.590000e+02, ptr %2397, align 8 -// CHECK-NEXT: %2398 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2397, 1 -// CHECK-NEXT: %2399 = extractvalue { ptr, ptr } %2396, 1 -// CHECK-NEXT: %2400 = extractvalue { ptr, ptr } %2396, 0 -// CHECK-NEXT: %__llgo_funcval_code319 = call ptr asm "", "=r,0"(ptr %2400) -// CHECK-NEXT: %2401 = call %reflect.Value %__llgo_funcval_code319(ptr {{(nest|swiftself)}} %2399, %"{{.*}}/runtime/internal/runtime.eface" %2398) -// CHECK-NEXT: store %reflect.Value %2394, ptr %2388, align 8 -// CHECK-NEXT: store %reflect.Value %2401, ptr %2395, align 8 -// CHECK-NEXT: %2402 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 160 -// CHECK-NEXT: %2403 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2402, i32 0, i32 0 -// CHECK-NEXT: %2404 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2405 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.600000e+02, ptr %2405, align 8 -// CHECK-NEXT: %2406 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2405, 1 -// CHECK-NEXT: %2407 = extractvalue { ptr, ptr } %2404, 1 -// CHECK-NEXT: %2408 = extractvalue { ptr, ptr } %2404, 0 -// CHECK-NEXT: %__llgo_funcval_code320 = call ptr asm "", "=r,0"(ptr %2408) -// CHECK-NEXT: %2409 = call %reflect.Value %__llgo_funcval_code320(ptr {{(nest|swiftself)}} %2407, %"{{.*}}/runtime/internal/runtime.eface" %2406) -// CHECK-NEXT: %2410 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2402, i32 0, i32 1 -// CHECK-NEXT: %2411 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2412 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 160, ptr %2412, align 8 -// CHECK-NEXT: %2413 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2412, 1 -// CHECK-NEXT: %2414 = extractvalue { ptr, ptr } %2411, 1 -// CHECK-NEXT: %2415 = extractvalue { ptr, ptr } %2411, 0 -// CHECK-NEXT: %__llgo_funcval_code321 = call ptr asm "", "=r,0"(ptr %2415) -// CHECK-NEXT: %2416 = call %reflect.Value %__llgo_funcval_code321(ptr {{(nest|swiftself)}} %2414, %"{{.*}}/runtime/internal/runtime.eface" %2413) -// CHECK-NEXT: store %reflect.Value %2409, ptr %2403, align 8 -// CHECK-NEXT: store %reflect.Value %2416, ptr %2410, align 8 -// CHECK-NEXT: %2417 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 161 -// CHECK-NEXT: %2418 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2417, i32 0, i32 0 -// CHECK-NEXT: %2419 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2420 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 161, ptr %2420, align 8 -// CHECK-NEXT: %2421 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2420, 1 -// CHECK-NEXT: %2422 = extractvalue { ptr, ptr } %2419, 1 -// CHECK-NEXT: %2423 = extractvalue { ptr, ptr } %2419, 0 -// CHECK-NEXT: %__llgo_funcval_code322 = call ptr asm "", "=r,0"(ptr %2423) -// CHECK-NEXT: %2424 = call %reflect.Value %__llgo_funcval_code322(ptr {{(nest|swiftself)}} %2422, %"{{.*}}/runtime/internal/runtime.eface" %2421) -// CHECK-NEXT: %2425 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2417, i32 0, i32 1 -// CHECK-NEXT: %2426 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2427 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 161, ptr %2427, align 8 -// CHECK-NEXT: %2428 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2427, 1 -// CHECK-NEXT: %2429 = extractvalue { ptr, ptr } %2426, 1 -// CHECK-NEXT: %2430 = extractvalue { ptr, ptr } %2426, 0 -// CHECK-NEXT: %__llgo_funcval_code323 = call ptr asm "", "=r,0"(ptr %2430) -// CHECK-NEXT: %2431 = call %reflect.Value %__llgo_funcval_code323(ptr {{(nest|swiftself)}} %2429, %"{{.*}}/runtime/internal/runtime.eface" %2428) -// CHECK-NEXT: store %reflect.Value %2424, ptr %2418, align 8 -// CHECK-NEXT: store %reflect.Value %2431, ptr %2425, align 8 -// CHECK-NEXT: %2432 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 162 -// CHECK-NEXT: %2433 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2432, i32 0, i32 0 -// CHECK-NEXT: %2434 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2435 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 162, ptr %2435, align 8 -// CHECK-NEXT: %2436 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2435, 1 -// CHECK-NEXT: %2437 = extractvalue { ptr, ptr } %2434, 1 -// CHECK-NEXT: %2438 = extractvalue { ptr, ptr } %2434, 0 -// CHECK-NEXT: %__llgo_funcval_code324 = call ptr asm "", "=r,0"(ptr %2438) -// CHECK-NEXT: %2439 = call %reflect.Value %__llgo_funcval_code324(ptr {{(nest|swiftself)}} %2437, %"{{.*}}/runtime/internal/runtime.eface" %2436) -// CHECK-NEXT: %2440 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2432, i32 0, i32 1 -// CHECK-NEXT: %2441 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2442 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.620000e+02, ptr %2442, align 4 -// CHECK-NEXT: %2443 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2442, 1 -// CHECK-NEXT: %2444 = extractvalue { ptr, ptr } %2441, 1 -// CHECK-NEXT: %2445 = extractvalue { ptr, ptr } %2441, 0 -// CHECK-NEXT: %__llgo_funcval_code325 = call ptr asm "", "=r,0"(ptr %2445) -// CHECK-NEXT: %2446 = call %reflect.Value %__llgo_funcval_code325(ptr {{(nest|swiftself)}} %2444, %"{{.*}}/runtime/internal/runtime.eface" %2443) -// CHECK-NEXT: store %reflect.Value %2439, ptr %2433, align 8 -// CHECK-NEXT: store %reflect.Value %2446, ptr %2440, align 8 -// CHECK-NEXT: %2447 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 163 -// CHECK-NEXT: %2448 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2447, i32 0, i32 0 -// CHECK-NEXT: %2449 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2450 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.630000e+02, ptr %2450, align 4 -// CHECK-NEXT: %2451 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2450, 1 -// CHECK-NEXT: %2452 = extractvalue { ptr, ptr } %2449, 1 -// CHECK-NEXT: %2453 = extractvalue { ptr, ptr } %2449, 0 -// CHECK-NEXT: %__llgo_funcval_code326 = call ptr asm "", "=r,0"(ptr %2453) -// CHECK-NEXT: %2454 = call %reflect.Value %__llgo_funcval_code326(ptr {{(nest|swiftself)}} %2452, %"{{.*}}/runtime/internal/runtime.eface" %2451) -// CHECK-NEXT: %2455 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2447, i32 0, i32 1 -// CHECK-NEXT: %2456 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2457 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 163, ptr %2457, align 8 -// CHECK-NEXT: %2458 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2457, 1 -// CHECK-NEXT: %2459 = extractvalue { ptr, ptr } %2456, 1 -// CHECK-NEXT: %2460 = extractvalue { ptr, ptr } %2456, 0 -// CHECK-NEXT: %__llgo_funcval_code327 = call ptr asm "", "=r,0"(ptr %2460) -// CHECK-NEXT: %2461 = call %reflect.Value %__llgo_funcval_code327(ptr {{(nest|swiftself)}} %2459, %"{{.*}}/runtime/internal/runtime.eface" %2458) -// CHECK-NEXT: store %reflect.Value %2454, ptr %2448, align 8 -// CHECK-NEXT: store %reflect.Value %2461, ptr %2455, align 8 -// CHECK-NEXT: %2462 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 164 -// CHECK-NEXT: %2463 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2462, i32 0, i32 0 -// CHECK-NEXT: %2464 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2465 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 164, ptr %2465, align 8 -// CHECK-NEXT: %2466 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2465, 1 -// CHECK-NEXT: %2467 = extractvalue { ptr, ptr } %2464, 1 -// CHECK-NEXT: %2468 = extractvalue { ptr, ptr } %2464, 0 -// CHECK-NEXT: %__llgo_funcval_code328 = call ptr asm "", "=r,0"(ptr %2468) -// CHECK-NEXT: %2469 = call %reflect.Value %__llgo_funcval_code328(ptr {{(nest|swiftself)}} %2467, %"{{.*}}/runtime/internal/runtime.eface" %2466) -// CHECK-NEXT: %2470 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2462, i32 0, i32 1 -// CHECK-NEXT: %2471 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2472 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.640000e+02, ptr %2472, align 8 -// CHECK-NEXT: %2473 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2472, 1 -// CHECK-NEXT: %2474 = extractvalue { ptr, ptr } %2471, 1 -// CHECK-NEXT: %2475 = extractvalue { ptr, ptr } %2471, 0 -// CHECK-NEXT: %__llgo_funcval_code329 = call ptr asm "", "=r,0"(ptr %2475) -// CHECK-NEXT: %2476 = call %reflect.Value %__llgo_funcval_code329(ptr {{(nest|swiftself)}} %2474, %"{{.*}}/runtime/internal/runtime.eface" %2473) -// CHECK-NEXT: store %reflect.Value %2469, ptr %2463, align 8 -// CHECK-NEXT: store %reflect.Value %2476, ptr %2470, align 8 -// CHECK-NEXT: %2477 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 165 -// CHECK-NEXT: %2478 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2477, i32 0, i32 0 -// CHECK-NEXT: %2479 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2480 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.650000e+02, ptr %2480, align 8 -// CHECK-NEXT: %2481 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2480, 1 -// CHECK-NEXT: %2482 = extractvalue { ptr, ptr } %2479, 1 -// CHECK-NEXT: %2483 = extractvalue { ptr, ptr } %2479, 0 -// CHECK-NEXT: %__llgo_funcval_code330 = call ptr asm "", "=r,0"(ptr %2483) -// CHECK-NEXT: %2484 = call %reflect.Value %__llgo_funcval_code330(ptr {{(nest|swiftself)}} %2482, %"{{.*}}/runtime/internal/runtime.eface" %2481) -// CHECK-NEXT: %2485 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2477, i32 0, i32 1 -// CHECK-NEXT: %2486 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2487 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 165, ptr %2487, align 8 -// CHECK-NEXT: %2488 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2487, 1 -// CHECK-NEXT: %2489 = extractvalue { ptr, ptr } %2486, 1 -// CHECK-NEXT: %2490 = extractvalue { ptr, ptr } %2486, 0 -// CHECK-NEXT: %__llgo_funcval_code331 = call ptr asm "", "=r,0"(ptr %2490) -// CHECK-NEXT: %2491 = call %reflect.Value %__llgo_funcval_code331(ptr {{(nest|swiftself)}} %2489, %"{{.*}}/runtime/internal/runtime.eface" %2488) -// CHECK-NEXT: store %reflect.Value %2484, ptr %2478, align 8 -// CHECK-NEXT: store %reflect.Value %2491, ptr %2485, align 8 -// CHECK-NEXT: %2492 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 166 -// CHECK-NEXT: %2493 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2492, i32 0, i32 0 -// CHECK-NEXT: %2494 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2495 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.660000e+02, ptr %2495, align 4 -// CHECK-NEXT: %2496 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2495, 1 -// CHECK-NEXT: %2497 = extractvalue { ptr, ptr } %2494, 1 -// CHECK-NEXT: %2498 = extractvalue { ptr, ptr } %2494, 0 -// CHECK-NEXT: %__llgo_funcval_code332 = call ptr asm "", "=r,0"(ptr %2498) -// CHECK-NEXT: %2499 = call %reflect.Value %__llgo_funcval_code332(ptr {{(nest|swiftself)}} %2497, %"{{.*}}/runtime/internal/runtime.eface" %2496) -// CHECK-NEXT: %2500 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2492, i32 0, i32 1 -// CHECK-NEXT: %2501 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2502 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.660000e+02, ptr %2502, align 4 -// CHECK-NEXT: %2503 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2502, 1 -// CHECK-NEXT: %2504 = extractvalue { ptr, ptr } %2501, 1 -// CHECK-NEXT: %2505 = extractvalue { ptr, ptr } %2501, 0 -// CHECK-NEXT: %__llgo_funcval_code333 = call ptr asm "", "=r,0"(ptr %2505) -// CHECK-NEXT: %2506 = call %reflect.Value %__llgo_funcval_code333(ptr {{(nest|swiftself)}} %2504, %"{{.*}}/runtime/internal/runtime.eface" %2503) -// CHECK-NEXT: store %reflect.Value %2499, ptr %2493, align 8 -// CHECK-NEXT: store %reflect.Value %2506, ptr %2500, align 8 -// CHECK-NEXT: %2507 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 167 -// CHECK-NEXT: %2508 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2507, i32 0, i32 0 -// CHECK-NEXT: %2509 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2510 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.670000e+02, ptr %2510, align 4 -// CHECK-NEXT: %2511 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2510, 1 -// CHECK-NEXT: %2512 = extractvalue { ptr, ptr } %2509, 1 -// CHECK-NEXT: %2513 = extractvalue { ptr, ptr } %2509, 0 -// CHECK-NEXT: %__llgo_funcval_code334 = call ptr asm "", "=r,0"(ptr %2513) -// CHECK-NEXT: %2514 = call %reflect.Value %__llgo_funcval_code334(ptr {{(nest|swiftself)}} %2512, %"{{.*}}/runtime/internal/runtime.eface" %2511) -// CHECK-NEXT: %2515 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2507, i32 0, i32 1 -// CHECK-NEXT: %2516 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2517 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.670000e+02, ptr %2517, align 8 -// CHECK-NEXT: %2518 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2517, 1 -// CHECK-NEXT: %2519 = extractvalue { ptr, ptr } %2516, 1 -// CHECK-NEXT: %2520 = extractvalue { ptr, ptr } %2516, 0 -// CHECK-NEXT: %__llgo_funcval_code335 = call ptr asm "", "=r,0"(ptr %2520) -// CHECK-NEXT: %2521 = call %reflect.Value %__llgo_funcval_code335(ptr {{(nest|swiftself)}} %2519, %"{{.*}}/runtime/internal/runtime.eface" %2518) -// CHECK-NEXT: store %reflect.Value %2514, ptr %2508, align 8 -// CHECK-NEXT: store %reflect.Value %2521, ptr %2515, align 8 -// CHECK-NEXT: %2522 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 168 -// CHECK-NEXT: %2523 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2522, i32 0, i32 0 -// CHECK-NEXT: %2524 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2525 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.680000e+02, ptr %2525, align 8 -// CHECK-NEXT: %2526 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2525, 1 -// CHECK-NEXT: %2527 = extractvalue { ptr, ptr } %2524, 1 -// CHECK-NEXT: %2528 = extractvalue { ptr, ptr } %2524, 0 -// CHECK-NEXT: %__llgo_funcval_code336 = call ptr asm "", "=r,0"(ptr %2528) -// CHECK-NEXT: %2529 = call %reflect.Value %__llgo_funcval_code336(ptr {{(nest|swiftself)}} %2527, %"{{.*}}/runtime/internal/runtime.eface" %2526) -// CHECK-NEXT: %2530 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2522, i32 0, i32 1 -// CHECK-NEXT: %2531 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2532 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float 1.680000e+02, ptr %2532, align 4 -// CHECK-NEXT: %2533 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %2532, 1 -// CHECK-NEXT: %2534 = extractvalue { ptr, ptr } %2531, 1 -// CHECK-NEXT: %2535 = extractvalue { ptr, ptr } %2531, 0 -// CHECK-NEXT: %__llgo_funcval_code337 = call ptr asm "", "=r,0"(ptr %2535) -// CHECK-NEXT: %2536 = call %reflect.Value %__llgo_funcval_code337(ptr {{(nest|swiftself)}} %2534, %"{{.*}}/runtime/internal/runtime.eface" %2533) -// CHECK-NEXT: store %reflect.Value %2529, ptr %2523, align 8 -// CHECK-NEXT: store %reflect.Value %2536, ptr %2530, align 8 -// CHECK-NEXT: %2537 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 169 -// CHECK-NEXT: %2538 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2537, i32 0, i32 0 -// CHECK-NEXT: %2539 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2540 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.690000e+02, ptr %2540, align 8 -// CHECK-NEXT: %2541 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2540, 1 -// CHECK-NEXT: %2542 = extractvalue { ptr, ptr } %2539, 1 -// CHECK-NEXT: %2543 = extractvalue { ptr, ptr } %2539, 0 -// CHECK-NEXT: %__llgo_funcval_code338 = call ptr asm "", "=r,0"(ptr %2543) -// CHECK-NEXT: %2544 = call %reflect.Value %__llgo_funcval_code338(ptr {{(nest|swiftself)}} %2542, %"{{.*}}/runtime/internal/runtime.eface" %2541) -// CHECK-NEXT: %2545 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2537, i32 0, i32 1 -// CHECK-NEXT: %2546 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2547 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.690000e+02, ptr %2547, align 8 -// CHECK-NEXT: %2548 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2547, 1 -// CHECK-NEXT: %2549 = extractvalue { ptr, ptr } %2546, 1 -// CHECK-NEXT: %2550 = extractvalue { ptr, ptr } %2546, 0 -// CHECK-NEXT: %__llgo_funcval_code339 = call ptr asm "", "=r,0"(ptr %2550) -// CHECK-NEXT: %2551 = call %reflect.Value %__llgo_funcval_code339(ptr {{(nest|swiftself)}} %2549, %"{{.*}}/runtime/internal/runtime.eface" %2548) -// CHECK-NEXT: store %reflect.Value %2544, ptr %2538, align 8 -// CHECK-NEXT: store %reflect.Value %2551, ptr %2545, align 8 -// CHECK-NEXT: %2552 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 170 -// CHECK-NEXT: %2553 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2552, i32 0, i32 0 -// CHECK-NEXT: %2554 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2555 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double 1.500000e+00, ptr %2555, align 8 -// CHECK-NEXT: %2556 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %2555, 1 -// CHECK-NEXT: %2557 = extractvalue { ptr, ptr } %2554, 1 -// CHECK-NEXT: %2558 = extractvalue { ptr, ptr } %2554, 0 -// CHECK-NEXT: %__llgo_funcval_code340 = call ptr asm "", "=r,0"(ptr %2558) -// CHECK-NEXT: %2559 = call %reflect.Value %__llgo_funcval_code340(ptr {{(nest|swiftself)}} %2557, %"{{.*}}/runtime/internal/runtime.eface" %2556) -// CHECK-NEXT: %2560 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2552, i32 0, i32 1 -// CHECK-NEXT: %2561 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2562 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %2562, align 8 -// CHECK-NEXT: %2563 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2562, 1 -// CHECK-NEXT: %2564 = extractvalue { ptr, ptr } %2561, 1 -// CHECK-NEXT: %2565 = extractvalue { ptr, ptr } %2561, 0 -// CHECK-NEXT: %__llgo_funcval_code341 = call ptr asm "", "=r,0"(ptr %2565) -// CHECK-NEXT: %2566 = call %reflect.Value %__llgo_funcval_code341(ptr {{(nest|swiftself)}} %2564, %"{{.*}}/runtime/internal/runtime.eface" %2563) -// CHECK-NEXT: store %reflect.Value %2559, ptr %2553, align 8 -// CHECK-NEXT: store %reflect.Value %2566, ptr %2560, align 8 -// CHECK-NEXT: %2567 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 171 -// CHECK-NEXT: %2568 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2567, i32 0, i32 0 -// CHECK-NEXT: %2569 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2570 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { float, float } { float 0.000000e+00, float 1.000000e+00 }, ptr %2570, align 4 -// CHECK-NEXT: %2571 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex64, ptr undef }, ptr %2570, 1 -// CHECK-NEXT: %2572 = extractvalue { ptr, ptr } %2569, 1 -// CHECK-NEXT: %2573 = extractvalue { ptr, ptr } %2569, 0 -// CHECK-NEXT: %__llgo_funcval_code342 = call ptr asm "", "=r,0"(ptr %2573) -// CHECK-NEXT: %2574 = call %reflect.Value %__llgo_funcval_code342(ptr {{(nest|swiftself)}} %2572, %"{{.*}}/runtime/internal/runtime.eface" %2571) -// CHECK-NEXT: %2575 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2567, i32 0, i32 1 -// CHECK-NEXT: %2576 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2577 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { float, float } { float 0.000000e+00, float 1.000000e+00 }, ptr %2577, align 4 -// CHECK-NEXT: %2578 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex64, ptr undef }, ptr %2577, 1 -// CHECK-NEXT: %2579 = extractvalue { ptr, ptr } %2576, 1 -// CHECK-NEXT: %2580 = extractvalue { ptr, ptr } %2576, 0 -// CHECK-NEXT: %__llgo_funcval_code343 = call ptr asm "", "=r,0"(ptr %2580) -// CHECK-NEXT: %2581 = call %reflect.Value %__llgo_funcval_code343(ptr {{(nest|swiftself)}} %2579, %"{{.*}}/runtime/internal/runtime.eface" %2578) -// CHECK-NEXT: store %reflect.Value %2574, ptr %2568, align 8 -// CHECK-NEXT: store %reflect.Value %2581, ptr %2575, align 8 -// CHECK-NEXT: %2582 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 172 -// CHECK-NEXT: %2583 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2582, i32 0, i32 0 -// CHECK-NEXT: %2584 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2585 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { float, float } { float 0.000000e+00, float 2.000000e+00 }, ptr %2585, align 4 -// CHECK-NEXT: %2586 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex64, ptr undef }, ptr %2585, 1 -// CHECK-NEXT: %2587 = extractvalue { ptr, ptr } %2584, 1 -// CHECK-NEXT: %2588 = extractvalue { ptr, ptr } %2584, 0 -// CHECK-NEXT: %__llgo_funcval_code344 = call ptr asm "", "=r,0"(ptr %2588) -// CHECK-NEXT: %2589 = call %reflect.Value %__llgo_funcval_code344(ptr {{(nest|swiftself)}} %2587, %"{{.*}}/runtime/internal/runtime.eface" %2586) -// CHECK-NEXT: %2590 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2582, i32 0, i32 1 -// CHECK-NEXT: %2591 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2592 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { double, double } { double 0.000000e+00, double 2.000000e+00 }, ptr %2592, align 8 -// CHECK-NEXT: %2593 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %2592, 1 -// CHECK-NEXT: %2594 = extractvalue { ptr, ptr } %2591, 1 -// CHECK-NEXT: %2595 = extractvalue { ptr, ptr } %2591, 0 -// CHECK-NEXT: %__llgo_funcval_code345 = call ptr asm "", "=r,0"(ptr %2595) -// CHECK-NEXT: %2596 = call %reflect.Value %__llgo_funcval_code345(ptr {{(nest|swiftself)}} %2594, %"{{.*}}/runtime/internal/runtime.eface" %2593) -// CHECK-NEXT: store %reflect.Value %2589, ptr %2583, align 8 -// CHECK-NEXT: store %reflect.Value %2596, ptr %2590, align 8 -// CHECK-NEXT: %2597 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 173 -// CHECK-NEXT: %2598 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2597, i32 0, i32 0 -// CHECK-NEXT: %2599 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2600 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { double, double } { double 0.000000e+00, double 3.000000e+00 }, ptr %2600, align 8 -// CHECK-NEXT: %2601 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %2600, 1 -// CHECK-NEXT: %2602 = extractvalue { ptr, ptr } %2599, 1 -// CHECK-NEXT: %2603 = extractvalue { ptr, ptr } %2599, 0 -// CHECK-NEXT: %__llgo_funcval_code346 = call ptr asm "", "=r,0"(ptr %2603) -// CHECK-NEXT: %2604 = call %reflect.Value %__llgo_funcval_code346(ptr {{(nest|swiftself)}} %2602, %"{{.*}}/runtime/internal/runtime.eface" %2601) -// CHECK-NEXT: %2605 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2597, i32 0, i32 1 -// CHECK-NEXT: %2606 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2607 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { float, float } { float 0.000000e+00, float 3.000000e+00 }, ptr %2607, align 4 -// CHECK-NEXT: %2608 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex64, ptr undef }, ptr %2607, 1 -// CHECK-NEXT: %2609 = extractvalue { ptr, ptr } %2606, 1 -// CHECK-NEXT: %2610 = extractvalue { ptr, ptr } %2606, 0 -// CHECK-NEXT: %__llgo_funcval_code347 = call ptr asm "", "=r,0"(ptr %2610) -// CHECK-NEXT: %2611 = call %reflect.Value %__llgo_funcval_code347(ptr {{(nest|swiftself)}} %2609, %"{{.*}}/runtime/internal/runtime.eface" %2608) -// CHECK-NEXT: store %reflect.Value %2604, ptr %2598, align 8 -// CHECK-NEXT: store %reflect.Value %2611, ptr %2605, align 8 -// CHECK-NEXT: %2612 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 174 -// CHECK-NEXT: %2613 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2612, i32 0, i32 0 -// CHECK-NEXT: %2614 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2615 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { double, double } { double 0.000000e+00, double 4.000000e+00 }, ptr %2615, align 8 -// CHECK-NEXT: %2616 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %2615, 1 -// CHECK-NEXT: %2617 = extractvalue { ptr, ptr } %2614, 1 -// CHECK-NEXT: %2618 = extractvalue { ptr, ptr } %2614, 0 -// CHECK-NEXT: %__llgo_funcval_code348 = call ptr asm "", "=r,0"(ptr %2618) -// CHECK-NEXT: %2619 = call %reflect.Value %__llgo_funcval_code348(ptr {{(nest|swiftself)}} %2617, %"{{.*}}/runtime/internal/runtime.eface" %2616) -// CHECK-NEXT: %2620 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2612, i32 0, i32 1 -// CHECK-NEXT: %2621 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2622 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { double, double } { double 0.000000e+00, double 4.000000e+00 }, ptr %2622, align 8 -// CHECK-NEXT: %2623 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_complex128, ptr undef }, ptr %2622, 1 -// CHECK-NEXT: %2624 = extractvalue { ptr, ptr } %2621, 1 -// CHECK-NEXT: %2625 = extractvalue { ptr, ptr } %2621, 0 -// CHECK-NEXT: %__llgo_funcval_code349 = call ptr asm "", "=r,0"(ptr %2625) -// CHECK-NEXT: %2626 = call %reflect.Value %__llgo_funcval_code349(ptr {{(nest|swiftself)}} %2624, %"{{.*}}/runtime/internal/runtime.eface" %2623) -// CHECK-NEXT: store %reflect.Value %2619, ptr %2613, align 8 -// CHECK-NEXT: store %reflect.Value %2626, ptr %2620, align 8 -// CHECK-NEXT: %2627 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 175 -// CHECK-NEXT: %2628 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2627, i32 0, i32 0 -// CHECK-NEXT: %2629 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2630 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %2630, align 8 -// CHECK-NEXT: %2631 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2630, 1 -// CHECK-NEXT: %2632 = extractvalue { ptr, ptr } %2629, 1 -// CHECK-NEXT: %2633 = extractvalue { ptr, ptr } %2629, 0 -// CHECK-NEXT: %__llgo_funcval_code350 = call ptr asm "", "=r,0"(ptr %2633) -// CHECK-NEXT: %2634 = call %reflect.Value %__llgo_funcval_code350(ptr {{(nest|swiftself)}} %2632, %"{{.*}}/runtime/internal/runtime.eface" %2631) -// CHECK-NEXT: %2635 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2627, i32 0, i32 1 -// CHECK-NEXT: %2636 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2637 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %2637, align 8 -// CHECK-NEXT: %2638 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2637, 1 -// CHECK-NEXT: %2639 = extractvalue { ptr, ptr } %2636, 1 -// CHECK-NEXT: %2640 = extractvalue { ptr, ptr } %2636, 0 -// CHECK-NEXT: %__llgo_funcval_code351 = call ptr asm "", "=r,0"(ptr %2640) -// CHECK-NEXT: %2641 = call %reflect.Value %__llgo_funcval_code351(ptr {{(nest|swiftself)}} %2639, %"{{.*}}/runtime/internal/runtime.eface" %2638) -// CHECK-NEXT: store %reflect.Value %2634, ptr %2628, align 8 -// CHECK-NEXT: store %reflect.Value %2641, ptr %2635, align 8 -// CHECK-NEXT: %2642 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 176 -// CHECK-NEXT: %2643 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2642, i32 0, i32 0 -// CHECK-NEXT: %2644 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2645 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }, ptr %2645, align 8 -// CHECK-NEXT: %2646 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2645, 1 -// CHECK-NEXT: %2647 = extractvalue { ptr, ptr } %2644, 1 -// CHECK-NEXT: %2648 = extractvalue { ptr, ptr } %2644, 0 -// CHECK-NEXT: %__llgo_funcval_code352 = call ptr asm "", "=r,0"(ptr %2648) -// CHECK-NEXT: %2649 = call %reflect.Value %__llgo_funcval_code352(ptr {{(nest|swiftself)}} %2647, %"{{.*}}/runtime/internal/runtime.eface" %2646) -// CHECK-NEXT: %2650 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2642, i32 0, i32 1 -// CHECK-NEXT: %2651 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2652 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }) -// CHECK-NEXT: %2653 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2652, ptr %2653, align 8 -// CHECK-NEXT: %2654 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %2653, 1 -// CHECK-NEXT: %2655 = extractvalue { ptr, ptr } %2651, 1 -// CHECK-NEXT: %2656 = extractvalue { ptr, ptr } %2651, 0 -// CHECK-NEXT: %__llgo_funcval_code353 = call ptr asm "", "=r,0"(ptr %2656) -// CHECK-NEXT: %2657 = call %reflect.Value %__llgo_funcval_code353(ptr {{(nest|swiftself)}} %2655, %"{{.*}}/runtime/internal/runtime.eface" %2654) -// CHECK-NEXT: store %reflect.Value %2649, ptr %2643, align 8 -// CHECK-NEXT: store %reflect.Value %2657, ptr %2650, align 8 -// CHECK-NEXT: %2658 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 177 -// CHECK-NEXT: %2659 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2658, i32 0, i32 0 -// CHECK-NEXT: %2660 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2661 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }) -// CHECK-NEXT: %2662 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2661, ptr %2662, align 8 -// CHECK-NEXT: %2663 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %2662, 1 -// CHECK-NEXT: %2664 = extractvalue { ptr, ptr } %2660, 1 -// CHECK-NEXT: %2665 = extractvalue { ptr, ptr } %2660, 0 -// CHECK-NEXT: %__llgo_funcval_code354 = call ptr asm "", "=r,0"(ptr %2665) -// CHECK-NEXT: %2666 = call %reflect.Value %__llgo_funcval_code354(ptr {{(nest|swiftself)}} %2664, %"{{.*}}/runtime/internal/runtime.eface" %2663) -// CHECK-NEXT: %2667 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2658, i32 0, i32 1 -// CHECK-NEXT: %2668 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2669 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }, ptr %2669, align 8 -// CHECK-NEXT: %2670 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2669, 1 -// CHECK-NEXT: %2671 = extractvalue { ptr, ptr } %2668, 1 -// CHECK-NEXT: %2672 = extractvalue { ptr, ptr } %2668, 0 -// CHECK-NEXT: %__llgo_funcval_code355 = call ptr asm "", "=r,0"(ptr %2672) -// CHECK-NEXT: %2673 = call %reflect.Value %__llgo_funcval_code355(ptr {{(nest|swiftself)}} %2671, %"{{.*}}/runtime/internal/runtime.eface" %2670) -// CHECK-NEXT: store %reflect.Value %2666, ptr %2659, align 8 -// CHECK-NEXT: store %reflect.Value %2673, ptr %2667, align 8 -// CHECK-NEXT: %2674 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 178 -// CHECK-NEXT: %2675 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2674, i32 0, i32 0 -// CHECK-NEXT: %2676 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2677 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %2678 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2677, ptr %2678, align 8 -// CHECK-NEXT: %2679 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %2678, 1 -// CHECK-NEXT: %2680 = extractvalue { ptr, ptr } %2676, 1 -// CHECK-NEXT: %2681 = extractvalue { ptr, ptr } %2676, 0 -// CHECK-NEXT: %__llgo_funcval_code356 = call ptr asm "", "=r,0"(ptr %2681) -// CHECK-NEXT: %2682 = call %reflect.Value %__llgo_funcval_code356(ptr {{(nest|swiftself)}} %2680, %"{{.*}}/runtime/internal/runtime.eface" %2679) -// CHECK-NEXT: %2683 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2674, i32 0, i32 1 -// CHECK-NEXT: %2684 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2685 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %2686 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2685, ptr %2686, align 8 -// CHECK-NEXT: %2687 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %2686, 1 -// CHECK-NEXT: %2688 = extractvalue { ptr, ptr } %2684, 1 -// CHECK-NEXT: %2689 = extractvalue { ptr, ptr } %2684, 0 -// CHECK-NEXT: %__llgo_funcval_code357 = call ptr asm "", "=r,0"(ptr %2689) -// CHECK-NEXT: %2690 = call %reflect.Value %__llgo_funcval_code357(ptr {{(nest|swiftself)}} %2688, %"{{.*}}/runtime/internal/runtime.eface" %2687) -// CHECK-NEXT: store %reflect.Value %2682, ptr %2675, align 8 -// CHECK-NEXT: store %reflect.Value %2690, ptr %2683, align 8 -// CHECK-NEXT: %2691 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 179 -// CHECK-NEXT: %2692 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2691, i32 0, i32 0 -// CHECK-NEXT: %2693 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2694 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }, ptr %2694, align 8 -// CHECK-NEXT: %2695 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2694, 1 -// CHECK-NEXT: %2696 = extractvalue { ptr, ptr } %2693, 1 -// CHECK-NEXT: %2697 = extractvalue { ptr, ptr } %2693, 0 -// CHECK-NEXT: %__llgo_funcval_code358 = call ptr asm "", "=r,0"(ptr %2697) -// CHECK-NEXT: %2698 = call %reflect.Value %__llgo_funcval_code358(ptr {{(nest|swiftself)}} %2696, %"{{.*}}/runtime/internal/runtime.eface" %2695) -// CHECK-NEXT: %2699 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2691, i32 0, i32 1 -// CHECK-NEXT: %2700 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2701 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }) -// CHECK-NEXT: %2702 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2701, ptr %2702, align 8 -// CHECK-NEXT: %2703 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %2702, 1 -// CHECK-NEXT: %2704 = extractvalue { ptr, ptr } %2700, 1 -// CHECK-NEXT: %2705 = extractvalue { ptr, ptr } %2700, 0 -// CHECK-NEXT: %__llgo_funcval_code359 = call ptr asm "", "=r,0"(ptr %2705) -// CHECK-NEXT: %2706 = call %reflect.Value %__llgo_funcval_code359(ptr {{(nest|swiftself)}} %2704, %"{{.*}}/runtime/internal/runtime.eface" %2703) -// CHECK-NEXT: store %reflect.Value %2698, ptr %2692, align 8 -// CHECK-NEXT: store %reflect.Value %2706, ptr %2699, align 8 -// CHECK-NEXT: %2707 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 180 -// CHECK-NEXT: %2708 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2707, i32 0, i32 0 -// CHECK-NEXT: %2709 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2710 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }) -// CHECK-NEXT: %2711 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2710, ptr %2711, align 8 -// CHECK-NEXT: %2712 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %2711, 1 -// CHECK-NEXT: %2713 = extractvalue { ptr, ptr } %2709, 1 -// CHECK-NEXT: %2714 = extractvalue { ptr, ptr } %2709, 0 -// CHECK-NEXT: %__llgo_funcval_code360 = call ptr asm "", "=r,0"(ptr %2714) -// CHECK-NEXT: %2715 = call %reflect.Value %__llgo_funcval_code360(ptr {{(nest|swiftself)}} %2713, %"{{.*}}/runtime/internal/runtime.eface" %2712) -// CHECK-NEXT: %2716 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2707, i32 0, i32 1 -// CHECK-NEXT: %2717 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2718 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }, ptr %2718, align 8 -// CHECK-NEXT: %2719 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2718, 1 -// CHECK-NEXT: %2720 = extractvalue { ptr, ptr } %2717, 1 -// CHECK-NEXT: %2721 = extractvalue { ptr, ptr } %2717, 0 -// CHECK-NEXT: %__llgo_funcval_code361 = call ptr asm "", "=r,0"(ptr %2721) -// CHECK-NEXT: %2722 = call %reflect.Value %__llgo_funcval_code361(ptr {{(nest|swiftself)}} %2720, %"{{.*}}/runtime/internal/runtime.eface" %2719) -// CHECK-NEXT: store %reflect.Value %2715, ptr %2708, align 8 -// CHECK-NEXT: store %reflect.Value %2722, ptr %2716, align 8 -// CHECK-NEXT: %2723 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 181 -// CHECK-NEXT: %2724 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2723, i32 0, i32 0 -// CHECK-NEXT: %2725 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2726 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %2727 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2726, ptr %2727, align 8 -// CHECK-NEXT: %2728 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %2727, 1 -// CHECK-NEXT: %2729 = extractvalue { ptr, ptr } %2725, 1 -// CHECK-NEXT: %2730 = extractvalue { ptr, ptr } %2725, 0 -// CHECK-NEXT: %__llgo_funcval_code362 = call ptr asm "", "=r,0"(ptr %2730) -// CHECK-NEXT: %2731 = call %reflect.Value %__llgo_funcval_code362(ptr {{(nest|swiftself)}} %2729, %"{{.*}}/runtime/internal/runtime.eface" %2728) -// CHECK-NEXT: %2732 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2723, i32 0, i32 1 -// CHECK-NEXT: %2733 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2734 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %2735 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %2734, ptr %2735, align 8 -// CHECK-NEXT: %2736 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %2735, 1 -// CHECK-NEXT: %2737 = extractvalue { ptr, ptr } %2733, 1 -// CHECK-NEXT: %2738 = extractvalue { ptr, ptr } %2733, 0 -// CHECK-NEXT: %__llgo_funcval_code363 = call ptr asm "", "=r,0"(ptr %2738) -// CHECK-NEXT: %2739 = call %reflect.Value %__llgo_funcval_code363(ptr {{(nest|swiftself)}} %2737, %"{{.*}}/runtime/internal/runtime.eface" %2736) -// CHECK-NEXT: store %reflect.Value %2731, ptr %2724, align 8 -// CHECK-NEXT: store %reflect.Value %2739, ptr %2732, align 8 -// CHECK-NEXT: %2740 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 182 -// CHECK-NEXT: %2741 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2740, i32 0, i32 0 -// CHECK-NEXT: %2742 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2743 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %2743, align 8 -// CHECK-NEXT: %2744 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2743, 1 -// CHECK-NEXT: %2745 = extractvalue { ptr, ptr } %2742, 1 -// CHECK-NEXT: %2746 = extractvalue { ptr, ptr } %2742, 0 -// CHECK-NEXT: %__llgo_funcval_code364 = call ptr asm "", "=r,0"(ptr %2746) -// CHECK-NEXT: %2747 = call %reflect.Value %__llgo_funcval_code364(ptr {{(nest|swiftself)}} %2745, %"{{.*}}/runtime/internal/runtime.eface" %2744) -// CHECK-NEXT: %2748 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2740, i32 0, i32 1 -// CHECK-NEXT: %2749 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2750 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2750, align 8 -// CHECK-NEXT: %2751 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2750, 1 -// CHECK-NEXT: %2752 = extractvalue { ptr, ptr } %2749, 1 -// CHECK-NEXT: %2753 = extractvalue { ptr, ptr } %2749, 0 -// CHECK-NEXT: %__llgo_funcval_code365 = call ptr asm "", "=r,0"(ptr %2753) -// CHECK-NEXT: %2754 = call %reflect.Value %__llgo_funcval_code365(ptr {{(nest|swiftself)}} %2752, %"{{.*}}/runtime/internal/runtime.eface" %2751) -// CHECK-NEXT: store %reflect.Value %2747, ptr %2741, align 8 -// CHECK-NEXT: store %reflect.Value %2754, ptr %2748, align 8 -// CHECK-NEXT: %2755 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 183 -// CHECK-NEXT: %2756 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2755, i32 0, i32 0 -// CHECK-NEXT: %2757 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2758 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 97, ptr %2758, align 1 -// CHECK-NEXT: %2759 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %2758, 1 -// CHECK-NEXT: %2760 = extractvalue { ptr, ptr } %2757, 1 -// CHECK-NEXT: %2761 = extractvalue { ptr, ptr } %2757, 0 -// CHECK-NEXT: %__llgo_funcval_code366 = call ptr asm "", "=r,0"(ptr %2761) -// CHECK-NEXT: %2762 = call %reflect.Value %__llgo_funcval_code366(ptr {{(nest|swiftself)}} %2760, %"{{.*}}/runtime/internal/runtime.eface" %2759) -// CHECK-NEXT: %2763 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2755, i32 0, i32 1 -// CHECK-NEXT: %2764 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2765 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2765, align 8 -// CHECK-NEXT: %2766 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2765, 1 -// CHECK-NEXT: %2767 = extractvalue { ptr, ptr } %2764, 1 -// CHECK-NEXT: %2768 = extractvalue { ptr, ptr } %2764, 0 -// CHECK-NEXT: %__llgo_funcval_code367 = call ptr asm "", "=r,0"(ptr %2768) -// CHECK-NEXT: %2769 = call %reflect.Value %__llgo_funcval_code367(ptr {{(nest|swiftself)}} %2767, %"{{.*}}/runtime/internal/runtime.eface" %2766) -// CHECK-NEXT: store %reflect.Value %2762, ptr %2756, align 8 -// CHECK-NEXT: store %reflect.Value %2769, ptr %2763, align 8 -// CHECK-NEXT: %2770 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 184 -// CHECK-NEXT: %2771 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2770, i32 0, i32 0 -// CHECK-NEXT: %2772 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2773 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 97, ptr %2773, align 2 -// CHECK-NEXT: %2774 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %2773, 1 -// CHECK-NEXT: %2775 = extractvalue { ptr, ptr } %2772, 1 -// CHECK-NEXT: %2776 = extractvalue { ptr, ptr } %2772, 0 -// CHECK-NEXT: %__llgo_funcval_code368 = call ptr asm "", "=r,0"(ptr %2776) -// CHECK-NEXT: %2777 = call %reflect.Value %__llgo_funcval_code368(ptr {{(nest|swiftself)}} %2775, %"{{.*}}/runtime/internal/runtime.eface" %2774) -// CHECK-NEXT: %2778 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2770, i32 0, i32 1 -// CHECK-NEXT: %2779 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2780 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2780, align 8 -// CHECK-NEXT: %2781 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2780, 1 -// CHECK-NEXT: %2782 = extractvalue { ptr, ptr } %2779, 1 -// CHECK-NEXT: %2783 = extractvalue { ptr, ptr } %2779, 0 -// CHECK-NEXT: %__llgo_funcval_code369 = call ptr asm "", "=r,0"(ptr %2783) -// CHECK-NEXT: %2784 = call %reflect.Value %__llgo_funcval_code369(ptr {{(nest|swiftself)}} %2782, %"{{.*}}/runtime/internal/runtime.eface" %2781) -// CHECK-NEXT: store %reflect.Value %2777, ptr %2771, align 8 -// CHECK-NEXT: store %reflect.Value %2784, ptr %2778, align 8 -// CHECK-NEXT: %2785 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 185 -// CHECK-NEXT: %2786 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2785, i32 0, i32 0 -// CHECK-NEXT: %2787 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2788 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %2788, align 4 -// CHECK-NEXT: %2789 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %2788, 1 -// CHECK-NEXT: %2790 = extractvalue { ptr, ptr } %2787, 1 -// CHECK-NEXT: %2791 = extractvalue { ptr, ptr } %2787, 0 -// CHECK-NEXT: %__llgo_funcval_code370 = call ptr asm "", "=r,0"(ptr %2791) -// CHECK-NEXT: %2792 = call %reflect.Value %__llgo_funcval_code370(ptr {{(nest|swiftself)}} %2790, %"{{.*}}/runtime/internal/runtime.eface" %2789) -// CHECK-NEXT: %2793 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2785, i32 0, i32 1 -// CHECK-NEXT: %2794 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2795 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2795, align 8 -// CHECK-NEXT: %2796 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2795, 1 -// CHECK-NEXT: %2797 = extractvalue { ptr, ptr } %2794, 1 -// CHECK-NEXT: %2798 = extractvalue { ptr, ptr } %2794, 0 -// CHECK-NEXT: %__llgo_funcval_code371 = call ptr asm "", "=r,0"(ptr %2798) -// CHECK-NEXT: %2799 = call %reflect.Value %__llgo_funcval_code371(ptr {{(nest|swiftself)}} %2797, %"{{.*}}/runtime/internal/runtime.eface" %2796) -// CHECK-NEXT: store %reflect.Value %2792, ptr %2786, align 8 -// CHECK-NEXT: store %reflect.Value %2799, ptr %2793, align 8 -// CHECK-NEXT: %2800 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 186 -// CHECK-NEXT: %2801 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2800, i32 0, i32 0 -// CHECK-NEXT: %2802 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2803 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %2803, align 8 -// CHECK-NEXT: %2804 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %2803, 1 -// CHECK-NEXT: %2805 = extractvalue { ptr, ptr } %2802, 1 -// CHECK-NEXT: %2806 = extractvalue { ptr, ptr } %2802, 0 -// CHECK-NEXT: %__llgo_funcval_code372 = call ptr asm "", "=r,0"(ptr %2806) -// CHECK-NEXT: %2807 = call %reflect.Value %__llgo_funcval_code372(ptr {{(nest|swiftself)}} %2805, %"{{.*}}/runtime/internal/runtime.eface" %2804) -// CHECK-NEXT: %2808 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2800, i32 0, i32 1 -// CHECK-NEXT: %2809 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2810 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2810, align 8 -// CHECK-NEXT: %2811 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2810, 1 -// CHECK-NEXT: %2812 = extractvalue { ptr, ptr } %2809, 1 -// CHECK-NEXT: %2813 = extractvalue { ptr, ptr } %2809, 0 -// CHECK-NEXT: %__llgo_funcval_code373 = call ptr asm "", "=r,0"(ptr %2813) -// CHECK-NEXT: %2814 = call %reflect.Value %__llgo_funcval_code373(ptr {{(nest|swiftself)}} %2812, %"{{.*}}/runtime/internal/runtime.eface" %2811) -// CHECK-NEXT: store %reflect.Value %2807, ptr %2801, align 8 -// CHECK-NEXT: store %reflect.Value %2814, ptr %2808, align 8 -// CHECK-NEXT: %2815 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 187 -// CHECK-NEXT: %2816 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2815, i32 0, i32 0 -// CHECK-NEXT: %2817 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2818 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %2818, align 8 -// CHECK-NEXT: %2819 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %2818, 1 -// CHECK-NEXT: %2820 = extractvalue { ptr, ptr } %2817, 1 -// CHECK-NEXT: %2821 = extractvalue { ptr, ptr } %2817, 0 -// CHECK-NEXT: %__llgo_funcval_code374 = call ptr asm "", "=r,0"(ptr %2821) -// CHECK-NEXT: %2822 = call %reflect.Value %__llgo_funcval_code374(ptr {{(nest|swiftself)}} %2820, %"{{.*}}/runtime/internal/runtime.eface" %2819) -// CHECK-NEXT: %2823 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2815, i32 0, i32 1 -// CHECK-NEXT: %2824 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2825 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2825, align 8 -// CHECK-NEXT: %2826 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2825, 1 -// CHECK-NEXT: %2827 = extractvalue { ptr, ptr } %2824, 1 -// CHECK-NEXT: %2828 = extractvalue { ptr, ptr } %2824, 0 -// CHECK-NEXT: %__llgo_funcval_code375 = call ptr asm "", "=r,0"(ptr %2828) -// CHECK-NEXT: %2829 = call %reflect.Value %__llgo_funcval_code375(ptr {{(nest|swiftself)}} %2827, %"{{.*}}/runtime/internal/runtime.eface" %2826) -// CHECK-NEXT: store %reflect.Value %2822, ptr %2816, align 8 -// CHECK-NEXT: store %reflect.Value %2829, ptr %2823, align 8 -// CHECK-NEXT: %2830 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 188 -// CHECK-NEXT: %2831 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2830, i32 0, i32 0 -// CHECK-NEXT: %2832 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2833 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 97, ptr %2833, align 1 -// CHECK-NEXT: %2834 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %2833, 1 -// CHECK-NEXT: %2835 = extractvalue { ptr, ptr } %2832, 1 -// CHECK-NEXT: %2836 = extractvalue { ptr, ptr } %2832, 0 -// CHECK-NEXT: %__llgo_funcval_code376 = call ptr asm "", "=r,0"(ptr %2836) -// CHECK-NEXT: %2837 = call %reflect.Value %__llgo_funcval_code376(ptr {{(nest|swiftself)}} %2835, %"{{.*}}/runtime/internal/runtime.eface" %2834) -// CHECK-NEXT: %2838 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2830, i32 0, i32 1 -// CHECK-NEXT: %2839 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2840 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2840, align 8 -// CHECK-NEXT: %2841 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2840, 1 -// CHECK-NEXT: %2842 = extractvalue { ptr, ptr } %2839, 1 -// CHECK-NEXT: %2843 = extractvalue { ptr, ptr } %2839, 0 -// CHECK-NEXT: %__llgo_funcval_code377 = call ptr asm "", "=r,0"(ptr %2843) -// CHECK-NEXT: %2844 = call %reflect.Value %__llgo_funcval_code377(ptr {{(nest|swiftself)}} %2842, %"{{.*}}/runtime/internal/runtime.eface" %2841) -// CHECK-NEXT: store %reflect.Value %2837, ptr %2831, align 8 -// CHECK-NEXT: store %reflect.Value %2844, ptr %2838, align 8 -// CHECK-NEXT: %2845 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 189 -// CHECK-NEXT: %2846 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2845, i32 0, i32 0 -// CHECK-NEXT: %2847 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2848 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 97, ptr %2848, align 2 -// CHECK-NEXT: %2849 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %2848, 1 -// CHECK-NEXT: %2850 = extractvalue { ptr, ptr } %2847, 1 -// CHECK-NEXT: %2851 = extractvalue { ptr, ptr } %2847, 0 -// CHECK-NEXT: %__llgo_funcval_code378 = call ptr asm "", "=r,0"(ptr %2851) -// CHECK-NEXT: %2852 = call %reflect.Value %__llgo_funcval_code378(ptr {{(nest|swiftself)}} %2850, %"{{.*}}/runtime/internal/runtime.eface" %2849) -// CHECK-NEXT: %2853 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2845, i32 0, i32 1 -// CHECK-NEXT: %2854 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2855 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2855, align 8 -// CHECK-NEXT: %2856 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2855, 1 -// CHECK-NEXT: %2857 = extractvalue { ptr, ptr } %2854, 1 -// CHECK-NEXT: %2858 = extractvalue { ptr, ptr } %2854, 0 -// CHECK-NEXT: %__llgo_funcval_code379 = call ptr asm "", "=r,0"(ptr %2858) -// CHECK-NEXT: %2859 = call %reflect.Value %__llgo_funcval_code379(ptr {{(nest|swiftself)}} %2857, %"{{.*}}/runtime/internal/runtime.eface" %2856) -// CHECK-NEXT: store %reflect.Value %2852, ptr %2846, align 8 -// CHECK-NEXT: store %reflect.Value %2859, ptr %2853, align 8 -// CHECK-NEXT: %2860 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 190 -// CHECK-NEXT: %2861 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2860, i32 0, i32 0 -// CHECK-NEXT: %2862 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2863 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %2863, align 4 -// CHECK-NEXT: %2864 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %2863, 1 -// CHECK-NEXT: %2865 = extractvalue { ptr, ptr } %2862, 1 -// CHECK-NEXT: %2866 = extractvalue { ptr, ptr } %2862, 0 -// CHECK-NEXT: %__llgo_funcval_code380 = call ptr asm "", "=r,0"(ptr %2866) -// CHECK-NEXT: %2867 = call %reflect.Value %__llgo_funcval_code380(ptr {{(nest|swiftself)}} %2865, %"{{.*}}/runtime/internal/runtime.eface" %2864) -// CHECK-NEXT: %2868 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2860, i32 0, i32 1 -// CHECK-NEXT: %2869 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2870 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2870, align 8 -// CHECK-NEXT: %2871 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2870, 1 -// CHECK-NEXT: %2872 = extractvalue { ptr, ptr } %2869, 1 -// CHECK-NEXT: %2873 = extractvalue { ptr, ptr } %2869, 0 -// CHECK-NEXT: %__llgo_funcval_code381 = call ptr asm "", "=r,0"(ptr %2873) -// CHECK-NEXT: %2874 = call %reflect.Value %__llgo_funcval_code381(ptr {{(nest|swiftself)}} %2872, %"{{.*}}/runtime/internal/runtime.eface" %2871) -// CHECK-NEXT: store %reflect.Value %2867, ptr %2861, align 8 -// CHECK-NEXT: store %reflect.Value %2874, ptr %2868, align 8 -// CHECK-NEXT: %2875 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 191 -// CHECK-NEXT: %2876 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2875, i32 0, i32 0 -// CHECK-NEXT: %2877 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2878 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %2878, align 8 -// CHECK-NEXT: %2879 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %2878, 1 -// CHECK-NEXT: %2880 = extractvalue { ptr, ptr } %2877, 1 -// CHECK-NEXT: %2881 = extractvalue { ptr, ptr } %2877, 0 -// CHECK-NEXT: %__llgo_funcval_code382 = call ptr asm "", "=r,0"(ptr %2881) -// CHECK-NEXT: %2882 = call %reflect.Value %__llgo_funcval_code382(ptr {{(nest|swiftself)}} %2880, %"{{.*}}/runtime/internal/runtime.eface" %2879) -// CHECK-NEXT: %2883 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2875, i32 0, i32 1 -// CHECK-NEXT: %2884 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2885 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2885, align 8 -// CHECK-NEXT: %2886 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2885, 1 -// CHECK-NEXT: %2887 = extractvalue { ptr, ptr } %2884, 1 -// CHECK-NEXT: %2888 = extractvalue { ptr, ptr } %2884, 0 -// CHECK-NEXT: %__llgo_funcval_code383 = call ptr asm "", "=r,0"(ptr %2888) -// CHECK-NEXT: %2889 = call %reflect.Value %__llgo_funcval_code383(ptr {{(nest|swiftself)}} %2887, %"{{.*}}/runtime/internal/runtime.eface" %2886) -// CHECK-NEXT: store %reflect.Value %2882, ptr %2876, align 8 -// CHECK-NEXT: store %reflect.Value %2889, ptr %2883, align 8 -// CHECK-NEXT: %2890 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 192 -// CHECK-NEXT: %2891 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2890, i32 0, i32 0 -// CHECK-NEXT: %2892 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2893 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %2893, align 8 -// CHECK-NEXT: %2894 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %2893, 1 -// CHECK-NEXT: %2895 = extractvalue { ptr, ptr } %2892, 1 -// CHECK-NEXT: %2896 = extractvalue { ptr, ptr } %2892, 0 -// CHECK-NEXT: %__llgo_funcval_code384 = call ptr asm "", "=r,0"(ptr %2896) -// CHECK-NEXT: %2897 = call %reflect.Value %__llgo_funcval_code384(ptr {{(nest|swiftself)}} %2895, %"{{.*}}/runtime/internal/runtime.eface" %2894) -// CHECK-NEXT: %2898 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2890, i32 0, i32 1 -// CHECK-NEXT: %2899 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2900 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %2900, align 8 -// CHECK-NEXT: %2901 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2900, 1 -// CHECK-NEXT: %2902 = extractvalue { ptr, ptr } %2899, 1 -// CHECK-NEXT: %2903 = extractvalue { ptr, ptr } %2899, 0 -// CHECK-NEXT: %__llgo_funcval_code385 = call ptr asm "", "=r,0"(ptr %2903) -// CHECK-NEXT: %2904 = call %reflect.Value %__llgo_funcval_code385(ptr {{(nest|swiftself)}} %2902, %"{{.*}}/runtime/internal/runtime.eface" %2901) -// CHECK-NEXT: store %reflect.Value %2897, ptr %2891, align 8 -// CHECK-NEXT: store %reflect.Value %2904, ptr %2898, align 8 -// CHECK-NEXT: %2905 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 193 -// CHECK-NEXT: %2906 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2905, i32 0, i32 0 -// CHECK-NEXT: %2907 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2908 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 -1, ptr %2908, align 8 -// CHECK-NEXT: %2909 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %2908, 1 -// CHECK-NEXT: %2910 = extractvalue { ptr, ptr } %2907, 1 -// CHECK-NEXT: %2911 = extractvalue { ptr, ptr } %2907, 0 -// CHECK-NEXT: %__llgo_funcval_code386 = call ptr asm "", "=r,0"(ptr %2911) -// CHECK-NEXT: %2912 = call %reflect.Value %__llgo_funcval_code386(ptr {{(nest|swiftself)}} %2910, %"{{.*}}/runtime/internal/runtime.eface" %2909) -// CHECK-NEXT: %2913 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2905, i32 0, i32 1 -// CHECK-NEXT: %2914 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2915 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2915, align 8 -// CHECK-NEXT: %2916 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2915, 1 -// CHECK-NEXT: %2917 = extractvalue { ptr, ptr } %2914, 1 -// CHECK-NEXT: %2918 = extractvalue { ptr, ptr } %2914, 0 -// CHECK-NEXT: %__llgo_funcval_code387 = call ptr asm "", "=r,0"(ptr %2918) -// CHECK-NEXT: %2919 = call %reflect.Value %__llgo_funcval_code387(ptr {{(nest|swiftself)}} %2917, %"{{.*}}/runtime/internal/runtime.eface" %2916) -// CHECK-NEXT: store %reflect.Value %2912, ptr %2906, align 8 -// CHECK-NEXT: store %reflect.Value %2919, ptr %2913, align 8 -// CHECK-NEXT: %2920 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 194 -// CHECK-NEXT: %2921 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2920, i32 0, i32 0 -// CHECK-NEXT: %2922 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2923 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 -2, ptr %2923, align 1 -// CHECK-NEXT: %2924 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %2923, 1 -// CHECK-NEXT: %2925 = extractvalue { ptr, ptr } %2922, 1 -// CHECK-NEXT: %2926 = extractvalue { ptr, ptr } %2922, 0 -// CHECK-NEXT: %__llgo_funcval_code388 = call ptr asm "", "=r,0"(ptr %2926) -// CHECK-NEXT: %2927 = call %reflect.Value %__llgo_funcval_code388(ptr {{(nest|swiftself)}} %2925, %"{{.*}}/runtime/internal/runtime.eface" %2924) -// CHECK-NEXT: %2928 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2920, i32 0, i32 1 -// CHECK-NEXT: %2929 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2930 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2930, align 8 -// CHECK-NEXT: %2931 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2930, 1 -// CHECK-NEXT: %2932 = extractvalue { ptr, ptr } %2929, 1 -// CHECK-NEXT: %2933 = extractvalue { ptr, ptr } %2929, 0 -// CHECK-NEXT: %__llgo_funcval_code389 = call ptr asm "", "=r,0"(ptr %2933) -// CHECK-NEXT: %2934 = call %reflect.Value %__llgo_funcval_code389(ptr {{(nest|swiftself)}} %2932, %"{{.*}}/runtime/internal/runtime.eface" %2931) -// CHECK-NEXT: store %reflect.Value %2927, ptr %2921, align 8 -// CHECK-NEXT: store %reflect.Value %2934, ptr %2928, align 8 -// CHECK-NEXT: %2935 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 195 -// CHECK-NEXT: %2936 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2935, i32 0, i32 0 -// CHECK-NEXT: %2937 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2938 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 -3, ptr %2938, align 2 -// CHECK-NEXT: %2939 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %2938, 1 -// CHECK-NEXT: %2940 = extractvalue { ptr, ptr } %2937, 1 -// CHECK-NEXT: %2941 = extractvalue { ptr, ptr } %2937, 0 -// CHECK-NEXT: %__llgo_funcval_code390 = call ptr asm "", "=r,0"(ptr %2941) -// CHECK-NEXT: %2942 = call %reflect.Value %__llgo_funcval_code390(ptr {{(nest|swiftself)}} %2940, %"{{.*}}/runtime/internal/runtime.eface" %2939) -// CHECK-NEXT: %2943 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2935, i32 0, i32 1 -// CHECK-NEXT: %2944 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2945 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2945, align 8 -// CHECK-NEXT: %2946 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2945, 1 -// CHECK-NEXT: %2947 = extractvalue { ptr, ptr } %2944, 1 -// CHECK-NEXT: %2948 = extractvalue { ptr, ptr } %2944, 0 -// CHECK-NEXT: %__llgo_funcval_code391 = call ptr asm "", "=r,0"(ptr %2948) -// CHECK-NEXT: %2949 = call %reflect.Value %__llgo_funcval_code391(ptr {{(nest|swiftself)}} %2947, %"{{.*}}/runtime/internal/runtime.eface" %2946) -// CHECK-NEXT: store %reflect.Value %2942, ptr %2936, align 8 -// CHECK-NEXT: store %reflect.Value %2949, ptr %2943, align 8 -// CHECK-NEXT: %2950 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 196 -// CHECK-NEXT: %2951 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2950, i32 0, i32 0 -// CHECK-NEXT: %2952 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2953 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 -4, ptr %2953, align 4 -// CHECK-NEXT: %2954 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %2953, 1 -// CHECK-NEXT: %2955 = extractvalue { ptr, ptr } %2952, 1 -// CHECK-NEXT: %2956 = extractvalue { ptr, ptr } %2952, 0 -// CHECK-NEXT: %__llgo_funcval_code392 = call ptr asm "", "=r,0"(ptr %2956) -// CHECK-NEXT: %2957 = call %reflect.Value %__llgo_funcval_code392(ptr {{(nest|swiftself)}} %2955, %"{{.*}}/runtime/internal/runtime.eface" %2954) -// CHECK-NEXT: %2958 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2950, i32 0, i32 1 -// CHECK-NEXT: %2959 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2960 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2960, align 8 -// CHECK-NEXT: %2961 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2960, 1 -// CHECK-NEXT: %2962 = extractvalue { ptr, ptr } %2959, 1 -// CHECK-NEXT: %2963 = extractvalue { ptr, ptr } %2959, 0 -// CHECK-NEXT: %__llgo_funcval_code393 = call ptr asm "", "=r,0"(ptr %2963) -// CHECK-NEXT: %2964 = call %reflect.Value %__llgo_funcval_code393(ptr {{(nest|swiftself)}} %2962, %"{{.*}}/runtime/internal/runtime.eface" %2961) -// CHECK-NEXT: store %reflect.Value %2957, ptr %2951, align 8 -// CHECK-NEXT: store %reflect.Value %2964, ptr %2958, align 8 -// CHECK-NEXT: %2965 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 197 -// CHECK-NEXT: %2966 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2965, i32 0, i32 0 -// CHECK-NEXT: %2967 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2968 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 -5, ptr %2968, align 8 -// CHECK-NEXT: %2969 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %2968, 1 -// CHECK-NEXT: %2970 = extractvalue { ptr, ptr } %2967, 1 -// CHECK-NEXT: %2971 = extractvalue { ptr, ptr } %2967, 0 -// CHECK-NEXT: %__llgo_funcval_code394 = call ptr asm "", "=r,0"(ptr %2971) -// CHECK-NEXT: %2972 = call %reflect.Value %__llgo_funcval_code394(ptr {{(nest|swiftself)}} %2970, %"{{.*}}/runtime/internal/runtime.eface" %2969) -// CHECK-NEXT: %2973 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2965, i32 0, i32 1 -// CHECK-NEXT: %2974 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2975 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2975, align 8 -// CHECK-NEXT: %2976 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2975, 1 -// CHECK-NEXT: %2977 = extractvalue { ptr, ptr } %2974, 1 -// CHECK-NEXT: %2978 = extractvalue { ptr, ptr } %2974, 0 -// CHECK-NEXT: %__llgo_funcval_code395 = call ptr asm "", "=r,0"(ptr %2978) -// CHECK-NEXT: %2979 = call %reflect.Value %__llgo_funcval_code395(ptr {{(nest|swiftself)}} %2977, %"{{.*}}/runtime/internal/runtime.eface" %2976) -// CHECK-NEXT: store %reflect.Value %2972, ptr %2966, align 8 -// CHECK-NEXT: store %reflect.Value %2979, ptr %2973, align 8 -// CHECK-NEXT: %2980 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 198 -// CHECK-NEXT: %2981 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2980, i32 0, i32 0 -// CHECK-NEXT: %2982 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2983 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 -4294967296, ptr %2983, align 8 -// CHECK-NEXT: %2984 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %2983, 1 -// CHECK-NEXT: %2985 = extractvalue { ptr, ptr } %2982, 1 -// CHECK-NEXT: %2986 = extractvalue { ptr, ptr } %2982, 0 -// CHECK-NEXT: %__llgo_funcval_code396 = call ptr asm "", "=r,0"(ptr %2986) -// CHECK-NEXT: %2987 = call %reflect.Value %__llgo_funcval_code396(ptr {{(nest|swiftself)}} %2985, %"{{.*}}/runtime/internal/runtime.eface" %2984) -// CHECK-NEXT: %2988 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2980, i32 0, i32 1 -// CHECK-NEXT: %2989 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2990 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %2990, align 8 -// CHECK-NEXT: %2991 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2990, 1 -// CHECK-NEXT: %2992 = extractvalue { ptr, ptr } %2989, 1 -// CHECK-NEXT: %2993 = extractvalue { ptr, ptr } %2989, 0 -// CHECK-NEXT: %__llgo_funcval_code397 = call ptr asm "", "=r,0"(ptr %2993) -// CHECK-NEXT: %2994 = call %reflect.Value %__llgo_funcval_code397(ptr {{(nest|swiftself)}} %2992, %"{{.*}}/runtime/internal/runtime.eface" %2991) -// CHECK-NEXT: store %reflect.Value %2987, ptr %2981, align 8 -// CHECK-NEXT: store %reflect.Value %2994, ptr %2988, align 8 -// CHECK-NEXT: %2995 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 199 -// CHECK-NEXT: %2996 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2995, i32 0, i32 0 -// CHECK-NEXT: %2997 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %2998 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 4294967296, ptr %2998, align 8 -// CHECK-NEXT: %2999 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %2998, 1 -// CHECK-NEXT: %3000 = extractvalue { ptr, ptr } %2997, 1 -// CHECK-NEXT: %3001 = extractvalue { ptr, ptr } %2997, 0 -// CHECK-NEXT: %__llgo_funcval_code398 = call ptr asm "", "=r,0"(ptr %3001) -// CHECK-NEXT: %3002 = call %reflect.Value %__llgo_funcval_code398(ptr {{(nest|swiftself)}} %3000, %"{{.*}}/runtime/internal/runtime.eface" %2999) -// CHECK-NEXT: %3003 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %2995, i32 0, i32 1 -// CHECK-NEXT: %3004 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3005 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3005, align 8 -// CHECK-NEXT: %3006 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3005, 1 -// CHECK-NEXT: %3007 = extractvalue { ptr, ptr } %3004, 1 -// CHECK-NEXT: %3008 = extractvalue { ptr, ptr } %3004, 0 -// CHECK-NEXT: %__llgo_funcval_code399 = call ptr asm "", "=r,0"(ptr %3008) -// CHECK-NEXT: %3009 = call %reflect.Value %__llgo_funcval_code399(ptr {{(nest|swiftself)}} %3007, %"{{.*}}/runtime/internal/runtime.eface" %3006) -// CHECK-NEXT: store %reflect.Value %3002, ptr %2996, align 8 -// CHECK-NEXT: store %reflect.Value %3009, ptr %3003, align 8 -// CHECK-NEXT: %3010 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 200 -// CHECK-NEXT: %3011 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3010, i32 0, i32 0 -// CHECK-NEXT: %3012 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3013 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114113, ptr %3013, align 8 -// CHECK-NEXT: %3014 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %3013, 1 -// CHECK-NEXT: %3015 = extractvalue { ptr, ptr } %3012, 1 -// CHECK-NEXT: %3016 = extractvalue { ptr, ptr } %3012, 0 -// CHECK-NEXT: %__llgo_funcval_code400 = call ptr asm "", "=r,0"(ptr %3016) -// CHECK-NEXT: %3017 = call %reflect.Value %__llgo_funcval_code400(ptr {{(nest|swiftself)}} %3015, %"{{.*}}/runtime/internal/runtime.eface" %3014) -// CHECK-NEXT: %3018 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3010, i32 0, i32 1 -// CHECK-NEXT: %3019 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3020 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3020, align 8 -// CHECK-NEXT: %3021 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3020, 1 -// CHECK-NEXT: %3022 = extractvalue { ptr, ptr } %3019, 1 -// CHECK-NEXT: %3023 = extractvalue { ptr, ptr } %3019, 0 -// CHECK-NEXT: %__llgo_funcval_code401 = call ptr asm "", "=r,0"(ptr %3023) -// CHECK-NEXT: %3024 = call %reflect.Value %__llgo_funcval_code401(ptr {{(nest|swiftself)}} %3022, %"{{.*}}/runtime/internal/runtime.eface" %3021) -// CHECK-NEXT: store %reflect.Value %3017, ptr %3011, align 8 -// CHECK-NEXT: store %reflect.Value %3024, ptr %3018, align 8 -// CHECK-NEXT: %3025 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 201 -// CHECK-NEXT: %3026 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3025, i32 0, i32 0 -// CHECK-NEXT: %3027 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3028 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 1114114, ptr %3028, align 4 -// CHECK-NEXT: %3029 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %3028, 1 -// CHECK-NEXT: %3030 = extractvalue { ptr, ptr } %3027, 1 -// CHECK-NEXT: %3031 = extractvalue { ptr, ptr } %3027, 0 -// CHECK-NEXT: %__llgo_funcval_code402 = call ptr asm "", "=r,0"(ptr %3031) -// CHECK-NEXT: %3032 = call %reflect.Value %__llgo_funcval_code402(ptr {{(nest|swiftself)}} %3030, %"{{.*}}/runtime/internal/runtime.eface" %3029) -// CHECK-NEXT: %3033 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3025, i32 0, i32 1 -// CHECK-NEXT: %3034 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3035 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3035, align 8 -// CHECK-NEXT: %3036 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3035, 1 -// CHECK-NEXT: %3037 = extractvalue { ptr, ptr } %3034, 1 -// CHECK-NEXT: %3038 = extractvalue { ptr, ptr } %3034, 0 -// CHECK-NEXT: %__llgo_funcval_code403 = call ptr asm "", "=r,0"(ptr %3038) -// CHECK-NEXT: %3039 = call %reflect.Value %__llgo_funcval_code403(ptr {{(nest|swiftself)}} %3037, %"{{.*}}/runtime/internal/runtime.eface" %3036) -// CHECK-NEXT: store %reflect.Value %3032, ptr %3026, align 8 -// CHECK-NEXT: store %reflect.Value %3039, ptr %3033, align 8 -// CHECK-NEXT: %3040 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 202 -// CHECK-NEXT: %3041 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3040, i32 0, i32 0 -// CHECK-NEXT: %3042 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3043 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114115, ptr %3043, align 8 -// CHECK-NEXT: %3044 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %3043, 1 -// CHECK-NEXT: %3045 = extractvalue { ptr, ptr } %3042, 1 -// CHECK-NEXT: %3046 = extractvalue { ptr, ptr } %3042, 0 -// CHECK-NEXT: %__llgo_funcval_code404 = call ptr asm "", "=r,0"(ptr %3046) -// CHECK-NEXT: %3047 = call %reflect.Value %__llgo_funcval_code404(ptr {{(nest|swiftself)}} %3045, %"{{.*}}/runtime/internal/runtime.eface" %3044) -// CHECK-NEXT: %3048 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3040, i32 0, i32 1 -// CHECK-NEXT: %3049 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3050 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3050, align 8 -// CHECK-NEXT: %3051 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3050, 1 -// CHECK-NEXT: %3052 = extractvalue { ptr, ptr } %3049, 1 -// CHECK-NEXT: %3053 = extractvalue { ptr, ptr } %3049, 0 -// CHECK-NEXT: %__llgo_funcval_code405 = call ptr asm "", "=r,0"(ptr %3053) -// CHECK-NEXT: %3054 = call %reflect.Value %__llgo_funcval_code405(ptr {{(nest|swiftself)}} %3052, %"{{.*}}/runtime/internal/runtime.eface" %3051) -// CHECK-NEXT: store %reflect.Value %3047, ptr %3041, align 8 -// CHECK-NEXT: store %reflect.Value %3054, ptr %3048, align 8 -// CHECK-NEXT: %3055 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 203 -// CHECK-NEXT: %3056 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3055, i32 0, i32 0 -// CHECK-NEXT: %3057 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3058 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 4294967296, ptr %3058, align 8 -// CHECK-NEXT: %3059 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %3058, 1 -// CHECK-NEXT: %3060 = extractvalue { ptr, ptr } %3057, 1 -// CHECK-NEXT: %3061 = extractvalue { ptr, ptr } %3057, 0 -// CHECK-NEXT: %__llgo_funcval_code406 = call ptr asm "", "=r,0"(ptr %3061) -// CHECK-NEXT: %3062 = call %reflect.Value %__llgo_funcval_code406(ptr {{(nest|swiftself)}} %3060, %"{{.*}}/runtime/internal/runtime.eface" %3059) -// CHECK-NEXT: %3063 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3055, i32 0, i32 1 -// CHECK-NEXT: %3064 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3065 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3065, align 8 -// CHECK-NEXT: %3066 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3065, 1 -// CHECK-NEXT: %3067 = extractvalue { ptr, ptr } %3064, 1 -// CHECK-NEXT: %3068 = extractvalue { ptr, ptr } %3064, 0 -// CHECK-NEXT: %__llgo_funcval_code407 = call ptr asm "", "=r,0"(ptr %3068) -// CHECK-NEXT: %3069 = call %reflect.Value %__llgo_funcval_code407(ptr {{(nest|swiftself)}} %3067, %"{{.*}}/runtime/internal/runtime.eface" %3066) -// CHECK-NEXT: store %reflect.Value %3062, ptr %3056, align 8 -// CHECK-NEXT: store %reflect.Value %3069, ptr %3063, align 8 -// CHECK-NEXT: %3070 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 204 -// CHECK-NEXT: %3071 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3070, i32 0, i32 0 -// CHECK-NEXT: %3072 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3073 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114116, ptr %3073, align 8 -// CHECK-NEXT: %3074 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %3073, 1 -// CHECK-NEXT: %3075 = extractvalue { ptr, ptr } %3072, 1 -// CHECK-NEXT: %3076 = extractvalue { ptr, ptr } %3072, 0 -// CHECK-NEXT: %__llgo_funcval_code408 = call ptr asm "", "=r,0"(ptr %3076) -// CHECK-NEXT: %3077 = call %reflect.Value %__llgo_funcval_code408(ptr {{(nest|swiftself)}} %3075, %"{{.*}}/runtime/internal/runtime.eface" %3074) -// CHECK-NEXT: %3078 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3070, i32 0, i32 1 -// CHECK-NEXT: %3079 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3080 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3080, align 8 -// CHECK-NEXT: %3081 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3080, 1 -// CHECK-NEXT: %3082 = extractvalue { ptr, ptr } %3079, 1 -// CHECK-NEXT: %3083 = extractvalue { ptr, ptr } %3079, 0 -// CHECK-NEXT: %__llgo_funcval_code409 = call ptr asm "", "=r,0"(ptr %3083) -// CHECK-NEXT: %3084 = call %reflect.Value %__llgo_funcval_code409(ptr {{(nest|swiftself)}} %3082, %"{{.*}}/runtime/internal/runtime.eface" %3081) -// CHECK-NEXT: store %reflect.Value %3077, ptr %3071, align 8 -// CHECK-NEXT: store %reflect.Value %3084, ptr %3078, align 8 -// CHECK-NEXT: %3085 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 205 -// CHECK-NEXT: %3086 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3085, i32 0, i32 0 -// CHECK-NEXT: %3087 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3088 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3088, align 8 -// CHECK-NEXT: %3089 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3088, 1 -// CHECK-NEXT: %3090 = extractvalue { ptr, ptr } %3087, 1 -// CHECK-NEXT: %3091 = extractvalue { ptr, ptr } %3087, 0 -// CHECK-NEXT: %__llgo_funcval_code410 = call ptr asm "", "=r,0"(ptr %3091) -// CHECK-NEXT: %3092 = call %reflect.Value %__llgo_funcval_code410(ptr {{(nest|swiftself)}} %3090, %"{{.*}}/runtime/internal/runtime.eface" %3089) -// CHECK-NEXT: %3093 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3085, i32 0, i32 1 -// CHECK-NEXT: %3094 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3095 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3095, align 8 -// CHECK-NEXT: %3096 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3095, 1 -// CHECK-NEXT: %3097 = extractvalue { ptr, ptr } %3094, 1 -// CHECK-NEXT: %3098 = extractvalue { ptr, ptr } %3094, 0 -// CHECK-NEXT: %__llgo_funcval_code411 = call ptr asm "", "=r,0"(ptr %3098) -// CHECK-NEXT: %3099 = call %reflect.Value %__llgo_funcval_code411(ptr {{(nest|swiftself)}} %3097, %"{{.*}}/runtime/internal/runtime.eface" %3096) -// CHECK-NEXT: store %reflect.Value %3092, ptr %3086, align 8 -// CHECK-NEXT: store %reflect.Value %3099, ptr %3093, align 8 -// CHECK-NEXT: %3100 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 206 -// CHECK-NEXT: %3101 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3100, i32 0, i32 0 -// CHECK-NEXT: %3102 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3103 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3103, align 8 -// CHECK-NEXT: %3104 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3103, 1 -// CHECK-NEXT: %3105 = extractvalue { ptr, ptr } %3102, 1 -// CHECK-NEXT: %3106 = extractvalue { ptr, ptr } %3102, 0 -// CHECK-NEXT: %__llgo_funcval_code412 = call ptr asm "", "=r,0"(ptr %3106) -// CHECK-NEXT: %3107 = call %reflect.Value %__llgo_funcval_code412(ptr {{(nest|swiftself)}} %3105, %"{{.*}}/runtime/internal/runtime.eface" %3104) -// CHECK-NEXT: %3108 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3100, i32 0, i32 1 -// CHECK-NEXT: %3109 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3110 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3110, align 8 -// CHECK-NEXT: %3111 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3110, 1 -// CHECK-NEXT: %3112 = extractvalue { ptr, ptr } %3109, 1 -// CHECK-NEXT: %3113 = extractvalue { ptr, ptr } %3109, 0 -// CHECK-NEXT: %__llgo_funcval_code413 = call ptr asm "", "=r,0"(ptr %3113) -// CHECK-NEXT: %3114 = call %reflect.Value %__llgo_funcval_code413(ptr {{(nest|swiftself)}} %3112, %"{{.*}}/runtime/internal/runtime.eface" %3111) -// CHECK-NEXT: store %reflect.Value %3107, ptr %3101, align 8 -// CHECK-NEXT: store %reflect.Value %3114, ptr %3108, align 8 -// CHECK-NEXT: %3115 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 207 -// CHECK-NEXT: %3116 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3115, i32 0, i32 0 -// CHECK-NEXT: %3117 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3118 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3118, align 8 -// CHECK-NEXT: %3119 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3118, 1 -// CHECK-NEXT: %3120 = extractvalue { ptr, ptr } %3117, 1 -// CHECK-NEXT: %3121 = extractvalue { ptr, ptr } %3117, 0 -// CHECK-NEXT: %__llgo_funcval_code414 = call ptr asm "", "=r,0"(ptr %3121) -// CHECK-NEXT: %3122 = call %reflect.Value %__llgo_funcval_code414(ptr {{(nest|swiftself)}} %3120, %"{{.*}}/runtime/internal/runtime.eface" %3119) -// CHECK-NEXT: %3123 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3115, i32 0, i32 1 -// CHECK-NEXT: %3124 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3125 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3125, align 8 -// CHECK-NEXT: %3126 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3125, 1 -// CHECK-NEXT: %3127 = extractvalue { ptr, ptr } %3124, 1 -// CHECK-NEXT: %3128 = extractvalue { ptr, ptr } %3124, 0 -// CHECK-NEXT: %__llgo_funcval_code415 = call ptr asm "", "=r,0"(ptr %3128) -// CHECK-NEXT: %3129 = call %reflect.Value %__llgo_funcval_code415(ptr {{(nest|swiftself)}} %3127, %"{{.*}}/runtime/internal/runtime.eface" %3126) -// CHECK-NEXT: store %reflect.Value %3122, ptr %3116, align 8 -// CHECK-NEXT: store %reflect.Value %3129, ptr %3123, align 8 -// CHECK-NEXT: %3130 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 208 -// CHECK-NEXT: %3131 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3130, i32 0, i32 0 -// CHECK-NEXT: %3132 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3133 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3133, align 8 -// CHECK-NEXT: %3134 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3133, 1 -// CHECK-NEXT: %3135 = extractvalue { ptr, ptr } %3132, 1 -// CHECK-NEXT: %3136 = extractvalue { ptr, ptr } %3132, 0 -// CHECK-NEXT: %__llgo_funcval_code416 = call ptr asm "", "=r,0"(ptr %3136) -// CHECK-NEXT: %3137 = call %reflect.Value %__llgo_funcval_code416(ptr {{(nest|swiftself)}} %3135, %"{{.*}}/runtime/internal/runtime.eface" %3134) -// CHECK-NEXT: %3138 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3130, i32 0, i32 1 -// CHECK-NEXT: %3139 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3140 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %3140, align 8 -// CHECK-NEXT: %3141 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3140, 1 -// CHECK-NEXT: %3142 = extractvalue { ptr, ptr } %3139, 1 -// CHECK-NEXT: %3143 = extractvalue { ptr, ptr } %3139, 0 -// CHECK-NEXT: %__llgo_funcval_code417 = call ptr asm "", "=r,0"(ptr %3143) -// CHECK-NEXT: %3144 = call %reflect.Value %__llgo_funcval_code417(ptr {{(nest|swiftself)}} %3142, %"{{.*}}/runtime/internal/runtime.eface" %3141) -// CHECK-NEXT: store %reflect.Value %3137, ptr %3131, align 8 -// CHECK-NEXT: store %reflect.Value %3144, ptr %3138, align 8 -// CHECK-NEXT: %3145 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 209 -// CHECK-NEXT: %3146 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3145, i32 0, i32 0 -// CHECK-NEXT: %3147 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3148 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }, ptr %3148, align 8 -// CHECK-NEXT: %3149 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3148, 1 -// CHECK-NEXT: %3150 = extractvalue { ptr, ptr } %3147, 1 -// CHECK-NEXT: %3151 = extractvalue { ptr, ptr } %3147, 0 -// CHECK-NEXT: %__llgo_funcval_code418 = call ptr asm "", "=r,0"(ptr %3151) -// CHECK-NEXT: %3152 = call %reflect.Value %__llgo_funcval_code418(ptr {{(nest|swiftself)}} %3150, %"{{.*}}/runtime/internal/runtime.eface" %3149) -// CHECK-NEXT: %3153 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3145, i32 0, i32 1 -// CHECK-NEXT: %3154 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3155 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }) -// CHECK-NEXT: %3156 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3155, ptr %3156, align 8 -// CHECK-NEXT: %3157 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3156, 1 -// CHECK-NEXT: %3158 = extractvalue { ptr, ptr } %3154, 1 -// CHECK-NEXT: %3159 = extractvalue { ptr, ptr } %3154, 0 -// CHECK-NEXT: %__llgo_funcval_code419 = call ptr asm "", "=r,0"(ptr %3159) -// CHECK-NEXT: %3160 = call %reflect.Value %__llgo_funcval_code419(ptr {{(nest|swiftself)}} %3158, %"{{.*}}/runtime/internal/runtime.eface" %3157) -// CHECK-NEXT: store %reflect.Value %3152, ptr %3146, align 8 -// CHECK-NEXT: store %reflect.Value %3160, ptr %3153, align 8 -// CHECK-NEXT: %3161 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 210 -// CHECK-NEXT: %3162 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3161, i32 0, i32 0 -// CHECK-NEXT: %3163 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3164 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }) -// CHECK-NEXT: %3165 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3164, ptr %3165, align 8 -// CHECK-NEXT: %3166 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3165, 1 -// CHECK-NEXT: %3167 = extractvalue { ptr, ptr } %3163, 1 -// CHECK-NEXT: %3168 = extractvalue { ptr, ptr } %3163, 0 -// CHECK-NEXT: %__llgo_funcval_code420 = call ptr asm "", "=r,0"(ptr %3168) -// CHECK-NEXT: %3169 = call %reflect.Value %__llgo_funcval_code420(ptr {{(nest|swiftself)}} %3167, %"{{.*}}/runtime/internal/runtime.eface" %3166) -// CHECK-NEXT: %3170 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3161, i32 0, i32 1 -// CHECK-NEXT: %3171 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3172 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }, ptr %3172, align 8 -// CHECK-NEXT: %3173 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3172, 1 -// CHECK-NEXT: %3174 = extractvalue { ptr, ptr } %3171, 1 -// CHECK-NEXT: %3175 = extractvalue { ptr, ptr } %3171, 0 -// CHECK-NEXT: %__llgo_funcval_code421 = call ptr asm "", "=r,0"(ptr %3175) -// CHECK-NEXT: %3176 = call %reflect.Value %__llgo_funcval_code421(ptr {{(nest|swiftself)}} %3174, %"{{.*}}/runtime/internal/runtime.eface" %3173) -// CHECK-NEXT: store %reflect.Value %3169, ptr %3162, align 8 -// CHECK-NEXT: store %reflect.Value %3176, ptr %3170, align 8 -// CHECK-NEXT: %3177 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 211 -// CHECK-NEXT: %3178 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3177, i32 0, i32 0 -// CHECK-NEXT: %3179 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3180 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %3181 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3180, ptr %3181, align 8 -// CHECK-NEXT: %3182 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3181, 1 -// CHECK-NEXT: %3183 = extractvalue { ptr, ptr } %3179, 1 -// CHECK-NEXT: %3184 = extractvalue { ptr, ptr } %3179, 0 -// CHECK-NEXT: %__llgo_funcval_code422 = call ptr asm "", "=r,0"(ptr %3184) -// CHECK-NEXT: %3185 = call %reflect.Value %__llgo_funcval_code422(ptr {{(nest|swiftself)}} %3183, %"{{.*}}/runtime/internal/runtime.eface" %3182) -// CHECK-NEXT: %3186 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3177, i32 0, i32 1 -// CHECK-NEXT: %3187 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3188 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %3189 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3188, ptr %3189, align 8 -// CHECK-NEXT: %3190 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3189, 1 -// CHECK-NEXT: %3191 = extractvalue { ptr, ptr } %3187, 1 -// CHECK-NEXT: %3192 = extractvalue { ptr, ptr } %3187, 0 -// CHECK-NEXT: %__llgo_funcval_code423 = call ptr asm "", "=r,0"(ptr %3192) -// CHECK-NEXT: %3193 = call %reflect.Value %__llgo_funcval_code423(ptr {{(nest|swiftself)}} %3191, %"{{.*}}/runtime/internal/runtime.eface" %3190) -// CHECK-NEXT: store %reflect.Value %3185, ptr %3178, align 8 -// CHECK-NEXT: store %reflect.Value %3193, ptr %3186, align 8 -// CHECK-NEXT: %3194 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 212 -// CHECK-NEXT: %3195 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3194, i32 0, i32 0 -// CHECK-NEXT: %3196 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3197 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }, ptr %3197, align 8 -// CHECK-NEXT: %3198 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3197, 1 -// CHECK-NEXT: %3199 = extractvalue { ptr, ptr } %3196, 1 -// CHECK-NEXT: %3200 = extractvalue { ptr, ptr } %3196, 0 -// CHECK-NEXT: %__llgo_funcval_code424 = call ptr asm "", "=r,0"(ptr %3200) -// CHECK-NEXT: %3201 = call %reflect.Value %__llgo_funcval_code424(ptr {{(nest|swiftself)}} %3199, %"{{.*}}/runtime/internal/runtime.eface" %3198) -// CHECK-NEXT: %3202 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3194, i32 0, i32 1 -// CHECK-NEXT: %3203 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3204 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }) -// CHECK-NEXT: %3205 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3204, ptr %3205, align 8 -// CHECK-NEXT: %3206 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3205, 1 -// CHECK-NEXT: %3207 = extractvalue { ptr, ptr } %3203, 1 -// CHECK-NEXT: %3208 = extractvalue { ptr, ptr } %3203, 0 -// CHECK-NEXT: %__llgo_funcval_code425 = call ptr asm "", "=r,0"(ptr %3208) -// CHECK-NEXT: %3209 = call %reflect.Value %__llgo_funcval_code425(ptr {{(nest|swiftself)}} %3207, %"{{.*}}/runtime/internal/runtime.eface" %3206) -// CHECK-NEXT: store %reflect.Value %3201, ptr %3195, align 8 -// CHECK-NEXT: store %reflect.Value %3209, ptr %3202, align 8 -// CHECK-NEXT: %3210 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 213 -// CHECK-NEXT: %3211 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3210, i32 0, i32 0 -// CHECK-NEXT: %3212 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3213 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }) -// CHECK-NEXT: %3214 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3213, ptr %3214, align 8 -// CHECK-NEXT: %3215 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3214, 1 -// CHECK-NEXT: %3216 = extractvalue { ptr, ptr } %3212, 1 -// CHECK-NEXT: %3217 = extractvalue { ptr, ptr } %3212, 0 -// CHECK-NEXT: %__llgo_funcval_code426 = call ptr asm "", "=r,0"(ptr %3217) -// CHECK-NEXT: %3218 = call %reflect.Value %__llgo_funcval_code426(ptr {{(nest|swiftself)}} %3216, %"{{.*}}/runtime/internal/runtime.eface" %3215) -// CHECK-NEXT: %3219 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3210, i32 0, i32 1 -// CHECK-NEXT: %3220 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3221 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }, ptr %3221, align 8 -// CHECK-NEXT: %3222 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3221, 1 -// CHECK-NEXT: %3223 = extractvalue { ptr, ptr } %3220, 1 -// CHECK-NEXT: %3224 = extractvalue { ptr, ptr } %3220, 0 -// CHECK-NEXT: %__llgo_funcval_code427 = call ptr asm "", "=r,0"(ptr %3224) -// CHECK-NEXT: %3225 = call %reflect.Value %__llgo_funcval_code427(ptr {{(nest|swiftself)}} %3223, %"{{.*}}/runtime/internal/runtime.eface" %3222) -// CHECK-NEXT: store %reflect.Value %3218, ptr %3211, align 8 -// CHECK-NEXT: store %reflect.Value %3225, ptr %3219, align 8 -// CHECK-NEXT: %3226 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 214 -// CHECK-NEXT: %3227 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3226, i32 0, i32 0 -// CHECK-NEXT: %3228 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3229 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3230 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3229, ptr %3230, align 8 -// CHECK-NEXT: %3231 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3230, 1 -// CHECK-NEXT: %3232 = extractvalue { ptr, ptr } %3228, 1 -// CHECK-NEXT: %3233 = extractvalue { ptr, ptr } %3228, 0 -// CHECK-NEXT: %__llgo_funcval_code428 = call ptr asm "", "=r,0"(ptr %3233) -// CHECK-NEXT: %3234 = call %reflect.Value %__llgo_funcval_code428(ptr {{(nest|swiftself)}} %3232, %"{{.*}}/runtime/internal/runtime.eface" %3231) -// CHECK-NEXT: %3235 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3226, i32 0, i32 1 -// CHECK-NEXT: %3236 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3237 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3238 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3237, ptr %3238, align 8 -// CHECK-NEXT: %3239 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3238, 1 -// CHECK-NEXT: %3240 = extractvalue { ptr, ptr } %3236, 1 -// CHECK-NEXT: %3241 = extractvalue { ptr, ptr } %3236, 0 -// CHECK-NEXT: %__llgo_funcval_code429 = call ptr asm "", "=r,0"(ptr %3241) -// CHECK-NEXT: %3242 = call %reflect.Value %__llgo_funcval_code429(ptr {{(nest|swiftself)}} %3240, %"{{.*}}/runtime/internal/runtime.eface" %3239) -// CHECK-NEXT: store %reflect.Value %3234, ptr %3227, align 8 -// CHECK-NEXT: store %reflect.Value %3242, ptr %3235, align 8 -// CHECK-NEXT: %3243 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 215 -// CHECK-NEXT: %3244 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3243, i32 0, i32 0 -// CHECK-NEXT: %3245 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3246 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3247 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3246, ptr %3247, align 8 -// CHECK-NEXT: %3248 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3247, 1 -// CHECK-NEXT: %3249 = extractvalue { ptr, ptr } %3245, 1 -// CHECK-NEXT: %3250 = extractvalue { ptr, ptr } %3245, 0 -// CHECK-NEXT: %__llgo_funcval_code430 = call ptr asm "", "=r,0"(ptr %3250) -// CHECK-NEXT: %3251 = call %reflect.Value %__llgo_funcval_code430(ptr {{(nest|swiftself)}} %3249, %"{{.*}}/runtime/internal/runtime.eface" %3248) -// CHECK-NEXT: %3252 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3243, i32 0, i32 1 -// CHECK-NEXT: %3253 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3254 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3255 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3254, ptr %3255, align 8 -// CHECK-NEXT: %3256 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3255, 1 -// CHECK-NEXT: %3257 = extractvalue { ptr, ptr } %3253, 1 -// CHECK-NEXT: %3258 = extractvalue { ptr, ptr } %3253, 0 -// CHECK-NEXT: %__llgo_funcval_code431 = call ptr asm "", "=r,0"(ptr %3258) -// CHECK-NEXT: %3259 = call %reflect.Value %__llgo_funcval_code431(ptr {{(nest|swiftself)}} %3257, %"{{.*}}/runtime/internal/runtime.eface" %3256) -// CHECK-NEXT: store %reflect.Value %3251, ptr %3244, align 8 -// CHECK-NEXT: store %reflect.Value %3259, ptr %3252, align 8 -// CHECK-NEXT: %3260 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 216 -// CHECK-NEXT: %3261 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3260, i32 0, i32 0 -// CHECK-NEXT: %3262 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3263 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3264 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3263, ptr %3264, align 8 -// CHECK-NEXT: %3265 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3264, 1 -// CHECK-NEXT: %3266 = extractvalue { ptr, ptr } %3262, 1 -// CHECK-NEXT: %3267 = extractvalue { ptr, ptr } %3262, 0 -// CHECK-NEXT: %__llgo_funcval_code432 = call ptr asm "", "=r,0"(ptr %3267) -// CHECK-NEXT: %3268 = call %reflect.Value %__llgo_funcval_code432(ptr {{(nest|swiftself)}} %3266, %"{{.*}}/runtime/internal/runtime.eface" %3265) -// CHECK-NEXT: %3269 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3260, i32 0, i32 1 -// CHECK-NEXT: %3270 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3271 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3272 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3271, ptr %3272, align 8 -// CHECK-NEXT: %3273 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int32", ptr undef }, ptr %3272, 1 -// CHECK-NEXT: %3274 = extractvalue { ptr, ptr } %3270, 1 -// CHECK-NEXT: %3275 = extractvalue { ptr, ptr } %3270, 0 -// CHECK-NEXT: %__llgo_funcval_code433 = call ptr asm "", "=r,0"(ptr %3275) -// CHECK-NEXT: %3276 = call %reflect.Value %__llgo_funcval_code433(ptr {{(nest|swiftself)}} %3274, %"{{.*}}/runtime/internal/runtime.eface" %3273) -// CHECK-NEXT: store %reflect.Value %3268, ptr %3261, align 8 -// CHECK-NEXT: store %reflect.Value %3276, ptr %3269, align 8 -// CHECK-NEXT: %3277 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 217 -// CHECK-NEXT: %3278 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3277, i32 0, i32 0 -// CHECK-NEXT: %3279 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3280 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %3280, align 8 -// CHECK-NEXT: %3281 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %3280, 1 -// CHECK-NEXT: %3282 = extractvalue { ptr, ptr } %3279, 1 -// CHECK-NEXT: %3283 = extractvalue { ptr, ptr } %3279, 0 -// CHECK-NEXT: %__llgo_funcval_code434 = call ptr asm "", "=r,0"(ptr %3283) -// CHECK-NEXT: %3284 = call %reflect.Value %__llgo_funcval_code434(ptr {{(nest|swiftself)}} %3282, %"{{.*}}/runtime/internal/runtime.eface" %3281) -// CHECK-NEXT: %3285 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3277, i32 0, i32 1 -// CHECK-NEXT: %3286 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3287 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3287, align 8 -// CHECK-NEXT: %3288 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3287, 1 -// CHECK-NEXT: %3289 = extractvalue { ptr, ptr } %3286, 1 -// CHECK-NEXT: %3290 = extractvalue { ptr, ptr } %3286, 0 -// CHECK-NEXT: %__llgo_funcval_code435 = call ptr asm "", "=r,0"(ptr %3290) -// CHECK-NEXT: %3291 = call %reflect.Value %__llgo_funcval_code435(ptr {{(nest|swiftself)}} %3289, %"{{.*}}/runtime/internal/runtime.eface" %3288) -// CHECK-NEXT: store %reflect.Value %3284, ptr %3278, align 8 -// CHECK-NEXT: store %reflect.Value %3291, ptr %3285, align 8 -// CHECK-NEXT: %3292 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 218 -// CHECK-NEXT: %3293 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3292, i32 0, i32 0 -// CHECK-NEXT: %3294 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3295 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 97, ptr %3295, align 1 -// CHECK-NEXT: %3296 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %3295, 1 -// CHECK-NEXT: %3297 = extractvalue { ptr, ptr } %3294, 1 -// CHECK-NEXT: %3298 = extractvalue { ptr, ptr } %3294, 0 -// CHECK-NEXT: %__llgo_funcval_code436 = call ptr asm "", "=r,0"(ptr %3298) -// CHECK-NEXT: %3299 = call %reflect.Value %__llgo_funcval_code436(ptr {{(nest|swiftself)}} %3297, %"{{.*}}/runtime/internal/runtime.eface" %3296) -// CHECK-NEXT: %3300 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3292, i32 0, i32 1 -// CHECK-NEXT: %3301 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3302 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3302, align 8 -// CHECK-NEXT: %3303 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3302, 1 -// CHECK-NEXT: %3304 = extractvalue { ptr, ptr } %3301, 1 -// CHECK-NEXT: %3305 = extractvalue { ptr, ptr } %3301, 0 -// CHECK-NEXT: %__llgo_funcval_code437 = call ptr asm "", "=r,0"(ptr %3305) -// CHECK-NEXT: %3306 = call %reflect.Value %__llgo_funcval_code437(ptr {{(nest|swiftself)}} %3304, %"{{.*}}/runtime/internal/runtime.eface" %3303) -// CHECK-NEXT: store %reflect.Value %3299, ptr %3293, align 8 -// CHECK-NEXT: store %reflect.Value %3306, ptr %3300, align 8 -// CHECK-NEXT: %3307 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 219 -// CHECK-NEXT: %3308 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3307, i32 0, i32 0 -// CHECK-NEXT: %3309 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3310 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 97, ptr %3310, align 2 -// CHECK-NEXT: %3311 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %3310, 1 -// CHECK-NEXT: %3312 = extractvalue { ptr, ptr } %3309, 1 -// CHECK-NEXT: %3313 = extractvalue { ptr, ptr } %3309, 0 -// CHECK-NEXT: %__llgo_funcval_code438 = call ptr asm "", "=r,0"(ptr %3313) -// CHECK-NEXT: %3314 = call %reflect.Value %__llgo_funcval_code438(ptr {{(nest|swiftself)}} %3312, %"{{.*}}/runtime/internal/runtime.eface" %3311) -// CHECK-NEXT: %3315 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3307, i32 0, i32 1 -// CHECK-NEXT: %3316 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3317 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3317, align 8 -// CHECK-NEXT: %3318 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3317, 1 -// CHECK-NEXT: %3319 = extractvalue { ptr, ptr } %3316, 1 -// CHECK-NEXT: %3320 = extractvalue { ptr, ptr } %3316, 0 -// CHECK-NEXT: %__llgo_funcval_code439 = call ptr asm "", "=r,0"(ptr %3320) -// CHECK-NEXT: %3321 = call %reflect.Value %__llgo_funcval_code439(ptr {{(nest|swiftself)}} %3319, %"{{.*}}/runtime/internal/runtime.eface" %3318) -// CHECK-NEXT: store %reflect.Value %3314, ptr %3308, align 8 -// CHECK-NEXT: store %reflect.Value %3321, ptr %3315, align 8 -// CHECK-NEXT: %3322 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 220 -// CHECK-NEXT: %3323 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3322, i32 0, i32 0 -// CHECK-NEXT: %3324 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3325 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %3325, align 4 -// CHECK-NEXT: %3326 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %3325, 1 -// CHECK-NEXT: %3327 = extractvalue { ptr, ptr } %3324, 1 -// CHECK-NEXT: %3328 = extractvalue { ptr, ptr } %3324, 0 -// CHECK-NEXT: %__llgo_funcval_code440 = call ptr asm "", "=r,0"(ptr %3328) -// CHECK-NEXT: %3329 = call %reflect.Value %__llgo_funcval_code440(ptr {{(nest|swiftself)}} %3327, %"{{.*}}/runtime/internal/runtime.eface" %3326) -// CHECK-NEXT: %3330 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3322, i32 0, i32 1 -// CHECK-NEXT: %3331 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3332 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3332, align 8 -// CHECK-NEXT: %3333 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3332, 1 -// CHECK-NEXT: %3334 = extractvalue { ptr, ptr } %3331, 1 -// CHECK-NEXT: %3335 = extractvalue { ptr, ptr } %3331, 0 -// CHECK-NEXT: %__llgo_funcval_code441 = call ptr asm "", "=r,0"(ptr %3335) -// CHECK-NEXT: %3336 = call %reflect.Value %__llgo_funcval_code441(ptr {{(nest|swiftself)}} %3334, %"{{.*}}/runtime/internal/runtime.eface" %3333) -// CHECK-NEXT: store %reflect.Value %3329, ptr %3323, align 8 -// CHECK-NEXT: store %reflect.Value %3336, ptr %3330, align 8 -// CHECK-NEXT: %3337 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 221 -// CHECK-NEXT: %3338 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3337, i32 0, i32 0 -// CHECK-NEXT: %3339 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3340 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %3340, align 8 -// CHECK-NEXT: %3341 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %3340, 1 -// CHECK-NEXT: %3342 = extractvalue { ptr, ptr } %3339, 1 -// CHECK-NEXT: %3343 = extractvalue { ptr, ptr } %3339, 0 -// CHECK-NEXT: %__llgo_funcval_code442 = call ptr asm "", "=r,0"(ptr %3343) -// CHECK-NEXT: %3344 = call %reflect.Value %__llgo_funcval_code442(ptr {{(nest|swiftself)}} %3342, %"{{.*}}/runtime/internal/runtime.eface" %3341) -// CHECK-NEXT: %3345 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3337, i32 0, i32 1 -// CHECK-NEXT: %3346 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3347 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3347, align 8 -// CHECK-NEXT: %3348 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3347, 1 -// CHECK-NEXT: %3349 = extractvalue { ptr, ptr } %3346, 1 -// CHECK-NEXT: %3350 = extractvalue { ptr, ptr } %3346, 0 -// CHECK-NEXT: %__llgo_funcval_code443 = call ptr asm "", "=r,0"(ptr %3350) -// CHECK-NEXT: %3351 = call %reflect.Value %__llgo_funcval_code443(ptr {{(nest|swiftself)}} %3349, %"{{.*}}/runtime/internal/runtime.eface" %3348) -// CHECK-NEXT: store %reflect.Value %3344, ptr %3338, align 8 -// CHECK-NEXT: store %reflect.Value %3351, ptr %3345, align 8 -// CHECK-NEXT: %3352 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 222 -// CHECK-NEXT: %3353 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3352, i32 0, i32 0 -// CHECK-NEXT: %3354 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3355 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %3355, align 8 -// CHECK-NEXT: %3356 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %3355, 1 -// CHECK-NEXT: %3357 = extractvalue { ptr, ptr } %3354, 1 -// CHECK-NEXT: %3358 = extractvalue { ptr, ptr } %3354, 0 -// CHECK-NEXT: %__llgo_funcval_code444 = call ptr asm "", "=r,0"(ptr %3358) -// CHECK-NEXT: %3359 = call %reflect.Value %__llgo_funcval_code444(ptr {{(nest|swiftself)}} %3357, %"{{.*}}/runtime/internal/runtime.eface" %3356) -// CHECK-NEXT: %3360 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3352, i32 0, i32 1 -// CHECK-NEXT: %3361 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3362 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3362, align 8 -// CHECK-NEXT: %3363 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3362, 1 -// CHECK-NEXT: %3364 = extractvalue { ptr, ptr } %3361, 1 -// CHECK-NEXT: %3365 = extractvalue { ptr, ptr } %3361, 0 -// CHECK-NEXT: %__llgo_funcval_code445 = call ptr asm "", "=r,0"(ptr %3365) -// CHECK-NEXT: %3366 = call %reflect.Value %__llgo_funcval_code445(ptr {{(nest|swiftself)}} %3364, %"{{.*}}/runtime/internal/runtime.eface" %3363) -// CHECK-NEXT: store %reflect.Value %3359, ptr %3353, align 8 -// CHECK-NEXT: store %reflect.Value %3366, ptr %3360, align 8 -// CHECK-NEXT: %3367 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 223 -// CHECK-NEXT: %3368 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3367, i32 0, i32 0 -// CHECK-NEXT: %3369 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3370 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 97, ptr %3370, align 1 -// CHECK-NEXT: %3371 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %3370, 1 -// CHECK-NEXT: %3372 = extractvalue { ptr, ptr } %3369, 1 -// CHECK-NEXT: %3373 = extractvalue { ptr, ptr } %3369, 0 -// CHECK-NEXT: %__llgo_funcval_code446 = call ptr asm "", "=r,0"(ptr %3373) -// CHECK-NEXT: %3374 = call %reflect.Value %__llgo_funcval_code446(ptr {{(nest|swiftself)}} %3372, %"{{.*}}/runtime/internal/runtime.eface" %3371) -// CHECK-NEXT: %3375 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3367, i32 0, i32 1 -// CHECK-NEXT: %3376 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3377 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3377, align 8 -// CHECK-NEXT: %3378 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3377, 1 -// CHECK-NEXT: %3379 = extractvalue { ptr, ptr } %3376, 1 -// CHECK-NEXT: %3380 = extractvalue { ptr, ptr } %3376, 0 -// CHECK-NEXT: %__llgo_funcval_code447 = call ptr asm "", "=r,0"(ptr %3380) -// CHECK-NEXT: %3381 = call %reflect.Value %__llgo_funcval_code447(ptr {{(nest|swiftself)}} %3379, %"{{.*}}/runtime/internal/runtime.eface" %3378) -// CHECK-NEXT: store %reflect.Value %3374, ptr %3368, align 8 -// CHECK-NEXT: store %reflect.Value %3381, ptr %3375, align 8 -// CHECK-NEXT: %3382 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 224 -// CHECK-NEXT: %3383 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3382, i32 0, i32 0 -// CHECK-NEXT: %3384 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3385 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 97, ptr %3385, align 2 -// CHECK-NEXT: %3386 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint16, ptr undef }, ptr %3385, 1 -// CHECK-NEXT: %3387 = extractvalue { ptr, ptr } %3384, 1 -// CHECK-NEXT: %3388 = extractvalue { ptr, ptr } %3384, 0 -// CHECK-NEXT: %__llgo_funcval_code448 = call ptr asm "", "=r,0"(ptr %3388) -// CHECK-NEXT: %3389 = call %reflect.Value %__llgo_funcval_code448(ptr {{(nest|swiftself)}} %3387, %"{{.*}}/runtime/internal/runtime.eface" %3386) -// CHECK-NEXT: %3390 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3382, i32 0, i32 1 -// CHECK-NEXT: %3391 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3392 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3392, align 8 -// CHECK-NEXT: %3393 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3392, 1 -// CHECK-NEXT: %3394 = extractvalue { ptr, ptr } %3391, 1 -// CHECK-NEXT: %3395 = extractvalue { ptr, ptr } %3391, 0 -// CHECK-NEXT: %__llgo_funcval_code449 = call ptr asm "", "=r,0"(ptr %3395) -// CHECK-NEXT: %3396 = call %reflect.Value %__llgo_funcval_code449(ptr {{(nest|swiftself)}} %3394, %"{{.*}}/runtime/internal/runtime.eface" %3393) -// CHECK-NEXT: store %reflect.Value %3389, ptr %3383, align 8 -// CHECK-NEXT: store %reflect.Value %3396, ptr %3390, align 8 -// CHECK-NEXT: %3397 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 225 -// CHECK-NEXT: %3398 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3397, i32 0, i32 0 -// CHECK-NEXT: %3399 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3400 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 97, ptr %3400, align 4 -// CHECK-NEXT: %3401 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %3400, 1 -// CHECK-NEXT: %3402 = extractvalue { ptr, ptr } %3399, 1 -// CHECK-NEXT: %3403 = extractvalue { ptr, ptr } %3399, 0 -// CHECK-NEXT: %__llgo_funcval_code450 = call ptr asm "", "=r,0"(ptr %3403) -// CHECK-NEXT: %3404 = call %reflect.Value %__llgo_funcval_code450(ptr {{(nest|swiftself)}} %3402, %"{{.*}}/runtime/internal/runtime.eface" %3401) -// CHECK-NEXT: %3405 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3397, i32 0, i32 1 -// CHECK-NEXT: %3406 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3407 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3407, align 8 -// CHECK-NEXT: %3408 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3407, 1 -// CHECK-NEXT: %3409 = extractvalue { ptr, ptr } %3406, 1 -// CHECK-NEXT: %3410 = extractvalue { ptr, ptr } %3406, 0 -// CHECK-NEXT: %__llgo_funcval_code451 = call ptr asm "", "=r,0"(ptr %3410) -// CHECK-NEXT: %3411 = call %reflect.Value %__llgo_funcval_code451(ptr {{(nest|swiftself)}} %3409, %"{{.*}}/runtime/internal/runtime.eface" %3408) -// CHECK-NEXT: store %reflect.Value %3404, ptr %3398, align 8 -// CHECK-NEXT: store %reflect.Value %3411, ptr %3405, align 8 -// CHECK-NEXT: %3412 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 226 -// CHECK-NEXT: %3413 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3412, i32 0, i32 0 -// CHECK-NEXT: %3414 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3415 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %3415, align 8 -// CHECK-NEXT: %3416 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %3415, 1 -// CHECK-NEXT: %3417 = extractvalue { ptr, ptr } %3414, 1 -// CHECK-NEXT: %3418 = extractvalue { ptr, ptr } %3414, 0 -// CHECK-NEXT: %__llgo_funcval_code452 = call ptr asm "", "=r,0"(ptr %3418) -// CHECK-NEXT: %3419 = call %reflect.Value %__llgo_funcval_code452(ptr {{(nest|swiftself)}} %3417, %"{{.*}}/runtime/internal/runtime.eface" %3416) -// CHECK-NEXT: %3420 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3412, i32 0, i32 1 -// CHECK-NEXT: %3421 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3422 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3422, align 8 -// CHECK-NEXT: %3423 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3422, 1 -// CHECK-NEXT: %3424 = extractvalue { ptr, ptr } %3421, 1 -// CHECK-NEXT: %3425 = extractvalue { ptr, ptr } %3421, 0 -// CHECK-NEXT: %__llgo_funcval_code453 = call ptr asm "", "=r,0"(ptr %3425) -// CHECK-NEXT: %3426 = call %reflect.Value %__llgo_funcval_code453(ptr {{(nest|swiftself)}} %3424, %"{{.*}}/runtime/internal/runtime.eface" %3423) -// CHECK-NEXT: store %reflect.Value %3419, ptr %3413, align 8 -// CHECK-NEXT: store %reflect.Value %3426, ptr %3420, align 8 -// CHECK-NEXT: %3427 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 227 -// CHECK-NEXT: %3428 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3427, i32 0, i32 0 -// CHECK-NEXT: %3429 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3430 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 97, ptr %3430, align 8 -// CHECK-NEXT: %3431 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %3430, 1 -// CHECK-NEXT: %3432 = extractvalue { ptr, ptr } %3429, 1 -// CHECK-NEXT: %3433 = extractvalue { ptr, ptr } %3429, 0 -// CHECK-NEXT: %__llgo_funcval_code454 = call ptr asm "", "=r,0"(ptr %3433) -// CHECK-NEXT: %3434 = call %reflect.Value %__llgo_funcval_code454(ptr {{(nest|swiftself)}} %3432, %"{{.*}}/runtime/internal/runtime.eface" %3431) -// CHECK-NEXT: %3435 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3427, i32 0, i32 1 -// CHECK-NEXT: %3436 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3437 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @427, i64 1 }, ptr %3437, align 8 -// CHECK-NEXT: %3438 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3437, 1 -// CHECK-NEXT: %3439 = extractvalue { ptr, ptr } %3436, 1 -// CHECK-NEXT: %3440 = extractvalue { ptr, ptr } %3436, 0 -// CHECK-NEXT: %__llgo_funcval_code455 = call ptr asm "", "=r,0"(ptr %3440) -// CHECK-NEXT: %3441 = call %reflect.Value %__llgo_funcval_code455(ptr {{(nest|swiftself)}} %3439, %"{{.*}}/runtime/internal/runtime.eface" %3438) -// CHECK-NEXT: store %reflect.Value %3434, ptr %3428, align 8 -// CHECK-NEXT: store %reflect.Value %3441, ptr %3435, align 8 -// CHECK-NEXT: %3442 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 228 -// CHECK-NEXT: %3443 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3442, i32 0, i32 0 -// CHECK-NEXT: %3444 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3445 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 -1, ptr %3445, align 8 -// CHECK-NEXT: %3446 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %3445, 1 -// CHECK-NEXT: %3447 = extractvalue { ptr, ptr } %3444, 1 -// CHECK-NEXT: %3448 = extractvalue { ptr, ptr } %3444, 0 -// CHECK-NEXT: %__llgo_funcval_code456 = call ptr asm "", "=r,0"(ptr %3448) -// CHECK-NEXT: %3449 = call %reflect.Value %__llgo_funcval_code456(ptr {{(nest|swiftself)}} %3447, %"{{.*}}/runtime/internal/runtime.eface" %3446) -// CHECK-NEXT: %3450 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3442, i32 0, i32 1 -// CHECK-NEXT: %3451 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3452 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3452, align 8 -// CHECK-NEXT: %3453 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3452, 1 -// CHECK-NEXT: %3454 = extractvalue { ptr, ptr } %3451, 1 -// CHECK-NEXT: %3455 = extractvalue { ptr, ptr } %3451, 0 -// CHECK-NEXT: %__llgo_funcval_code457 = call ptr asm "", "=r,0"(ptr %3455) -// CHECK-NEXT: %3456 = call %reflect.Value %__llgo_funcval_code457(ptr {{(nest|swiftself)}} %3454, %"{{.*}}/runtime/internal/runtime.eface" %3453) -// CHECK-NEXT: store %reflect.Value %3449, ptr %3443, align 8 -// CHECK-NEXT: store %reflect.Value %3456, ptr %3450, align 8 -// CHECK-NEXT: %3457 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 229 -// CHECK-NEXT: %3458 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3457, i32 0, i32 0 -// CHECK-NEXT: %3459 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3460 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 -2, ptr %3460, align 1 -// CHECK-NEXT: %3461 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int8, ptr undef }, ptr %3460, 1 -// CHECK-NEXT: %3462 = extractvalue { ptr, ptr } %3459, 1 -// CHECK-NEXT: %3463 = extractvalue { ptr, ptr } %3459, 0 -// CHECK-NEXT: %__llgo_funcval_code458 = call ptr asm "", "=r,0"(ptr %3463) -// CHECK-NEXT: %3464 = call %reflect.Value %__llgo_funcval_code458(ptr {{(nest|swiftself)}} %3462, %"{{.*}}/runtime/internal/runtime.eface" %3461) -// CHECK-NEXT: %3465 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3457, i32 0, i32 1 -// CHECK-NEXT: %3466 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3467 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3467, align 8 -// CHECK-NEXT: %3468 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3467, 1 -// CHECK-NEXT: %3469 = extractvalue { ptr, ptr } %3466, 1 -// CHECK-NEXT: %3470 = extractvalue { ptr, ptr } %3466, 0 -// CHECK-NEXT: %__llgo_funcval_code459 = call ptr asm "", "=r,0"(ptr %3470) -// CHECK-NEXT: %3471 = call %reflect.Value %__llgo_funcval_code459(ptr {{(nest|swiftself)}} %3469, %"{{.*}}/runtime/internal/runtime.eface" %3468) -// CHECK-NEXT: store %reflect.Value %3464, ptr %3458, align 8 -// CHECK-NEXT: store %reflect.Value %3471, ptr %3465, align 8 -// CHECK-NEXT: %3472 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 230 -// CHECK-NEXT: %3473 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3472, i32 0, i32 0 -// CHECK-NEXT: %3474 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3475 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store i16 -3, ptr %3475, align 2 -// CHECK-NEXT: %3476 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int16, ptr undef }, ptr %3475, 1 -// CHECK-NEXT: %3477 = extractvalue { ptr, ptr } %3474, 1 -// CHECK-NEXT: %3478 = extractvalue { ptr, ptr } %3474, 0 -// CHECK-NEXT: %__llgo_funcval_code460 = call ptr asm "", "=r,0"(ptr %3478) -// CHECK-NEXT: %3479 = call %reflect.Value %__llgo_funcval_code460(ptr {{(nest|swiftself)}} %3477, %"{{.*}}/runtime/internal/runtime.eface" %3476) -// CHECK-NEXT: %3480 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3472, i32 0, i32 1 -// CHECK-NEXT: %3481 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3482 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3482, align 8 -// CHECK-NEXT: %3483 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3482, 1 -// CHECK-NEXT: %3484 = extractvalue { ptr, ptr } %3481, 1 -// CHECK-NEXT: %3485 = extractvalue { ptr, ptr } %3481, 0 -// CHECK-NEXT: %__llgo_funcval_code461 = call ptr asm "", "=r,0"(ptr %3485) -// CHECK-NEXT: %3486 = call %reflect.Value %__llgo_funcval_code461(ptr {{(nest|swiftself)}} %3484, %"{{.*}}/runtime/internal/runtime.eface" %3483) -// CHECK-NEXT: store %reflect.Value %3479, ptr %3473, align 8 -// CHECK-NEXT: store %reflect.Value %3486, ptr %3480, align 8 -// CHECK-NEXT: %3487 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 231 -// CHECK-NEXT: %3488 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3487, i32 0, i32 0 -// CHECK-NEXT: %3489 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3490 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 -4, ptr %3490, align 4 -// CHECK-NEXT: %3491 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %3490, 1 -// CHECK-NEXT: %3492 = extractvalue { ptr, ptr } %3489, 1 -// CHECK-NEXT: %3493 = extractvalue { ptr, ptr } %3489, 0 -// CHECK-NEXT: %__llgo_funcval_code462 = call ptr asm "", "=r,0"(ptr %3493) -// CHECK-NEXT: %3494 = call %reflect.Value %__llgo_funcval_code462(ptr {{(nest|swiftself)}} %3492, %"{{.*}}/runtime/internal/runtime.eface" %3491) -// CHECK-NEXT: %3495 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3487, i32 0, i32 1 -// CHECK-NEXT: %3496 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3497 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3497, align 8 -// CHECK-NEXT: %3498 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3497, 1 -// CHECK-NEXT: %3499 = extractvalue { ptr, ptr } %3496, 1 -// CHECK-NEXT: %3500 = extractvalue { ptr, ptr } %3496, 0 -// CHECK-NEXT: %__llgo_funcval_code463 = call ptr asm "", "=r,0"(ptr %3500) -// CHECK-NEXT: %3501 = call %reflect.Value %__llgo_funcval_code463(ptr {{(nest|swiftself)}} %3499, %"{{.*}}/runtime/internal/runtime.eface" %3498) -// CHECK-NEXT: store %reflect.Value %3494, ptr %3488, align 8 -// CHECK-NEXT: store %reflect.Value %3501, ptr %3495, align 8 -// CHECK-NEXT: %3502 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 232 -// CHECK-NEXT: %3503 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3502, i32 0, i32 0 -// CHECK-NEXT: %3504 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3505 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 -5, ptr %3505, align 8 -// CHECK-NEXT: %3506 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int64, ptr undef }, ptr %3505, 1 -// CHECK-NEXT: %3507 = extractvalue { ptr, ptr } %3504, 1 -// CHECK-NEXT: %3508 = extractvalue { ptr, ptr } %3504, 0 -// CHECK-NEXT: %__llgo_funcval_code464 = call ptr asm "", "=r,0"(ptr %3508) -// CHECK-NEXT: %3509 = call %reflect.Value %__llgo_funcval_code464(ptr {{(nest|swiftself)}} %3507, %"{{.*}}/runtime/internal/runtime.eface" %3506) -// CHECK-NEXT: %3510 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3502, i32 0, i32 1 -// CHECK-NEXT: %3511 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3512 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3512, align 8 -// CHECK-NEXT: %3513 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3512, 1 -// CHECK-NEXT: %3514 = extractvalue { ptr, ptr } %3511, 1 -// CHECK-NEXT: %3515 = extractvalue { ptr, ptr } %3511, 0 -// CHECK-NEXT: %__llgo_funcval_code465 = call ptr asm "", "=r,0"(ptr %3515) -// CHECK-NEXT: %3516 = call %reflect.Value %__llgo_funcval_code465(ptr {{(nest|swiftself)}} %3514, %"{{.*}}/runtime/internal/runtime.eface" %3513) -// CHECK-NEXT: store %reflect.Value %3509, ptr %3503, align 8 -// CHECK-NEXT: store %reflect.Value %3516, ptr %3510, align 8 -// CHECK-NEXT: %3517 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 233 -// CHECK-NEXT: %3518 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3517, i32 0, i32 0 -// CHECK-NEXT: %3519 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3520 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114113, ptr %3520, align 8 -// CHECK-NEXT: %3521 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint, ptr undef }, ptr %3520, 1 -// CHECK-NEXT: %3522 = extractvalue { ptr, ptr } %3519, 1 -// CHECK-NEXT: %3523 = extractvalue { ptr, ptr } %3519, 0 -// CHECK-NEXT: %__llgo_funcval_code466 = call ptr asm "", "=r,0"(ptr %3523) -// CHECK-NEXT: %3524 = call %reflect.Value %__llgo_funcval_code466(ptr {{(nest|swiftself)}} %3522, %"{{.*}}/runtime/internal/runtime.eface" %3521) -// CHECK-NEXT: %3525 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3517, i32 0, i32 1 -// CHECK-NEXT: %3526 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3527 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3527, align 8 -// CHECK-NEXT: %3528 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3527, 1 -// CHECK-NEXT: %3529 = extractvalue { ptr, ptr } %3526, 1 -// CHECK-NEXT: %3530 = extractvalue { ptr, ptr } %3526, 0 -// CHECK-NEXT: %__llgo_funcval_code467 = call ptr asm "", "=r,0"(ptr %3530) -// CHECK-NEXT: %3531 = call %reflect.Value %__llgo_funcval_code467(ptr {{(nest|swiftself)}} %3529, %"{{.*}}/runtime/internal/runtime.eface" %3528) -// CHECK-NEXT: store %reflect.Value %3524, ptr %3518, align 8 -// CHECK-NEXT: store %reflect.Value %3531, ptr %3525, align 8 -// CHECK-NEXT: %3532 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 234 -// CHECK-NEXT: %3533 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3532, i32 0, i32 0 -// CHECK-NEXT: %3534 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3535 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 1114114, ptr %3535, align 4 -// CHECK-NEXT: %3536 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint32, ptr undef }, ptr %3535, 1 -// CHECK-NEXT: %3537 = extractvalue { ptr, ptr } %3534, 1 -// CHECK-NEXT: %3538 = extractvalue { ptr, ptr } %3534, 0 -// CHECK-NEXT: %__llgo_funcval_code468 = call ptr asm "", "=r,0"(ptr %3538) -// CHECK-NEXT: %3539 = call %reflect.Value %__llgo_funcval_code468(ptr {{(nest|swiftself)}} %3537, %"{{.*}}/runtime/internal/runtime.eface" %3536) -// CHECK-NEXT: %3540 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3532, i32 0, i32 1 -// CHECK-NEXT: %3541 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3542 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3542, align 8 -// CHECK-NEXT: %3543 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3542, 1 -// CHECK-NEXT: %3544 = extractvalue { ptr, ptr } %3541, 1 -// CHECK-NEXT: %3545 = extractvalue { ptr, ptr } %3541, 0 -// CHECK-NEXT: %__llgo_funcval_code469 = call ptr asm "", "=r,0"(ptr %3545) -// CHECK-NEXT: %3546 = call %reflect.Value %__llgo_funcval_code469(ptr {{(nest|swiftself)}} %3544, %"{{.*}}/runtime/internal/runtime.eface" %3543) -// CHECK-NEXT: store %reflect.Value %3539, ptr %3533, align 8 -// CHECK-NEXT: store %reflect.Value %3546, ptr %3540, align 8 -// CHECK-NEXT: %3547 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 235 -// CHECK-NEXT: %3548 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3547, i32 0, i32 0 -// CHECK-NEXT: %3549 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3550 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114115, ptr %3550, align 8 -// CHECK-NEXT: %3551 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint64, ptr undef }, ptr %3550, 1 -// CHECK-NEXT: %3552 = extractvalue { ptr, ptr } %3549, 1 -// CHECK-NEXT: %3553 = extractvalue { ptr, ptr } %3549, 0 -// CHECK-NEXT: %__llgo_funcval_code470 = call ptr asm "", "=r,0"(ptr %3553) -// CHECK-NEXT: %3554 = call %reflect.Value %__llgo_funcval_code470(ptr {{(nest|swiftself)}} %3552, %"{{.*}}/runtime/internal/runtime.eface" %3551) -// CHECK-NEXT: %3555 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3547, i32 0, i32 1 -// CHECK-NEXT: %3556 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3557 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3557, align 8 -// CHECK-NEXT: %3558 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3557, 1 -// CHECK-NEXT: %3559 = extractvalue { ptr, ptr } %3556, 1 -// CHECK-NEXT: %3560 = extractvalue { ptr, ptr } %3556, 0 -// CHECK-NEXT: %__llgo_funcval_code471 = call ptr asm "", "=r,0"(ptr %3560) -// CHECK-NEXT: %3561 = call %reflect.Value %__llgo_funcval_code471(ptr {{(nest|swiftself)}} %3559, %"{{.*}}/runtime/internal/runtime.eface" %3558) -// CHECK-NEXT: store %reflect.Value %3554, ptr %3548, align 8 -// CHECK-NEXT: store %reflect.Value %3561, ptr %3555, align 8 -// CHECK-NEXT: %3562 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 236 -// CHECK-NEXT: %3563 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3562, i32 0, i32 0 -// CHECK-NEXT: %3564 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3565 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1114116, ptr %3565, align 8 -// CHECK-NEXT: %3566 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uintptr, ptr undef }, ptr %3565, 1 -// CHECK-NEXT: %3567 = extractvalue { ptr, ptr } %3564, 1 -// CHECK-NEXT: %3568 = extractvalue { ptr, ptr } %3564, 0 -// CHECK-NEXT: %__llgo_funcval_code472 = call ptr asm "", "=r,0"(ptr %3568) -// CHECK-NEXT: %3569 = call %reflect.Value %__llgo_funcval_code472(ptr {{(nest|swiftself)}} %3567, %"{{.*}}/runtime/internal/runtime.eface" %3566) -// CHECK-NEXT: %3570 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3562, i32 0, i32 1 -// CHECK-NEXT: %3571 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3572 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @428, i64 3 }, ptr %3572, align 8 -// CHECK-NEXT: %3573 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3572, 1 -// CHECK-NEXT: %3574 = extractvalue { ptr, ptr } %3571, 1 -// CHECK-NEXT: %3575 = extractvalue { ptr, ptr } %3571, 0 -// CHECK-NEXT: %__llgo_funcval_code473 = call ptr asm "", "=r,0"(ptr %3575) -// CHECK-NEXT: %3576 = call %reflect.Value %__llgo_funcval_code473(ptr {{(nest|swiftself)}} %3574, %"{{.*}}/runtime/internal/runtime.eface" %3573) -// CHECK-NEXT: store %reflect.Value %3569, ptr %3563, align 8 -// CHECK-NEXT: store %reflect.Value %3576, ptr %3570, align 8 -// CHECK-NEXT: %3577 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 237 -// CHECK-NEXT: %3578 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3577, i32 0, i32 0 -// CHECK-NEXT: %3579 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3580 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }, ptr %3580, align 8 -// CHECK-NEXT: %3581 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3580, 1 -// CHECK-NEXT: %3582 = extractvalue { ptr, ptr } %3579, 1 -// CHECK-NEXT: %3583 = extractvalue { ptr, ptr } %3579, 0 -// CHECK-NEXT: %__llgo_funcval_code474 = call ptr asm "", "=r,0"(ptr %3583) -// CHECK-NEXT: %3584 = call %reflect.Value %__llgo_funcval_code474(ptr {{(nest|swiftself)}} %3582, %"{{.*}}/runtime/internal/runtime.eface" %3581) -// CHECK-NEXT: %3585 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3577, i32 0, i32 1 -// CHECK-NEXT: %3586 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3587 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }) -// CHECK-NEXT: %3588 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3587, ptr %3588, align 8 -// CHECK-NEXT: %3589 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3588, 1 -// CHECK-NEXT: %3590 = extractvalue { ptr, ptr } %3586, 1 -// CHECK-NEXT: %3591 = extractvalue { ptr, ptr } %3586, 0 -// CHECK-NEXT: %__llgo_funcval_code475 = call ptr asm "", "=r,0"(ptr %3591) -// CHECK-NEXT: %3592 = call %reflect.Value %__llgo_funcval_code475(ptr {{(nest|swiftself)}} %3590, %"{{.*}}/runtime/internal/runtime.eface" %3589) -// CHECK-NEXT: store %reflect.Value %3584, ptr %3578, align 8 -// CHECK-NEXT: store %reflect.Value %3592, ptr %3585, align 8 -// CHECK-NEXT: %3593 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 238 -// CHECK-NEXT: %3594 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3593, i32 0, i32 0 -// CHECK-NEXT: %3595 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3596 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }) -// CHECK-NEXT: %3597 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3596, ptr %3597, align 8 -// CHECK-NEXT: %3598 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3597, 1 -// CHECK-NEXT: %3599 = extractvalue { ptr, ptr } %3595, 1 -// CHECK-NEXT: %3600 = extractvalue { ptr, ptr } %3595, 0 -// CHECK-NEXT: %__llgo_funcval_code476 = call ptr asm "", "=r,0"(ptr %3600) -// CHECK-NEXT: %3601 = call %reflect.Value %__llgo_funcval_code476(ptr {{(nest|swiftself)}} %3599, %"{{.*}}/runtime/internal/runtime.eface" %3598) -// CHECK-NEXT: %3602 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3593, i32 0, i32 1 -// CHECK-NEXT: %3603 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3604 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }, ptr %3604, align 8 -// CHECK-NEXT: %3605 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3604, 1 -// CHECK-NEXT: %3606 = extractvalue { ptr, ptr } %3603, 1 -// CHECK-NEXT: %3607 = extractvalue { ptr, ptr } %3603, 0 -// CHECK-NEXT: %__llgo_funcval_code477 = call ptr asm "", "=r,0"(ptr %3607) -// CHECK-NEXT: %3608 = call %reflect.Value %__llgo_funcval_code477(ptr {{(nest|swiftself)}} %3606, %"{{.*}}/runtime/internal/runtime.eface" %3605) -// CHECK-NEXT: store %reflect.Value %3601, ptr %3594, align 8 -// CHECK-NEXT: store %reflect.Value %3608, ptr %3602, align 8 -// CHECK-NEXT: %3609 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 239 -// CHECK-NEXT: %3610 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3609, i32 0, i32 0 -// CHECK-NEXT: %3611 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3612 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %3613 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3612, ptr %3613, align 8 -// CHECK-NEXT: %3614 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3613, 1 -// CHECK-NEXT: %3615 = extractvalue { ptr, ptr } %3611, 1 -// CHECK-NEXT: %3616 = extractvalue { ptr, ptr } %3611, 0 -// CHECK-NEXT: %__llgo_funcval_code478 = call ptr asm "", "=r,0"(ptr %3616) -// CHECK-NEXT: %3617 = call %reflect.Value %__llgo_funcval_code478(ptr {{(nest|swiftself)}} %3615, %"{{.*}}/runtime/internal/runtime.eface" %3614) -// CHECK-NEXT: %3618 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3609, i32 0, i32 1 -// CHECK-NEXT: %3619 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3620 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @423, i64 6 }) -// CHECK-NEXT: %3621 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3620, ptr %3621, align 8 -// CHECK-NEXT: %3622 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3621, 1 -// CHECK-NEXT: %3623 = extractvalue { ptr, ptr } %3619, 1 -// CHECK-NEXT: %3624 = extractvalue { ptr, ptr } %3619, 0 -// CHECK-NEXT: %__llgo_funcval_code479 = call ptr asm "", "=r,0"(ptr %3624) -// CHECK-NEXT: %3625 = call %reflect.Value %__llgo_funcval_code479(ptr {{(nest|swiftself)}} %3623, %"{{.*}}/runtime/internal/runtime.eface" %3622) -// CHECK-NEXT: store %reflect.Value %3617, ptr %3610, align 8 -// CHECK-NEXT: store %reflect.Value %3625, ptr %3618, align 8 -// CHECK-NEXT: %3626 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 240 -// CHECK-NEXT: %3627 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3626, i32 0, i32 0 -// CHECK-NEXT: %3628 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3629 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }, ptr %3629, align 8 -// CHECK-NEXT: %3630 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3629, 1 -// CHECK-NEXT: %3631 = extractvalue { ptr, ptr } %3628, 1 -// CHECK-NEXT: %3632 = extractvalue { ptr, ptr } %3628, 0 -// CHECK-NEXT: %__llgo_funcval_code480 = call ptr asm "", "=r,0"(ptr %3632) -// CHECK-NEXT: %3633 = call %reflect.Value %__llgo_funcval_code480(ptr {{(nest|swiftself)}} %3631, %"{{.*}}/runtime/internal/runtime.eface" %3630) -// CHECK-NEXT: %3634 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3626, i32 0, i32 1 -// CHECK-NEXT: %3635 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3636 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @421, i64 6 }) -// CHECK-NEXT: %3637 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3636, ptr %3637, align 8 -// CHECK-NEXT: %3638 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3637, 1 -// CHECK-NEXT: %3639 = extractvalue { ptr, ptr } %3635, 1 -// CHECK-NEXT: %3640 = extractvalue { ptr, ptr } %3635, 0 -// CHECK-NEXT: %__llgo_funcval_code481 = call ptr asm "", "=r,0"(ptr %3640) -// CHECK-NEXT: %3641 = call %reflect.Value %__llgo_funcval_code481(ptr {{(nest|swiftself)}} %3639, %"{{.*}}/runtime/internal/runtime.eface" %3638) -// CHECK-NEXT: store %reflect.Value %3633, ptr %3627, align 8 -// CHECK-NEXT: store %reflect.Value %3641, ptr %3634, align 8 -// CHECK-NEXT: %3642 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 241 -// CHECK-NEXT: %3643 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3642, i32 0, i32 0 -// CHECK-NEXT: %3644 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3645 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }) -// CHECK-NEXT: %3646 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3645, ptr %3646, align 8 -// CHECK-NEXT: %3647 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3646, 1 -// CHECK-NEXT: %3648 = extractvalue { ptr, ptr } %3644, 1 -// CHECK-NEXT: %3649 = extractvalue { ptr, ptr } %3644, 0 -// CHECK-NEXT: %__llgo_funcval_code482 = call ptr asm "", "=r,0"(ptr %3649) -// CHECK-NEXT: %3650 = call %reflect.Value %__llgo_funcval_code482(ptr {{(nest|swiftself)}} %3648, %"{{.*}}/runtime/internal/runtime.eface" %3647) -// CHECK-NEXT: %3651 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3642, i32 0, i32 1 -// CHECK-NEXT: %3652 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3653 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @422, i64 6 }, ptr %3653, align 8 -// CHECK-NEXT: %3654 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3653, 1 -// CHECK-NEXT: %3655 = extractvalue { ptr, ptr } %3652, 1 -// CHECK-NEXT: %3656 = extractvalue { ptr, ptr } %3652, 0 -// CHECK-NEXT: %__llgo_funcval_code483 = call ptr asm "", "=r,0"(ptr %3656) -// CHECK-NEXT: %3657 = call %reflect.Value %__llgo_funcval_code483(ptr {{(nest|swiftself)}} %3655, %"{{.*}}/runtime/internal/runtime.eface" %3654) -// CHECK-NEXT: store %reflect.Value %3650, ptr %3643, align 8 -// CHECK-NEXT: store %reflect.Value %3657, ptr %3651, align 8 -// CHECK-NEXT: %3658 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 242 -// CHECK-NEXT: %3659 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3658, i32 0, i32 0 -// CHECK-NEXT: %3660 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3661 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }, ptr %3661, align 8 -// CHECK-NEXT: %3662 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3661, 1 -// CHECK-NEXT: %3663 = extractvalue { ptr, ptr } %3660, 1 -// CHECK-NEXT: %3664 = extractvalue { ptr, ptr } %3660, 0 -// CHECK-NEXT: %__llgo_funcval_code484 = call ptr asm "", "=r,0"(ptr %3664) -// CHECK-NEXT: %3665 = call %reflect.Value %__llgo_funcval_code484(ptr {{(nest|swiftself)}} %3663, %"{{.*}}/runtime/internal/runtime.eface" %3662) -// CHECK-NEXT: %3666 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3658, i32 0, i32 1 -// CHECK-NEXT: %3667 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3668 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }) -// CHECK-NEXT: %3669 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3668, ptr %3669, align 8 -// CHECK-NEXT: %3670 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3669, 1 -// CHECK-NEXT: %3671 = extractvalue { ptr, ptr } %3667, 1 -// CHECK-NEXT: %3672 = extractvalue { ptr, ptr } %3667, 0 -// CHECK-NEXT: %__llgo_funcval_code485 = call ptr asm "", "=r,0"(ptr %3672) -// CHECK-NEXT: %3673 = call %reflect.Value %__llgo_funcval_code485(ptr {{(nest|swiftself)}} %3671, %"{{.*}}/runtime/internal/runtime.eface" %3670) -// CHECK-NEXT: store %reflect.Value %3665, ptr %3659, align 8 -// CHECK-NEXT: store %reflect.Value %3673, ptr %3666, align 8 -// CHECK-NEXT: %3674 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 243 -// CHECK-NEXT: %3675 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3674, i32 0, i32 0 -// CHECK-NEXT: %3676 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3677 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }) -// CHECK-NEXT: %3678 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3677, ptr %3678, align 8 -// CHECK-NEXT: %3679 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3678, 1 -// CHECK-NEXT: %3680 = extractvalue { ptr, ptr } %3676, 1 -// CHECK-NEXT: %3681 = extractvalue { ptr, ptr } %3676, 0 -// CHECK-NEXT: %__llgo_funcval_code486 = call ptr asm "", "=r,0"(ptr %3681) -// CHECK-NEXT: %3682 = call %reflect.Value %__llgo_funcval_code486(ptr {{(nest|swiftself)}} %3680, %"{{.*}}/runtime/internal/runtime.eface" %3679) -// CHECK-NEXT: %3683 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3674, i32 0, i32 1 -// CHECK-NEXT: %3684 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3685 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }, ptr %3685, align 8 -// CHECK-NEXT: %3686 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3685, 1 -// CHECK-NEXT: %3687 = extractvalue { ptr, ptr } %3684, 1 -// CHECK-NEXT: %3688 = extractvalue { ptr, ptr } %3684, 0 -// CHECK-NEXT: %__llgo_funcval_code487 = call ptr asm "", "=r,0"(ptr %3688) -// CHECK-NEXT: %3689 = call %reflect.Value %__llgo_funcval_code487(ptr {{(nest|swiftself)}} %3687, %"{{.*}}/runtime/internal/runtime.eface" %3686) -// CHECK-NEXT: store %reflect.Value %3682, ptr %3675, align 8 -// CHECK-NEXT: store %reflect.Value %3689, ptr %3683, align 8 -// CHECK-NEXT: %3690 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 244 -// CHECK-NEXT: %3691 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3690, i32 0, i32 0 -// CHECK-NEXT: %3692 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3693 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3694 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3693, ptr %3694, align 8 -// CHECK-NEXT: %3695 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3694, 1 -// CHECK-NEXT: %3696 = extractvalue { ptr, ptr } %3692, 1 -// CHECK-NEXT: %3697 = extractvalue { ptr, ptr } %3692, 0 -// CHECK-NEXT: %__llgo_funcval_code488 = call ptr asm "", "=r,0"(ptr %3697) -// CHECK-NEXT: %3698 = call %reflect.Value %__llgo_funcval_code488(ptr {{(nest|swiftself)}} %3696, %"{{.*}}/runtime/internal/runtime.eface" %3695) -// CHECK-NEXT: %3699 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3690, i32 0, i32 1 -// CHECK-NEXT: %3700 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3701 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @426, i64 17 }) -// CHECK-NEXT: %3702 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3701, ptr %3702, align 8 -// CHECK-NEXT: %3703 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3702, 1 -// CHECK-NEXT: %3704 = extractvalue { ptr, ptr } %3700, 1 -// CHECK-NEXT: %3705 = extractvalue { ptr, ptr } %3700, 0 -// CHECK-NEXT: %__llgo_funcval_code489 = call ptr asm "", "=r,0"(ptr %3705) -// CHECK-NEXT: %3706 = call %reflect.Value %__llgo_funcval_code489(ptr {{(nest|swiftself)}} %3704, %"{{.*}}/runtime/internal/runtime.eface" %3703) -// CHECK-NEXT: store %reflect.Value %3698, ptr %3691, align 8 -// CHECK-NEXT: store %reflect.Value %3706, ptr %3699, align 8 -// CHECK-NEXT: %3707 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 245 -// CHECK-NEXT: %3708 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3707, i32 0, i32 0 -// CHECK-NEXT: %3709 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3710 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }, ptr %3710, align 8 -// CHECK-NEXT: %3711 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3710, 1 -// CHECK-NEXT: %3712 = extractvalue { ptr, ptr } %3709, 1 -// CHECK-NEXT: %3713 = extractvalue { ptr, ptr } %3709, 0 -// CHECK-NEXT: %__llgo_funcval_code490 = call ptr asm "", "=r,0"(ptr %3713) -// CHECK-NEXT: %3714 = call %reflect.Value %__llgo_funcval_code490(ptr {{(nest|swiftself)}} %3712, %"{{.*}}/runtime/internal/runtime.eface" %3711) -// CHECK-NEXT: %3715 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3707, i32 0, i32 1 -// CHECK-NEXT: %3716 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3717 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @424, i64 8 }) -// CHECK-NEXT: %3718 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3717, ptr %3718, align 8 -// CHECK-NEXT: %3719 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3718, 1 -// CHECK-NEXT: %3720 = extractvalue { ptr, ptr } %3716, 1 -// CHECK-NEXT: %3721 = extractvalue { ptr, ptr } %3716, 0 -// CHECK-NEXT: %__llgo_funcval_code491 = call ptr asm "", "=r,0"(ptr %3721) -// CHECK-NEXT: %3722 = call %reflect.Value %__llgo_funcval_code491(ptr {{(nest|swiftself)}} %3720, %"{{.*}}/runtime/internal/runtime.eface" %3719) -// CHECK-NEXT: store %reflect.Value %3714, ptr %3708, align 8 -// CHECK-NEXT: store %reflect.Value %3722, ptr %3715, align 8 -// CHECK-NEXT: %3723 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 246 -// CHECK-NEXT: %3724 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3723, i32 0, i32 0 -// CHECK-NEXT: %3725 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3726 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }) -// CHECK-NEXT: %3727 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3726, ptr %3727, align 8 -// CHECK-NEXT: %3728 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyRunes, ptr undef }, ptr %3727, 1 -// CHECK-NEXT: %3729 = extractvalue { ptr, ptr } %3725, 1 -// CHECK-NEXT: %3730 = extractvalue { ptr, ptr } %3725, 0 -// CHECK-NEXT: %__llgo_funcval_code492 = call ptr asm "", "=r,0"(ptr %3730) -// CHECK-NEXT: %3731 = call %reflect.Value %__llgo_funcval_code492(ptr {{(nest|swiftself)}} %3729, %"{{.*}}/runtime/internal/runtime.eface" %3728) -// CHECK-NEXT: %3732 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3723, i32 0, i32 1 -// CHECK-NEXT: %3733 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3734 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @425, i64 8 }, ptr %3734, align 8 -// CHECK-NEXT: %3735 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyString, ptr undef }, ptr %3734, 1 -// CHECK-NEXT: %3736 = extractvalue { ptr, ptr } %3733, 1 -// CHECK-NEXT: %3737 = extractvalue { ptr, ptr } %3733, 0 -// CHECK-NEXT: %__llgo_funcval_code493 = call ptr asm "", "=r,0"(ptr %3737) -// CHECK-NEXT: %3738 = call %reflect.Value %__llgo_funcval_code493(ptr {{(nest|swiftself)}} %3736, %"{{.*}}/runtime/internal/runtime.eface" %3735) -// CHECK-NEXT: store %reflect.Value %3731, ptr %3724, align 8 -// CHECK-NEXT: store %reflect.Value %3738, ptr %3732, align 8 -// CHECK-NEXT: %3739 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 247 -// CHECK-NEXT: %3740 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3739, i32 0, i32 0 -// CHECK-NEXT: %3741 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3742 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %3742, align 8 -// CHECK-NEXT: %3743 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3742, 1 -// CHECK-NEXT: %3744 = extractvalue { ptr, ptr } %3741, 1 -// CHECK-NEXT: %3745 = extractvalue { ptr, ptr } %3741, 0 -// CHECK-NEXT: %__llgo_funcval_code494 = call ptr asm "", "=r,0"(ptr %3745) -// CHECK-NEXT: %3746 = call %reflect.Value %__llgo_funcval_code494(ptr {{(nest|swiftself)}} %3744, %"{{.*}}/runtime/internal/runtime.eface" %3743) -// CHECK-NEXT: %3747 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3739, i32 0, i32 1 -// CHECK-NEXT: %3748 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3749 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3749, align 1 -// CHECK-NEXT: %3750 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %3749, 1 -// CHECK-NEXT: %3751 = extractvalue { ptr, ptr } %3748, 1 -// CHECK-NEXT: %3752 = extractvalue { ptr, ptr } %3748, 0 -// CHECK-NEXT: %__llgo_funcval_code495 = call ptr asm "", "=r,0"(ptr %3752) -// CHECK-NEXT: %3753 = call %reflect.Value %__llgo_funcval_code495(ptr {{(nest|swiftself)}} %3751, %"{{.*}}/runtime/internal/runtime.eface" %3750) -// CHECK-NEXT: store %reflect.Value %3746, ptr %3740, align 8 -// CHECK-NEXT: store %reflect.Value %3753, ptr %3747, align 8 -// CHECK-NEXT: %3754 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 248 -// CHECK-NEXT: %3755 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3754, i32 0, i32 0 -// CHECK-NEXT: %3756 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3757 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %3757, align 8 -// CHECK-NEXT: %3758 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3757, 1 -// CHECK-NEXT: %3759 = extractvalue { ptr, ptr } %3756, 1 -// CHECK-NEXT: %3760 = extractvalue { ptr, ptr } %3756, 0 -// CHECK-NEXT: %__llgo_funcval_code496 = call ptr asm "", "=r,0"(ptr %3760) -// CHECK-NEXT: %3761 = call %reflect.Value %__llgo_funcval_code496(ptr {{(nest|swiftself)}} %3759, %"{{.*}}/runtime/internal/runtime.eface" %3758) -// CHECK-NEXT: %3762 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3754, i32 0, i32 1 -// CHECK-NEXT: %3763 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3764 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3764, align 1 -// CHECK-NEXT: %3765 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %3764, 1 -// CHECK-NEXT: %3766 = extractvalue { ptr, ptr } %3763, 1 -// CHECK-NEXT: %3767 = extractvalue { ptr, ptr } %3763, 0 -// CHECK-NEXT: %__llgo_funcval_code497 = call ptr asm "", "=r,0"(ptr %3767) -// CHECK-NEXT: %3768 = call %reflect.Value %__llgo_funcval_code497(ptr {{(nest|swiftself)}} %3766, %"{{.*}}/runtime/internal/runtime.eface" %3765) -// CHECK-NEXT: store %reflect.Value %3761, ptr %3755, align 8 -// CHECK-NEXT: store %reflect.Value %3768, ptr %3762, align 8 -// CHECK-NEXT: %3769 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 249 -// CHECK-NEXT: %3770 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3769, i32 0, i32 0 -// CHECK-NEXT: %3771 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3772 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %3773 = getelementptr inbounds i8, ptr %3772, i64 0 -// CHECK-NEXT: store i8 1, ptr %3773, align 1 -// CHECK-NEXT: %3774 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3772, 0 -// CHECK-NEXT: %3775 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3774, i64 1, 1 -// CHECK-NEXT: %3776 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3775, i64 1, 2 -// CHECK-NEXT: %3777 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3776, ptr %3777, align 8 -// CHECK-NEXT: %3778 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3777, 1 -// CHECK-NEXT: %3779 = extractvalue { ptr, ptr } %3771, 1 -// CHECK-NEXT: %3780 = extractvalue { ptr, ptr } %3771, 0 -// CHECK-NEXT: %__llgo_funcval_code498 = call ptr asm "", "=r,0"(ptr %3780) -// CHECK-NEXT: %3781 = call %reflect.Value %__llgo_funcval_code498(ptr {{(nest|swiftself)}} %3779, %"{{.*}}/runtime/internal/runtime.eface" %3778) -// CHECK-NEXT: %3782 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3769, i32 0, i32 1 -// CHECK-NEXT: %3783 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3784 = alloca [1 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3784, i8 0, i64 1, i1 false) -// CHECK-NEXT: %3785 = getelementptr inbounds i8, ptr %3784, i64 0 -// CHECK-NEXT: store i8 1, ptr %3785, align 1 -// CHECK-NEXT: %3786 = load [1 x i8], ptr %3784, align 1 -// CHECK-NEXT: %3787 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store [1 x i8] %3786, ptr %3787, align 1 -// CHECK-NEXT: %3788 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[1]_llgo_uint8", ptr undef }, ptr %3787, 1 -// CHECK-NEXT: %3789 = extractvalue { ptr, ptr } %3783, 1 -// CHECK-NEXT: %3790 = extractvalue { ptr, ptr } %3783, 0 -// CHECK-NEXT: %__llgo_funcval_code499 = call ptr asm "", "=r,0"(ptr %3790) -// CHECK-NEXT: %3791 = call %reflect.Value %__llgo_funcval_code499(ptr {{(nest|swiftself)}} %3789, %"{{.*}}/runtime/internal/runtime.eface" %3788) -// CHECK-NEXT: store %reflect.Value %3781, ptr %3770, align 8 -// CHECK-NEXT: store %reflect.Value %3791, ptr %3782, align 8 -// CHECK-NEXT: %3792 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 250 -// CHECK-NEXT: %3793 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3792, i32 0, i32 0 -// CHECK-NEXT: %3794 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3795 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %3796 = getelementptr inbounds i8, ptr %3795, i64 0 -// CHECK-NEXT: store i8 1, ptr %3796, align 1 -// CHECK-NEXT: %3797 = getelementptr inbounds i8, ptr %3795, i64 1 -// CHECK-NEXT: store i8 2, ptr %3797, align 1 -// CHECK-NEXT: %3798 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3795, 0 -// CHECK-NEXT: %3799 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3798, i64 2, 1 -// CHECK-NEXT: %3800 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3799, i64 2, 2 -// CHECK-NEXT: %3801 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3800, ptr %3801, align 8 -// CHECK-NEXT: %3802 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3801, 1 -// CHECK-NEXT: %3803 = extractvalue { ptr, ptr } %3794, 1 -// CHECK-NEXT: %3804 = extractvalue { ptr, ptr } %3794, 0 -// CHECK-NEXT: %__llgo_funcval_code500 = call ptr asm "", "=r,0"(ptr %3804) -// CHECK-NEXT: %3805 = call %reflect.Value %__llgo_funcval_code500(ptr {{(nest|swiftself)}} %3803, %"{{.*}}/runtime/internal/runtime.eface" %3802) -// CHECK-NEXT: %3806 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3792, i32 0, i32 1 -// CHECK-NEXT: %3807 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3808 = alloca [2 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3808, i8 0, i64 2, i1 false) -// CHECK-NEXT: %3809 = getelementptr inbounds i8, ptr %3808, i64 0 -// CHECK-NEXT: %3810 = getelementptr inbounds i8, ptr %3808, i64 1 -// CHECK-NEXT: store i8 1, ptr %3809, align 1 -// CHECK-NEXT: store i8 2, ptr %3810, align 1 -// CHECK-NEXT: %3811 = load [2 x i8], ptr %3808, align 1 -// CHECK-NEXT: %3812 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] %3811, ptr %3812, align 1 -// CHECK-NEXT: %3813 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %3812, 1 -// CHECK-NEXT: %3814 = extractvalue { ptr, ptr } %3807, 1 -// CHECK-NEXT: %3815 = extractvalue { ptr, ptr } %3807, 0 -// CHECK-NEXT: %__llgo_funcval_code501 = call ptr asm "", "=r,0"(ptr %3815) -// CHECK-NEXT: %3816 = call %reflect.Value %__llgo_funcval_code501(ptr {{(nest|swiftself)}} %3814, %"{{.*}}/runtime/internal/runtime.eface" %3813) -// CHECK-NEXT: store %reflect.Value %3805, ptr %3793, align 8 -// CHECK-NEXT: store %reflect.Value %3816, ptr %3806, align 8 -// CHECK-NEXT: %3817 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 251 -// CHECK-NEXT: %3818 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3817, i32 0, i32 0 -// CHECK-NEXT: %3819 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3820 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 3) -// CHECK-NEXT: %3821 = getelementptr inbounds i8, ptr %3820, i64 0 -// CHECK-NEXT: store i8 1, ptr %3821, align 1 -// CHECK-NEXT: %3822 = getelementptr inbounds i8, ptr %3820, i64 1 -// CHECK-NEXT: store i8 2, ptr %3822, align 1 -// CHECK-NEXT: %3823 = getelementptr inbounds i8, ptr %3820, i64 2 -// CHECK-NEXT: store i8 3, ptr %3823, align 1 -// CHECK-NEXT: %3824 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3820, 0 -// CHECK-NEXT: %3825 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3824, i64 3, 1 -// CHECK-NEXT: %3826 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3825, i64 3, 2 -// CHECK-NEXT: %3827 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3826, ptr %3827, align 8 -// CHECK-NEXT: %3828 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3827, 1 -// CHECK-NEXT: %3829 = extractvalue { ptr, ptr } %3819, 1 -// CHECK-NEXT: %3830 = extractvalue { ptr, ptr } %3819, 0 -// CHECK-NEXT: %__llgo_funcval_code502 = call ptr asm "", "=r,0"(ptr %3830) -// CHECK-NEXT: %3831 = call %reflect.Value %__llgo_funcval_code502(ptr {{(nest|swiftself)}} %3829, %"{{.*}}/runtime/internal/runtime.eface" %3828) -// CHECK-NEXT: %3832 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3817, i32 0, i32 1 -// CHECK-NEXT: %3833 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3834 = alloca [3 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3834, i8 0, i64 3, i1 false) -// CHECK-NEXT: %3835 = getelementptr inbounds i8, ptr %3834, i64 0 -// CHECK-NEXT: %3836 = getelementptr inbounds i8, ptr %3834, i64 1 -// CHECK-NEXT: %3837 = getelementptr inbounds i8, ptr %3834, i64 2 -// CHECK-NEXT: store i8 1, ptr %3835, align 1 -// CHECK-NEXT: store i8 2, ptr %3836, align 1 -// CHECK-NEXT: store i8 3, ptr %3837, align 1 -// CHECK-NEXT: %3838 = load [3 x i8], ptr %3834, align 1 -// CHECK-NEXT: %3839 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 3) -// CHECK-NEXT: store [3 x i8] %3838, ptr %3839, align 1 -// CHECK-NEXT: %3840 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[3]_llgo_uint8", ptr undef }, ptr %3839, 1 -// CHECK-NEXT: %3841 = extractvalue { ptr, ptr } %3833, 1 -// CHECK-NEXT: %3842 = extractvalue { ptr, ptr } %3833, 0 -// CHECK-NEXT: %__llgo_funcval_code503 = call ptr asm "", "=r,0"(ptr %3842) -// CHECK-NEXT: %3843 = call %reflect.Value %__llgo_funcval_code503(ptr {{(nest|swiftself)}} %3841, %"{{.*}}/runtime/internal/runtime.eface" %3840) -// CHECK-NEXT: store %reflect.Value %3831, ptr %3818, align 8 -// CHECK-NEXT: store %reflect.Value %3843, ptr %3832, align 8 -// CHECK-NEXT: %3844 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 252 -// CHECK-NEXT: %3845 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3844, i32 0, i32 0 -// CHECK-NEXT: %3846 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3847 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %3847, align 8 -// CHECK-NEXT: %3848 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3847, 1 -// CHECK-NEXT: %3849 = extractvalue { ptr, ptr } %3846, 1 -// CHECK-NEXT: %3850 = extractvalue { ptr, ptr } %3846, 0 -// CHECK-NEXT: %__llgo_funcval_code504 = call ptr asm "", "=r,0"(ptr %3850) -// CHECK-NEXT: %3851 = call %reflect.Value %__llgo_funcval_code504(ptr {{(nest|swiftself)}} %3849, %"{{.*}}/runtime/internal/runtime.eface" %3848) -// CHECK-NEXT: %3852 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3844, i32 0, i32 1 -// CHECK-NEXT: %3853 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3854 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3854, align 1 -// CHECK-NEXT: %3855 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %3854, 1 -// CHECK-NEXT: %3856 = extractvalue { ptr, ptr } %3853, 1 -// CHECK-NEXT: %3857 = extractvalue { ptr, ptr } %3853, 0 -// CHECK-NEXT: %__llgo_funcval_code505 = call ptr asm "", "=r,0"(ptr %3857) -// CHECK-NEXT: %3858 = call %reflect.Value %__llgo_funcval_code505(ptr {{(nest|swiftself)}} %3856, %"{{.*}}/runtime/internal/runtime.eface" %3855) -// CHECK-NEXT: store %reflect.Value %3851, ptr %3845, align 8 -// CHECK-NEXT: store %reflect.Value %3858, ptr %3852, align 8 -// CHECK-NEXT: %3859 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 253 -// CHECK-NEXT: %3860 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3859, i32 0, i32 0 -// CHECK-NEXT: %3861 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3862 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %3862, align 8 -// CHECK-NEXT: %3863 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3862, 1 -// CHECK-NEXT: %3864 = extractvalue { ptr, ptr } %3861, 1 -// CHECK-NEXT: %3865 = extractvalue { ptr, ptr } %3861, 0 -// CHECK-NEXT: %__llgo_funcval_code506 = call ptr asm "", "=r,0"(ptr %3865) -// CHECK-NEXT: %3866 = call %reflect.Value %__llgo_funcval_code506(ptr {{(nest|swiftself)}} %3864, %"{{.*}}/runtime/internal/runtime.eface" %3863) -// CHECK-NEXT: %3867 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3859, i32 0, i32 1 -// CHECK-NEXT: %3868 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3869 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3869, align 1 -// CHECK-NEXT: %3870 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %3869, 1 -// CHECK-NEXT: %3871 = extractvalue { ptr, ptr } %3868, 1 -// CHECK-NEXT: %3872 = extractvalue { ptr, ptr } %3868, 0 -// CHECK-NEXT: %__llgo_funcval_code507 = call ptr asm "", "=r,0"(ptr %3872) -// CHECK-NEXT: %3873 = call %reflect.Value %__llgo_funcval_code507(ptr {{(nest|swiftself)}} %3871, %"{{.*}}/runtime/internal/runtime.eface" %3870) -// CHECK-NEXT: store %reflect.Value %3866, ptr %3860, align 8 -// CHECK-NEXT: store %reflect.Value %3873, ptr %3867, align 8 -// CHECK-NEXT: %3874 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 254 -// CHECK-NEXT: %3875 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3874, i32 0, i32 0 -// CHECK-NEXT: %3876 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3877 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %3878 = getelementptr inbounds i8, ptr %3877, i64 0 -// CHECK-NEXT: store i8 1, ptr %3878, align 1 -// CHECK-NEXT: %3879 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3877, 0 -// CHECK-NEXT: %3880 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3879, i64 1, 1 -// CHECK-NEXT: %3881 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3880, i64 1, 2 -// CHECK-NEXT: %3882 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3881, ptr %3882, align 8 -// CHECK-NEXT: %3883 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3882, 1 -// CHECK-NEXT: %3884 = extractvalue { ptr, ptr } %3876, 1 -// CHECK-NEXT: %3885 = extractvalue { ptr, ptr } %3876, 0 -// CHECK-NEXT: %__llgo_funcval_code508 = call ptr asm "", "=r,0"(ptr %3885) -// CHECK-NEXT: %3886 = call %reflect.Value %__llgo_funcval_code508(ptr {{(nest|swiftself)}} %3884, %"{{.*}}/runtime/internal/runtime.eface" %3883) -// CHECK-NEXT: %3887 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3874, i32 0, i32 1 -// CHECK-NEXT: %3888 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3889 = alloca [1 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3889, i8 0, i64 1, i1 false) -// CHECK-NEXT: %3890 = getelementptr inbounds i8, ptr %3889, i64 0 -// CHECK-NEXT: store i8 1, ptr %3890, align 1 -// CHECK-NEXT: %3891 = load [1 x i8], ptr %3889, align 1 -// CHECK-NEXT: %3892 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store [1 x i8] %3891, ptr %3892, align 1 -// CHECK-NEXT: %3893 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[1]_llgo_uint8", ptr undef }, ptr %3892, 1 -// CHECK-NEXT: %3894 = extractvalue { ptr, ptr } %3888, 1 -// CHECK-NEXT: %3895 = extractvalue { ptr, ptr } %3888, 0 -// CHECK-NEXT: %__llgo_funcval_code509 = call ptr asm "", "=r,0"(ptr %3895) -// CHECK-NEXT: %3896 = call %reflect.Value %__llgo_funcval_code509(ptr {{(nest|swiftself)}} %3894, %"{{.*}}/runtime/internal/runtime.eface" %3893) -// CHECK-NEXT: store %reflect.Value %3886, ptr %3875, align 8 -// CHECK-NEXT: store %reflect.Value %3896, ptr %3887, align 8 -// CHECK-NEXT: %3897 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 255 -// CHECK-NEXT: %3898 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3897, i32 0, i32 0 -// CHECK-NEXT: %3899 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3900 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %3901 = getelementptr inbounds i8, ptr %3900, i64 0 -// CHECK-NEXT: store i8 1, ptr %3901, align 1 -// CHECK-NEXT: %3902 = getelementptr inbounds i8, ptr %3900, i64 1 -// CHECK-NEXT: store i8 2, ptr %3902, align 1 -// CHECK-NEXT: %3903 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3900, 0 -// CHECK-NEXT: %3904 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3903, i64 2, 1 -// CHECK-NEXT: %3905 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3904, i64 2, 2 -// CHECK-NEXT: %3906 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3905, ptr %3906, align 8 -// CHECK-NEXT: %3907 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3906, 1 -// CHECK-NEXT: %3908 = extractvalue { ptr, ptr } %3899, 1 -// CHECK-NEXT: %3909 = extractvalue { ptr, ptr } %3899, 0 -// CHECK-NEXT: %__llgo_funcval_code510 = call ptr asm "", "=r,0"(ptr %3909) -// CHECK-NEXT: %3910 = call %reflect.Value %__llgo_funcval_code510(ptr {{(nest|swiftself)}} %3908, %"{{.*}}/runtime/internal/runtime.eface" %3907) -// CHECK-NEXT: %3911 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3897, i32 0, i32 1 -// CHECK-NEXT: %3912 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3913 = alloca [2 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3913, i8 0, i64 2, i1 false) -// CHECK-NEXT: %3914 = getelementptr inbounds i8, ptr %3913, i64 0 -// CHECK-NEXT: %3915 = getelementptr inbounds i8, ptr %3913, i64 1 -// CHECK-NEXT: store i8 1, ptr %3914, align 1 -// CHECK-NEXT: store i8 2, ptr %3915, align 1 -// CHECK-NEXT: %3916 = load [2 x i8], ptr %3913, align 1 -// CHECK-NEXT: %3917 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] %3916, ptr %3917, align 1 -// CHECK-NEXT: %3918 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %3917, 1 -// CHECK-NEXT: %3919 = extractvalue { ptr, ptr } %3912, 1 -// CHECK-NEXT: %3920 = extractvalue { ptr, ptr } %3912, 0 -// CHECK-NEXT: %__llgo_funcval_code511 = call ptr asm "", "=r,0"(ptr %3920) -// CHECK-NEXT: %3921 = call %reflect.Value %__llgo_funcval_code511(ptr {{(nest|swiftself)}} %3919, %"{{.*}}/runtime/internal/runtime.eface" %3918) -// CHECK-NEXT: store %reflect.Value %3910, ptr %3898, align 8 -// CHECK-NEXT: store %reflect.Value %3921, ptr %3911, align 8 -// CHECK-NEXT: %3922 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 256 -// CHECK-NEXT: %3923 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3922, i32 0, i32 0 -// CHECK-NEXT: %3924 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3925 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 3) -// CHECK-NEXT: %3926 = getelementptr inbounds i8, ptr %3925, i64 0 -// CHECK-NEXT: store i8 1, ptr %3926, align 1 -// CHECK-NEXT: %3927 = getelementptr inbounds i8, ptr %3925, i64 1 -// CHECK-NEXT: store i8 2, ptr %3927, align 1 -// CHECK-NEXT: %3928 = getelementptr inbounds i8, ptr %3925, i64 2 -// CHECK-NEXT: store i8 3, ptr %3928, align 1 -// CHECK-NEXT: %3929 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3925, 0 -// CHECK-NEXT: %3930 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3929, i64 3, 1 -// CHECK-NEXT: %3931 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3930, i64 3, 2 -// CHECK-NEXT: %3932 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3931, ptr %3932, align 8 -// CHECK-NEXT: %3933 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %3932, 1 -// CHECK-NEXT: %3934 = extractvalue { ptr, ptr } %3924, 1 -// CHECK-NEXT: %3935 = extractvalue { ptr, ptr } %3924, 0 -// CHECK-NEXT: %__llgo_funcval_code512 = call ptr asm "", "=r,0"(ptr %3935) -// CHECK-NEXT: %3936 = call %reflect.Value %__llgo_funcval_code512(ptr {{(nest|swiftself)}} %3934, %"{{.*}}/runtime/internal/runtime.eface" %3933) -// CHECK-NEXT: %3937 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3922, i32 0, i32 1 -// CHECK-NEXT: %3938 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3939 = alloca [3 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3939, i8 0, i64 3, i1 false) -// CHECK-NEXT: %3940 = getelementptr inbounds i8, ptr %3939, i64 0 -// CHECK-NEXT: %3941 = getelementptr inbounds i8, ptr %3939, i64 1 -// CHECK-NEXT: %3942 = getelementptr inbounds i8, ptr %3939, i64 2 -// CHECK-NEXT: store i8 1, ptr %3940, align 1 -// CHECK-NEXT: store i8 2, ptr %3941, align 1 -// CHECK-NEXT: store i8 3, ptr %3942, align 1 -// CHECK-NEXT: %3943 = load [3 x i8], ptr %3939, align 1 -// CHECK-NEXT: %3944 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 3) -// CHECK-NEXT: store [3 x i8] %3943, ptr %3944, align 1 -// CHECK-NEXT: %3945 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[3]_llgo_uint8", ptr undef }, ptr %3944, 1 -// CHECK-NEXT: %3946 = extractvalue { ptr, ptr } %3938, 1 -// CHECK-NEXT: %3947 = extractvalue { ptr, ptr } %3938, 0 -// CHECK-NEXT: %__llgo_funcval_code513 = call ptr asm "", "=r,0"(ptr %3947) -// CHECK-NEXT: %3948 = call %reflect.Value %__llgo_funcval_code513(ptr {{(nest|swiftself)}} %3946, %"{{.*}}/runtime/internal/runtime.eface" %3945) -// CHECK-NEXT: store %reflect.Value %3936, ptr %3923, align 8 -// CHECK-NEXT: store %reflect.Value %3948, ptr %3937, align 8 -// CHECK-NEXT: %3949 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 257 -// CHECK-NEXT: %3950 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3949, i32 0, i32 0 -// CHECK-NEXT: %3951 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3952 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %3952, align 8 -// CHECK-NEXT: %3953 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3952, 1 -// CHECK-NEXT: %3954 = extractvalue { ptr, ptr } %3951, 1 -// CHECK-NEXT: %3955 = extractvalue { ptr, ptr } %3951, 0 -// CHECK-NEXT: %__llgo_funcval_code514 = call ptr asm "", "=r,0"(ptr %3955) -// CHECK-NEXT: %3956 = call %reflect.Value %__llgo_funcval_code514(ptr {{(nest|swiftself)}} %3954, %"{{.*}}/runtime/internal/runtime.eface" %3953) -// CHECK-NEXT: %3957 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3949, i32 0, i32 1 -// CHECK-NEXT: %3958 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3959 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3959, align 1 -// CHECK-NEXT: %3960 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray0, ptr undef }, ptr %3959, 1 -// CHECK-NEXT: %3961 = extractvalue { ptr, ptr } %3958, 1 -// CHECK-NEXT: %3962 = extractvalue { ptr, ptr } %3958, 0 -// CHECK-NEXT: %__llgo_funcval_code515 = call ptr asm "", "=r,0"(ptr %3962) -// CHECK-NEXT: %3963 = call %reflect.Value %__llgo_funcval_code515(ptr {{(nest|swiftself)}} %3961, %"{{.*}}/runtime/internal/runtime.eface" %3960) -// CHECK-NEXT: store %reflect.Value %3956, ptr %3950, align 8 -// CHECK-NEXT: store %reflect.Value %3963, ptr %3957, align 8 -// CHECK-NEXT: %3964 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 258 -// CHECK-NEXT: %3965 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3964, i32 0, i32 0 -// CHECK-NEXT: %3966 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3967 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %3967, align 8 -// CHECK-NEXT: %3968 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3967, 1 -// CHECK-NEXT: %3969 = extractvalue { ptr, ptr } %3966, 1 -// CHECK-NEXT: %3970 = extractvalue { ptr, ptr } %3966, 0 -// CHECK-NEXT: %__llgo_funcval_code516 = call ptr asm "", "=r,0"(ptr %3970) -// CHECK-NEXT: %3971 = call %reflect.Value %__llgo_funcval_code516(ptr {{(nest|swiftself)}} %3969, %"{{.*}}/runtime/internal/runtime.eface" %3968) -// CHECK-NEXT: %3972 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3964, i32 0, i32 1 -// CHECK-NEXT: %3973 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3974 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %3974, align 1 -// CHECK-NEXT: %3975 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray0, ptr undef }, ptr %3974, 1 -// CHECK-NEXT: %3976 = extractvalue { ptr, ptr } %3973, 1 -// CHECK-NEXT: %3977 = extractvalue { ptr, ptr } %3973, 0 -// CHECK-NEXT: %__llgo_funcval_code517 = call ptr asm "", "=r,0"(ptr %3977) -// CHECK-NEXT: %3978 = call %reflect.Value %__llgo_funcval_code517(ptr {{(nest|swiftself)}} %3976, %"{{.*}}/runtime/internal/runtime.eface" %3975) -// CHECK-NEXT: store %reflect.Value %3971, ptr %3965, align 8 -// CHECK-NEXT: store %reflect.Value %3978, ptr %3972, align 8 -// CHECK-NEXT: %3979 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 259 -// CHECK-NEXT: %3980 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3979, i32 0, i32 0 -// CHECK-NEXT: %3981 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3982 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %3983 = getelementptr inbounds i8, ptr %3982, i64 0 -// CHECK-NEXT: store i8 1, ptr %3983, align 1 -// CHECK-NEXT: %3984 = getelementptr inbounds i8, ptr %3982, i64 1 -// CHECK-NEXT: store i8 2, ptr %3984, align 1 -// CHECK-NEXT: %3985 = getelementptr inbounds i8, ptr %3982, i64 2 -// CHECK-NEXT: store i8 3, ptr %3985, align 1 -// CHECK-NEXT: %3986 = getelementptr inbounds i8, ptr %3982, i64 3 -// CHECK-NEXT: store i8 4, ptr %3986, align 1 -// CHECK-NEXT: %3987 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %3982, 0 -// CHECK-NEXT: %3988 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3987, i64 4, 1 -// CHECK-NEXT: %3989 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %3988, i64 4, 2 -// CHECK-NEXT: %3990 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %3989, ptr %3990, align 8 -// CHECK-NEXT: %3991 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %3990, 1 -// CHECK-NEXT: %3992 = extractvalue { ptr, ptr } %3981, 1 -// CHECK-NEXT: %3993 = extractvalue { ptr, ptr } %3981, 0 -// CHECK-NEXT: %__llgo_funcval_code518 = call ptr asm "", "=r,0"(ptr %3993) -// CHECK-NEXT: %3994 = call %reflect.Value %__llgo_funcval_code518(ptr {{(nest|swiftself)}} %3992, %"{{.*}}/runtime/internal/runtime.eface" %3991) -// CHECK-NEXT: %3995 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %3979, i32 0, i32 1 -// CHECK-NEXT: %3996 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %3997 = alloca [4 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %3997, i8 0, i64 4, i1 false) -// CHECK-NEXT: %3998 = getelementptr inbounds i8, ptr %3997, i64 0 -// CHECK-NEXT: %3999 = getelementptr inbounds i8, ptr %3997, i64 1 -// CHECK-NEXT: %4000 = getelementptr inbounds i8, ptr %3997, i64 2 -// CHECK-NEXT: %4001 = getelementptr inbounds i8, ptr %3997, i64 3 -// CHECK-NEXT: store i8 1, ptr %3998, align 1 -// CHECK-NEXT: store i8 2, ptr %3999, align 1 -// CHECK-NEXT: store i8 3, ptr %4000, align 1 -// CHECK-NEXT: store i8 4, ptr %4001, align 1 -// CHECK-NEXT: %4002 = load [4 x i8], ptr %3997, align 1 -// CHECK-NEXT: %4003 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store [4 x i8] %4002, ptr %4003, align 1 -// CHECK-NEXT: %4004 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray, ptr undef }, ptr %4003, 1 -// CHECK-NEXT: %4005 = extractvalue { ptr, ptr } %3996, 1 -// CHECK-NEXT: %4006 = extractvalue { ptr, ptr } %3996, 0 -// CHECK-NEXT: %__llgo_funcval_code519 = call ptr asm "", "=r,0"(ptr %4006) -// CHECK-NEXT: %4007 = call %reflect.Value %__llgo_funcval_code519(ptr {{(nest|swiftself)}} %4005, %"{{.*}}/runtime/internal/runtime.eface" %4004) -// CHECK-NEXT: store %reflect.Value %3994, ptr %3980, align 8 -// CHECK-NEXT: store %reflect.Value %4007, ptr %3995, align 8 -// CHECK-NEXT: %4008 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 260 -// CHECK-NEXT: %4009 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4008, i32 0, i32 0 -// CHECK-NEXT: %4010 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4011 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4011, align 8 -// CHECK-NEXT: %4012 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4011, 1 -// CHECK-NEXT: %4013 = extractvalue { ptr, ptr } %4010, 1 -// CHECK-NEXT: %4014 = extractvalue { ptr, ptr } %4010, 0 -// CHECK-NEXT: %__llgo_funcval_code520 = call ptr asm "", "=r,0"(ptr %4014) -// CHECK-NEXT: %4015 = call %reflect.Value %__llgo_funcval_code520(ptr {{(nest|swiftself)}} %4013, %"{{.*}}/runtime/internal/runtime.eface" %4012) -// CHECK-NEXT: %4016 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4008, i32 0, i32 1 -// CHECK-NEXT: %4017 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4018 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4018, align 1 -// CHECK-NEXT: %4019 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray0, ptr undef }, ptr %4018, 1 -// CHECK-NEXT: %4020 = extractvalue { ptr, ptr } %4017, 1 -// CHECK-NEXT: %4021 = extractvalue { ptr, ptr } %4017, 0 -// CHECK-NEXT: %__llgo_funcval_code521 = call ptr asm "", "=r,0"(ptr %4021) -// CHECK-NEXT: %4022 = call %reflect.Value %__llgo_funcval_code521(ptr {{(nest|swiftself)}} %4020, %"{{.*}}/runtime/internal/runtime.eface" %4019) -// CHECK-NEXT: store %reflect.Value %4015, ptr %4009, align 8 -// CHECK-NEXT: store %reflect.Value %4022, ptr %4016, align 8 -// CHECK-NEXT: %4023 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 261 -// CHECK-NEXT: %4024 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4023, i32 0, i32 0 -// CHECK-NEXT: %4025 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4026 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4027 = getelementptr inbounds i8, ptr %4026, i64 0 -// CHECK-NEXT: store i8 5, ptr %4027, align 1 -// CHECK-NEXT: %4028 = getelementptr inbounds i8, ptr %4026, i64 1 -// CHECK-NEXT: store i8 6, ptr %4028, align 1 -// CHECK-NEXT: %4029 = getelementptr inbounds i8, ptr %4026, i64 2 -// CHECK-NEXT: store i8 7, ptr %4029, align 1 -// CHECK-NEXT: %4030 = getelementptr inbounds i8, ptr %4026, i64 3 -// CHECK-NEXT: store i8 8, ptr %4030, align 1 -// CHECK-NEXT: %4031 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4026, 0 -// CHECK-NEXT: %4032 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4031, i64 4, 1 -// CHECK-NEXT: %4033 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4032, i64 4, 2 -// CHECK-NEXT: %4034 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4033, ptr %4034, align 8 -// CHECK-NEXT: %4035 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4034, 1 -// CHECK-NEXT: %4036 = extractvalue { ptr, ptr } %4025, 1 -// CHECK-NEXT: %4037 = extractvalue { ptr, ptr } %4025, 0 -// CHECK-NEXT: %__llgo_funcval_code522 = call ptr asm "", "=r,0"(ptr %4037) -// CHECK-NEXT: %4038 = call %reflect.Value %__llgo_funcval_code522(ptr {{(nest|swiftself)}} %4036, %"{{.*}}/runtime/internal/runtime.eface" %4035) -// CHECK-NEXT: %4039 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4023, i32 0, i32 1 -// CHECK-NEXT: %4040 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4041 = alloca [4 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %4041, i8 0, i64 4, i1 false) -// CHECK-NEXT: %4042 = getelementptr inbounds i8, ptr %4041, i64 0 -// CHECK-NEXT: %4043 = getelementptr inbounds i8, ptr %4041, i64 1 -// CHECK-NEXT: %4044 = getelementptr inbounds i8, ptr %4041, i64 2 -// CHECK-NEXT: %4045 = getelementptr inbounds i8, ptr %4041, i64 3 -// CHECK-NEXT: store i8 5, ptr %4042, align 1 -// CHECK-NEXT: store i8 6, ptr %4043, align 1 -// CHECK-NEXT: store i8 7, ptr %4044, align 1 -// CHECK-NEXT: store i8 8, ptr %4045, align 1 -// CHECK-NEXT: %4046 = load [4 x i8], ptr %4041, align 1 -// CHECK-NEXT: %4047 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store [4 x i8] %4046, ptr %4047, align 1 -// CHECK-NEXT: %4048 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray, ptr undef }, ptr %4047, 1 -// CHECK-NEXT: %4049 = extractvalue { ptr, ptr } %4040, 1 -// CHECK-NEXT: %4050 = extractvalue { ptr, ptr } %4040, 0 -// CHECK-NEXT: %__llgo_funcval_code523 = call ptr asm "", "=r,0"(ptr %4050) -// CHECK-NEXT: %4051 = call %reflect.Value %__llgo_funcval_code523(ptr {{(nest|swiftself)}} %4049, %"{{.*}}/runtime/internal/runtime.eface" %4048) -// CHECK-NEXT: store %reflect.Value %4038, ptr %4024, align 8 -// CHECK-NEXT: store %reflect.Value %4051, ptr %4039, align 8 -// CHECK-NEXT: %4052 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 262 -// CHECK-NEXT: %4053 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4052, i32 0, i32 0 -// CHECK-NEXT: %4054 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4055 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4055, align 8 -// CHECK-NEXT: %4056 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_main.MyByte", ptr undef }, ptr %4055, 1 -// CHECK-NEXT: %4057 = extractvalue { ptr, ptr } %4054, 1 -// CHECK-NEXT: %4058 = extractvalue { ptr, ptr } %4054, 0 -// CHECK-NEXT: %__llgo_funcval_code524 = call ptr asm "", "=r,0"(ptr %4058) -// CHECK-NEXT: %4059 = call %reflect.Value %__llgo_funcval_code524(ptr {{(nest|swiftself)}} %4057, %"{{.*}}/runtime/internal/runtime.eface" %4056) -// CHECK-NEXT: %4060 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4052, i32 0, i32 1 -// CHECK-NEXT: %4061 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4062 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4062, align 1 -// CHECK-NEXT: %4063 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_main.MyByte", ptr undef }, ptr %4062, 1 -// CHECK-NEXT: %4064 = extractvalue { ptr, ptr } %4061, 1 -// CHECK-NEXT: %4065 = extractvalue { ptr, ptr } %4061, 0 -// CHECK-NEXT: %__llgo_funcval_code525 = call ptr asm "", "=r,0"(ptr %4065) -// CHECK-NEXT: %4066 = call %reflect.Value %__llgo_funcval_code525(ptr {{(nest|swiftself)}} %4064, %"{{.*}}/runtime/internal/runtime.eface" %4063) -// CHECK-NEXT: store %reflect.Value %4059, ptr %4053, align 8 -// CHECK-NEXT: store %reflect.Value %4066, ptr %4060, align 8 -// CHECK-NEXT: %4067 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 263 -// CHECK-NEXT: %4068 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4067, i32 0, i32 0 -// CHECK-NEXT: %4069 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4070 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %4071 = getelementptr inbounds i8, ptr %4070, i64 0 -// CHECK-NEXT: store i8 1, ptr %4071, align 1 -// CHECK-NEXT: %4072 = getelementptr inbounds i8, ptr %4070, i64 1 -// CHECK-NEXT: store i8 2, ptr %4072, align 1 -// CHECK-NEXT: %4073 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4070, 0 -// CHECK-NEXT: %4074 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4073, i64 2, 1 -// CHECK-NEXT: %4075 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4074, i64 2, 2 -// CHECK-NEXT: %4076 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4075, ptr %4076, align 8 -// CHECK-NEXT: %4077 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_main.MyByte", ptr undef }, ptr %4076, 1 -// CHECK-NEXT: %4078 = extractvalue { ptr, ptr } %4069, 1 -// CHECK-NEXT: %4079 = extractvalue { ptr, ptr } %4069, 0 -// CHECK-NEXT: %__llgo_funcval_code526 = call ptr asm "", "=r,0"(ptr %4079) -// CHECK-NEXT: %4080 = call %reflect.Value %__llgo_funcval_code526(ptr {{(nest|swiftself)}} %4078, %"{{.*}}/runtime/internal/runtime.eface" %4077) -// CHECK-NEXT: %4081 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4067, i32 0, i32 1 -// CHECK-NEXT: %4082 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4083 = alloca [2 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %4083, i8 0, i64 2, i1 false) -// CHECK-NEXT: %4084 = getelementptr inbounds i8, ptr %4083, i64 0 -// CHECK-NEXT: %4085 = getelementptr inbounds i8, ptr %4083, i64 1 -// CHECK-NEXT: store i8 1, ptr %4084, align 1 -// CHECK-NEXT: store i8 2, ptr %4085, align 1 -// CHECK-NEXT: %4086 = load [2 x i8], ptr %4083, align 1 -// CHECK-NEXT: %4087 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] %4086, ptr %4087, align 1 -// CHECK-NEXT: %4088 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_main.MyByte", ptr undef }, ptr %4087, 1 -// CHECK-NEXT: %4089 = extractvalue { ptr, ptr } %4082, 1 -// CHECK-NEXT: %4090 = extractvalue { ptr, ptr } %4082, 0 -// CHECK-NEXT: %__llgo_funcval_code527 = call ptr asm "", "=r,0"(ptr %4090) -// CHECK-NEXT: %4091 = call %reflect.Value %__llgo_funcval_code527(ptr {{(nest|swiftself)}} %4089, %"{{.*}}/runtime/internal/runtime.eface" %4088) -// CHECK-NEXT: store %reflect.Value %4080, ptr %4068, align 8 -// CHECK-NEXT: store %reflect.Value %4091, ptr %4081, align 8 -// CHECK-NEXT: %4092 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 264 -// CHECK-NEXT: %4093 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4092, i32 0, i32 0 -// CHECK-NEXT: %4094 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4095 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4095, align 8 -// CHECK-NEXT: %4096 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4095, 1 -// CHECK-NEXT: %4097 = extractvalue { ptr, ptr } %4094, 1 -// CHECK-NEXT: %4098 = extractvalue { ptr, ptr } %4094, 0 -// CHECK-NEXT: %__llgo_funcval_code528 = call ptr asm "", "=r,0"(ptr %4098) -// CHECK-NEXT: %4099 = call %reflect.Value %__llgo_funcval_code528(ptr {{(nest|swiftself)}} %4097, %"{{.*}}/runtime/internal/runtime.eface" %4096) -// CHECK-NEXT: %4100 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4092, i32 0, i32 1 -// CHECK-NEXT: %4101 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4102 = extractvalue { ptr, ptr } %4101, 1 -// CHECK-NEXT: %4103 = extractvalue { ptr, ptr } %4101, 0 -// CHECK-NEXT: %__llgo_funcval_code529 = call ptr asm "", "=r,0"(ptr %4103) -// CHECK-NEXT: %4104 = call %reflect.Value %__llgo_funcval_code529(ptr {{(nest|swiftself)}} %4102, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4099, ptr %4093, align 8 -// CHECK-NEXT: store %reflect.Value %4104, ptr %4100, align 8 -// CHECK-NEXT: %4105 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 265 -// CHECK-NEXT: %4106 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4105, i32 0, i32 0 -// CHECK-NEXT: %4107 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4108 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4108, align 8 -// CHECK-NEXT: %4109 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4108, 1 -// CHECK-NEXT: %4110 = extractvalue { ptr, ptr } %4107, 1 -// CHECK-NEXT: %4111 = extractvalue { ptr, ptr } %4107, 0 -// CHECK-NEXT: %__llgo_funcval_code530 = call ptr asm "", "=r,0"(ptr %4111) -// CHECK-NEXT: %4112 = call %reflect.Value %__llgo_funcval_code530(ptr {{(nest|swiftself)}} %4110, %"{{.*}}/runtime/internal/runtime.eface" %4109) -// CHECK-NEXT: %4113 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4105, i32 0, i32 1 -// CHECK-NEXT: %4114 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4115 = extractvalue { ptr, ptr } %4114, 1 -// CHECK-NEXT: %4116 = extractvalue { ptr, ptr } %4114, 0 -// CHECK-NEXT: %__llgo_funcval_code531 = call ptr asm "", "=r,0"(ptr %4116) -// CHECK-NEXT: %4117 = call %reflect.Value %__llgo_funcval_code531(ptr {{(nest|swiftself)}} %4115, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4112, ptr %4106, align 8 -// CHECK-NEXT: store %reflect.Value %4117, ptr %4113, align 8 -// CHECK-NEXT: %4118 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 266 -// CHECK-NEXT: %4119 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4118, i32 0, i32 0 -// CHECK-NEXT: %4120 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4121 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %4122 = getelementptr inbounds i8, ptr %4121, i64 0 -// CHECK-NEXT: store i8 7, ptr %4122, align 1 -// CHECK-NEXT: %4123 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4121, 0 -// CHECK-NEXT: %4124 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4123, i64 1, 1 -// CHECK-NEXT: %4125 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4124, i64 1, 2 -// CHECK-NEXT: %4126 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4125, ptr %4126, align 8 -// CHECK-NEXT: %4127 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4126, 1 -// CHECK-NEXT: %4128 = extractvalue { ptr, ptr } %4120, 1 -// CHECK-NEXT: %4129 = extractvalue { ptr, ptr } %4120, 0 -// CHECK-NEXT: %__llgo_funcval_code532 = call ptr asm "", "=r,0"(ptr %4129) -// CHECK-NEXT: %4130 = call %reflect.Value %__llgo_funcval_code532(ptr {{(nest|swiftself)}} %4128, %"{{.*}}/runtime/internal/runtime.eface" %4127) -// CHECK-NEXT: %4131 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4118, i32 0, i32 1 -// CHECK-NEXT: %4132 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4133 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %4134 = getelementptr inbounds i8, ptr %4133, i64 0 -// CHECK-NEXT: store i8 7, ptr %4134, align 1 -// CHECK-NEXT: %4135 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[1]_llgo_uint8", ptr undef }, ptr %4133, 1 -// CHECK-NEXT: %4136 = extractvalue { ptr, ptr } %4132, 1 -// CHECK-NEXT: %4137 = extractvalue { ptr, ptr } %4132, 0 -// CHECK-NEXT: %__llgo_funcval_code533 = call ptr asm "", "=r,0"(ptr %4137) -// CHECK-NEXT: %4138 = call %reflect.Value %__llgo_funcval_code533(ptr {{(nest|swiftself)}} %4136, %"{{.*}}/runtime/internal/runtime.eface" %4135) -// CHECK-NEXT: store %reflect.Value %4130, ptr %4119, align 8 -// CHECK-NEXT: store %reflect.Value %4138, ptr %4131, align 8 -// CHECK-NEXT: %4139 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 267 -// CHECK-NEXT: %4140 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4139, i32 0, i32 0 -// CHECK-NEXT: %4141 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4142 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4142, align 8 -// CHECK-NEXT: %4143 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4142, 1 -// CHECK-NEXT: %4144 = extractvalue { ptr, ptr } %4141, 1 -// CHECK-NEXT: %4145 = extractvalue { ptr, ptr } %4141, 0 -// CHECK-NEXT: %__llgo_funcval_code534 = call ptr asm "", "=r,0"(ptr %4145) -// CHECK-NEXT: %4146 = call %reflect.Value %__llgo_funcval_code534(ptr {{(nest|swiftself)}} %4144, %"{{.*}}/runtime/internal/runtime.eface" %4143) -// CHECK-NEXT: %4147 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4139, i32 0, i32 1 -// CHECK-NEXT: %4148 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4149 = extractvalue { ptr, ptr } %4148, 1 -// CHECK-NEXT: %4150 = extractvalue { ptr, ptr } %4148, 0 -// CHECK-NEXT: %__llgo_funcval_code535 = call ptr asm "", "=r,0"(ptr %4150) -// CHECK-NEXT: %4151 = call %reflect.Value %__llgo_funcval_code535(ptr {{(nest|swiftself)}} %4149, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4146, ptr %4140, align 8 -// CHECK-NEXT: store %reflect.Value %4151, ptr %4147, align 8 -// CHECK-NEXT: %4152 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 268 -// CHECK-NEXT: %4153 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4152, i32 0, i32 0 -// CHECK-NEXT: %4154 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4155 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4155, align 8 -// CHECK-NEXT: %4156 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4155, 1 -// CHECK-NEXT: %4157 = extractvalue { ptr, ptr } %4154, 1 -// CHECK-NEXT: %4158 = extractvalue { ptr, ptr } %4154, 0 -// CHECK-NEXT: %__llgo_funcval_code536 = call ptr asm "", "=r,0"(ptr %4158) -// CHECK-NEXT: %4159 = call %reflect.Value %__llgo_funcval_code536(ptr {{(nest|swiftself)}} %4157, %"{{.*}}/runtime/internal/runtime.eface" %4156) -// CHECK-NEXT: %4160 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4152, i32 0, i32 1 -// CHECK-NEXT: %4161 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4162 = extractvalue { ptr, ptr } %4161, 1 -// CHECK-NEXT: %4163 = extractvalue { ptr, ptr } %4161, 0 -// CHECK-NEXT: %__llgo_funcval_code537 = call ptr asm "", "=r,0"(ptr %4163) -// CHECK-NEXT: %4164 = call %reflect.Value %__llgo_funcval_code537(ptr {{(nest|swiftself)}} %4162, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4159, ptr %4153, align 8 -// CHECK-NEXT: store %reflect.Value %4164, ptr %4160, align 8 -// CHECK-NEXT: %4165 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 269 -// CHECK-NEXT: %4166 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4165, i32 0, i32 0 -// CHECK-NEXT: %4167 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4168 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %4169 = getelementptr inbounds i8, ptr %4168, i64 0 -// CHECK-NEXT: store i8 9, ptr %4169, align 1 -// CHECK-NEXT: %4170 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4168, 0 -// CHECK-NEXT: %4171 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4170, i64 1, 1 -// CHECK-NEXT: %4172 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4171, i64 1, 2 -// CHECK-NEXT: %4173 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4172, ptr %4173, align 8 -// CHECK-NEXT: %4174 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4173, 1 -// CHECK-NEXT: %4175 = extractvalue { ptr, ptr } %4167, 1 -// CHECK-NEXT: %4176 = extractvalue { ptr, ptr } %4167, 0 -// CHECK-NEXT: %__llgo_funcval_code538 = call ptr asm "", "=r,0"(ptr %4176) -// CHECK-NEXT: %4177 = call %reflect.Value %__llgo_funcval_code538(ptr {{(nest|swiftself)}} %4175, %"{{.*}}/runtime/internal/runtime.eface" %4174) -// CHECK-NEXT: %4178 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4165, i32 0, i32 1 -// CHECK-NEXT: %4179 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4180 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 1) -// CHECK-NEXT: %4181 = getelementptr inbounds i8, ptr %4180, i64 0 -// CHECK-NEXT: store i8 9, ptr %4181, align 1 -// CHECK-NEXT: %4182 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[1]_llgo_uint8", ptr undef }, ptr %4180, 1 -// CHECK-NEXT: %4183 = extractvalue { ptr, ptr } %4179, 1 -// CHECK-NEXT: %4184 = extractvalue { ptr, ptr } %4179, 0 -// CHECK-NEXT: %__llgo_funcval_code539 = call ptr asm "", "=r,0"(ptr %4184) -// CHECK-NEXT: %4185 = call %reflect.Value %__llgo_funcval_code539(ptr {{(nest|swiftself)}} %4183, %"{{.*}}/runtime/internal/runtime.eface" %4182) -// CHECK-NEXT: store %reflect.Value %4177, ptr %4166, align 8 -// CHECK-NEXT: store %reflect.Value %4185, ptr %4178, align 8 -// CHECK-NEXT: %4186 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 270 -// CHECK-NEXT: %4187 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4186, i32 0, i32 0 -// CHECK-NEXT: %4188 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4189 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4189, align 8 -// CHECK-NEXT: %4190 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4189, 1 -// CHECK-NEXT: %4191 = extractvalue { ptr, ptr } %4188, 1 -// CHECK-NEXT: %4192 = extractvalue { ptr, ptr } %4188, 0 -// CHECK-NEXT: %__llgo_funcval_code540 = call ptr asm "", "=r,0"(ptr %4192) -// CHECK-NEXT: %4193 = call %reflect.Value %__llgo_funcval_code540(ptr {{(nest|swiftself)}} %4191, %"{{.*}}/runtime/internal/runtime.eface" %4190) -// CHECK-NEXT: %4194 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4186, i32 0, i32 1 -// CHECK-NEXT: %4195 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4196 = extractvalue { ptr, ptr } %4195, 1 -// CHECK-NEXT: %4197 = extractvalue { ptr, ptr } %4195, 0 -// CHECK-NEXT: %__llgo_funcval_code541 = call ptr asm "", "=r,0"(ptr %4197) -// CHECK-NEXT: %4198 = call %reflect.Value %__llgo_funcval_code541(ptr {{(nest|swiftself)}} %4196, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr0, ptr null }) -// CHECK-NEXT: store %reflect.Value %4193, ptr %4187, align 8 -// CHECK-NEXT: store %reflect.Value %4198, ptr %4194, align 8 -// CHECK-NEXT: %4199 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 271 -// CHECK-NEXT: %4200 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4199, i32 0, i32 0 -// CHECK-NEXT: %4201 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4202 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4202, align 8 -// CHECK-NEXT: %4203 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4202, 1 -// CHECK-NEXT: %4204 = extractvalue { ptr, ptr } %4201, 1 -// CHECK-NEXT: %4205 = extractvalue { ptr, ptr } %4201, 0 -// CHECK-NEXT: %__llgo_funcval_code542 = call ptr asm "", "=r,0"(ptr %4205) -// CHECK-NEXT: %4206 = call %reflect.Value %__llgo_funcval_code542(ptr {{(nest|swiftself)}} %4204, %"{{.*}}/runtime/internal/runtime.eface" %4203) -// CHECK-NEXT: %4207 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4199, i32 0, i32 1 -// CHECK-NEXT: %4208 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4209 = extractvalue { ptr, ptr } %4208, 1 -// CHECK-NEXT: %4210 = extractvalue { ptr, ptr } %4208, 0 -// CHECK-NEXT: %__llgo_funcval_code543 = call ptr asm "", "=r,0"(ptr %4210) -// CHECK-NEXT: %4211 = call %reflect.Value %__llgo_funcval_code543(ptr {{(nest|swiftself)}} %4209, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr0, ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4206, ptr %4200, align 8 -// CHECK-NEXT: store %reflect.Value %4211, ptr %4207, align 8 -// CHECK-NEXT: %4212 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 272 -// CHECK-NEXT: %4213 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4212, i32 0, i32 0 -// CHECK-NEXT: %4214 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4215 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4216 = getelementptr inbounds i8, ptr %4215, i64 0 -// CHECK-NEXT: store i8 1, ptr %4216, align 1 -// CHECK-NEXT: %4217 = getelementptr inbounds i8, ptr %4215, i64 1 -// CHECK-NEXT: store i8 2, ptr %4217, align 1 -// CHECK-NEXT: %4218 = getelementptr inbounds i8, ptr %4215, i64 2 -// CHECK-NEXT: store i8 3, ptr %4218, align 1 -// CHECK-NEXT: %4219 = getelementptr inbounds i8, ptr %4215, i64 3 -// CHECK-NEXT: store i8 4, ptr %4219, align 1 -// CHECK-NEXT: %4220 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4215, 0 -// CHECK-NEXT: %4221 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4220, i64 4, 1 -// CHECK-NEXT: %4222 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4221, i64 4, 2 -// CHECK-NEXT: %4223 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4222, ptr %4223, align 8 -// CHECK-NEXT: %4224 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4223, 1 -// CHECK-NEXT: %4225 = extractvalue { ptr, ptr } %4214, 1 -// CHECK-NEXT: %4226 = extractvalue { ptr, ptr } %4214, 0 -// CHECK-NEXT: %__llgo_funcval_code544 = call ptr asm "", "=r,0"(ptr %4226) -// CHECK-NEXT: %4227 = call %reflect.Value %__llgo_funcval_code544(ptr {{(nest|swiftself)}} %4225, %"{{.*}}/runtime/internal/runtime.eface" %4224) -// CHECK-NEXT: %4228 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4212, i32 0, i32 1 -// CHECK-NEXT: %4229 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4230 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4231 = getelementptr inbounds i8, ptr %4230, i64 0 -// CHECK-NEXT: %4232 = getelementptr inbounds i8, ptr %4230, i64 1 -// CHECK-NEXT: %4233 = getelementptr inbounds i8, ptr %4230, i64 2 -// CHECK-NEXT: %4234 = getelementptr inbounds i8, ptr %4230, i64 3 -// CHECK-NEXT: store i8 1, ptr %4231, align 1 -// CHECK-NEXT: store i8 2, ptr %4232, align 1 -// CHECK-NEXT: store i8 3, ptr %4233, align 1 -// CHECK-NEXT: store i8 4, ptr %4234, align 1 -// CHECK-NEXT: %4235 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr, ptr undef }, ptr %4230, 1 -// CHECK-NEXT: %4236 = extractvalue { ptr, ptr } %4229, 1 -// CHECK-NEXT: %4237 = extractvalue { ptr, ptr } %4229, 0 -// CHECK-NEXT: %__llgo_funcval_code545 = call ptr asm "", "=r,0"(ptr %4237) -// CHECK-NEXT: %4238 = call %reflect.Value %__llgo_funcval_code545(ptr {{(nest|swiftself)}} %4236, %"{{.*}}/runtime/internal/runtime.eface" %4235) -// CHECK-NEXT: store %reflect.Value %4227, ptr %4213, align 8 -// CHECK-NEXT: store %reflect.Value %4238, ptr %4228, align 8 -// CHECK-NEXT: %4239 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 273 -// CHECK-NEXT: %4240 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4239, i32 0, i32 0 -// CHECK-NEXT: %4241 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4242 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4242, align 8 -// CHECK-NEXT: %4243 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4242, 1 -// CHECK-NEXT: %4244 = extractvalue { ptr, ptr } %4241, 1 -// CHECK-NEXT: %4245 = extractvalue { ptr, ptr } %4241, 0 -// CHECK-NEXT: %__llgo_funcval_code546 = call ptr asm "", "=r,0"(ptr %4245) -// CHECK-NEXT: %4246 = call %reflect.Value %__llgo_funcval_code546(ptr {{(nest|swiftself)}} %4244, %"{{.*}}/runtime/internal/runtime.eface" %4243) -// CHECK-NEXT: %4247 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4239, i32 0, i32 1 -// CHECK-NEXT: %4248 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4249 = extractvalue { ptr, ptr } %4248, 1 -// CHECK-NEXT: %4250 = extractvalue { ptr, ptr } %4248, 0 -// CHECK-NEXT: %__llgo_funcval_code547 = call ptr asm "", "=r,0"(ptr %4250) -// CHECK-NEXT: %4251 = call %reflect.Value %__llgo_funcval_code547(ptr {{(nest|swiftself)}} %4249, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr0, ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4246, ptr %4240, align 8 -// CHECK-NEXT: store %reflect.Value %4251, ptr %4247, align 8 -// CHECK-NEXT: %4252 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 274 -// CHECK-NEXT: %4253 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4252, i32 0, i32 0 -// CHECK-NEXT: %4254 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4255 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4256 = getelementptr inbounds i8, ptr %4255, i64 0 -// CHECK-NEXT: store i8 5, ptr %4256, align 1 -// CHECK-NEXT: %4257 = getelementptr inbounds i8, ptr %4255, i64 1 -// CHECK-NEXT: store i8 6, ptr %4257, align 1 -// CHECK-NEXT: %4258 = getelementptr inbounds i8, ptr %4255, i64 2 -// CHECK-NEXT: store i8 7, ptr %4258, align 1 -// CHECK-NEXT: %4259 = getelementptr inbounds i8, ptr %4255, i64 3 -// CHECK-NEXT: store i8 8, ptr %4259, align 1 -// CHECK-NEXT: %4260 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4255, 0 -// CHECK-NEXT: %4261 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4260, i64 4, 1 -// CHECK-NEXT: %4262 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4261, i64 4, 2 -// CHECK-NEXT: %4263 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4262, ptr %4263, align 8 -// CHECK-NEXT: %4264 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4263, 1 -// CHECK-NEXT: %4265 = extractvalue { ptr, ptr } %4254, 1 -// CHECK-NEXT: %4266 = extractvalue { ptr, ptr } %4254, 0 -// CHECK-NEXT: %__llgo_funcval_code548 = call ptr asm "", "=r,0"(ptr %4266) -// CHECK-NEXT: %4267 = call %reflect.Value %__llgo_funcval_code548(ptr {{(nest|swiftself)}} %4265, %"{{.*}}/runtime/internal/runtime.eface" %4264) -// CHECK-NEXT: %4268 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4252, i32 0, i32 1 -// CHECK-NEXT: %4269 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4270 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4271 = getelementptr inbounds i8, ptr %4270, i64 0 -// CHECK-NEXT: %4272 = getelementptr inbounds i8, ptr %4270, i64 1 -// CHECK-NEXT: %4273 = getelementptr inbounds i8, ptr %4270, i64 2 -// CHECK-NEXT: %4274 = getelementptr inbounds i8, ptr %4270, i64 3 -// CHECK-NEXT: store i8 5, ptr %4271, align 1 -// CHECK-NEXT: store i8 6, ptr %4272, align 1 -// CHECK-NEXT: store i8 7, ptr %4273, align 1 -// CHECK-NEXT: store i8 8, ptr %4274, align 1 -// CHECK-NEXT: %4275 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr, ptr undef }, ptr %4270, 1 -// CHECK-NEXT: %4276 = extractvalue { ptr, ptr } %4269, 1 -// CHECK-NEXT: %4277 = extractvalue { ptr, ptr } %4269, 0 -// CHECK-NEXT: %__llgo_funcval_code549 = call ptr asm "", "=r,0"(ptr %4277) -// CHECK-NEXT: %4278 = call %reflect.Value %__llgo_funcval_code549(ptr {{(nest|swiftself)}} %4276, %"{{.*}}/runtime/internal/runtime.eface" %4275) -// CHECK-NEXT: store %reflect.Value %4267, ptr %4253, align 8 -// CHECK-NEXT: store %reflect.Value %4278, ptr %4268, align 8 -// CHECK-NEXT: %4279 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 275 -// CHECK-NEXT: %4280 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4279, i32 0, i32 0 -// CHECK-NEXT: %4281 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4282 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4282, align 8 -// CHECK-NEXT: %4283 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4282, 1 -// CHECK-NEXT: %4284 = extractvalue { ptr, ptr } %4281, 1 -// CHECK-NEXT: %4285 = extractvalue { ptr, ptr } %4281, 0 -// CHECK-NEXT: %__llgo_funcval_code550 = call ptr asm "", "=r,0"(ptr %4285) -// CHECK-NEXT: %4286 = call %reflect.Value %__llgo_funcval_code550(ptr {{(nest|swiftself)}} %4284, %"{{.*}}/runtime/internal/runtime.eface" %4283) -// CHECK-NEXT: %4287 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4279, i32 0, i32 1 -// CHECK-NEXT: %4288 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4289 = extractvalue { ptr, ptr } %4288, 1 -// CHECK-NEXT: %4290 = extractvalue { ptr, ptr } %4288, 0 -// CHECK-NEXT: %__llgo_funcval_code551 = call ptr asm "", "=r,0"(ptr %4290) -// CHECK-NEXT: %4291 = call %reflect.Value %__llgo_funcval_code551(ptr {{(nest|swiftself)}} %4289, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr null }) -// CHECK-NEXT: store %reflect.Value %4286, ptr %4280, align 8 -// CHECK-NEXT: store %reflect.Value %4291, ptr %4287, align 8 -// CHECK-NEXT: %4292 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 276 -// CHECK-NEXT: %4293 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4292, i32 0, i32 0 -// CHECK-NEXT: %4294 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4295 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4295, align 8 -// CHECK-NEXT: %4296 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4295, 1 -// CHECK-NEXT: %4297 = extractvalue { ptr, ptr } %4294, 1 -// CHECK-NEXT: %4298 = extractvalue { ptr, ptr } %4294, 0 -// CHECK-NEXT: %__llgo_funcval_code552 = call ptr asm "", "=r,0"(ptr %4298) -// CHECK-NEXT: %4299 = call %reflect.Value %__llgo_funcval_code552(ptr {{(nest|swiftself)}} %4297, %"{{.*}}/runtime/internal/runtime.eface" %4296) -// CHECK-NEXT: %4300 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4292, i32 0, i32 1 -// CHECK-NEXT: %4301 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4302 = extractvalue { ptr, ptr } %4301, 1 -// CHECK-NEXT: %4303 = extractvalue { ptr, ptr } %4301, 0 -// CHECK-NEXT: %__llgo_funcval_code553 = call ptr asm "", "=r,0"(ptr %4303) -// CHECK-NEXT: %4304 = call %reflect.Value %__llgo_funcval_code553(ptr {{(nest|swiftself)}} %4302, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4299, ptr %4293, align 8 -// CHECK-NEXT: store %reflect.Value %4304, ptr %4300, align 8 -// CHECK-NEXT: %4305 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 277 -// CHECK-NEXT: %4306 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4305, i32 0, i32 0 -// CHECK-NEXT: %4307 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4308 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4309 = getelementptr inbounds i8, ptr %4308, i64 0 -// CHECK-NEXT: store i8 1, ptr %4309, align 1 -// CHECK-NEXT: %4310 = getelementptr inbounds i8, ptr %4308, i64 1 -// CHECK-NEXT: store i8 2, ptr %4310, align 1 -// CHECK-NEXT: %4311 = getelementptr inbounds i8, ptr %4308, i64 2 -// CHECK-NEXT: store i8 3, ptr %4311, align 1 -// CHECK-NEXT: %4312 = getelementptr inbounds i8, ptr %4308, i64 3 -// CHECK-NEXT: store i8 4, ptr %4312, align 1 -// CHECK-NEXT: %4313 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4308, 0 -// CHECK-NEXT: %4314 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4313, i64 4, 1 -// CHECK-NEXT: %4315 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4314, i64 4, 2 -// CHECK-NEXT: %4316 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4315, ptr %4316, align 8 -// CHECK-NEXT: %4317 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4316, 1 -// CHECK-NEXT: %4318 = extractvalue { ptr, ptr } %4307, 1 -// CHECK-NEXT: %4319 = extractvalue { ptr, ptr } %4307, 0 -// CHECK-NEXT: %__llgo_funcval_code554 = call ptr asm "", "=r,0"(ptr %4319) -// CHECK-NEXT: %4320 = call %reflect.Value %__llgo_funcval_code554(ptr {{(nest|swiftself)}} %4318, %"{{.*}}/runtime/internal/runtime.eface" %4317) -// CHECK-NEXT: %4321 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4305, i32 0, i32 1 -// CHECK-NEXT: %4322 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4323 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4324 = getelementptr inbounds i8, ptr %4323, i64 0 -// CHECK-NEXT: %4325 = getelementptr inbounds i8, ptr %4323, i64 1 -// CHECK-NEXT: %4326 = getelementptr inbounds i8, ptr %4323, i64 2 -// CHECK-NEXT: %4327 = getelementptr inbounds i8, ptr %4323, i64 3 -// CHECK-NEXT: store i8 1, ptr %4324, align 1 -// CHECK-NEXT: store i8 2, ptr %4325, align 1 -// CHECK-NEXT: store i8 3, ptr %4326, align 1 -// CHECK-NEXT: store i8 4, ptr %4327, align 1 -// CHECK-NEXT: %4328 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray", ptr undef }, ptr %4323, 1 -// CHECK-NEXT: %4329 = extractvalue { ptr, ptr } %4322, 1 -// CHECK-NEXT: %4330 = extractvalue { ptr, ptr } %4322, 0 -// CHECK-NEXT: %__llgo_funcval_code555 = call ptr asm "", "=r,0"(ptr %4330) -// CHECK-NEXT: %4331 = call %reflect.Value %__llgo_funcval_code555(ptr {{(nest|swiftself)}} %4329, %"{{.*}}/runtime/internal/runtime.eface" %4328) -// CHECK-NEXT: store %reflect.Value %4320, ptr %4306, align 8 -// CHECK-NEXT: store %reflect.Value %4331, ptr %4321, align 8 -// CHECK-NEXT: %4332 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 278 -// CHECK-NEXT: %4333 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4332, i32 0, i32 0 -// CHECK-NEXT: %4334 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4335 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4335, align 8 -// CHECK-NEXT: %4336 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4335, 1 -// CHECK-NEXT: %4337 = extractvalue { ptr, ptr } %4334, 1 -// CHECK-NEXT: %4338 = extractvalue { ptr, ptr } %4334, 0 -// CHECK-NEXT: %__llgo_funcval_code556 = call ptr asm "", "=r,0"(ptr %4338) -// CHECK-NEXT: %4339 = call %reflect.Value %__llgo_funcval_code556(ptr {{(nest|swiftself)}} %4337, %"{{.*}}/runtime/internal/runtime.eface" %4336) -// CHECK-NEXT: %4340 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4332, i32 0, i32 1 -// CHECK-NEXT: %4341 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4342 = extractvalue { ptr, ptr } %4341, 1 -// CHECK-NEXT: %4343 = extractvalue { ptr, ptr } %4341, 0 -// CHECK-NEXT: %__llgo_funcval_code557 = call ptr asm "", "=r,0"(ptr %4343) -// CHECK-NEXT: %4344 = call %reflect.Value %__llgo_funcval_code557(ptr {{(nest|swiftself)}} %4342, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr null }) -// CHECK-NEXT: store %reflect.Value %4339, ptr %4333, align 8 -// CHECK-NEXT: store %reflect.Value %4344, ptr %4340, align 8 -// CHECK-NEXT: %4345 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 279 -// CHECK-NEXT: %4346 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4345, i32 0, i32 0 -// CHECK-NEXT: %4347 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4348 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4348, align 8 -// CHECK-NEXT: %4349 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4348, 1 -// CHECK-NEXT: %4350 = extractvalue { ptr, ptr } %4347, 1 -// CHECK-NEXT: %4351 = extractvalue { ptr, ptr } %4347, 0 -// CHECK-NEXT: %__llgo_funcval_code558 = call ptr asm "", "=r,0"(ptr %4351) -// CHECK-NEXT: %4352 = call %reflect.Value %__llgo_funcval_code558(ptr {{(nest|swiftself)}} %4350, %"{{.*}}/runtime/internal/runtime.eface" %4349) -// CHECK-NEXT: %4353 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4345, i32 0, i32 1 -// CHECK-NEXT: %4354 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4355 = extractvalue { ptr, ptr } %4354, 1 -// CHECK-NEXT: %4356 = extractvalue { ptr, ptr } %4354, 0 -// CHECK-NEXT: %__llgo_funcval_code559 = call ptr asm "", "=r,0"(ptr %4356) -// CHECK-NEXT: %4357 = call %reflect.Value %__llgo_funcval_code559(ptr {{(nest|swiftself)}} %4355, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4352, ptr %4346, align 8 -// CHECK-NEXT: store %reflect.Value %4357, ptr %4353, align 8 -// CHECK-NEXT: %4358 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 280 -// CHECK-NEXT: %4359 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4358, i32 0, i32 0 -// CHECK-NEXT: %4360 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4361 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4362 = getelementptr inbounds i8, ptr %4361, i64 0 -// CHECK-NEXT: store i8 5, ptr %4362, align 1 -// CHECK-NEXT: %4363 = getelementptr inbounds i8, ptr %4361, i64 1 -// CHECK-NEXT: store i8 6, ptr %4363, align 1 -// CHECK-NEXT: %4364 = getelementptr inbounds i8, ptr %4361, i64 2 -// CHECK-NEXT: store i8 7, ptr %4364, align 1 -// CHECK-NEXT: %4365 = getelementptr inbounds i8, ptr %4361, i64 3 -// CHECK-NEXT: store i8 8, ptr %4365, align 1 -// CHECK-NEXT: %4366 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4361, 0 -// CHECK-NEXT: %4367 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4366, i64 4, 1 -// CHECK-NEXT: %4368 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4367, i64 4, 2 -// CHECK-NEXT: %4369 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %4368, ptr %4369, align 8 -// CHECK-NEXT: %4370 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4369, 1 -// CHECK-NEXT: %4371 = extractvalue { ptr, ptr } %4360, 1 -// CHECK-NEXT: %4372 = extractvalue { ptr, ptr } %4360, 0 -// CHECK-NEXT: %__llgo_funcval_code560 = call ptr asm "", "=r,0"(ptr %4372) -// CHECK-NEXT: %4373 = call %reflect.Value %__llgo_funcval_code560(ptr {{(nest|swiftself)}} %4371, %"{{.*}}/runtime/internal/runtime.eface" %4370) -// CHECK-NEXT: %4374 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4358, i32 0, i32 1 -// CHECK-NEXT: %4375 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4376 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %4377 = getelementptr inbounds i8, ptr %4376, i64 0 -// CHECK-NEXT: %4378 = getelementptr inbounds i8, ptr %4376, i64 1 -// CHECK-NEXT: %4379 = getelementptr inbounds i8, ptr %4376, i64 2 -// CHECK-NEXT: %4380 = getelementptr inbounds i8, ptr %4376, i64 3 -// CHECK-NEXT: store i8 5, ptr %4377, align 1 -// CHECK-NEXT: store i8 6, ptr %4378, align 1 -// CHECK-NEXT: store i8 7, ptr %4379, align 1 -// CHECK-NEXT: store i8 8, ptr %4380, align 1 -// CHECK-NEXT: %4381 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray", ptr undef }, ptr %4376, 1 -// CHECK-NEXT: %4382 = extractvalue { ptr, ptr } %4375, 1 -// CHECK-NEXT: %4383 = extractvalue { ptr, ptr } %4375, 0 -// CHECK-NEXT: %__llgo_funcval_code561 = call ptr asm "", "=r,0"(ptr %4383) -// CHECK-NEXT: %4384 = call %reflect.Value %__llgo_funcval_code561(ptr {{(nest|swiftself)}} %4382, %"{{.*}}/runtime/internal/runtime.eface" %4381) -// CHECK-NEXT: store %reflect.Value %4373, ptr %4359, align 8 -// CHECK-NEXT: store %reflect.Value %4384, ptr %4374, align 8 -// CHECK-NEXT: %4385 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 281 -// CHECK-NEXT: %4386 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4385, i32 0, i32 0 -// CHECK-NEXT: %4387 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4388 = extractvalue { ptr, ptr } %4387, 1 -// CHECK-NEXT: %4389 = extractvalue { ptr, ptr } %4387, 0 -// CHECK-NEXT: %__llgo_funcval_code562 = call ptr asm "", "=r,0"(ptr %4389) -// CHECK-NEXT: %4390 = call %reflect.Value %__llgo_funcval_code562(ptr {{(nest|swiftself)}} %4388, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: %4391 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4385, i32 0, i32 1 -// CHECK-NEXT: %4392 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4393 = extractvalue { ptr, ptr } %4392, 1 -// CHECK-NEXT: %4394 = extractvalue { ptr, ptr } %4392, 0 -// CHECK-NEXT: %__llgo_funcval_code563 = call ptr asm "", "=r,0"(ptr %4394) -// CHECK-NEXT: %4395 = call %reflect.Value %__llgo_funcval_code563(ptr {{(nest|swiftself)}} %4393, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4390, ptr %4386, align 8 -// CHECK-NEXT: store %reflect.Value %4395, ptr %4391, align 8 -// CHECK-NEXT: %4396 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 282 -// CHECK-NEXT: %4397 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4396, i32 0, i32 0 -// CHECK-NEXT: %4398 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4399 = extractvalue { ptr, ptr } %4398, 1 -// CHECK-NEXT: %4400 = extractvalue { ptr, ptr } %4398, 0 -// CHECK-NEXT: %__llgo_funcval_code564 = call ptr asm "", "=r,0"(ptr %4400) -// CHECK-NEXT: %4401 = call %reflect.Value %__llgo_funcval_code564(ptr {{(nest|swiftself)}} %4399, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyBytesArray0", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: %4402 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4396, i32 0, i32 1 -// CHECK-NEXT: %4403 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4404 = extractvalue { ptr, ptr } %4403, 1 -// CHECK-NEXT: %4405 = extractvalue { ptr, ptr } %4403, 0 -// CHECK-NEXT: %__llgo_funcval_code565 = call ptr asm "", "=r,0"(ptr %4405) -// CHECK-NEXT: %4406 = call %reflect.Value %__llgo_funcval_code565(ptr {{(nest|swiftself)}} %4404, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4401, ptr %4397, align 8 -// CHECK-NEXT: store %reflect.Value %4406, ptr %4402, align 8 -// CHECK-NEXT: %4407 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 283 -// CHECK-NEXT: %4408 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4407, i32 0, i32 0 -// CHECK-NEXT: %4409 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4410 = extractvalue { ptr, ptr } %4409, 1 -// CHECK-NEXT: %4411 = extractvalue { ptr, ptr } %4409, 0 -// CHECK-NEXT: %__llgo_funcval_code566 = call ptr asm "", "=r,0"(ptr %4411) -// CHECK-NEXT: %4412 = call %reflect.Value %__llgo_funcval_code566(ptr {{(nest|swiftself)}} %4410, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr0, ptr null }) -// CHECK-NEXT: %4413 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4407, i32 0, i32 1 -// CHECK-NEXT: %4414 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4415 = extractvalue { ptr, ptr } %4414, 1 -// CHECK-NEXT: %4416 = extractvalue { ptr, ptr } %4414, 0 -// CHECK-NEXT: %__llgo_funcval_code567 = call ptr asm "", "=r,0"(ptr %4416) -// CHECK-NEXT: %4417 = call %reflect.Value %__llgo_funcval_code567(ptr {{(nest|swiftself)}} %4415, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4412, ptr %4408, align 8 -// CHECK-NEXT: store %reflect.Value %4417, ptr %4413, align 8 -// CHECK-NEXT: %4418 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 284 -// CHECK-NEXT: %4419 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4418, i32 0, i32 0 -// CHECK-NEXT: %4420 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4421 = extractvalue { ptr, ptr } %4420, 1 -// CHECK-NEXT: %4422 = extractvalue { ptr, ptr } %4420, 0 -// CHECK-NEXT: %__llgo_funcval_code568 = call ptr asm "", "=r,0"(ptr %4422) -// CHECK-NEXT: %4423 = call %reflect.Value %__llgo_funcval_code568(ptr {{(nest|swiftself)}} %4421, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*[0]_llgo_uint8", ptr null }) -// CHECK-NEXT: %4424 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4418, i32 0, i32 1 -// CHECK-NEXT: %4425 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4426 = extractvalue { ptr, ptr } %4425, 1 -// CHECK-NEXT: %4427 = extractvalue { ptr, ptr } %4425, 0 -// CHECK-NEXT: %__llgo_funcval_code569 = call ptr asm "", "=r,0"(ptr %4427) -// CHECK-NEXT: %4428 = call %reflect.Value %__llgo_funcval_code569(ptr {{(nest|swiftself)}} %4426, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArrayPtr0, ptr null }) -// CHECK-NEXT: store %reflect.Value %4423, ptr %4419, align 8 -// CHECK-NEXT: store %reflect.Value %4428, ptr %4424, align 8 -// CHECK-NEXT: %4429 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 285 -// CHECK-NEXT: %4430 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4429, i32 0, i32 0 -// CHECK-NEXT: %4431 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4432 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4433 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_int", ptr undef }, ptr %4432, 1 -// CHECK-NEXT: %4434 = extractvalue { ptr, ptr } %4431, 1 -// CHECK-NEXT: %4435 = extractvalue { ptr, ptr } %4431, 0 -// CHECK-NEXT: %__llgo_funcval_code570 = call ptr asm "", "=r,0"(ptr %4435) -// CHECK-NEXT: %4436 = call %reflect.Value %__llgo_funcval_code570(ptr {{(nest|swiftself)}} %4434, %"{{.*}}/runtime/internal/runtime.eface" %4433) -// CHECK-NEXT: %4437 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4429, i32 0, i32 1 -// CHECK-NEXT: %4438 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4439 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4440 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.integer", ptr undef }, ptr %4439, 1 -// CHECK-NEXT: %4441 = extractvalue { ptr, ptr } %4438, 1 -// CHECK-NEXT: %4442 = extractvalue { ptr, ptr } %4438, 0 -// CHECK-NEXT: %__llgo_funcval_code571 = call ptr asm "", "=r,0"(ptr %4442) -// CHECK-NEXT: %4443 = call %reflect.Value %__llgo_funcval_code571(ptr {{(nest|swiftself)}} %4441, %"{{.*}}/runtime/internal/runtime.eface" %4440) -// CHECK-NEXT: store %reflect.Value %4436, ptr %4430, align 8 -// CHECK-NEXT: store %reflect.Value %4443, ptr %4437, align 8 -// CHECK-NEXT: %4444 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 286 -// CHECK-NEXT: %4445 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4444, i32 0, i32 0 -// CHECK-NEXT: %4446 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4447 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4448 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.integer", ptr undef }, ptr %4447, 1 -// CHECK-NEXT: %4449 = extractvalue { ptr, ptr } %4446, 1 -// CHECK-NEXT: %4450 = extractvalue { ptr, ptr } %4446, 0 -// CHECK-NEXT: %__llgo_funcval_code572 = call ptr asm "", "=r,0"(ptr %4450) -// CHECK-NEXT: %4451 = call %reflect.Value %__llgo_funcval_code572(ptr {{(nest|swiftself)}} %4449, %"{{.*}}/runtime/internal/runtime.eface" %4448) -// CHECK-NEXT: %4452 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4444, i32 0, i32 1 -// CHECK-NEXT: %4453 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4454 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %4455 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_int", ptr undef }, ptr %4454, 1 -// CHECK-NEXT: %4456 = extractvalue { ptr, ptr } %4453, 1 -// CHECK-NEXT: %4457 = extractvalue { ptr, ptr } %4453, 0 -// CHECK-NEXT: %__llgo_funcval_code573 = call ptr asm "", "=r,0"(ptr %4457) -// CHECK-NEXT: %4458 = call %reflect.Value %__llgo_funcval_code573(ptr {{(nest|swiftself)}} %4456, %"{{.*}}/runtime/internal/runtime.eface" %4455) -// CHECK-NEXT: store %reflect.Value %4451, ptr %4445, align 8 -// CHECK-NEXT: store %reflect.Value %4458, ptr %4452, align 8 -// CHECK-NEXT: %4459 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 287 -// CHECK-NEXT: %4460 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4459, i32 0, i32 0 -// CHECK-NEXT: %4461 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4462 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.Empty zeroinitializer, ptr %4462, align 1 -// CHECK-NEXT: %4463 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.Empty, ptr undef }, ptr %4462, 1 -// CHECK-NEXT: %4464 = extractvalue { ptr, ptr } %4461, 1 -// CHECK-NEXT: %4465 = extractvalue { ptr, ptr } %4461, 0 -// CHECK-NEXT: %__llgo_funcval_code574 = call ptr asm "", "=r,0"(ptr %4465) -// CHECK-NEXT: %4466 = call %reflect.Value %__llgo_funcval_code574(ptr {{(nest|swiftself)}} %4464, %"{{.*}}/runtime/internal/runtime.eface" %4463) -// CHECK-NEXT: %4467 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4459, i32 0, i32 1 -// CHECK-NEXT: %4468 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4469 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store {} zeroinitializer, ptr %4469, align 1 -// CHECK-NEXT: %4470 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %4469, 1 -// CHECK-NEXT: %4471 = extractvalue { ptr, ptr } %4468, 1 -// CHECK-NEXT: %4472 = extractvalue { ptr, ptr } %4468, 0 -// CHECK-NEXT: %__llgo_funcval_code575 = call ptr asm "", "=r,0"(ptr %4472) -// CHECK-NEXT: %4473 = call %reflect.Value %__llgo_funcval_code575(ptr {{(nest|swiftself)}} %4471, %"{{.*}}/runtime/internal/runtime.eface" %4470) -// CHECK-NEXT: store %reflect.Value %4466, ptr %4460, align 8 -// CHECK-NEXT: store %reflect.Value %4473, ptr %4467, align 8 -// CHECK-NEXT: %4474 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 288 -// CHECK-NEXT: %4475 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4474, i32 0, i32 0 -// CHECK-NEXT: %4476 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4477 = extractvalue { ptr, ptr } %4476, 1 -// CHECK-NEXT: %4478 = extractvalue { ptr, ptr } %4476, 0 -// CHECK-NEXT: %__llgo_funcval_code576 = call ptr asm "", "=r,0"(ptr %4478) -// CHECK-NEXT: %4479 = call %reflect.Value %__llgo_funcval_code576(ptr {{(nest|swiftself)}} %4477, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Empty", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: %4480 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4474, i32 0, i32 1 -// CHECK-NEXT: %4481 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4482 = extractvalue { ptr, ptr } %4481, 1 -// CHECK-NEXT: %4483 = extractvalue { ptr, ptr } %4481, 0 -// CHECK-NEXT: %__llgo_funcval_code577 = call ptr asm "", "=r,0"(ptr %4483) -// CHECK-NEXT: %4484 = call %reflect.Value %__llgo_funcval_code577(ptr {{(nest|swiftself)}} %4482, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4479, ptr %4475, align 8 -// CHECK-NEXT: store %reflect.Value %4484, ptr %4480, align 8 -// CHECK-NEXT: %4485 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 289 -// CHECK-NEXT: %4486 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4485, i32 0, i32 0 -// CHECK-NEXT: %4487 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4488 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store {} zeroinitializer, ptr %4488, align 1 -// CHECK-NEXT: %4489 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr undef }, ptr %4488, 1 -// CHECK-NEXT: %4490 = extractvalue { ptr, ptr } %4487, 1 -// CHECK-NEXT: %4491 = extractvalue { ptr, ptr } %4487, 0 -// CHECK-NEXT: %__llgo_funcval_code578 = call ptr asm "", "=r,0"(ptr %4491) -// CHECK-NEXT: %4492 = call %reflect.Value %__llgo_funcval_code578(ptr {{(nest|swiftself)}} %4490, %"{{.*}}/runtime/internal/runtime.eface" %4489) -// CHECK-NEXT: %4493 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4485, i32 0, i32 1 -// CHECK-NEXT: %4494 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4495 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.Empty zeroinitializer, ptr %4495, align 1 -// CHECK-NEXT: %4496 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.Empty, ptr undef }, ptr %4495, 1 -// CHECK-NEXT: %4497 = extractvalue { ptr, ptr } %4494, 1 -// CHECK-NEXT: %4498 = extractvalue { ptr, ptr } %4494, 0 -// CHECK-NEXT: %__llgo_funcval_code579 = call ptr asm "", "=r,0"(ptr %4498) -// CHECK-NEXT: %4499 = call %reflect.Value %__llgo_funcval_code579(ptr {{(nest|swiftself)}} %4497, %"{{.*}}/runtime/internal/runtime.eface" %4496) -// CHECK-NEXT: store %reflect.Value %4492, ptr %4486, align 8 -// CHECK-NEXT: store %reflect.Value %4499, ptr %4493, align 8 -// CHECK-NEXT: %4500 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 290 -// CHECK-NEXT: %4501 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4500, i32 0, i32 0 -// CHECK-NEXT: %4502 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4503 = extractvalue { ptr, ptr } %4502, 1 -// CHECK-NEXT: %4504 = extractvalue { ptr, ptr } %4502, 0 -// CHECK-NEXT: %__llgo_funcval_code580 = call ptr asm "", "=r,0"(ptr %4504) -// CHECK-NEXT: %4505 = call %reflect.Value %__llgo_funcval_code580(ptr {{(nest|swiftself)}} %4503, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_struct$n1H8J_3prDN3firMwPxBLVTkE5hJ9Di-AqNvaC9jczw", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: %4506 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4500, i32 0, i32 1 -// CHECK-NEXT: %4507 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4508 = extractvalue { ptr, ptr } %4507, 1 -// CHECK-NEXT: %4509 = extractvalue { ptr, ptr } %4507, 0 -// CHECK-NEXT: %__llgo_funcval_code581 = call ptr asm "", "=r,0"(ptr %4509) -// CHECK-NEXT: %4510 = call %reflect.Value %__llgo_funcval_code581(ptr {{(nest|swiftself)}} %4508, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Empty", ptr @"__llgo.moduleZeroSizedAlloc$" }) -// CHECK-NEXT: store %reflect.Value %4505, ptr %4501, align 8 -// CHECK-NEXT: store %reflect.Value %4510, ptr %4506, align 8 -// CHECK-NEXT: %4511 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 291 -// CHECK-NEXT: %4512 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4511, i32 0, i32 0 -// CHECK-NEXT: %4513 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4514 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.Empty zeroinitializer, ptr %4514, align 1 -// CHECK-NEXT: %4515 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.Empty, ptr undef }, ptr %4514, 1 -// CHECK-NEXT: %4516 = extractvalue { ptr, ptr } %4513, 1 -// CHECK-NEXT: %4517 = extractvalue { ptr, ptr } %4513, 0 -// CHECK-NEXT: %__llgo_funcval_code582 = call ptr asm "", "=r,0"(ptr %4517) -// CHECK-NEXT: %4518 = call %reflect.Value %__llgo_funcval_code582(ptr {{(nest|swiftself)}} %4516, %"{{.*}}/runtime/internal/runtime.eface" %4515) -// CHECK-NEXT: %4519 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4511, i32 0, i32 1 -// CHECK-NEXT: %4520 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4521 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store %main.Empty zeroinitializer, ptr %4521, align 1 -// CHECK-NEXT: %4522 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.Empty, ptr undef }, ptr %4521, 1 -// CHECK-NEXT: %4523 = extractvalue { ptr, ptr } %4520, 1 -// CHECK-NEXT: %4524 = extractvalue { ptr, ptr } %4520, 0 -// CHECK-NEXT: %__llgo_funcval_code583 = call ptr asm "", "=r,0"(ptr %4524) -// CHECK-NEXT: %4525 = call %reflect.Value %__llgo_funcval_code583(ptr {{(nest|swiftself)}} %4523, %"{{.*}}/runtime/internal/runtime.eface" %4522) -// CHECK-NEXT: store %reflect.Value %4518, ptr %4512, align 8 -// CHECK-NEXT: store %reflect.Value %4525, ptr %4519, align 8 -// CHECK-NEXT: %4526 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 292 -// CHECK-NEXT: %4527 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4526, i32 0, i32 0 -// CHECK-NEXT: %4528 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4529 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4529, align 8 -// CHECK-NEXT: %4530 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4529, 1 -// CHECK-NEXT: %4531 = extractvalue { ptr, ptr } %4528, 1 -// CHECK-NEXT: %4532 = extractvalue { ptr, ptr } %4528, 0 -// CHECK-NEXT: %__llgo_funcval_code584 = call ptr asm "", "=r,0"(ptr %4532) -// CHECK-NEXT: %4533 = call %reflect.Value %__llgo_funcval_code584(ptr {{(nest|swiftself)}} %4531, %"{{.*}}/runtime/internal/runtime.eface" %4530) -// CHECK-NEXT: %4534 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4526, i32 0, i32 1 -// CHECK-NEXT: %4535 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4536 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4536, align 8 -// CHECK-NEXT: %4537 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4536, 1 -// CHECK-NEXT: %4538 = extractvalue { ptr, ptr } %4535, 1 -// CHECK-NEXT: %4539 = extractvalue { ptr, ptr } %4535, 0 -// CHECK-NEXT: %__llgo_funcval_code585 = call ptr asm "", "=r,0"(ptr %4539) -// CHECK-NEXT: %4540 = call %reflect.Value %__llgo_funcval_code585(ptr {{(nest|swiftself)}} %4538, %"{{.*}}/runtime/internal/runtime.eface" %4537) -// CHECK-NEXT: store %reflect.Value %4533, ptr %4527, align 8 -// CHECK-NEXT: store %reflect.Value %4540, ptr %4534, align 8 -// CHECK-NEXT: %4541 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 293 -// CHECK-NEXT: %4542 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4541, i32 0, i32 0 -// CHECK-NEXT: %4543 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4544 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4544, align 8 -// CHECK-NEXT: %4545 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4544, 1 -// CHECK-NEXT: %4546 = extractvalue { ptr, ptr } %4543, 1 -// CHECK-NEXT: %4547 = extractvalue { ptr, ptr } %4543, 0 -// CHECK-NEXT: %__llgo_funcval_code586 = call ptr asm "", "=r,0"(ptr %4547) -// CHECK-NEXT: %4548 = call %reflect.Value %__llgo_funcval_code586(ptr {{(nest|swiftself)}} %4546, %"{{.*}}/runtime/internal/runtime.eface" %4545) -// CHECK-NEXT: %4549 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4541, i32 0, i32 1 -// CHECK-NEXT: %4550 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4551 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %4551, align 8 -// CHECK-NEXT: %4552 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %4551, 1 -// CHECK-NEXT: %4553 = extractvalue { ptr, ptr } %4550, 1 -// CHECK-NEXT: %4554 = extractvalue { ptr, ptr } %4550, 0 -// CHECK-NEXT: %__llgo_funcval_code587 = call ptr asm "", "=r,0"(ptr %4554) -// CHECK-NEXT: %4555 = call %reflect.Value %__llgo_funcval_code587(ptr {{(nest|swiftself)}} %4553, %"{{.*}}/runtime/internal/runtime.eface" %4552) -// CHECK-NEXT: store %reflect.Value %4548, ptr %4542, align 8 -// CHECK-NEXT: store %reflect.Value %4555, ptr %4549, align 8 -// CHECK-NEXT: %4556 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 294 -// CHECK-NEXT: %4557 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4556, i32 0, i32 0 -// CHECK-NEXT: %4558 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4559 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } zeroinitializer, ptr %4559, align 8 -// CHECK-NEXT: %4560 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %4559, 1 -// CHECK-NEXT: %4561 = extractvalue { ptr, ptr } %4558, 1 -// CHECK-NEXT: %4562 = extractvalue { ptr, ptr } %4558, 0 -// CHECK-NEXT: %__llgo_funcval_code588 = call ptr asm "", "=r,0"(ptr %4562) -// CHECK-NEXT: %4563 = call %reflect.Value %__llgo_funcval_code588(ptr {{(nest|swiftself)}} %4561, %"{{.*}}/runtime/internal/runtime.eface" %4560) -// CHECK-NEXT: %4564 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4556, i32 0, i32 1 -// CHECK-NEXT: %4565 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4566 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.MyFunc zeroinitializer, ptr %4566, align 8 -// CHECK-NEXT: %4567 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyFunc, ptr undef }, ptr %4566, 1 -// CHECK-NEXT: %4568 = extractvalue { ptr, ptr } %4565, 1 -// CHECK-NEXT: %4569 = extractvalue { ptr, ptr } %4565, 0 -// CHECK-NEXT: %__llgo_funcval_code589 = call ptr asm "", "=r,0"(ptr %4569) -// CHECK-NEXT: %4570 = call %reflect.Value %__llgo_funcval_code589(ptr {{(nest|swiftself)}} %4568, %"{{.*}}/runtime/internal/runtime.eface" %4567) -// CHECK-NEXT: store %reflect.Value %4563, ptr %4557, align 8 -// CHECK-NEXT: store %reflect.Value %4570, ptr %4564, align 8 -// CHECK-NEXT: %4571 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 295 -// CHECK-NEXT: %4572 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4571, i32 0, i32 0 -// CHECK-NEXT: %4573 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4574 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %main.MyFunc zeroinitializer, ptr %4574, align 8 -// CHECK-NEXT: %4575 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyFunc, ptr undef }, ptr %4574, 1 -// CHECK-NEXT: %4576 = extractvalue { ptr, ptr } %4573, 1 -// CHECK-NEXT: %4577 = extractvalue { ptr, ptr } %4573, 0 -// CHECK-NEXT: %__llgo_funcval_code590 = call ptr asm "", "=r,0"(ptr %4577) -// CHECK-NEXT: %4578 = call %reflect.Value %__llgo_funcval_code590(ptr {{(nest|swiftself)}} %4576, %"{{.*}}/runtime/internal/runtime.eface" %4575) -// CHECK-NEXT: %4579 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4571, i32 0, i32 1 -// CHECK-NEXT: %4580 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4581 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } zeroinitializer, ptr %4581, align 8 -// CHECK-NEXT: %4582 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %4581, 1 -// CHECK-NEXT: %4583 = extractvalue { ptr, ptr } %4580, 1 -// CHECK-NEXT: %4584 = extractvalue { ptr, ptr } %4580, 0 -// CHECK-NEXT: %__llgo_funcval_code591 = call ptr asm "", "=r,0"(ptr %4584) -// CHECK-NEXT: %4585 = call %reflect.Value %__llgo_funcval_code591(ptr {{(nest|swiftself)}} %4583, %"{{.*}}/runtime/internal/runtime.eface" %4582) -// CHECK-NEXT: store %reflect.Value %4578, ptr %4572, align 8 -// CHECK-NEXT: store %reflect.Value %4585, ptr %4579, align 8 -// CHECK-NEXT: %4586 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 296 -// CHECK-NEXT: %4587 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4586, i32 0, i32 0 -// CHECK-NEXT: %4588 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4589 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4589, align 8 -// CHECK-NEXT: %4590 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4589, 1 -// CHECK-NEXT: %4591 = extractvalue { ptr, ptr } %4588, 1 -// CHECK-NEXT: %4592 = extractvalue { ptr, ptr } %4588, 0 -// CHECK-NEXT: %__llgo_funcval_code592 = call ptr asm "", "=r,0"(ptr %4592) -// CHECK-NEXT: %4593 = call %reflect.Value %__llgo_funcval_code592(ptr {{(nest|swiftself)}} %4591, %"{{.*}}/runtime/internal/runtime.eface" %4590) -// CHECK-NEXT: %4594 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4586, i32 0, i32 1 -// CHECK-NEXT: %4595 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4596 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4596, align 8 -// CHECK-NEXT: %4597 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4596, 1 -// CHECK-NEXT: %4598 = extractvalue { ptr, ptr } %4595, 1 -// CHECK-NEXT: %4599 = extractvalue { ptr, ptr } %4595, 0 -// CHECK-NEXT: %__llgo_funcval_code593 = call ptr asm "", "=r,0"(ptr %4599) -// CHECK-NEXT: %4600 = call %reflect.Value %__llgo_funcval_code593(ptr {{(nest|swiftself)}} %4598, %"{{.*}}/runtime/internal/runtime.eface" %4597) -// CHECK-NEXT: store %reflect.Value %4593, ptr %4587, align 8 -// CHECK-NEXT: store %reflect.Value %4600, ptr %4594, align 8 -// CHECK-NEXT: %4601 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 297 -// CHECK-NEXT: %4602 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4601, i32 0, i32 0 -// CHECK-NEXT: %4603 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4604 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4604, align 8 -// CHECK-NEXT: %4605 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4604, 1 -// CHECK-NEXT: %4606 = extractvalue { ptr, ptr } %4603, 1 -// CHECK-NEXT: %4607 = extractvalue { ptr, ptr } %4603, 0 -// CHECK-NEXT: %__llgo_funcval_code594 = call ptr asm "", "=r,0"(ptr %4607) -// CHECK-NEXT: %4608 = call %reflect.Value %__llgo_funcval_code594(ptr {{(nest|swiftself)}} %4606, %"{{.*}}/runtime/internal/runtime.eface" %4605) -// CHECK-NEXT: %4609 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4601, i32 0, i32 1 -// CHECK-NEXT: %4610 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4611 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4611, align 8 -// CHECK-NEXT: %4612 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4611, 1 -// CHECK-NEXT: %4613 = extractvalue { ptr, ptr } %4610, 1 -// CHECK-NEXT: %4614 = extractvalue { ptr, ptr } %4610, 0 -// CHECK-NEXT: %__llgo_funcval_code595 = call ptr asm "", "=r,0"(ptr %4614) -// CHECK-NEXT: %4615 = call %reflect.Value %__llgo_funcval_code595(ptr {{(nest|swiftself)}} %4613, %"{{.*}}/runtime/internal/runtime.eface" %4612) -// CHECK-NEXT: store %reflect.Value %4608, ptr %4602, align 8 -// CHECK-NEXT: store %reflect.Value %4615, ptr %4609, align 8 -// CHECK-NEXT: %4616 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 298 -// CHECK-NEXT: %4617 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4616, i32 0, i32 0 -// CHECK-NEXT: %4618 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4619 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct zeroinitializer, ptr %4619, align 8 -// CHECK-NEXT: %4620 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct, ptr undef }, ptr %4619, 1 -// CHECK-NEXT: %4621 = extractvalue { ptr, ptr } %4618, 1 -// CHECK-NEXT: %4622 = extractvalue { ptr, ptr } %4618, 0 -// CHECK-NEXT: %__llgo_funcval_code596 = call ptr asm "", "=r,0"(ptr %4622) -// CHECK-NEXT: %4623 = call %reflect.Value %__llgo_funcval_code596(ptr {{(nest|swiftself)}} %4621, %"{{.*}}/runtime/internal/runtime.eface" %4620) -// CHECK-NEXT: %4624 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4616, i32 0, i32 1 -// CHECK-NEXT: %4625 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4626 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4626, align 8 -// CHECK-NEXT: %4627 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4626, 1 -// CHECK-NEXT: %4628 = extractvalue { ptr, ptr } %4625, 1 -// CHECK-NEXT: %4629 = extractvalue { ptr, ptr } %4625, 0 -// CHECK-NEXT: %__llgo_funcval_code597 = call ptr asm "", "=r,0"(ptr %4629) -// CHECK-NEXT: %4630 = call %reflect.Value %__llgo_funcval_code597(ptr {{(nest|swiftself)}} %4628, %"{{.*}}/runtime/internal/runtime.eface" %4627) -// CHECK-NEXT: store %reflect.Value %4623, ptr %4617, align 8 -// CHECK-NEXT: store %reflect.Value %4630, ptr %4624, align 8 -// CHECK-NEXT: %4631 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 299 -// CHECK-NEXT: %4632 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4631, i32 0, i32 0 -// CHECK-NEXT: %4633 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4634 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4634, align 8 -// CHECK-NEXT: %4635 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4634, 1 -// CHECK-NEXT: %4636 = extractvalue { ptr, ptr } %4633, 1 -// CHECK-NEXT: %4637 = extractvalue { ptr, ptr } %4633, 0 -// CHECK-NEXT: %__llgo_funcval_code598 = call ptr asm "", "=r,0"(ptr %4637) -// CHECK-NEXT: %4638 = call %reflect.Value %__llgo_funcval_code598(ptr {{(nest|swiftself)}} %4636, %"{{.*}}/runtime/internal/runtime.eface" %4635) -// CHECK-NEXT: %4639 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4631, i32 0, i32 1 -// CHECK-NEXT: %4640 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4641 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct zeroinitializer, ptr %4641, align 8 -// CHECK-NEXT: %4642 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct, ptr undef }, ptr %4641, 1 -// CHECK-NEXT: %4643 = extractvalue { ptr, ptr } %4640, 1 -// CHECK-NEXT: %4644 = extractvalue { ptr, ptr } %4640, 0 -// CHECK-NEXT: %__llgo_funcval_code599 = call ptr asm "", "=r,0"(ptr %4644) -// CHECK-NEXT: %4645 = call %reflect.Value %__llgo_funcval_code599(ptr {{(nest|swiftself)}} %4643, %"{{.*}}/runtime/internal/runtime.eface" %4642) -// CHECK-NEXT: store %reflect.Value %4638, ptr %4632, align 8 -// CHECK-NEXT: store %reflect.Value %4645, ptr %4639, align 8 -// CHECK-NEXT: %4646 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 300 -// CHECK-NEXT: %4647 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4646, i32 0, i32 0 -// CHECK-NEXT: %4648 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4649 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct zeroinitializer, ptr %4649, align 8 -// CHECK-NEXT: %4650 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct, ptr undef }, ptr %4649, 1 -// CHECK-NEXT: %4651 = extractvalue { ptr, ptr } %4648, 1 -// CHECK-NEXT: %4652 = extractvalue { ptr, ptr } %4648, 0 -// CHECK-NEXT: %__llgo_funcval_code600 = call ptr asm "", "=r,0"(ptr %4652) -// CHECK-NEXT: %4653 = call %reflect.Value %__llgo_funcval_code600(ptr {{(nest|swiftself)}} %4651, %"{{.*}}/runtime/internal/runtime.eface" %4650) -// CHECK-NEXT: %4654 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4646, i32 0, i32 1 -// CHECK-NEXT: %4655 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4656 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4656, align 8 -// CHECK-NEXT: %4657 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4656, 1 -// CHECK-NEXT: %4658 = extractvalue { ptr, ptr } %4655, 1 -// CHECK-NEXT: %4659 = extractvalue { ptr, ptr } %4655, 0 -// CHECK-NEXT: %__llgo_funcval_code601 = call ptr asm "", "=r,0"(ptr %4659) -// CHECK-NEXT: %4660 = call %reflect.Value %__llgo_funcval_code601(ptr {{(nest|swiftself)}} %4658, %"{{.*}}/runtime/internal/runtime.eface" %4657) -// CHECK-NEXT: store %reflect.Value %4653, ptr %4647, align 8 -// CHECK-NEXT: store %reflect.Value %4660, ptr %4654, align 8 -// CHECK-NEXT: %4661 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 301 -// CHECK-NEXT: %4662 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4661, i32 0, i32 0 -// CHECK-NEXT: %4663 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4664 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } zeroinitializer, ptr %4664, align 8 -// CHECK-NEXT: %4665 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testgo/reflectconv.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %4664, 1 -// CHECK-NEXT: %4666 = extractvalue { ptr, ptr } %4663, 1 -// CHECK-NEXT: %4667 = extractvalue { ptr, ptr } %4663, 0 -// CHECK-NEXT: %__llgo_funcval_code602 = call ptr asm "", "=r,0"(ptr %4667) -// CHECK-NEXT: %4668 = call %reflect.Value %__llgo_funcval_code602(ptr {{(nest|swiftself)}} %4666, %"{{.*}}/runtime/internal/runtime.eface" %4665) -// CHECK-NEXT: %4669 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4661, i32 0, i32 1 -// CHECK-NEXT: %4670 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4671 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct zeroinitializer, ptr %4671, align 8 -// CHECK-NEXT: %4672 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct, ptr undef }, ptr %4671, 1 -// CHECK-NEXT: %4673 = extractvalue { ptr, ptr } %4670, 1 -// CHECK-NEXT: %4674 = extractvalue { ptr, ptr } %4670, 0 -// CHECK-NEXT: %__llgo_funcval_code603 = call ptr asm "", "=r,0"(ptr %4674) -// CHECK-NEXT: %4675 = call %reflect.Value %__llgo_funcval_code603(ptr {{(nest|swiftself)}} %4673, %"{{.*}}/runtime/internal/runtime.eface" %4672) -// CHECK-NEXT: store %reflect.Value %4668, ptr %4662, align 8 -// CHECK-NEXT: store %reflect.Value %4675, ptr %4669, align 8 -// CHECK-NEXT: %4676 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 302 -// CHECK-NEXT: %4677 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4676, i32 0, i32 0 -// CHECK-NEXT: %4678 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4679 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct1 zeroinitializer, ptr %4679, align 8 -// CHECK-NEXT: %4680 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct1, ptr undef }, ptr %4679, 1 -// CHECK-NEXT: %4681 = extractvalue { ptr, ptr } %4678, 1 -// CHECK-NEXT: %4682 = extractvalue { ptr, ptr } %4678, 0 -// CHECK-NEXT: %__llgo_funcval_code604 = call ptr asm "", "=r,0"(ptr %4682) -// CHECK-NEXT: %4683 = call %reflect.Value %__llgo_funcval_code604(ptr {{(nest|swiftself)}} %4681, %"{{.*}}/runtime/internal/runtime.eface" %4680) -// CHECK-NEXT: %4684 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4676, i32 0, i32 1 -// CHECK-NEXT: %4685 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4686 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct2 zeroinitializer, ptr %4686, align 8 -// CHECK-NEXT: %4687 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct2, ptr undef }, ptr %4686, 1 -// CHECK-NEXT: %4688 = extractvalue { ptr, ptr } %4685, 1 -// CHECK-NEXT: %4689 = extractvalue { ptr, ptr } %4685, 0 -// CHECK-NEXT: %__llgo_funcval_code605 = call ptr asm "", "=r,0"(ptr %4689) -// CHECK-NEXT: %4690 = call %reflect.Value %__llgo_funcval_code605(ptr {{(nest|swiftself)}} %4688, %"{{.*}}/runtime/internal/runtime.eface" %4687) -// CHECK-NEXT: store %reflect.Value %4683, ptr %4677, align 8 -// CHECK-NEXT: store %reflect.Value %4690, ptr %4684, align 8 -// CHECK-NEXT: %4691 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 303 -// CHECK-NEXT: %4692 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4691, i32 0, i32 0 -// CHECK-NEXT: %4693 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4694 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct2 zeroinitializer, ptr %4694, align 8 -// CHECK-NEXT: %4695 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct2, ptr undef }, ptr %4694, 1 -// CHECK-NEXT: %4696 = extractvalue { ptr, ptr } %4693, 1 -// CHECK-NEXT: %4697 = extractvalue { ptr, ptr } %4693, 0 -// CHECK-NEXT: %__llgo_funcval_code606 = call ptr asm "", "=r,0"(ptr %4697) -// CHECK-NEXT: %4698 = call %reflect.Value %__llgo_funcval_code606(ptr {{(nest|swiftself)}} %4696, %"{{.*}}/runtime/internal/runtime.eface" %4695) -// CHECK-NEXT: %4699 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4691, i32 0, i32 1 -// CHECK-NEXT: %4700 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4701 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store %main.MyStruct1 zeroinitializer, ptr %4701, align 8 -// CHECK-NEXT: %4702 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyStruct1, ptr undef }, ptr %4701, 1 -// CHECK-NEXT: %4703 = extractvalue { ptr, ptr } %4700, 1 -// CHECK-NEXT: %4704 = extractvalue { ptr, ptr } %4700, 0 -// CHECK-NEXT: %__llgo_funcval_code607 = call ptr asm "", "=r,0"(ptr %4704) -// CHECK-NEXT: %4705 = call %reflect.Value %__llgo_funcval_code607(ptr {{(nest|swiftself)}} %4703, %"{{.*}}/runtime/internal/runtime.eface" %4702) -// CHECK-NEXT: store %reflect.Value %4698, ptr %4692, align 8 -// CHECK-NEXT: store %reflect.Value %4705, ptr %4699, align 8 -// CHECK-NEXT: %4706 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 304 -// CHECK-NEXT: %4707 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4706, i32 0, i32 0 -// CHECK-NEXT: %4708 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4709 = extractvalue { ptr, ptr } %4708, 1 -// CHECK-NEXT: %4710 = extractvalue { ptr, ptr } %4708, 0 -// CHECK-NEXT: %__llgo_funcval_code608 = call ptr asm "", "=r,0"(ptr %4710) -// CHECK-NEXT: %4711 = call %reflect.Value %__llgo_funcval_code608(ptr {{(nest|swiftself)}} %4709, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_uint8", ptr null }) -// CHECK-NEXT: %4712 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4706, i32 0, i32 1 -// CHECK-NEXT: %4713 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4714 = extractvalue { ptr, ptr } %4713, 1 -// CHECK-NEXT: %4715 = extractvalue { ptr, ptr } %4713, 0 -// CHECK-NEXT: %__llgo_funcval_code609 = call ptr asm "", "=r,0"(ptr %4715) -// CHECK-NEXT: %4716 = call %reflect.Value %__llgo_funcval_code609(ptr {{(nest|swiftself)}} %4714, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: store %reflect.Value %4711, ptr %4707, align 8 -// CHECK-NEXT: store %reflect.Value %4716, ptr %4712, align 8 -// CHECK-NEXT: %4717 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 305 -// CHECK-NEXT: %4718 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4717, i32 0, i32 0 -// CHECK-NEXT: %4719 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4720 = extractvalue { ptr, ptr } %4719, 1 -// CHECK-NEXT: %4721 = extractvalue { ptr, ptr } %4719, 0 -// CHECK-NEXT: %__llgo_funcval_code610 = call ptr asm "", "=r,0"(ptr %4721) -// CHECK-NEXT: %4722 = call %reflect.Value %__llgo_funcval_code610(ptr {{(nest|swiftself)}} %4720, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: %4723 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4717, i32 0, i32 1 -// CHECK-NEXT: %4724 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4725 = extractvalue { ptr, ptr } %4724, 1 -// CHECK-NEXT: %4726 = extractvalue { ptr, ptr } %4724, 0 -// CHECK-NEXT: %__llgo_funcval_code611 = call ptr asm "", "=r,0"(ptr %4726) -// CHECK-NEXT: %4727 = call %reflect.Value %__llgo_funcval_code611(ptr {{(nest|swiftself)}} %4725, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4722, ptr %4718, align 8 -// CHECK-NEXT: store %reflect.Value %4727, ptr %4723, align 8 -// CHECK-NEXT: %4728 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 306 -// CHECK-NEXT: %4729 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4728, i32 0, i32 0 -// CHECK-NEXT: %4730 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4731 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4731, align 1 -// CHECK-NEXT: %4732 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %4731, 1 -// CHECK-NEXT: %4733 = extractvalue { ptr, ptr } %4730, 1 -// CHECK-NEXT: %4734 = extractvalue { ptr, ptr } %4730, 0 -// CHECK-NEXT: %__llgo_funcval_code612 = call ptr asm "", "=r,0"(ptr %4734) -// CHECK-NEXT: %4735 = call %reflect.Value %__llgo_funcval_code612(ptr {{(nest|swiftself)}} %4733, %"{{.*}}/runtime/internal/runtime.eface" %4732) -// CHECK-NEXT: %4736 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4728, i32 0, i32 1 -// CHECK-NEXT: %4737 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4738 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4738, align 1 -// CHECK-NEXT: %4739 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %4738, 1 -// CHECK-NEXT: %4740 = extractvalue { ptr, ptr } %4737, 1 -// CHECK-NEXT: %4741 = extractvalue { ptr, ptr } %4737, 0 -// CHECK-NEXT: %__llgo_funcval_code613 = call ptr asm "", "=r,0"(ptr %4741) -// CHECK-NEXT: %4742 = call %reflect.Value %__llgo_funcval_code613(ptr {{(nest|swiftself)}} %4740, %"{{.*}}/runtime/internal/runtime.eface" %4739) -// CHECK-NEXT: store %reflect.Value %4735, ptr %4729, align 8 -// CHECK-NEXT: store %reflect.Value %4742, ptr %4736, align 8 -// CHECK-NEXT: %4743 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 307 -// CHECK-NEXT: %4744 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4743, i32 0, i32 0 -// CHECK-NEXT: %4745 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4746 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 3) -// CHECK-NEXT: store [3 x i8] zeroinitializer, ptr %4746, align 1 -// CHECK-NEXT: %4747 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[3]_llgo_uint8", ptr undef }, ptr %4746, 1 -// CHECK-NEXT: %4748 = extractvalue { ptr, ptr } %4745, 1 -// CHECK-NEXT: %4749 = extractvalue { ptr, ptr } %4745, 0 -// CHECK-NEXT: %__llgo_funcval_code614 = call ptr asm "", "=r,0"(ptr %4749) -// CHECK-NEXT: %4750 = call %reflect.Value %__llgo_funcval_code614(ptr {{(nest|swiftself)}} %4748, %"{{.*}}/runtime/internal/runtime.eface" %4747) -// CHECK-NEXT: %4751 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4743, i32 0, i32 1 -// CHECK-NEXT: %4752 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4753 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 3) -// CHECK-NEXT: store [3 x i8] zeroinitializer, ptr %4753, align 1 -// CHECK-NEXT: %4754 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[3]_llgo_uint8", ptr undef }, ptr %4753, 1 -// CHECK-NEXT: %4755 = extractvalue { ptr, ptr } %4752, 1 -// CHECK-NEXT: %4756 = extractvalue { ptr, ptr } %4752, 0 -// CHECK-NEXT: %__llgo_funcval_code615 = call ptr asm "", "=r,0"(ptr %4756) -// CHECK-NEXT: %4757 = call %reflect.Value %__llgo_funcval_code615(ptr {{(nest|swiftself)}} %4755, %"{{.*}}/runtime/internal/runtime.eface" %4754) -// CHECK-NEXT: store %reflect.Value %4750, ptr %4744, align 8 -// CHECK-NEXT: store %reflect.Value %4757, ptr %4751, align 8 -// CHECK-NEXT: %4758 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 308 -// CHECK-NEXT: %4759 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4758, i32 0, i32 0 -// CHECK-NEXT: %4760 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4761 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4761, align 1 -// CHECK-NEXT: %4762 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray0, ptr undef }, ptr %4761, 1 -// CHECK-NEXT: %4763 = extractvalue { ptr, ptr } %4760, 1 -// CHECK-NEXT: %4764 = extractvalue { ptr, ptr } %4760, 0 -// CHECK-NEXT: %__llgo_funcval_code616 = call ptr asm "", "=r,0"(ptr %4764) -// CHECK-NEXT: %4765 = call %reflect.Value %__llgo_funcval_code616(ptr {{(nest|swiftself)}} %4763, %"{{.*}}/runtime/internal/runtime.eface" %4762) -// CHECK-NEXT: %4766 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4758, i32 0, i32 1 -// CHECK-NEXT: %4767 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4768 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4768, align 1 -// CHECK-NEXT: %4769 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %4768, 1 -// CHECK-NEXT: %4770 = extractvalue { ptr, ptr } %4767, 1 -// CHECK-NEXT: %4771 = extractvalue { ptr, ptr } %4767, 0 -// CHECK-NEXT: %__llgo_funcval_code617 = call ptr asm "", "=r,0"(ptr %4771) -// CHECK-NEXT: %4772 = call %reflect.Value %__llgo_funcval_code617(ptr {{(nest|swiftself)}} %4770, %"{{.*}}/runtime/internal/runtime.eface" %4769) -// CHECK-NEXT: store %reflect.Value %4765, ptr %4759, align 8 -// CHECK-NEXT: store %reflect.Value %4772, ptr %4766, align 8 -// CHECK-NEXT: %4773 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 309 -// CHECK-NEXT: %4774 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4773, i32 0, i32 0 -// CHECK-NEXT: %4775 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4776 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4776, align 1 -// CHECK-NEXT: %4777 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[0]_llgo_uint8", ptr undef }, ptr %4776, 1 -// CHECK-NEXT: %4778 = extractvalue { ptr, ptr } %4775, 1 -// CHECK-NEXT: %4779 = extractvalue { ptr, ptr } %4775, 0 -// CHECK-NEXT: %__llgo_funcval_code618 = call ptr asm "", "=r,0"(ptr %4779) -// CHECK-NEXT: %4780 = call %reflect.Value %__llgo_funcval_code618(ptr {{(nest|swiftself)}} %4778, %"{{.*}}/runtime/internal/runtime.eface" %4777) -// CHECK-NEXT: %4781 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4773, i32 0, i32 1 -// CHECK-NEXT: %4782 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4783 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 0) -// CHECK-NEXT: store [0 x i8] zeroinitializer, ptr %4783, align 1 -// CHECK-NEXT: %4784 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytesArray0, ptr undef }, ptr %4783, 1 -// CHECK-NEXT: %4785 = extractvalue { ptr, ptr } %4782, 1 -// CHECK-NEXT: %4786 = extractvalue { ptr, ptr } %4782, 0 -// CHECK-NEXT: %__llgo_funcval_code619 = call ptr asm "", "=r,0"(ptr %4786) -// CHECK-NEXT: %4787 = call %reflect.Value %__llgo_funcval_code619(ptr {{(nest|swiftself)}} %4785, %"{{.*}}/runtime/internal/runtime.eface" %4784) -// CHECK-NEXT: store %reflect.Value %4780, ptr %4774, align 8 -// CHECK-NEXT: store %reflect.Value %4787, ptr %4781, align 8 -// CHECK-NEXT: %4788 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 310 -// CHECK-NEXT: %4789 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4788, i32 0, i32 0 -// CHECK-NEXT: %4790 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4791 = extractvalue { ptr, ptr } %4790, 1 -// CHECK-NEXT: %4792 = extractvalue { ptr, ptr } %4790, 0 -// CHECK-NEXT: %__llgo_funcval_code620 = call ptr asm "", "=r,0"(ptr %4792) -// CHECK-NEXT: %4793 = call %reflect.Value %__llgo_funcval_code620(ptr {{(nest|swiftself)}} %4791, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"**_llgo_uint8", ptr null }) -// CHECK-NEXT: %4794 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4788, i32 0, i32 1 -// CHECK-NEXT: %4795 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4796 = extractvalue { ptr, ptr } %4795, 1 -// CHECK-NEXT: %4797 = extractvalue { ptr, ptr } %4795, 0 -// CHECK-NEXT: %__llgo_funcval_code621 = call ptr asm "", "=r,0"(ptr %4797) -// CHECK-NEXT: %4798 = call %reflect.Value %__llgo_funcval_code621(ptr {{(nest|swiftself)}} %4796, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"**_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4793, ptr %4789, align 8 -// CHECK-NEXT: store %reflect.Value %4798, ptr %4794, align 8 -// CHECK-NEXT: %4799 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 311 -// CHECK-NEXT: %4800 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4799, i32 0, i32 0 -// CHECK-NEXT: %4801 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4802 = extractvalue { ptr, ptr } %4801, 1 -// CHECK-NEXT: %4803 = extractvalue { ptr, ptr } %4801, 0 -// CHECK-NEXT: %__llgo_funcval_code622 = call ptr asm "", "=r,0"(ptr %4803) -// CHECK-NEXT: %4804 = call %reflect.Value %__llgo_funcval_code622(ptr {{(nest|swiftself)}} %4802, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"**_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: %4805 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4799, i32 0, i32 1 -// CHECK-NEXT: %4806 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4807 = extractvalue { ptr, ptr } %4806, 1 -// CHECK-NEXT: %4808 = extractvalue { ptr, ptr } %4806, 0 -// CHECK-NEXT: %__llgo_funcval_code623 = call ptr asm "", "=r,0"(ptr %4808) -// CHECK-NEXT: %4809 = call %reflect.Value %__llgo_funcval_code623(ptr {{(nest|swiftself)}} %4807, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"**_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: store %reflect.Value %4804, ptr %4800, align 8 -// CHECK-NEXT: store %reflect.Value %4809, ptr %4805, align 8 -// CHECK-NEXT: %4810 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 312 -// CHECK-NEXT: %4811 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4810, i32 0, i32 0 -// CHECK-NEXT: %4812 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4813 = extractvalue { ptr, ptr } %4812, 1 -// CHECK-NEXT: %4814 = extractvalue { ptr, ptr } %4812, 0 -// CHECK-NEXT: %__llgo_funcval_code624 = call ptr asm "", "=r,0"(ptr %4814) -// CHECK-NEXT: %4815 = call %reflect.Value %__llgo_funcval_code624(ptr {{(nest|swiftself)}} %4813, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_uint8", ptr null }) -// CHECK-NEXT: %4816 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4810, i32 0, i32 1 -// CHECK-NEXT: %4817 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4818 = extractvalue { ptr, ptr } %4817, 1 -// CHECK-NEXT: %4819 = extractvalue { ptr, ptr } %4817, 0 -// CHECK-NEXT: %__llgo_funcval_code625 = call ptr asm "", "=r,0"(ptr %4819) -// CHECK-NEXT: %4820 = call %reflect.Value %__llgo_funcval_code625(ptr {{(nest|swiftself)}} %4818, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4815, ptr %4811, align 8 -// CHECK-NEXT: store %reflect.Value %4820, ptr %4816, align 8 -// CHECK-NEXT: %4821 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 313 -// CHECK-NEXT: %4822 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4821, i32 0, i32 0 -// CHECK-NEXT: %4823 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4824 = extractvalue { ptr, ptr } %4823, 1 -// CHECK-NEXT: %4825 = extractvalue { ptr, ptr } %4823, 0 -// CHECK-NEXT: %__llgo_funcval_code626 = call ptr asm "", "=r,0"(ptr %4825) -// CHECK-NEXT: %4826 = call %reflect.Value %__llgo_funcval_code626(ptr {{(nest|swiftself)}} %4824, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_main.MyByte", ptr null }) -// CHECK-NEXT: %4827 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4821, i32 0, i32 1 -// CHECK-NEXT: %4828 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4829 = extractvalue { ptr, ptr } %4828, 1 -// CHECK-NEXT: %4830 = extractvalue { ptr, ptr } %4828, 0 -// CHECK-NEXT: %__llgo_funcval_code627 = call ptr asm "", "=r,0"(ptr %4830) -// CHECK-NEXT: %4831 = call %reflect.Value %__llgo_funcval_code627(ptr {{(nest|swiftself)}} %4829, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_main.MyByte", ptr null }) -// CHECK-NEXT: store %reflect.Value %4826, ptr %4822, align 8 -// CHECK-NEXT: store %reflect.Value %4831, ptr %4827, align 8 -// CHECK-NEXT: %4832 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 314 -// CHECK-NEXT: %4833 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4832, i32 0, i32 0 -// CHECK-NEXT: %4834 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4835 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4835, align 8 -// CHECK-NEXT: %4836 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4835, 1 -// CHECK-NEXT: %4837 = extractvalue { ptr, ptr } %4834, 1 -// CHECK-NEXT: %4838 = extractvalue { ptr, ptr } %4834, 0 -// CHECK-NEXT: %__llgo_funcval_code628 = call ptr asm "", "=r,0"(ptr %4838) -// CHECK-NEXT: %4839 = call %reflect.Value %__llgo_funcval_code628(ptr {{(nest|swiftself)}} %4837, %"{{.*}}/runtime/internal/runtime.eface" %4836) -// CHECK-NEXT: %4840 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4832, i32 0, i32 1 -// CHECK-NEXT: %4841 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4842 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4842, align 8 -// CHECK-NEXT: %4843 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint8", ptr undef }, ptr %4842, 1 -// CHECK-NEXT: %4844 = extractvalue { ptr, ptr } %4841, 1 -// CHECK-NEXT: %4845 = extractvalue { ptr, ptr } %4841, 0 -// CHECK-NEXT: %__llgo_funcval_code629 = call ptr asm "", "=r,0"(ptr %4845) -// CHECK-NEXT: %4846 = call %reflect.Value %__llgo_funcval_code629(ptr {{(nest|swiftself)}} %4844, %"{{.*}}/runtime/internal/runtime.eface" %4843) -// CHECK-NEXT: store %reflect.Value %4839, ptr %4833, align 8 -// CHECK-NEXT: store %reflect.Value %4846, ptr %4840, align 8 -// CHECK-NEXT: %4847 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 315 -// CHECK-NEXT: %4848 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4847, i32 0, i32 0 -// CHECK-NEXT: %4849 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4850 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4850, align 8 -// CHECK-NEXT: %4851 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_main.MyByte", ptr undef }, ptr %4850, 1 -// CHECK-NEXT: %4852 = extractvalue { ptr, ptr } %4849, 1 -// CHECK-NEXT: %4853 = extractvalue { ptr, ptr } %4849, 0 -// CHECK-NEXT: %__llgo_funcval_code630 = call ptr asm "", "=r,0"(ptr %4853) -// CHECK-NEXT: %4854 = call %reflect.Value %__llgo_funcval_code630(ptr {{(nest|swiftself)}} %4852, %"{{.*}}/runtime/internal/runtime.eface" %4851) -// CHECK-NEXT: %4855 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4847, i32 0, i32 1 -// CHECK-NEXT: %4856 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4857 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %4857, align 8 -// CHECK-NEXT: %4858 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_main.MyByte", ptr undef }, ptr %4857, 1 -// CHECK-NEXT: %4859 = extractvalue { ptr, ptr } %4856, 1 -// CHECK-NEXT: %4860 = extractvalue { ptr, ptr } %4856, 0 -// CHECK-NEXT: %__llgo_funcval_code631 = call ptr asm "", "=r,0"(ptr %4860) -// CHECK-NEXT: %4861 = call %reflect.Value %__llgo_funcval_code631(ptr {{(nest|swiftself)}} %4859, %"{{.*}}/runtime/internal/runtime.eface" %4858) -// CHECK-NEXT: store %reflect.Value %4854, ptr %4848, align 8 -// CHECK-NEXT: store %reflect.Value %4861, ptr %4855, align 8 -// CHECK-NEXT: %4862 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 316 -// CHECK-NEXT: %4863 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4862, i32 0, i32 0 -// CHECK-NEXT: %4864 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4865 = extractvalue { ptr, ptr } %4864, 1 -// CHECK-NEXT: %4866 = extractvalue { ptr, ptr } %4864, 0 -// CHECK-NEXT: %__llgo_funcval_code632 = call ptr asm "", "=r,0"(ptr %4866) -// CHECK-NEXT: %4867 = call %reflect.Value %__llgo_funcval_code632(ptr {{(nest|swiftself)}} %4865, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_uint8", ptr null }) -// CHECK-NEXT: %4868 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4862, i32 0, i32 1 -// CHECK-NEXT: %4869 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4870 = extractvalue { ptr, ptr } %4869, 1 -// CHECK-NEXT: %4871 = extractvalue { ptr, ptr } %4869, 0 -// CHECK-NEXT: %__llgo_funcval_code633 = call ptr asm "", "=r,0"(ptr %4871) -// CHECK-NEXT: %4872 = call %reflect.Value %__llgo_funcval_code633(ptr {{(nest|swiftself)}} %4870, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4867, ptr %4863, align 8 -// CHECK-NEXT: store %reflect.Value %4872, ptr %4868, align 8 -// CHECK-NEXT: %4873 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 317 -// CHECK-NEXT: %4874 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4873, i32 0, i32 0 -// CHECK-NEXT: %4875 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4876 = extractvalue { ptr, ptr } %4875, 1 -// CHECK-NEXT: %4877 = extractvalue { ptr, ptr } %4875, 0 -// CHECK-NEXT: %__llgo_funcval_code634 = call ptr asm "", "=r,0"(ptr %4877) -// CHECK-NEXT: %4878 = call %reflect.Value %__llgo_funcval_code634(ptr {{(nest|swiftself)}} %4876, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: %4879 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4873, i32 0, i32 1 -// CHECK-NEXT: %4880 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4881 = extractvalue { ptr, ptr } %4880, 1 -// CHECK-NEXT: %4882 = extractvalue { ptr, ptr } %4880, 0 -// CHECK-NEXT: %__llgo_funcval_code635 = call ptr asm "", "=r,0"(ptr %4882) -// CHECK-NEXT: %4883 = call %reflect.Value %__llgo_funcval_code635(ptr {{(nest|swiftself)}} %4881, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_main.MyByte", ptr null }) -// CHECK-NEXT: store %reflect.Value %4878, ptr %4874, align 8 -// CHECK-NEXT: store %reflect.Value %4883, ptr %4879, align 8 -// CHECK-NEXT: %4884 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 318 -// CHECK-NEXT: %4885 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4884, i32 0, i32 0 -// CHECK-NEXT: %4886 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4887 = extractvalue { ptr, ptr } %4886, 1 -// CHECK-NEXT: %4888 = extractvalue { ptr, ptr } %4886, 0 -// CHECK-NEXT: %__llgo_funcval_code636 = call ptr asm "", "=r,0"(ptr %4888) -// CHECK-NEXT: %4889 = call %reflect.Value %__llgo_funcval_code636(ptr {{(nest|swiftself)}} %4887, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_uint8]_llgo_int", ptr null }) -// CHECK-NEXT: %4890 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4884, i32 0, i32 1 -// CHECK-NEXT: %4891 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4892 = extractvalue { ptr, ptr } %4891, 1 -// CHECK-NEXT: %4893 = extractvalue { ptr, ptr } %4891, 0 -// CHECK-NEXT: %__llgo_funcval_code637 = call ptr asm "", "=r,0"(ptr %4893) -// CHECK-NEXT: %4894 = call %reflect.Value %__llgo_funcval_code637(ptr {{(nest|swiftself)}} %4892, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_uint8]_llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %4889, ptr %4885, align 8 -// CHECK-NEXT: store %reflect.Value %4894, ptr %4890, align 8 -// CHECK-NEXT: %4895 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 319 -// CHECK-NEXT: %4896 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4895, i32 0, i32 0 -// CHECK-NEXT: %4897 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4898 = extractvalue { ptr, ptr } %4897, 1 -// CHECK-NEXT: %4899 = extractvalue { ptr, ptr } %4897, 0 -// CHECK-NEXT: %__llgo_funcval_code638 = call ptr asm "", "=r,0"(ptr %4899) -// CHECK-NEXT: %4900 = call %reflect.Value %__llgo_funcval_code638(ptr {{(nest|swiftself)}} %4898, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_main.MyByte]_llgo_int", ptr null }) -// CHECK-NEXT: %4901 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4895, i32 0, i32 1 -// CHECK-NEXT: %4902 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4903 = extractvalue { ptr, ptr } %4902, 1 -// CHECK-NEXT: %4904 = extractvalue { ptr, ptr } %4902, 0 -// CHECK-NEXT: %__llgo_funcval_code639 = call ptr asm "", "=r,0"(ptr %4904) -// CHECK-NEXT: %4905 = call %reflect.Value %__llgo_funcval_code639(ptr {{(nest|swiftself)}} %4903, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_main.MyByte]_llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %4900, ptr %4896, align 8 -// CHECK-NEXT: store %reflect.Value %4905, ptr %4901, align 8 -// CHECK-NEXT: %4906 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 320 -// CHECK-NEXT: %4907 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4906, i32 0, i32 0 -// CHECK-NEXT: %4908 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4909 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4909, align 1 -// CHECK-NEXT: %4910 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %4909, 1 -// CHECK-NEXT: %4911 = extractvalue { ptr, ptr } %4908, 1 -// CHECK-NEXT: %4912 = extractvalue { ptr, ptr } %4908, 0 -// CHECK-NEXT: %__llgo_funcval_code640 = call ptr asm "", "=r,0"(ptr %4912) -// CHECK-NEXT: %4913 = call %reflect.Value %__llgo_funcval_code640(ptr {{(nest|swiftself)}} %4911, %"{{.*}}/runtime/internal/runtime.eface" %4910) -// CHECK-NEXT: %4914 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4906, i32 0, i32 1 -// CHECK-NEXT: %4915 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4916 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4916, align 1 -// CHECK-NEXT: %4917 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_uint8", ptr undef }, ptr %4916, 1 -// CHECK-NEXT: %4918 = extractvalue { ptr, ptr } %4915, 1 -// CHECK-NEXT: %4919 = extractvalue { ptr, ptr } %4915, 0 -// CHECK-NEXT: %__llgo_funcval_code641 = call ptr asm "", "=r,0"(ptr %4919) -// CHECK-NEXT: %4920 = call %reflect.Value %__llgo_funcval_code641(ptr {{(nest|swiftself)}} %4918, %"{{.*}}/runtime/internal/runtime.eface" %4917) -// CHECK-NEXT: store %reflect.Value %4913, ptr %4907, align 8 -// CHECK-NEXT: store %reflect.Value %4920, ptr %4914, align 8 -// CHECK-NEXT: %4921 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 321 -// CHECK-NEXT: %4922 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4921, i32 0, i32 0 -// CHECK-NEXT: %4923 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4924 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4924, align 1 -// CHECK-NEXT: %4925 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_main.MyByte", ptr undef }, ptr %4924, 1 -// CHECK-NEXT: %4926 = extractvalue { ptr, ptr } %4923, 1 -// CHECK-NEXT: %4927 = extractvalue { ptr, ptr } %4923, 0 -// CHECK-NEXT: %__llgo_funcval_code642 = call ptr asm "", "=r,0"(ptr %4927) -// CHECK-NEXT: %4928 = call %reflect.Value %__llgo_funcval_code642(ptr {{(nest|swiftself)}} %4926, %"{{.*}}/runtime/internal/runtime.eface" %4925) -// CHECK-NEXT: %4929 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4921, i32 0, i32 1 -// CHECK-NEXT: %4930 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4931 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [2 x i8] zeroinitializer, ptr %4931, align 1 -// CHECK-NEXT: %4932 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[2]_llgo_main.MyByte", ptr undef }, ptr %4931, 1 -// CHECK-NEXT: %4933 = extractvalue { ptr, ptr } %4930, 1 -// CHECK-NEXT: %4934 = extractvalue { ptr, ptr } %4930, 0 -// CHECK-NEXT: %__llgo_funcval_code643 = call ptr asm "", "=r,0"(ptr %4934) -// CHECK-NEXT: %4935 = call %reflect.Value %__llgo_funcval_code643(ptr {{(nest|swiftself)}} %4933, %"{{.*}}/runtime/internal/runtime.eface" %4932) -// CHECK-NEXT: store %reflect.Value %4928, ptr %4922, align 8 -// CHECK-NEXT: store %reflect.Value %4935, ptr %4929, align 8 -// CHECK-NEXT: %4936 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 322 -// CHECK-NEXT: %4937 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4936, i32 0, i32 0 -// CHECK-NEXT: %4938 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4939 = extractvalue { ptr, ptr } %4938, 1 -// CHECK-NEXT: %4940 = extractvalue { ptr, ptr } %4938, 0 -// CHECK-NEXT: %__llgo_funcval_code644 = call ptr asm "", "=r,0"(ptr %4940) -// CHECK-NEXT: %4941 = call %reflect.Value %__llgo_funcval_code644(ptr {{(nest|swiftself)}} %4939, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int", ptr null }) -// CHECK-NEXT: %4942 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4936, i32 0, i32 1 -// CHECK-NEXT: %4943 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4944 = extractvalue { ptr, ptr } %4943, 1 -// CHECK-NEXT: %4945 = extractvalue { ptr, ptr } %4943, 0 -// CHECK-NEXT: %__llgo_funcval_code645 = call ptr asm "", "=r,0"(ptr %4945) -// CHECK-NEXT: %4946 = call %reflect.Value %__llgo_funcval_code645(ptr {{(nest|swiftself)}} %4944, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %4941, ptr %4937, align 8 -// CHECK-NEXT: store %reflect.Value %4946, ptr %4942, align 8 -// CHECK-NEXT: %4947 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 323 -// CHECK-NEXT: %4948 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4947, i32 0, i32 0 -// CHECK-NEXT: %4949 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4950 = extractvalue { ptr, ptr } %4949, 1 -// CHECK-NEXT: %4951 = extractvalue { ptr, ptr } %4949, 0 -// CHECK-NEXT: %__llgo_funcval_code646 = call ptr asm "", "=r,0"(ptr %4951) -// CHECK-NEXT: %4952 = call %reflect.Value %__llgo_funcval_code646(ptr {{(nest|swiftself)}} %4950, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_uint8", ptr null }) -// CHECK-NEXT: %4953 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4947, i32 0, i32 1 -// CHECK-NEXT: %4954 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4955 = extractvalue { ptr, ptr } %4954, 1 -// CHECK-NEXT: %4956 = extractvalue { ptr, ptr } %4954, 0 -// CHECK-NEXT: %__llgo_funcval_code647 = call ptr asm "", "=r,0"(ptr %4956) -// CHECK-NEXT: %4957 = call %reflect.Value %__llgo_funcval_code647(ptr {{(nest|swiftself)}} %4955, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4952, ptr %4948, align 8 -// CHECK-NEXT: store %reflect.Value %4957, ptr %4953, align 8 -// CHECK-NEXT: %4958 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 324 -// CHECK-NEXT: %4959 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4958, i32 0, i32 0 -// CHECK-NEXT: %4960 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4961 = extractvalue { ptr, ptr } %4960, 1 -// CHECK-NEXT: %4962 = extractvalue { ptr, ptr } %4960, 0 -// CHECK-NEXT: %__llgo_funcval_code648 = call ptr asm "", "=r,0"(ptr %4962) -// CHECK-NEXT: %4963 = call %reflect.Value %__llgo_funcval_code648(ptr {{(nest|swiftself)}} %4961, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int32", ptr null }) -// CHECK-NEXT: %4964 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4958, i32 0, i32 1 -// CHECK-NEXT: %4965 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4966 = extractvalue { ptr, ptr } %4965, 1 -// CHECK-NEXT: %4967 = extractvalue { ptr, ptr } %4965, 0 -// CHECK-NEXT: %__llgo_funcval_code649 = call ptr asm "", "=r,0"(ptr %4967) -// CHECK-NEXT: %4968 = call %reflect.Value %__llgo_funcval_code649(ptr {{(nest|swiftself)}} %4966, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int32", ptr null }) -// CHECK-NEXT: store %reflect.Value %4963, ptr %4959, align 8 -// CHECK-NEXT: store %reflect.Value %4968, ptr %4964, align 8 -// CHECK-NEXT: %4969 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 325 -// CHECK-NEXT: %4970 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4969, i32 0, i32 0 -// CHECK-NEXT: %4971 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4972 = extractvalue { ptr, ptr } %4971, 1 -// CHECK-NEXT: %4973 = extractvalue { ptr, ptr } %4971, 0 -// CHECK-NEXT: %__llgo_funcval_code650 = call ptr asm "", "=r,0"(ptr %4973) -// CHECK-NEXT: %4974 = call %reflect.Value %__llgo_funcval_code650(ptr {{(nest|swiftself)}} %4972, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int64", ptr null }) -// CHECK-NEXT: %4975 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4969, i32 0, i32 1 -// CHECK-NEXT: %4976 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4977 = extractvalue { ptr, ptr } %4976, 1 -// CHECK-NEXT: %4978 = extractvalue { ptr, ptr } %4976, 0 -// CHECK-NEXT: %__llgo_funcval_code651 = call ptr asm "", "=r,0"(ptr %4978) -// CHECK-NEXT: %4979 = call %reflect.Value %__llgo_funcval_code651(ptr {{(nest|swiftself)}} %4977, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"***_llgo_int64", ptr null }) -// CHECK-NEXT: store %reflect.Value %4974, ptr %4970, align 8 -// CHECK-NEXT: store %reflect.Value %4979, ptr %4975, align 8 -// CHECK-NEXT: %4980 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 326 -// CHECK-NEXT: %4981 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4980, i32 0, i32 0 -// CHECK-NEXT: %4982 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4983 = extractvalue { ptr, ptr } %4982, 1 -// CHECK-NEXT: %4984 = extractvalue { ptr, ptr } %4982, 0 -// CHECK-NEXT: %__llgo_funcval_code652 = call ptr asm "", "=r,0"(ptr %4984) -// CHECK-NEXT: %4985 = call %reflect.Value %__llgo_funcval_code652(ptr {{(nest|swiftself)}} %4983, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_uint8", ptr null }) -// CHECK-NEXT: %4986 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4980, i32 0, i32 1 -// CHECK-NEXT: %4987 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4988 = extractvalue { ptr, ptr } %4987, 1 -// CHECK-NEXT: %4989 = extractvalue { ptr, ptr } %4987, 0 -// CHECK-NEXT: %__llgo_funcval_code653 = call ptr asm "", "=r,0"(ptr %4989) -// CHECK-NEXT: %4990 = call %reflect.Value %__llgo_funcval_code653(ptr {{(nest|swiftself)}} %4988, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %4985, ptr %4981, align 8 -// CHECK-NEXT: store %reflect.Value %4990, ptr %4986, align 8 -// CHECK-NEXT: %4991 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 327 -// CHECK-NEXT: %4992 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4991, i32 0, i32 0 -// CHECK-NEXT: %4993 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4994 = extractvalue { ptr, ptr } %4993, 1 -// CHECK-NEXT: %4995 = extractvalue { ptr, ptr } %4993, 0 -// CHECK-NEXT: %__llgo_funcval_code654 = call ptr asm "", "=r,0"(ptr %4995) -// CHECK-NEXT: %4996 = call %reflect.Value %__llgo_funcval_code654(ptr {{(nest|swiftself)}} %4994, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_main.MyByte", ptr null }) -// CHECK-NEXT: %4997 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %4991, i32 0, i32 1 -// CHECK-NEXT: %4998 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %4999 = extractvalue { ptr, ptr } %4998, 1 -// CHECK-NEXT: %5000 = extractvalue { ptr, ptr } %4998, 0 -// CHECK-NEXT: %__llgo_funcval_code655 = call ptr asm "", "=r,0"(ptr %5000) -// CHECK-NEXT: %5001 = call %reflect.Value %__llgo_funcval_code655(ptr {{(nest|swiftself)}} %4999, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_main.MyByte", ptr null }) -// CHECK-NEXT: store %reflect.Value %4996, ptr %4992, align 8 -// CHECK-NEXT: store %reflect.Value %5001, ptr %4997, align 8 -// CHECK-NEXT: %5002 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 328 -// CHECK-NEXT: %5003 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5002, i32 0, i32 0 -// CHECK-NEXT: %5004 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5005 = extractvalue { ptr, ptr } %5004, 1 -// CHECK-NEXT: %5006 = extractvalue { ptr, ptr } %5004, 0 -// CHECK-NEXT: %__llgo_funcval_code656 = call ptr asm "", "=r,0"(ptr %5006) -// CHECK-NEXT: %5007 = call %reflect.Value %__llgo_funcval_code656(ptr {{(nest|swiftself)}} %5005, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_bool", ptr null }) -// CHECK-NEXT: %5008 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5002, i32 0, i32 1 -// CHECK-NEXT: %5009 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5010 = extractvalue { ptr, ptr } %5009, 1 -// CHECK-NEXT: %5011 = extractvalue { ptr, ptr } %5009, 0 -// CHECK-NEXT: %__llgo_funcval_code657 = call ptr asm "", "=r,0"(ptr %5011) -// CHECK-NEXT: %5012 = call %reflect.Value %__llgo_funcval_code657(ptr {{(nest|swiftself)}} %5010, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_bool", ptr null }) -// CHECK-NEXT: store %reflect.Value %5007, ptr %5003, align 8 -// CHECK-NEXT: store %reflect.Value %5012, ptr %5008, align 8 -// CHECK-NEXT: %5013 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 329 -// CHECK-NEXT: %5014 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5013, i32 0, i32 0 -// CHECK-NEXT: %5015 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5016 = extractvalue { ptr, ptr } %5015, 1 -// CHECK-NEXT: %5017 = extractvalue { ptr, ptr } %5015, 0 -// CHECK-NEXT: %__llgo_funcval_code658 = call ptr asm "", "=r,0"(ptr %5017) -// CHECK-NEXT: %5018 = call %reflect.Value %__llgo_funcval_code658(ptr {{(nest|swiftself)}} %5016, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_uint8", ptr null }) -// CHECK-NEXT: %5019 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5013, i32 0, i32 1 -// CHECK-NEXT: %5020 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5021 = extractvalue { ptr, ptr } %5020, 1 -// CHECK-NEXT: %5022 = extractvalue { ptr, ptr } %5020, 0 -// CHECK-NEXT: %__llgo_funcval_code659 = call ptr asm "", "=r,0"(ptr %5022) -// CHECK-NEXT: %5023 = call %reflect.Value %__llgo_funcval_code659(ptr {{(nest|swiftself)}} %5021, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_int]_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5018, ptr %5014, align 8 -// CHECK-NEXT: store %reflect.Value %5023, ptr %5019, align 8 -// CHECK-NEXT: %5024 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 330 -// CHECK-NEXT: %5025 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5024, i32 0, i32 0 -// CHECK-NEXT: %5026 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5027 = extractvalue { ptr, ptr } %5026, 1 -// CHECK-NEXT: %5028 = extractvalue { ptr, ptr } %5026, 0 -// CHECK-NEXT: %__llgo_funcval_code660 = call ptr asm "", "=r,0"(ptr %5028) -// CHECK-NEXT: %5029 = call %reflect.Value %__llgo_funcval_code660(ptr {{(nest|swiftself)}} %5027, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_uint]_llgo_bool", ptr null }) -// CHECK-NEXT: %5030 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5024, i32 0, i32 1 -// CHECK-NEXT: %5031 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5032 = extractvalue { ptr, ptr } %5031, 1 -// CHECK-NEXT: %5033 = extractvalue { ptr, ptr } %5031, 0 -// CHECK-NEXT: %__llgo_funcval_code661 = call ptr asm "", "=r,0"(ptr %5033) -// CHECK-NEXT: %5034 = call %reflect.Value %__llgo_funcval_code661(ptr {{(nest|swiftself)}} %5032, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"map[_llgo_uint]_llgo_bool", ptr null }) -// CHECK-NEXT: store %reflect.Value %5029, ptr %5025, align 8 -// CHECK-NEXT: store %reflect.Value %5034, ptr %5030, align 8 -// CHECK-NEXT: %5035 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 331 -// CHECK-NEXT: %5036 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5035, i32 0, i32 0 -// CHECK-NEXT: %5037 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5038 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %5038, align 8 -// CHECK-NEXT: %5039 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint", ptr undef }, ptr %5038, 1 -// CHECK-NEXT: %5040 = extractvalue { ptr, ptr } %5037, 1 -// CHECK-NEXT: %5041 = extractvalue { ptr, ptr } %5037, 0 -// CHECK-NEXT: %__llgo_funcval_code662 = call ptr asm "", "=r,0"(ptr %5041) -// CHECK-NEXT: %5042 = call %reflect.Value %__llgo_funcval_code662(ptr {{(nest|swiftself)}} %5040, %"{{.*}}/runtime/internal/runtime.eface" %5039) -// CHECK-NEXT: %5043 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5035, i32 0, i32 1 -// CHECK-NEXT: %5044 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5045 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %5045, align 8 -// CHECK-NEXT: %5046 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_uint", ptr undef }, ptr %5045, 1 -// CHECK-NEXT: %5047 = extractvalue { ptr, ptr } %5044, 1 -// CHECK-NEXT: %5048 = extractvalue { ptr, ptr } %5044, 0 -// CHECK-NEXT: %__llgo_funcval_code663 = call ptr asm "", "=r,0"(ptr %5048) -// CHECK-NEXT: %5049 = call %reflect.Value %__llgo_funcval_code663(ptr {{(nest|swiftself)}} %5047, %"{{.*}}/runtime/internal/runtime.eface" %5046) -// CHECK-NEXT: store %reflect.Value %5042, ptr %5036, align 8 -// CHECK-NEXT: store %reflect.Value %5049, ptr %5043, align 8 -// CHECK-NEXT: %5050 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 332 -// CHECK-NEXT: %5051 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5050, i32 0, i32 0 -// CHECK-NEXT: %5052 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5053 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %5053, align 8 -// CHECK-NEXT: %5054 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int", ptr undef }, ptr %5053, 1 -// CHECK-NEXT: %5055 = extractvalue { ptr, ptr } %5052, 1 -// CHECK-NEXT: %5056 = extractvalue { ptr, ptr } %5052, 0 -// CHECK-NEXT: %__llgo_funcval_code664 = call ptr asm "", "=r,0"(ptr %5056) -// CHECK-NEXT: %5057 = call %reflect.Value %__llgo_funcval_code664(ptr {{(nest|swiftself)}} %5055, %"{{.*}}/runtime/internal/runtime.eface" %5054) -// CHECK-NEXT: %5058 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5050, i32 0, i32 1 -// CHECK-NEXT: %5059 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5060 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer, ptr %5060, align 8 -// CHECK-NEXT: %5061 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int", ptr undef }, ptr %5060, 1 -// CHECK-NEXT: %5062 = extractvalue { ptr, ptr } %5059, 1 -// CHECK-NEXT: %5063 = extractvalue { ptr, ptr } %5059, 0 -// CHECK-NEXT: %__llgo_funcval_code665 = call ptr asm "", "=r,0"(ptr %5063) -// CHECK-NEXT: %5064 = call %reflect.Value %__llgo_funcval_code665(ptr {{(nest|swiftself)}} %5062, %"{{.*}}/runtime/internal/runtime.eface" %5061) -// CHECK-NEXT: store %reflect.Value %5057, ptr %5051, align 8 -// CHECK-NEXT: store %reflect.Value %5064, ptr %5058, align 8 -// CHECK-NEXT: %5065 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 333 -// CHECK-NEXT: %5066 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5065, i32 0, i32 0 -// CHECK-NEXT: %5067 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5068 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5069 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_any", ptr undef }, ptr %5068, 1 -// CHECK-NEXT: %5070 = extractvalue { ptr, ptr } %5067, 1 -// CHECK-NEXT: %5071 = extractvalue { ptr, ptr } %5067, 0 -// CHECK-NEXT: %__llgo_funcval_code666 = call ptr asm "", "=r,0"(ptr %5071) -// CHECK-NEXT: %5072 = call %reflect.Value %__llgo_funcval_code666(ptr {{(nest|swiftself)}} %5070, %"{{.*}}/runtime/internal/runtime.eface" %5069) -// CHECK-NEXT: %5073 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5065, i32 0, i32 1 -// CHECK-NEXT: %5074 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5075 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5076 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_any", ptr undef }, ptr %5075, 1 -// CHECK-NEXT: %5077 = extractvalue { ptr, ptr } %5074, 1 -// CHECK-NEXT: %5078 = extractvalue { ptr, ptr } %5074, 0 -// CHECK-NEXT: %__llgo_funcval_code667 = call ptr asm "", "=r,0"(ptr %5078) -// CHECK-NEXT: %5079 = call %reflect.Value %__llgo_funcval_code667(ptr {{(nest|swiftself)}} %5077, %"{{.*}}/runtime/internal/runtime.eface" %5076) -// CHECK-NEXT: store %reflect.Value %5072, ptr %5066, align 8 -// CHECK-NEXT: store %reflect.Value %5079, ptr %5073, align 8 -// CHECK-NEXT: %5080 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 334 -// CHECK-NEXT: %5081 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5080, i32 0, i32 0 -// CHECK-NEXT: %5082 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5083 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5084 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Reader", ptr undef }, ptr %5083, 1 -// CHECK-NEXT: %5085 = extractvalue { ptr, ptr } %5082, 1 -// CHECK-NEXT: %5086 = extractvalue { ptr, ptr } %5082, 0 -// CHECK-NEXT: %__llgo_funcval_code668 = call ptr asm "", "=r,0"(ptr %5086) -// CHECK-NEXT: %5087 = call %reflect.Value %__llgo_funcval_code668(ptr {{(nest|swiftself)}} %5085, %"{{.*}}/runtime/internal/runtime.eface" %5084) -// CHECK-NEXT: %5088 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5080, i32 0, i32 1 -// CHECK-NEXT: %5089 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5090 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5091 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Reader", ptr undef }, ptr %5090, 1 -// CHECK-NEXT: %5092 = extractvalue { ptr, ptr } %5089, 1 -// CHECK-NEXT: %5093 = extractvalue { ptr, ptr } %5089, 0 -// CHECK-NEXT: %__llgo_funcval_code669 = call ptr asm "", "=r,0"(ptr %5093) -// CHECK-NEXT: %5094 = call %reflect.Value %__llgo_funcval_code669(ptr {{(nest|swiftself)}} %5092, %"{{.*}}/runtime/internal/runtime.eface" %5091) -// CHECK-NEXT: store %reflect.Value %5087, ptr %5081, align 8 -// CHECK-NEXT: store %reflect.Value %5094, ptr %5088, align 8 -// CHECK-NEXT: %5095 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 335 -// CHECK-NEXT: %5096 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5095, i32 0, i32 0 -// CHECK-NEXT: %5097 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5098 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5099 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Writer", ptr undef }, ptr %5098, 1 -// CHECK-NEXT: %5100 = extractvalue { ptr, ptr } %5097, 1 -// CHECK-NEXT: %5101 = extractvalue { ptr, ptr } %5097, 0 -// CHECK-NEXT: %__llgo_funcval_code670 = call ptr asm "", "=r,0"(ptr %5101) -// CHECK-NEXT: %5102 = call %reflect.Value %__llgo_funcval_code670(ptr {{(nest|swiftself)}} %5100, %"{{.*}}/runtime/internal/runtime.eface" %5099) -// CHECK-NEXT: %5103 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5095, i32 0, i32 1 -// CHECK-NEXT: %5104 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5105 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5106 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_io.Writer", ptr undef }, ptr %5105, 1 -// CHECK-NEXT: %5107 = extractvalue { ptr, ptr } %5104, 1 -// CHECK-NEXT: %5108 = extractvalue { ptr, ptr } %5104, 0 -// CHECK-NEXT: %__llgo_funcval_code671 = call ptr asm "", "=r,0"(ptr %5108) -// CHECK-NEXT: %5109 = call %reflect.Value %__llgo_funcval_code671(ptr {{(nest|swiftself)}} %5107, %"{{.*}}/runtime/internal/runtime.eface" %5106) -// CHECK-NEXT: store %reflect.Value %5102, ptr %5096, align 8 -// CHECK-NEXT: store %reflect.Value %5109, ptr %5103, align 8 -// CHECK-NEXT: %5110 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 336 -// CHECK-NEXT: %5111 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5110, i32 0, i32 0 -// CHECK-NEXT: %5112 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5113 = extractvalue { ptr, ptr } %5112, 1 -// CHECK-NEXT: %5114 = extractvalue { ptr, ptr } %5112, 0 -// CHECK-NEXT: %__llgo_funcval_code672 = call ptr asm "", "=r,0"(ptr %5114) -// CHECK-NEXT: %5115 = call %reflect.Value %__llgo_funcval_code672(ptr {{(nest|swiftself)}} %5113, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: %5116 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5110, i32 0, i32 1 -// CHECK-NEXT: %5117 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5118 = extractvalue { ptr, ptr } %5117, 1 -// CHECK-NEXT: %5119 = extractvalue { ptr, ptr } %5117, 0 -// CHECK-NEXT: %__llgo_funcval_code673 = call ptr asm "", "=r,0"(ptr %5119) -// CHECK-NEXT: %5120 = call %reflect.Value %__llgo_funcval_code673(ptr {{(nest|swiftself)}} %5118, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5115, ptr %5111, align 8 -// CHECK-NEXT: store %reflect.Value %5120, ptr %5116, align 8 -// CHECK-NEXT: %5121 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 337 -// CHECK-NEXT: %5122 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5121, i32 0, i32 0 -// CHECK-NEXT: %5123 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5124 = extractvalue { ptr, ptr } %5123, 1 -// CHECK-NEXT: %5125 = extractvalue { ptr, ptr } %5123, 0 -// CHECK-NEXT: %__llgo_funcval_code674 = call ptr asm "", "=r,0"(ptr %5125) -// CHECK-NEXT: %5126 = call %reflect.Value %__llgo_funcval_code674(ptr {{(nest|swiftself)}} %5124, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: %5127 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5121, i32 0, i32 1 -// CHECK-NEXT: %5128 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5129 = extractvalue { ptr, ptr } %5128, 1 -// CHECK-NEXT: %5130 = extractvalue { ptr, ptr } %5128, 0 -// CHECK-NEXT: %__llgo_funcval_code675 = call ptr asm "", "=r,0"(ptr %5130) -// CHECK-NEXT: %5131 = call %reflect.Value %__llgo_funcval_code675(ptr {{(nest|swiftself)}} %5129, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5126, ptr %5122, align 8 -// CHECK-NEXT: store %reflect.Value %5131, ptr %5127, align 8 -// CHECK-NEXT: %5132 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 338 -// CHECK-NEXT: %5133 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5132, i32 0, i32 0 -// CHECK-NEXT: %5134 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5135 = extractvalue { ptr, ptr } %5134, 1 -// CHECK-NEXT: %5136 = extractvalue { ptr, ptr } %5134, 0 -// CHECK-NEXT: %__llgo_funcval_code676 = call ptr asm "", "=r,0"(ptr %5136) -// CHECK-NEXT: %5137 = call %reflect.Value %__llgo_funcval_code676(ptr {{(nest|swiftself)}} %5135, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: %5138 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5132, i32 0, i32 1 -// CHECK-NEXT: %5139 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5140 = extractvalue { ptr, ptr } %5139, 1 -// CHECK-NEXT: %5141 = extractvalue { ptr, ptr } %5139, 0 -// CHECK-NEXT: %__llgo_funcval_code677 = call ptr asm "", "=r,0"(ptr %5141) -// CHECK-NEXT: %5142 = call %reflect.Value %__llgo_funcval_code677(ptr {{(nest|swiftself)}} %5140, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5137, ptr %5133, align 8 -// CHECK-NEXT: store %reflect.Value %5142, ptr %5138, align 8 -// CHECK-NEXT: %5143 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 339 -// CHECK-NEXT: %5144 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5143, i32 0, i32 0 -// CHECK-NEXT: %5145 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5146 = extractvalue { ptr, ptr } %5145, 1 -// CHECK-NEXT: %5147 = extractvalue { ptr, ptr } %5145, 0 -// CHECK-NEXT: %__llgo_funcval_code678 = call ptr asm "", "=r,0"(ptr %5147) -// CHECK-NEXT: %5148 = call %reflect.Value %__llgo_funcval_code678(ptr {{(nest|swiftself)}} %5146, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: %5149 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5143, i32 0, i32 1 -// CHECK-NEXT: %5150 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5151 = extractvalue { ptr, ptr } %5150, 1 -// CHECK-NEXT: %5152 = extractvalue { ptr, ptr } %5150, 0 -// CHECK-NEXT: %__llgo_funcval_code679 = call ptr asm "", "=r,0"(ptr %5152) -// CHECK-NEXT: %5153 = call %reflect.Value %__llgo_funcval_code679(ptr {{(nest|swiftself)}} %5151, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5148, ptr %5144, align 8 -// CHECK-NEXT: store %reflect.Value %5153, ptr %5149, align 8 -// CHECK-NEXT: %5154 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 340 -// CHECK-NEXT: %5155 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5154, i32 0, i32 0 -// CHECK-NEXT: %5156 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5157 = extractvalue { ptr, ptr } %5156, 1 -// CHECK-NEXT: %5158 = extractvalue { ptr, ptr } %5156, 0 -// CHECK-NEXT: %__llgo_funcval_code680 = call ptr asm "", "=r,0"(ptr %5158) -// CHECK-NEXT: %5159 = call %reflect.Value %__llgo_funcval_code680(ptr {{(nest|swiftself)}} %5157, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanRecv, ptr null }) -// CHECK-NEXT: %5160 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5154, i32 0, i32 1 -// CHECK-NEXT: %5161 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5162 = extractvalue { ptr, ptr } %5161, 1 -// CHECK-NEXT: %5163 = extractvalue { ptr, ptr } %5161, 0 -// CHECK-NEXT: %__llgo_funcval_code681 = call ptr asm "", "=r,0"(ptr %5163) -// CHECK-NEXT: %5164 = call %reflect.Value %__llgo_funcval_code681(ptr {{(nest|swiftself)}} %5162, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5159, ptr %5155, align 8 -// CHECK-NEXT: store %reflect.Value %5164, ptr %5160, align 8 -// CHECK-NEXT: %5165 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 341 -// CHECK-NEXT: %5166 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5165, i32 0, i32 0 -// CHECK-NEXT: %5167 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5168 = extractvalue { ptr, ptr } %5167, 1 -// CHECK-NEXT: %5169 = extractvalue { ptr, ptr } %5167, 0 -// CHECK-NEXT: %__llgo_funcval_code682 = call ptr asm "", "=r,0"(ptr %5169) -// CHECK-NEXT: %5170 = call %reflect.Value %__llgo_funcval_code682(ptr {{(nest|swiftself)}} %5168, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan _llgo_int", ptr null }) -// CHECK-NEXT: %5171 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5165, i32 0, i32 1 -// CHECK-NEXT: %5172 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5173 = extractvalue { ptr, ptr } %5172, 1 -// CHECK-NEXT: %5174 = extractvalue { ptr, ptr } %5172, 0 -// CHECK-NEXT: %__llgo_funcval_code683 = call ptr asm "", "=r,0"(ptr %5174) -// CHECK-NEXT: %5175 = call %reflect.Value %__llgo_funcval_code683(ptr {{(nest|swiftself)}} %5173, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5170, ptr %5166, align 8 -// CHECK-NEXT: store %reflect.Value %5175, ptr %5171, align 8 -// CHECK-NEXT: %5176 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 342 -// CHECK-NEXT: %5177 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5176, i32 0, i32 0 -// CHECK-NEXT: %5178 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5179 = extractvalue { ptr, ptr } %5178, 1 -// CHECK-NEXT: %5180 = extractvalue { ptr, ptr } %5178, 0 -// CHECK-NEXT: %__llgo_funcval_code684 = call ptr asm "", "=r,0"(ptr %5180) -// CHECK-NEXT: %5181 = call %reflect.Value %__llgo_funcval_code684(ptr {{(nest|swiftself)}} %5179, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanSend, ptr null }) -// CHECK-NEXT: %5182 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5176, i32 0, i32 1 -// CHECK-NEXT: %5183 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5184 = extractvalue { ptr, ptr } %5183, 1 -// CHECK-NEXT: %5185 = extractvalue { ptr, ptr } %5183, 0 -// CHECK-NEXT: %__llgo_funcval_code685 = call ptr asm "", "=r,0"(ptr %5185) -// CHECK-NEXT: %5186 = call %reflect.Value %__llgo_funcval_code685(ptr {{(nest|swiftself)}} %5184, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5181, ptr %5177, align 8 -// CHECK-NEXT: store %reflect.Value %5186, ptr %5182, align 8 -// CHECK-NEXT: %5187 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 343 -// CHECK-NEXT: %5188 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5187, i32 0, i32 0 -// CHECK-NEXT: %5189 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5190 = extractvalue { ptr, ptr } %5189, 1 -// CHECK-NEXT: %5191 = extractvalue { ptr, ptr } %5189, 0 -// CHECK-NEXT: %__llgo_funcval_code686 = call ptr asm "", "=r,0"(ptr %5191) -// CHECK-NEXT: %5192 = call %reflect.Value %__llgo_funcval_code686(ptr {{(nest|swiftself)}} %5190, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- _llgo_int", ptr null }) -// CHECK-NEXT: %5193 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5187, i32 0, i32 1 -// CHECK-NEXT: %5194 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5195 = extractvalue { ptr, ptr } %5194, 1 -// CHECK-NEXT: %5196 = extractvalue { ptr, ptr } %5194, 0 -// CHECK-NEXT: %__llgo_funcval_code687 = call ptr asm "", "=r,0"(ptr %5196) -// CHECK-NEXT: %5197 = call %reflect.Value %__llgo_funcval_code687(ptr {{(nest|swiftself)}} %5195, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5192, ptr %5188, align 8 -// CHECK-NEXT: store %reflect.Value %5197, ptr %5193, align 8 -// CHECK-NEXT: %5198 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 344 -// CHECK-NEXT: %5199 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5198, i32 0, i32 0 -// CHECK-NEXT: %5200 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5201 = extractvalue { ptr, ptr } %5200, 1 -// CHECK-NEXT: %5202 = extractvalue { ptr, ptr } %5200, 0 -// CHECK-NEXT: %__llgo_funcval_code688 = call ptr asm "", "=r,0"(ptr %5202) -// CHECK-NEXT: %5203 = call %reflect.Value %__llgo_funcval_code688(ptr {{(nest|swiftself)}} %5201, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: %5204 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5198, i32 0, i32 1 -// CHECK-NEXT: %5205 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5206 = extractvalue { ptr, ptr } %5205, 1 -// CHECK-NEXT: %5207 = extractvalue { ptr, ptr } %5205, 0 -// CHECK-NEXT: %__llgo_funcval_code689 = call ptr asm "", "=r,0"(ptr %5207) -// CHECK-NEXT: %5208 = call %reflect.Value %__llgo_funcval_code689(ptr {{(nest|swiftself)}} %5206, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5203, ptr %5199, align 8 -// CHECK-NEXT: store %reflect.Value %5208, ptr %5204, align 8 -// CHECK-NEXT: %5209 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 345 -// CHECK-NEXT: %5210 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5209, i32 0, i32 0 -// CHECK-NEXT: %5211 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5212 = extractvalue { ptr, ptr } %5211, 1 -// CHECK-NEXT: %5213 = extractvalue { ptr, ptr } %5211, 0 -// CHECK-NEXT: %__llgo_funcval_code690 = call ptr asm "", "=r,0"(ptr %5213) -// CHECK-NEXT: %5214 = call %reflect.Value %__llgo_funcval_code690(ptr {{(nest|swiftself)}} %5212, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: %5215 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5209, i32 0, i32 1 -// CHECK-NEXT: %5216 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5217 = extractvalue { ptr, ptr } %5216, 1 -// CHECK-NEXT: %5218 = extractvalue { ptr, ptr } %5216, 0 -// CHECK-NEXT: %__llgo_funcval_code691 = call ptr asm "", "=r,0"(ptr %5218) -// CHECK-NEXT: %5219 = call %reflect.Value %__llgo_funcval_code691(ptr {{(nest|swiftself)}} %5217, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: store %reflect.Value %5214, ptr %5210, align 8 -// CHECK-NEXT: store %reflect.Value %5219, ptr %5215, align 8 -// CHECK-NEXT: %5220 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 346 -// CHECK-NEXT: %5221 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5220, i32 0, i32 0 -// CHECK-NEXT: %5222 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5223 = extractvalue { ptr, ptr } %5222, 1 -// CHECK-NEXT: %5224 = extractvalue { ptr, ptr } %5222, 0 -// CHECK-NEXT: %__llgo_funcval_code692 = call ptr asm "", "=r,0"(ptr %5224) -// CHECK-NEXT: %5225 = call %reflect.Value %__llgo_funcval_code692(ptr {{(nest|swiftself)}} %5223, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: %5226 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5220, i32 0, i32 1 -// CHECK-NEXT: %5227 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5228 = extractvalue { ptr, ptr } %5227, 1 -// CHECK-NEXT: %5229 = extractvalue { ptr, ptr } %5227, 0 -// CHECK-NEXT: %__llgo_funcval_code693 = call ptr asm "", "=r,0"(ptr %5229) -// CHECK-NEXT: %5230 = call %reflect.Value %__llgo_funcval_code693(ptr {{(nest|swiftself)}} %5228, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5225, ptr %5221, align 8 -// CHECK-NEXT: store %reflect.Value %5230, ptr %5226, align 8 -// CHECK-NEXT: %5231 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 347 -// CHECK-NEXT: %5232 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5231, i32 0, i32 0 -// CHECK-NEXT: %5233 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5234 = extractvalue { ptr, ptr } %5233, 1 -// CHECK-NEXT: %5235 = extractvalue { ptr, ptr } %5233, 0 -// CHECK-NEXT: %__llgo_funcval_code694 = call ptr asm "", "=r,0"(ptr %5235) -// CHECK-NEXT: %5236 = call %reflect.Value %__llgo_funcval_code694(ptr {{(nest|swiftself)}} %5234, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr null }) -// CHECK-NEXT: %5237 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5231, i32 0, i32 1 -// CHECK-NEXT: %5238 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5239 = extractvalue { ptr, ptr } %5238, 1 -// CHECK-NEXT: %5240 = extractvalue { ptr, ptr } %5238, 0 -// CHECK-NEXT: %__llgo_funcval_code695 = call ptr asm "", "=r,0"(ptr %5240) -// CHECK-NEXT: %5241 = call %reflect.Value %__llgo_funcval_code695(ptr {{(nest|swiftself)}} %5239, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- _llgo_int", ptr null }) -// CHECK-NEXT: store %reflect.Value %5236, ptr %5232, align 8 -// CHECK-NEXT: store %reflect.Value %5241, ptr %5237, align 8 -// CHECK-NEXT: %5242 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 348 -// CHECK-NEXT: %5243 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5242, i32 0, i32 0 -// CHECK-NEXT: %5244 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5245 = extractvalue { ptr, ptr } %5244, 1 -// CHECK-NEXT: %5246 = extractvalue { ptr, ptr } %5244, 0 -// CHECK-NEXT: %__llgo_funcval_code696 = call ptr asm "", "=r,0"(ptr %5246) -// CHECK-NEXT: %5247 = call %reflect.Value %__llgo_funcval_code696(ptr {{(nest|swiftself)}} %5245, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: %5248 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5242, i32 0, i32 1 -// CHECK-NEXT: %5249 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5250 = extractvalue { ptr, ptr } %5249, 1 -// CHECK-NEXT: %5251 = extractvalue { ptr, ptr } %5249, 0 -// CHECK-NEXT: %__llgo_funcval_code697 = call ptr asm "", "=r,0"(ptr %5251) -// CHECK-NEXT: %5252 = call %reflect.Value %__llgo_funcval_code697(ptr {{(nest|swiftself)}} %5250, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5247, ptr %5243, align 8 -// CHECK-NEXT: store %reflect.Value %5252, ptr %5248, align 8 -// CHECK-NEXT: %5253 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 349 -// CHECK-NEXT: %5254 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5253, i32 0, i32 0 -// CHECK-NEXT: %5255 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5256 = extractvalue { ptr, ptr } %5255, 1 -// CHECK-NEXT: %5257 = extractvalue { ptr, ptr } %5255, 0 -// CHECK-NEXT: %__llgo_funcval_code698 = call ptr asm "", "=r,0"(ptr %5257) -// CHECK-NEXT: %5258 = call %reflect.Value %__llgo_funcval_code698(ptr {{(nest|swiftself)}} %5256, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: %5259 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5253, i32 0, i32 1 -// CHECK-NEXT: %5260 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5261 = extractvalue { ptr, ptr } %5260, 1 -// CHECK-NEXT: %5262 = extractvalue { ptr, ptr } %5260, 0 -// CHECK-NEXT: %__llgo_funcval_code699 = call ptr asm "", "=r,0"(ptr %5262) -// CHECK-NEXT: %5263 = call %reflect.Value %__llgo_funcval_code699(ptr {{(nest|swiftself)}} %5261, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5258, ptr %5254, align 8 -// CHECK-NEXT: store %reflect.Value %5263, ptr %5259, align 8 -// CHECK-NEXT: %5264 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 350 -// CHECK-NEXT: %5265 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5264, i32 0, i32 0 -// CHECK-NEXT: %5266 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5267 = extractvalue { ptr, ptr } %5266, 1 -// CHECK-NEXT: %5268 = extractvalue { ptr, ptr } %5266, 0 -// CHECK-NEXT: %__llgo_funcval_code700 = call ptr asm "", "=r,0"(ptr %5268) -// CHECK-NEXT: %5269 = call %reflect.Value %__llgo_funcval_code700(ptr {{(nest|swiftself)}} %5267, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5270 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5264, i32 0, i32 1 -// CHECK-NEXT: %5271 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5272 = extractvalue { ptr, ptr } %5271, 1 -// CHECK-NEXT: %5273 = extractvalue { ptr, ptr } %5271, 0 -// CHECK-NEXT: %__llgo_funcval_code701 = call ptr asm "", "=r,0"(ptr %5273) -// CHECK-NEXT: %5274 = call %reflect.Value %__llgo_funcval_code701(ptr {{(nest|swiftself)}} %5272, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5269, ptr %5265, align 8 -// CHECK-NEXT: store %reflect.Value %5274, ptr %5270, align 8 -// CHECK-NEXT: %5275 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 351 -// CHECK-NEXT: %5276 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5275, i32 0, i32 0 -// CHECK-NEXT: %5277 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5278 = extractvalue { ptr, ptr } %5277, 1 -// CHECK-NEXT: %5279 = extractvalue { ptr, ptr } %5277, 0 -// CHECK-NEXT: %__llgo_funcval_code702 = call ptr asm "", "=r,0"(ptr %5279) -// CHECK-NEXT: %5280 = call %reflect.Value %__llgo_funcval_code702(ptr {{(nest|swiftself)}} %5278, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5281 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5275, i32 0, i32 1 -// CHECK-NEXT: %5282 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5283 = extractvalue { ptr, ptr } %5282, 1 -// CHECK-NEXT: %5284 = extractvalue { ptr, ptr } %5282, 0 -// CHECK-NEXT: %__llgo_funcval_code703 = call ptr asm "", "=r,0"(ptr %5284) -// CHECK-NEXT: %5285 = call %reflect.Value %__llgo_funcval_code703(ptr {{(nest|swiftself)}} %5283, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5280, ptr %5276, align 8 -// CHECK-NEXT: store %reflect.Value %5285, ptr %5281, align 8 -// CHECK-NEXT: %5286 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 352 -// CHECK-NEXT: %5287 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5286, i32 0, i32 0 -// CHECK-NEXT: %5288 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5289 = extractvalue { ptr, ptr } %5288, 1 -// CHECK-NEXT: %5290 = extractvalue { ptr, ptr } %5288, 0 -// CHECK-NEXT: %__llgo_funcval_code704 = call ptr asm "", "=r,0"(ptr %5290) -// CHECK-NEXT: %5291 = call %reflect.Value %__llgo_funcval_code704(ptr {{(nest|swiftself)}} %5289, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanRecv, ptr null }) -// CHECK-NEXT: %5292 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5286, i32 0, i32 1 -// CHECK-NEXT: %5293 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5294 = extractvalue { ptr, ptr } %5293, 1 -// CHECK-NEXT: %5295 = extractvalue { ptr, ptr } %5293, 0 -// CHECK-NEXT: %__llgo_funcval_code705 = call ptr asm "", "=r,0"(ptr %5295) -// CHECK-NEXT: %5296 = call %reflect.Value %__llgo_funcval_code705(ptr {{(nest|swiftself)}} %5294, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5291, ptr %5287, align 8 -// CHECK-NEXT: store %reflect.Value %5296, ptr %5292, align 8 -// CHECK-NEXT: %5297 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 353 -// CHECK-NEXT: %5298 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5297, i32 0, i32 0 -// CHECK-NEXT: %5299 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5300 = extractvalue { ptr, ptr } %5299, 1 -// CHECK-NEXT: %5301 = extractvalue { ptr, ptr } %5299, 0 -// CHECK-NEXT: %__llgo_funcval_code706 = call ptr asm "", "=r,0"(ptr %5301) -// CHECK-NEXT: %5302 = call %reflect.Value %__llgo_funcval_code706(ptr {{(nest|swiftself)}} %5300, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5303 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5297, i32 0, i32 1 -// CHECK-NEXT: %5304 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5305 = extractvalue { ptr, ptr } %5304, 1 -// CHECK-NEXT: %5306 = extractvalue { ptr, ptr } %5304, 0 -// CHECK-NEXT: %__llgo_funcval_code707 = call ptr asm "", "=r,0"(ptr %5306) -// CHECK-NEXT: %5307 = call %reflect.Value %__llgo_funcval_code707(ptr {{(nest|swiftself)}} %5305, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5302, ptr %5298, align 8 -// CHECK-NEXT: store %reflect.Value %5307, ptr %5303, align 8 -// CHECK-NEXT: %5308 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 354 -// CHECK-NEXT: %5309 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5308, i32 0, i32 0 -// CHECK-NEXT: %5310 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5311 = extractvalue { ptr, ptr } %5310, 1 -// CHECK-NEXT: %5312 = extractvalue { ptr, ptr } %5310, 0 -// CHECK-NEXT: %__llgo_funcval_code708 = call ptr asm "", "=r,0"(ptr %5312) -// CHECK-NEXT: %5313 = call %reflect.Value %__llgo_funcval_code708(ptr {{(nest|swiftself)}} %5311, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanSend, ptr null }) -// CHECK-NEXT: %5314 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5308, i32 0, i32 1 -// CHECK-NEXT: %5315 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5316 = extractvalue { ptr, ptr } %5315, 1 -// CHECK-NEXT: %5317 = extractvalue { ptr, ptr } %5315, 0 -// CHECK-NEXT: %__llgo_funcval_code709 = call ptr asm "", "=r,0"(ptr %5317) -// CHECK-NEXT: %5318 = call %reflect.Value %__llgo_funcval_code709(ptr {{(nest|swiftself)}} %5316, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5313, ptr %5309, align 8 -// CHECK-NEXT: store %reflect.Value %5318, ptr %5314, align 8 -// CHECK-NEXT: %5319 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 355 -// CHECK-NEXT: %5320 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5319, i32 0, i32 0 -// CHECK-NEXT: %5321 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5322 = extractvalue { ptr, ptr } %5321, 1 -// CHECK-NEXT: %5323 = extractvalue { ptr, ptr } %5321, 0 -// CHECK-NEXT: %__llgo_funcval_code710 = call ptr asm "", "=r,0"(ptr %5323) -// CHECK-NEXT: %5324 = call %reflect.Value %__llgo_funcval_code710(ptr {{(nest|swiftself)}} %5322, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5325 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5319, i32 0, i32 1 -// CHECK-NEXT: %5326 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5327 = extractvalue { ptr, ptr } %5326, 1 -// CHECK-NEXT: %5328 = extractvalue { ptr, ptr } %5326, 0 -// CHECK-NEXT: %__llgo_funcval_code711 = call ptr asm "", "=r,0"(ptr %5328) -// CHECK-NEXT: %5329 = call %reflect.Value %__llgo_funcval_code711(ptr {{(nest|swiftself)}} %5327, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5324, ptr %5320, align 8 -// CHECK-NEXT: store %reflect.Value %5329, ptr %5325, align 8 -// CHECK-NEXT: %5330 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 356 -// CHECK-NEXT: %5331 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5330, i32 0, i32 0 -// CHECK-NEXT: %5332 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5333 = extractvalue { ptr, ptr } %5332, 1 -// CHECK-NEXT: %5334 = extractvalue { ptr, ptr } %5332, 0 -// CHECK-NEXT: %__llgo_funcval_code712 = call ptr asm "", "=r,0"(ptr %5334) -// CHECK-NEXT: %5335 = call %reflect.Value %__llgo_funcval_code712(ptr {{(nest|swiftself)}} %5333, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: %5336 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5330, i32 0, i32 1 -// CHECK-NEXT: %5337 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5338 = extractvalue { ptr, ptr } %5337, 1 -// CHECK-NEXT: %5339 = extractvalue { ptr, ptr } %5337, 0 -// CHECK-NEXT: %__llgo_funcval_code713 = call ptr asm "", "=r,0"(ptr %5339) -// CHECK-NEXT: %5340 = call %reflect.Value %__llgo_funcval_code713(ptr {{(nest|swiftself)}} %5338, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5335, ptr %5331, align 8 -// CHECK-NEXT: store %reflect.Value %5340, ptr %5336, align 8 -// CHECK-NEXT: %5341 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 357 -// CHECK-NEXT: %5342 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5341, i32 0, i32 0 -// CHECK-NEXT: %5343 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5344 = extractvalue { ptr, ptr } %5343, 1 -// CHECK-NEXT: %5345 = extractvalue { ptr, ptr } %5343, 0 -// CHECK-NEXT: %__llgo_funcval_code714 = call ptr asm "", "=r,0"(ptr %5345) -// CHECK-NEXT: %5346 = call %reflect.Value %__llgo_funcval_code714(ptr {{(nest|swiftself)}} %5344, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5347 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5341, i32 0, i32 1 -// CHECK-NEXT: %5348 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5349 = extractvalue { ptr, ptr } %5348, 1 -// CHECK-NEXT: %5350 = extractvalue { ptr, ptr } %5348, 0 -// CHECK-NEXT: %__llgo_funcval_code715 = call ptr asm "", "=r,0"(ptr %5350) -// CHECK-NEXT: %5351 = call %reflect.Value %__llgo_funcval_code715(ptr {{(nest|swiftself)}} %5349, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: store %reflect.Value %5346, ptr %5342, align 8 -// CHECK-NEXT: store %reflect.Value %5351, ptr %5347, align 8 -// CHECK-NEXT: %5352 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 358 -// CHECK-NEXT: %5353 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5352, i32 0, i32 0 -// CHECK-NEXT: %5354 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5355 = extractvalue { ptr, ptr } %5354, 1 -// CHECK-NEXT: %5356 = extractvalue { ptr, ptr } %5354, 0 -// CHECK-NEXT: %__llgo_funcval_code716 = call ptr asm "", "=r,0"(ptr %5356) -// CHECK-NEXT: %5357 = call %reflect.Value %__llgo_funcval_code716(ptr {{(nest|swiftself)}} %5355, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5358 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5352, i32 0, i32 1 -// CHECK-NEXT: %5359 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5360 = extractvalue { ptr, ptr } %5359, 1 -// CHECK-NEXT: %5361 = extractvalue { ptr, ptr } %5359, 0 -// CHECK-NEXT: %__llgo_funcval_code717 = call ptr asm "", "=r,0"(ptr %5361) -// CHECK-NEXT: %5362 = call %reflect.Value %__llgo_funcval_code717(ptr {{(nest|swiftself)}} %5360, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"<-chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5357, ptr %5353, align 8 -// CHECK-NEXT: store %reflect.Value %5362, ptr %5358, align 8 -// CHECK-NEXT: %5363 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 359 -// CHECK-NEXT: %5364 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5363, i32 0, i32 0 -// CHECK-NEXT: %5365 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5366 = extractvalue { ptr, ptr } %5365, 1 -// CHECK-NEXT: %5367 = extractvalue { ptr, ptr } %5365, 0 -// CHECK-NEXT: %__llgo_funcval_code718 = call ptr asm "", "=r,0"(ptr %5367) -// CHECK-NEXT: %5368 = call %reflect.Value %__llgo_funcval_code718(ptr {{(nest|swiftself)}} %5366, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan []_llgo_uint8", ptr null }) -// CHECK-NEXT: %5369 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5363, i32 0, i32 1 -// CHECK-NEXT: %5370 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5371 = extractvalue { ptr, ptr } %5370, 1 -// CHECK-NEXT: %5372 = extractvalue { ptr, ptr } %5370, 0 -// CHECK-NEXT: %__llgo_funcval_code719 = call ptr asm "", "=r,0"(ptr %5372) -// CHECK-NEXT: %5373 = call %reflect.Value %__llgo_funcval_code719(ptr {{(nest|swiftself)}} %5371, %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan<- []_llgo_uint8", ptr null }) -// CHECK-NEXT: store %reflect.Value %5368, ptr %5364, align 8 -// CHECK-NEXT: store %reflect.Value %5373, ptr %5369, align 8 -// CHECK-NEXT: %5374 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 360 -// CHECK-NEXT: %5375 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5374, i32 0, i32 0 -// CHECK-NEXT: %5376 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5377 = extractvalue { ptr, ptr } %5376, 1 -// CHECK-NEXT: %5378 = extractvalue { ptr, ptr } %5376, 0 -// CHECK-NEXT: %__llgo_funcval_code720 = call ptr asm "", "=r,0"(ptr %5378) -// CHECK-NEXT: %5379 = call %reflect.Value %__llgo_funcval_code720(ptr {{(nest|swiftself)}} %5377, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: %5380 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5374, i32 0, i32 1 -// CHECK-NEXT: %5381 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5382 = extractvalue { ptr, ptr } %5381, 1 -// CHECK-NEXT: %5383 = extractvalue { ptr, ptr } %5381, 0 -// CHECK-NEXT: %__llgo_funcval_code721 = call ptr asm "", "=r,0"(ptr %5383) -// CHECK-NEXT: %5384 = call %reflect.Value %__llgo_funcval_code721(ptr {{(nest|swiftself)}} %5382, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChan, ptr null }) -// CHECK-NEXT: store %reflect.Value %5379, ptr %5375, align 8 -// CHECK-NEXT: store %reflect.Value %5384, ptr %5380, align 8 -// CHECK-NEXT: %5385 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 361 -// CHECK-NEXT: %5386 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5385, i32 0, i32 0 -// CHECK-NEXT: %5387 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5388 = extractvalue { ptr, ptr } %5387, 1 -// CHECK-NEXT: %5389 = extractvalue { ptr, ptr } %5387, 0 -// CHECK-NEXT: %__llgo_funcval_code722 = call ptr asm "", "=r,0"(ptr %5389) -// CHECK-NEXT: %5390 = call %reflect.Value %__llgo_funcval_code722(ptr {{(nest|swiftself)}} %5388, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanRecv, ptr null }) -// CHECK-NEXT: %5391 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5385, i32 0, i32 1 -// CHECK-NEXT: %5392 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5393 = extractvalue { ptr, ptr } %5392, 1 -// CHECK-NEXT: %5394 = extractvalue { ptr, ptr } %5392, 0 -// CHECK-NEXT: %__llgo_funcval_code723 = call ptr asm "", "=r,0"(ptr %5394) -// CHECK-NEXT: %5395 = call %reflect.Value %__llgo_funcval_code723(ptr {{(nest|swiftself)}} %5393, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5390, ptr %5386, align 8 -// CHECK-NEXT: store %reflect.Value %5395, ptr %5391, align 8 -// CHECK-NEXT: %5396 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 362 -// CHECK-NEXT: %5397 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5396, i32 0, i32 0 -// CHECK-NEXT: %5398 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5399 = extractvalue { ptr, ptr } %5398, 1 -// CHECK-NEXT: %5400 = extractvalue { ptr, ptr } %5398, 0 -// CHECK-NEXT: %__llgo_funcval_code724 = call ptr asm "", "=r,0"(ptr %5400) -// CHECK-NEXT: %5401 = call %reflect.Value %__llgo_funcval_code724(ptr {{(nest|swiftself)}} %5399, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanSend, ptr null }) -// CHECK-NEXT: %5402 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5396, i32 0, i32 1 -// CHECK-NEXT: %5403 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5404 = extractvalue { ptr, ptr } %5403, 1 -// CHECK-NEXT: %5405 = extractvalue { ptr, ptr } %5403, 0 -// CHECK-NEXT: %__llgo_funcval_code725 = call ptr asm "", "=r,0"(ptr %5405) -// CHECK-NEXT: %5406 = call %reflect.Value %__llgo_funcval_code725(ptr {{(nest|swiftself)}} %5404, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.IntChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5401, ptr %5397, align 8 -// CHECK-NEXT: store %reflect.Value %5406, ptr %5402, align 8 -// CHECK-NEXT: %5407 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 363 -// CHECK-NEXT: %5408 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5407, i32 0, i32 0 -// CHECK-NEXT: %5409 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5410 = extractvalue { ptr, ptr } %5409, 1 -// CHECK-NEXT: %5411 = extractvalue { ptr, ptr } %5409, 0 -// CHECK-NEXT: %__llgo_funcval_code726 = call ptr asm "", "=r,0"(ptr %5411) -// CHECK-NEXT: %5412 = call %reflect.Value %__llgo_funcval_code726(ptr {{(nest|swiftself)}} %5410, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: %5413 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5407, i32 0, i32 1 -// CHECK-NEXT: %5414 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5415 = extractvalue { ptr, ptr } %5414, 1 -// CHECK-NEXT: %5416 = extractvalue { ptr, ptr } %5414, 0 -// CHECK-NEXT: %__llgo_funcval_code727 = call ptr asm "", "=r,0"(ptr %5416) -// CHECK-NEXT: %5417 = call %reflect.Value %__llgo_funcval_code727(ptr {{(nest|swiftself)}} %5415, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChan, ptr null }) -// CHECK-NEXT: store %reflect.Value %5412, ptr %5408, align 8 -// CHECK-NEXT: store %reflect.Value %5417, ptr %5413, align 8 -// CHECK-NEXT: %5418 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 364 -// CHECK-NEXT: %5419 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5418, i32 0, i32 0 -// CHECK-NEXT: %5420 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5421 = extractvalue { ptr, ptr } %5420, 1 -// CHECK-NEXT: %5422 = extractvalue { ptr, ptr } %5420, 0 -// CHECK-NEXT: %__llgo_funcval_code728 = call ptr asm "", "=r,0"(ptr %5422) -// CHECK-NEXT: %5423 = call %reflect.Value %__llgo_funcval_code728(ptr {{(nest|swiftself)}} %5421, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanRecv, ptr null }) -// CHECK-NEXT: %5424 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5418, i32 0, i32 1 -// CHECK-NEXT: %5425 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5426 = extractvalue { ptr, ptr } %5425, 1 -// CHECK-NEXT: %5427 = extractvalue { ptr, ptr } %5425, 0 -// CHECK-NEXT: %__llgo_funcval_code729 = call ptr asm "", "=r,0"(ptr %5427) -// CHECK-NEXT: %5428 = call %reflect.Value %__llgo_funcval_code729(ptr {{(nest|swiftself)}} %5426, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanRecv, ptr null }) -// CHECK-NEXT: store %reflect.Value %5423, ptr %5419, align 8 -// CHECK-NEXT: store %reflect.Value %5428, ptr %5424, align 8 -// CHECK-NEXT: %5429 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 365 -// CHECK-NEXT: %5430 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5429, i32 0, i32 0 -// CHECK-NEXT: %5431 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5432 = extractvalue { ptr, ptr } %5431, 1 -// CHECK-NEXT: %5433 = extractvalue { ptr, ptr } %5431, 0 -// CHECK-NEXT: %__llgo_funcval_code730 = call ptr asm "", "=r,0"(ptr %5433) -// CHECK-NEXT: %5434 = call %reflect.Value %__llgo_funcval_code730(ptr {{(nest|swiftself)}} %5432, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanSend, ptr null }) -// CHECK-NEXT: %5435 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5429, i32 0, i32 1 -// CHECK-NEXT: %5436 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5437 = extractvalue { ptr, ptr } %5436, 1 -// CHECK-NEXT: %5438 = extractvalue { ptr, ptr } %5436, 0 -// CHECK-NEXT: %__llgo_funcval_code731 = call ptr asm "", "=r,0"(ptr %5438) -// CHECK-NEXT: %5439 = call %reflect.Value %__llgo_funcval_code731(ptr {{(nest|swiftself)}} %5437, %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.BytesChanSend, ptr null }) -// CHECK-NEXT: store %reflect.Value %5434, ptr %5430, align 8 -// CHECK-NEXT: store %reflect.Value %5439, ptr %5435, align 8 -// CHECK-NEXT: %5440 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 366 -// CHECK-NEXT: %5441 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5440, i32 0, i32 0 -// CHECK-NEXT: %5442 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5443 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %5443, align 8 -// CHECK-NEXT: %5444 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %5443, 1 -// CHECK-NEXT: %5445 = extractvalue { ptr, ptr } %5442, 1 -// CHECK-NEXT: %5446 = extractvalue { ptr, ptr } %5442, 0 -// CHECK-NEXT: %__llgo_funcval_code732 = call ptr asm "", "=r,0"(ptr %5446) -// CHECK-NEXT: %5447 = call %reflect.Value %__llgo_funcval_code732(ptr {{(nest|swiftself)}} %5445, %"{{.*}}/runtime/internal/runtime.eface" %5444) -// CHECK-NEXT: %5448 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5440, i32 0, i32 1 -// CHECK-NEXT: %5449 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %5449, align 8 -// CHECK-NEXT: %5450 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %5449, 1 -// CHECK-NEXT: %5451 = call %reflect.Value @main.EmptyInterfaceV(%"{{.*}}/runtime/internal/runtime.eface" %5450) -// CHECK-NEXT: store %reflect.Value %5447, ptr %5441, align 8 -// CHECK-NEXT: store %reflect.Value %5451, ptr %5448, align 8 -// CHECK-NEXT: %5452 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 367 -// CHECK-NEXT: %5453 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5452, i32 0, i32 0 -// CHECK-NEXT: %5454 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5455 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %5455, align 8 -// CHECK-NEXT: %5456 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %5455, 1 -// CHECK-NEXT: %5457 = extractvalue { ptr, ptr } %5454, 1 -// CHECK-NEXT: %5458 = extractvalue { ptr, ptr } %5454, 0 -// CHECK-NEXT: %__llgo_funcval_code733 = call ptr asm "", "=r,0"(ptr %5458) -// CHECK-NEXT: %5459 = call %reflect.Value %__llgo_funcval_code733(ptr {{(nest|swiftself)}} %5457, %"{{.*}}/runtime/internal/runtime.eface" %5456) -// CHECK-NEXT: %5460 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5452, i32 0, i32 1 -// CHECK-NEXT: %5461 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @420, i64 5 }, ptr %5461, align 8 -// CHECK-NEXT: %5462 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %5461, 1 -// CHECK-NEXT: %5463 = call %reflect.Value @main.EmptyInterfaceV(%"{{.*}}/runtime/internal/runtime.eface" %5462) -// CHECK-NEXT: store %reflect.Value %5459, ptr %5453, align 8 -// CHECK-NEXT: store %reflect.Value %5463, ptr %5460, align 8 -// CHECK-NEXT: %5464 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 368 -// CHECK-NEXT: %5465 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5464, i32 0, i32 0 -// CHECK-NEXT: %5466 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5467 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5468 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_bytes.Buffer", ptr undef }, ptr %5467, 1 -// CHECK-NEXT: %5469 = extractvalue { ptr, ptr } %5466, 1 -// CHECK-NEXT: %5470 = extractvalue { ptr, ptr } %5466, 0 -// CHECK-NEXT: %__llgo_funcval_code734 = call ptr asm "", "=r,0"(ptr %5470) -// CHECK-NEXT: %5471 = call %reflect.Value %__llgo_funcval_code734(ptr {{(nest|swiftself)}} %5469, %"{{.*}}/runtime/internal/runtime.eface" %5468) -// CHECK-NEXT: %5472 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5464, i32 0, i32 1 -// CHECK-NEXT: %5473 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5474 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_bytes.Buffer") -// CHECK-NEXT: %5475 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5474, 0 -// CHECK-NEXT: %5476 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5475, ptr %5473, 1 -// CHECK-NEXT: %5477 = call %reflect.Value @main.ReaderV(%"{{.*}}/runtime/internal/runtime.iface" %5476) -// CHECK-NEXT: store %reflect.Value %5471, ptr %5465, align 8 -// CHECK-NEXT: store %reflect.Value %5477, ptr %5472, align 8 -// CHECK-NEXT: %5478 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 369 -// CHECK-NEXT: %5479 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5478, i32 0, i32 0 -// CHECK-NEXT: %5480 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5481 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_bytes.Buffer") -// CHECK-NEXT: %5482 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5481, 0 -// CHECK-NEXT: %5483 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5482, ptr %5480, 1 -// CHECK-NEXT: %5484 = call %reflect.Value @main.ReadWriterV(%"{{.*}}/runtime/internal/runtime.iface" %5483) -// CHECK-NEXT: %5485 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5478, i32 0, i32 1 -// CHECK-NEXT: %5486 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5487 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_bytes.Buffer") -// CHECK-NEXT: %5488 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5487, 0 -// CHECK-NEXT: %5489 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5488, ptr %5486, 1 -// CHECK-NEXT: %5490 = call %reflect.Value @main.ReaderV(%"{{.*}}/runtime/internal/runtime.iface" %5489) -// CHECK-NEXT: store %reflect.Value %5484, ptr %5479, align 8 -// CHECK-NEXT: store %reflect.Value %5490, ptr %5485, align 8 -// CHECK-NEXT: %5491 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %1, i64 370 -// CHECK-NEXT: %5492 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5491, i32 0, i32 0 -// CHECK-NEXT: %5493 = load { ptr, ptr }, ptr @main.V, align 8 -// CHECK-NEXT: %5494 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5495 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_bytes.Buffer", ptr undef }, ptr %5494, 1 -// CHECK-NEXT: %5496 = extractvalue { ptr, ptr } %5493, 1 -// CHECK-NEXT: %5497 = extractvalue { ptr, ptr } %5493, 0 -// CHECK-NEXT: %__llgo_funcval_code735 = call ptr asm "", "=r,0"(ptr %5497) -// CHECK-NEXT: %5498 = call %reflect.Value %__llgo_funcval_code735(ptr {{(nest|swiftself)}} %5496, %"{{.*}}/runtime/internal/runtime.eface" %5495) -// CHECK-NEXT: %5499 = getelementptr inbounds { %reflect.Value, %reflect.Value }, ptr %5491, i32 0, i32 1 -// CHECK-NEXT: %5500 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %5501 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_bytes.Buffer") -// CHECK-NEXT: %5502 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %5501, 0 -// CHECK-NEXT: %5503 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %5502, ptr %5500, 1 -// CHECK-NEXT: %5504 = call %reflect.Value @main.ReadWriterV(%"{{.*}}/runtime/internal/runtime.iface" %5503) -// CHECK-NEXT: store %reflect.Value %5498, ptr %5492, align 8 -// CHECK-NEXT: store %reflect.Value %5504, ptr %5499, align 8 -// CHECK-NEXT: %5505 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %1, 0 -// CHECK-NEXT: %5506 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5505, i64 371, 1 -// CHECK-NEXT: %5507 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5506, i64 371, 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %5507, ptr @main.convertTests, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.TestConvert(ptr @"__llgo.moduleZeroSizedAlloc$") -// CHECK-NEXT: call void @main.TestConvertPanic(ptr @"__llgo.moduleZeroSizedAlloc$") -// CHECK-NEXT: call void @main.TestConvertSlice2Array(ptr @"__llgo.moduleZeroSizedAlloc$") -// CHECK-NEXT: call void @main.TestConvertNaNs(ptr @"__llgo.moduleZeroSizedAlloc$") -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.shouldPanic(%"{{.*}}/runtime/internal/runtime.String" %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } { ptr @"main.shouldPanic$1", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %7 = alloca i8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store ptr %7, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %10, align 8 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 2 -// CHECK-NEXT: store ptr %6, ptr %11, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.shouldPanic, %_llgo_2), ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %8) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 1 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 3 -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 4 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %16, align 8 -// CHECK-NEXT: %17 = call i32 @{{(__)?sigsetjmp}}(ptr %7, i32 0) -// CHECK-NEXT: %18 = icmp eq i32 %17, 0 -// CHECK-NEXT: br i1 %18, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@main.shouldPanic, %_llgo_3), ptr %14, align 8 -// CHECK-NEXT: %19 = load i64, ptr %13, align 8 -// CHECK-NEXT: %20 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %21 = icmp ne ptr %20, null -// CHECK-NEXT: br i1 %21, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %6) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 0 -// CHECK-NEXT: store ptr %22, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %25, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds { ptr, i64, { ptr, ptr } }, ptr %23, i32 0, i32 2 -// CHECK-NEXT: store { ptr, ptr } %5, ptr %26, align 8 -// CHECK-NEXT: store ptr %23, ptr %16, align 8 -// CHECK-NEXT: %27 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %28) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %27) -// CHECK-NEXT: store ptr blockaddress(@main.shouldPanic, %_llgo_6), ptr %15, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.shouldPanic, %_llgo_3), ptr %15, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %14, align 8 -// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %30 = load ptr, ptr %16, align 8 -// CHECK-NEXT: %31 = load { ptr, i64, { ptr, ptr } }, ptr %30, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i64, { ptr, ptr } } %31, 0 -// CHECK-NEXT: store ptr %32, ptr %16, align 8 -// CHECK-NEXT: %33 = extractvalue { ptr, i64, { ptr, ptr } } %31, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %30) -// CHECK-NEXT: %34 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %35 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr %34) -// CHECK-NEXT: %36 = extractvalue { ptr, ptr } %33, 1 -// CHECK-NEXT: %37 = extractvalue { ptr, ptr } %33, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %37) -// CHECK-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %35) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %38 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %8, align 8 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %38, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %39) -// CHECK-NEXT: %40 = load ptr, ptr %15, align 8 -// CHECK-NEXT: indirectbr ptr %40, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.shouldPanic$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = alloca i8, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.shouldPanic$1", ptr %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr %2) -// CHECK-NEXT: %4 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %3, %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) -// CHECK-NEXT: br i1 %4, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @535, i64 13 }, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %5, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %6) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %8 = load %"{{.*}}/runtime/internal/runtime.String", ptr %7, align 8 -// CHECK-NEXT: %9 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %8, %"{{.*}}/runtime/internal/runtime.String" zeroinitializer) -// CHECK-NEXT: %10 = xor i1 %9, true -// CHECK-NEXT: br i1 %10, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 0 -// CHECK-NEXT: %12 = icmp eq ptr %11, @_llgo_string -// CHECK-NEXT: br i1 %12, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_11, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_8, %_llgo_6 -// CHECK-NEXT: %13 = phi %"{{.*}}/runtime/internal/runtime.String" [ %44, %_llgo_6 ], [ %17, %_llgo_8 ] -// CHECK-NEXT: %14 = call i1 @strings.HasPrefix(%"{{.*}}/runtime/internal/runtime.String" %13, %"{{.*}}/runtime/internal/runtime.String" { ptr @30, i64 7 }) -// CHECK-NEXT: br i1 %14, label %_llgo_11, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_15 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_15 -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 0 -// CHECK-NEXT: %16 = icmp eq ptr %15, @"*_llgo_reflect.ValueError" -// CHECK-NEXT: br i1 %16, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_18 -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.String" @"reflect.(*ValueError).Error"(ptr %50) -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_18 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %19 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %18, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %3, ptr %19, align 8 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %18, 0 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %20, i64 1, 1 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %21, i64 1, 2 -// CHECK-NEXT: %23 = call %"{{.*}}/runtime/internal/runtime.String" @fmt.Sprintf(%"{{.*}}/runtime/internal/runtime.String" { ptr @537, i64 32 }, %"{{.*}}/runtime/internal/runtime.Slice" %22) -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %23, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %24, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %25) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_5 -// CHECK-NEXT: %26 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" { ptr @538, i64 44 }, %"{{.*}}/runtime/internal/runtime.String" %13) -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %26, ptr %27, align 8 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %27, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %28) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_5 -// CHECK-NEXT: %29 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %30 = load %"{{.*}}/runtime/internal/runtime.String", ptr %29, align 8 -// CHECK-NEXT: %31 = call i1 @strings.Contains(%"{{.*}}/runtime/internal/runtime.String" %13, %"{{.*}}/runtime/internal/runtime.String" %30) -// CHECK-NEXT: br i1 %31, label %_llgo_4, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_11 -// CHECK-NEXT: %32 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %33 = load %"{{.*}}/runtime/internal/runtime.String", ptr %32, align 8 -// CHECK-NEXT: %34 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" { ptr @539, i64 31 }, %"{{.*}}/runtime/internal/runtime.String" %33) -// CHECK-NEXT: %35 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %34, %"{{.*}}/runtime/internal/runtime.String" { ptr @540, i64 3 }) -// CHECK-NEXT: %36 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %35, %"{{.*}}/runtime/internal/runtime.String" %13) -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %36, ptr %37, align 8 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %37, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %38) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_3 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 1 -// CHECK-NEXT: %40 = load %"{{.*}}/runtime/internal/runtime.String", ptr %39, align 8 -// CHECK-NEXT: %41 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %40, 0 -// CHECK-NEXT: %42 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %41, i1 true, 1 -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_3 -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14, %_llgo_13 -// CHECK-NEXT: %43 = phi { %"{{.*}}/runtime/internal/runtime.String", i1 } [ %42, %_llgo_13 ], [ zeroinitializer, %_llgo_14 ] -// CHECK-NEXT: %44 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %43, 0 -// CHECK-NEXT: %45 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %43, 1 -// CHECK-NEXT: br i1 %45, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_7 -// CHECK-NEXT: %46 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 1 -// CHECK-NEXT: %47 = insertvalue { ptr, i1 } undef, ptr %46, 0 -// CHECK-NEXT: %48 = insertvalue { ptr, i1 } %47, i1 true, 1 -// CHECK-NEXT: br label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_7 -// CHECK-NEXT: br label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_17, %_llgo_16 -// CHECK-NEXT: %49 = phi { ptr, i1 } [ %48, %_llgo_16 ], [ zeroinitializer, %_llgo_17 ] -// CHECK-NEXT: %50 = extractvalue { ptr, i1 } %49, 0 -// CHECK-NEXT: %51 = extractvalue { ptr, i1 } %49, 1 -// CHECK-NEXT: br i1 %51, label %_llgo_8, label %_llgo_9 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.(*testingT).Errorf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.Slice" %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @fmt.Sprintf(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.Slice" %2) -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.(*testingT).Fatalf"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.Slice" %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @fmt.Sprintf(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.Slice" %2) -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } diff --git a/cl/_testgo/reflectfn/in.go b/cl/_testgo/reflectfn/in.go index e535767eea..d14b59ae5d 100644 --- a/cl/_testgo/reflectfn/in.go +++ b/cl/_testgo/reflectfn/in.go @@ -6,95 +6,43 @@ import ( "reflect" ) +// Capturing and declared functions both enter reflect as closure pairs, but a +// declared function has a nil environment. // CHECK-LABEL: define void @main.demo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}runtime.String" { ptr @{{[0-9]+}}, i64 4 }) +// CHECK: ret void +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: %[[CAPTURED_VALUE:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: store i64 100, ptr %[[CAPTURED_VALUE]] +// CHECK: %[[ENV:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: %[[ENV_SLOT:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[ENV]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[CAPTURED_VALUE]], ptr %[[ENV_SLOT]] +// CHECK-NEXT: %[[CAPTURED_FN:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[ENV]], 1 +// CHECK: store { ptr, ptr } %[[CAPTURED_FN]], ptr %{{[0-9]+}} +// CHECK: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %{{[0-9]+}} +// CHECK: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %{{[0-9]+}} +// CHECK: store { ptr, ptr } %[[CAPTURED_FN]], ptr %{{[0-9]+}} +// CHECK: %[[CAPTURED_EFACE:[0-9]+]] = insertvalue %"{{.*}}runtime.eface" { ptr @{{.*}}, ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: %[[CAPTURED_REFLECT:[0-9]+]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}runtime.eface" %[[CAPTURED_EFACE]]) +// CHECK-NEXT: %[[CAPTURED_PTR:[0-9]+]] = call ptr @reflect.Value.UnsafePointer(%reflect.Value %[[CAPTURED_REFLECT]]) +// CHECK: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %[[DECL_BOX1:[0-9]+]] +// CHECK-NEXT: %[[DECL_EFACE1:[0-9]+]] = insertvalue %"{{.*}}runtime.eface" { ptr @{{.*}}, ptr undef }, ptr %[[DECL_BOX1]], 1 +// CHECK-NEXT: %[[DECL_REFLECT1:[0-9]+]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}runtime.eface" %[[DECL_EFACE1]]) +// CHECK-NEXT: %[[DECL_PTR1:[0-9]+]] = call ptr @reflect.Value.UnsafePointer(%reflect.Value %[[DECL_REFLECT1]]) +// CHECK: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %[[DECL_BOX2:[0-9]+]] +// CHECK-NEXT: %[[DECL_EFACE2:[0-9]+]] = insertvalue %"{{.*}}runtime.eface" { ptr @{{.*}}, ptr undef }, ptr %[[DECL_BOX2]], 1 +// CHECK-NEXT: %[[DECL_REFLECT2:[0-9]+]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}runtime.eface" %[[DECL_EFACE2]]) +// CHECK-NEXT: %[[DECL_PTR2:[0-9]+]] = call ptr @reflect.Value.UnsafePointer(%reflect.Value %[[DECL_REFLECT2]]) +// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: %[[ENV_VALUE:[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: %[[VALUE_PTR:[0-9]+]] = extractvalue { ptr } %[[ENV_VALUE]], 0 +// CHECK-NEXT: %[[VALUE:[0-9]+]] = load i64, ptr %[[VALUE_PTR]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[VALUE]]) + func demo() { println("demo") } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 100, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %4, i64 0 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } %3, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %6, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %7, ptr %5, align 8 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %4, 0 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %8, i64 1, 1 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, i64 1, 2 -// CHECK-NEXT: %11 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %10) -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %12, i64 0 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %14, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %15, ptr %13, align 8 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %12, 0 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %16, i64 1, 1 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, i64 1, 2 -// CHECK-NEXT: %19 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %18) -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %21 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %20, i64 0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %22, align 8 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %22, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %23, ptr %21, align 8 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %20, 0 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, i64 1, 1 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %25, i64 1, 2 -// CHECK-NEXT: %27 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %26) -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } %3, ptr %28, align 8 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %28, 1 -// CHECK-NEXT: %30 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %29) -// CHECK-NEXT: %31 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %30) -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %33 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %32, i64 0 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %31, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %34, ptr %33, align 8 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %32, 0 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, i64 1, 1 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %36, i64 1, 2 -// CHECK-NEXT: %38 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %37) -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %39, align 8 -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %39, 1 -// CHECK-NEXT: %41 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %40) -// CHECK-NEXT: %42 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %41) -// CHECK-NEXT: %43 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %44 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %43, i64 0 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %42, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %45, ptr %44, align 8 -// CHECK-NEXT: %46 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %43, 0 -// CHECK-NEXT: %47 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %46, i64 1, 1 -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %47, i64 1, 2 -// CHECK-NEXT: %49 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %48) -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %50, align 8 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %50, 1 -// CHECK-NEXT: %52 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %51) -// CHECK-NEXT: %53 = call ptr @reflect.Value.UnsafePointer(%reflect.Value %52) -// CHECK-NEXT: %54 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %55 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %54, i64 0 -// CHECK-NEXT: %56 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_Pointer, ptr undef }, ptr %53, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %56, ptr %55, align 8 -// CHECK-NEXT: %57 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %54, 0 -// CHECK-NEXT: %58 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, i64 1, 1 -// CHECK-NEXT: %59 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %58, i64 1, 2 -// CHECK-NEXT: %60 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %59) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { v := 100 fn := func() { diff --git a/cl/_testgo/reflectmk/in.go b/cl/_testgo/reflectmk/in.go index 46d854fbe2..891746c17b 100644 --- a/cl/_testgo/reflectmk/in.go +++ b/cl/_testgo/reflectmk/in.go @@ -6,23 +6,6 @@ import ( "reflect" ) -// CHECK: {{^}}@1 = private unnamed_addr constant [7 x i8] c"(%v,%v)", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [49 x i8] c"{{.*}}/cl/_testgo/reflectmk.Point", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [6 x i8] c"String", align 1{{$}} -// CHECK: {{^}}@12 = private unnamed_addr constant [13 x i8] c"arrayOf error", align 1{{$}} -// CHECK: {{^}}@13 = private unnamed_addr constant [12 x i8] c"chanOf error", align 1{{$}} -// CHECK: {{^}}@14 = private unnamed_addr constant [12 x i8] c"funcOf error", align 1{{$}} -// CHECK: {{^}}@15 = private unnamed_addr constant [11 x i8] c"mapOf error", align 1{{$}} -// CHECK: {{^}}@16 = private unnamed_addr constant [15 x i8] c"pointerTo error", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [13 x i8] c"sliceOf error", align 1{{$}} -// CHECK: {{^}}@18 = private unnamed_addr constant [1 x i8] c"T", align 1{{$}} -// CHECK: {{^}}@19 = private unnamed_addr constant [14 x i8] c"structOf error", align 1{{$}} -// CHECK: {{^}}@20 = private unnamed_addr constant [12 x i8] c"method error", align 1{{$}} -// CHECK: {{^}}@21 = private unnamed_addr constant [18 x i8] c"methodByName error", align 1{{$}} -// CHECK: {{^}}@22 = private unnamed_addr constant [5 x i8] c"(1,2)", align 1{{$}} -// CHECK: {{^}}@23 = private unnamed_addr constant [18 x i8] c"value.Method error", align 1{{$}} -// CHECK: {{^}}@24 = private unnamed_addr constant [24 x i8] c"value.MethodByName error", align 1{{$}} - type Point struct { x int y int @@ -33,42 +16,6 @@ func (p *Point) Set(x int, y int) { p.y = y } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.Point.String(%main.Point %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.Point, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %main.Point %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load i64, ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %6, i64 0 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %3, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %8, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %9, ptr %7, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %6, i64 1 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 %5, ptr %11, align 8 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %11, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %12, ptr %10, align 8 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %6, 0 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %13, i64 2, 1 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %14, i64 2, 2 -// CHECK-NEXT: %16 = call %"{{.*}}/runtime/internal/runtime.String" @fmt.Sprintf(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 7 }, %"{{.*}}/runtime/internal/runtime.Slice" %15) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %16 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.(*Point).Set"(ptr %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %main.Point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i64 %2, ptr %4, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - func (p Point) String() string { return fmt.Sprintf("(%v,%v)", p.x, p.y) } @@ -129,495 +76,75 @@ func methodByName(name string) { } } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*Point).String"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 49 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: %2 = load %main.Point, ptr %0, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @main.Point.String(%main.Point %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %3 -// CHECK-NEXT: } +// CHECK-LABEL: define void @main.main(){{.*}} { +// Recover the element Type from *Point and reuse that exact interface for all +// constructor inputs. +// CHECK: %[[PTR_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Point", ptr null }) +// CHECK: %[[PTR_DATA:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[PTR_TYPE]]) +// CHECK: %[[RT:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" %{{[0-9]+}}(ptr %{{[0-9]+}}) -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @reflect.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Each constructed type must be queried and compared back to RT. This proves +// more than the presence of seven reflect helper calls. +// CHECK: %[[ARRAY_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.ArrayOf(i64 1, %"{{.*}}/runtime/internal/runtime.iface" %[[RT]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[ARRAY_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[CHAN_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.ChanOf(i64 2, %"{{.*}}/runtime/internal/runtime.iface" %[[RT]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[CHAN_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %[[RT]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %[[RT]], ptr %{{[0-9]+}} +// CHECK: %[[FUNC_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.FuncOf(%"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}, i1 false) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[FUNC_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[MAP_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.MapOf(%"{{.*}}/runtime/internal/runtime.iface" %[[RT]], %"{{.*}}/runtime/internal/runtime.iface" %[[RT]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[MAP_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[PTR_TO_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.PointerTo(%"{{.*}}/runtime/internal/runtime.iface" %[[RT]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[PTR_TO_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[SLICE_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.SliceOf(%"{{.*}}/runtime/internal/runtime.iface" %[[RT]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[SLICE_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: store %"{{.*}}/runtime/internal/runtime.iface" %[[RT]], ptr %{{[0-9]+}} +// CHECK: %[[STRUCT_TYPE:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.StructOf(%"{{.*}}/runtime/internal/runtime.Slice" %{{[0-9]+}}) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[STRUCT_TYPE]]) +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.TypeOf(%"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Point", ptr null }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 11 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %6, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %6, 0 -// CHECK-NEXT: %9 = call %"{{.*}}/runtime/internal/runtime.iface" %8(ptr %7) -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.ArrayOf(i64 1, %"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %10) -// CHECK-NEXT: %12 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %10, 0 -// CHECK-NEXT: %13 = getelementptr ptr, ptr %12, i64 11 -// CHECK-NEXT: %14 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %15 = insertvalue { ptr, ptr } undef, ptr %14, 0 -// CHECK-NEXT: %16 = insertvalue { ptr, ptr } %15, ptr %11, 1 -// CHECK-NEXT: %17 = extractvalue { ptr, ptr } %16, 1 -// CHECK-NEXT: %18 = extractvalue { ptr, ptr } %16, 0 -// CHECK-NEXT: %19 = call %"{{.*}}/runtime/internal/runtime.iface" %18(ptr %17) -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %19) -// CHECK-NEXT: %21 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %19, 1 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %20, 0 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %22, ptr %21, 1 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %24, 0 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %26, ptr %25, 1 -// CHECK-NEXT: %28 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %23, %"{{.*}}/runtime/internal/runtime.eface" %27) -// CHECK-NEXT: %29 = xor i1 %28, true -// CHECK-NEXT: br i1 %29, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @12, i64 13 }, ptr %30, align 8 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %30, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %31) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %32 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.ChanOf(i64 2, %"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %32) -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %32, 0 -// CHECK-NEXT: %35 = getelementptr ptr, ptr %34, i64 11 -// CHECK-NEXT: %36 = load ptr, ptr %35, align 8 -// CHECK-NEXT: %37 = insertvalue { ptr, ptr } undef, ptr %36, 0 -// CHECK-NEXT: %38 = insertvalue { ptr, ptr } %37, ptr %33, 1 -// CHECK-NEXT: %39 = extractvalue { ptr, ptr } %38, 1 -// CHECK-NEXT: %40 = extractvalue { ptr, ptr } %38, 0 -// CHECK-NEXT: %41 = call %"{{.*}}/runtime/internal/runtime.iface" %40(ptr %39) -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %41) -// CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %41, 1 -// CHECK-NEXT: %44 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %42, 0 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %44, ptr %43, 1 -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %47 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %48 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %46, 0 -// CHECK-NEXT: %49 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %48, ptr %47, 1 -// CHECK-NEXT: %50 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %45, %"{{.*}}/runtime/internal/runtime.eface" %49) -// CHECK-NEXT: %51 = xor i1 %50, true -// CHECK-NEXT: br i1 %51, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %52 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @13, i64 12 }, ptr %52, align 8 -// CHECK-NEXT: %53 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %52, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %53) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %54 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %55 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %54, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %9, ptr %55, align 8 -// CHECK-NEXT: %56 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %54, 0 -// CHECK-NEXT: %57 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %56, i64 1, 1 -// CHECK-NEXT: %58 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, i64 1, 2 -// CHECK-NEXT: %59 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %60 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %59, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %9, ptr %60, align 8 -// CHECK-NEXT: %61 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %59, 0 -// CHECK-NEXT: %62 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %61, i64 1, 1 -// CHECK-NEXT: %63 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %62, i64 1, 2 -// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.FuncOf(%"{{.*}}/runtime/internal/runtime.Slice" %58, %"{{.*}}/runtime/internal/runtime.Slice" %63, i1 false) -// CHECK-NEXT: %65 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %64) -// CHECK-NEXT: %66 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %64, 0 -// CHECK-NEXT: %67 = getelementptr ptr, ptr %66, i64 {{(18|19)}} -// CHECK-NEXT: %68 = load ptr, ptr %67, align 8 -// CHECK-NEXT: %69 = insertvalue { ptr, ptr } undef, ptr %68, 0 -// CHECK-NEXT: %70 = insertvalue { ptr, ptr } %69, ptr %65, 1 -// CHECK-NEXT: %71 = extractvalue { ptr, ptr } %70, 1 -// CHECK-NEXT: %72 = extractvalue { ptr, ptr } %70, 0 -// CHECK-NEXT: %73 = call %"{{.*}}/runtime/internal/runtime.iface" %72(ptr %71, i64 0) -// CHECK-NEXT: %74 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %73) -// CHECK-NEXT: %75 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %73, 1 -// CHECK-NEXT: %76 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %74, 0 -// CHECK-NEXT: %77 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %76, ptr %75, 1 -// CHECK-NEXT: %78 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %79 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %80 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %78, 0 -// CHECK-NEXT: %81 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %80, ptr %79, 1 -// CHECK-NEXT: %82 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %77, %"{{.*}}/runtime/internal/runtime.eface" %81) -// CHECK-NEXT: %83 = xor i1 %82, true -// CHECK-NEXT: br i1 %83, label %_llgo_5, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7, %_llgo_4 -// CHECK-NEXT: %84 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @14, i64 12 }, ptr %84, align 8 -// CHECK-NEXT: %85 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %84, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %85) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7 -// CHECK-NEXT: %86 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.MapOf(%"{{.*}}/runtime/internal/runtime.iface" %9, %"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %87 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %86) -// CHECK-NEXT: %88 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %86, 0 -// CHECK-NEXT: %89 = getelementptr ptr, ptr %88, i64 {{(20|22)}} -// CHECK-NEXT: %90 = load ptr, ptr %89, align 8 -// CHECK-NEXT: %91 = insertvalue { ptr, ptr } undef, ptr %90, 0 -// CHECK-NEXT: %92 = insertvalue { ptr, ptr } %91, ptr %87, 1 -// CHECK-NEXT: %93 = extractvalue { ptr, ptr } %92, 1 -// CHECK-NEXT: %94 = extractvalue { ptr, ptr } %92, 0 -// CHECK-NEXT: %95 = call %"{{.*}}/runtime/internal/runtime.iface" %94(ptr %93) -// CHECK-NEXT: %96 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %95) -// CHECK-NEXT: %97 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %95, 1 -// CHECK-NEXT: %98 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %96, 0 -// CHECK-NEXT: %99 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %98, ptr %97, 1 -// CHECK-NEXT: %100 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %101 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %102 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %100, 0 -// CHECK-NEXT: %103 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %102, ptr %101, 1 -// CHECK-NEXT: %104 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %99, %"{{.*}}/runtime/internal/runtime.eface" %103) -// CHECK-NEXT: %105 = xor i1 %104, true -// CHECK-NEXT: br i1 %105, label %_llgo_8, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_4 -// CHECK-NEXT: %106 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %64) -// CHECK-NEXT: %107 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %64, 0 -// CHECK-NEXT: %108 = getelementptr ptr, ptr %107, i64 {{(30|33)}} -// CHECK-NEXT: %109 = load ptr, ptr %108, align 8 -// CHECK-NEXT: %110 = insertvalue { ptr, ptr } undef, ptr %109, 0 -// CHECK-NEXT: %111 = insertvalue { ptr, ptr } %110, ptr %106, 1 -// CHECK-NEXT: %112 = extractvalue { ptr, ptr } %111, 1 -// CHECK-NEXT: %113 = extractvalue { ptr, ptr } %111, 0 -// CHECK-NEXT: %114 = call %"{{.*}}/runtime/internal/runtime.iface" %113(ptr %112, i64 0) -// CHECK-NEXT: %115 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %114) -// CHECK-NEXT: %116 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %114, 1 -// CHECK-NEXT: %117 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %115, 0 -// CHECK-NEXT: %118 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %117, ptr %116, 1 -// CHECK-NEXT: %119 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %120 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %121 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %119, 0 -// CHECK-NEXT: %122 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %121, ptr %120, 1 -// CHECK-NEXT: %123 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %118, %"{{.*}}/runtime/internal/runtime.eface" %122) -// CHECK-NEXT: %124 = xor i1 %123, true -// CHECK-NEXT: br i1 %124, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_10, %_llgo_6 -// CHECK-NEXT: %125 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @15, i64 11 }, ptr %125, align 8 -// CHECK-NEXT: %126 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %125, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %126) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_10 -// CHECK-NEXT: %127 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.PointerTo(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %128 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %127) -// CHECK-NEXT: %129 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %127, 0 -// CHECK-NEXT: %130 = getelementptr ptr, ptr %129, i64 11 -// CHECK-NEXT: %131 = load ptr, ptr %130, align 8 -// CHECK-NEXT: %132 = insertvalue { ptr, ptr } undef, ptr %131, 0 -// CHECK-NEXT: %133 = insertvalue { ptr, ptr } %132, ptr %128, 1 -// CHECK-NEXT: %134 = extractvalue { ptr, ptr } %133, 1 -// CHECK-NEXT: %135 = extractvalue { ptr, ptr } %133, 0 -// CHECK-NEXT: %136 = call %"{{.*}}/runtime/internal/runtime.iface" %135(ptr %134) -// CHECK-NEXT: %137 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %136) -// CHECK-NEXT: %138 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %136, 1 -// CHECK-NEXT: %139 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %137, 0 -// CHECK-NEXT: %140 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %139, ptr %138, 1 -// CHECK-NEXT: %141 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %142 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %143 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %141, 0 -// CHECK-NEXT: %144 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %143, ptr %142, 1 -// CHECK-NEXT: %145 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %140, %"{{.*}}/runtime/internal/runtime.eface" %144) -// CHECK-NEXT: %146 = xor i1 %145, true -// CHECK-NEXT: br i1 %146, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_6 -// CHECK-NEXT: %147 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %86) -// CHECK-NEXT: %148 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %86, 0 -// CHECK-NEXT: %149 = getelementptr ptr, ptr %148, i64 11 -// CHECK-NEXT: %150 = load ptr, ptr %149, align 8 -// CHECK-NEXT: %151 = insertvalue { ptr, ptr } undef, ptr %150, 0 -// CHECK-NEXT: %152 = insertvalue { ptr, ptr } %151, ptr %147, 1 -// CHECK-NEXT: %153 = extractvalue { ptr, ptr } %152, 1 -// CHECK-NEXT: %154 = extractvalue { ptr, ptr } %152, 0 -// CHECK-NEXT: %155 = call %"{{.*}}/runtime/internal/runtime.iface" %154(ptr %153) -// CHECK-NEXT: %156 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %155) -// CHECK-NEXT: %157 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %155, 1 -// CHECK-NEXT: %158 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %156, 0 -// CHECK-NEXT: %159 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %158, ptr %157, 1 -// CHECK-NEXT: %160 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %161 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %162 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %160, 0 -// CHECK-NEXT: %163 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %162, ptr %161, 1 -// CHECK-NEXT: %164 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %159, %"{{.*}}/runtime/internal/runtime.eface" %163) -// CHECK-NEXT: %165 = xor i1 %164, true -// CHECK-NEXT: br i1 %165, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_9 -// CHECK-NEXT: %166 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 15 }, ptr %166, align 8 -// CHECK-NEXT: %167 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %166, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %167) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_9 -// CHECK-NEXT: %168 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.SliceOf(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %169 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %168) -// CHECK-NEXT: %170 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %168, 0 -// CHECK-NEXT: %171 = getelementptr ptr, ptr %170, i64 11 -// CHECK-NEXT: %172 = load ptr, ptr %171, align 8 -// CHECK-NEXT: %173 = insertvalue { ptr, ptr } undef, ptr %172, 0 -// CHECK-NEXT: %174 = insertvalue { ptr, ptr } %173, ptr %169, 1 -// CHECK-NEXT: %175 = extractvalue { ptr, ptr } %174, 1 -// CHECK-NEXT: %176 = extractvalue { ptr, ptr } %174, 0 -// CHECK-NEXT: %177 = call %"{{.*}}/runtime/internal/runtime.iface" %176(ptr %175) -// CHECK-NEXT: %178 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %177) -// CHECK-NEXT: %179 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %177, 1 -// CHECK-NEXT: %180 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %178, 0 -// CHECK-NEXT: %181 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %180, ptr %179, 1 -// CHECK-NEXT: %182 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %183 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %184 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %182, 0 -// CHECK-NEXT: %185 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %184, ptr %183, 1 -// CHECK-NEXT: %186 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %181, %"{{.*}}/runtime/internal/runtime.eface" %185) -// CHECK-NEXT: %187 = xor i1 %186, true -// CHECK-NEXT: br i1 %187, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_12 -// CHECK-NEXT: %188 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 13 }, ptr %188, align 8 -// CHECK-NEXT: %189 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %188, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %189) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: %190 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 104) -// CHECK-NEXT: %191 = getelementptr inbounds %reflect.StructField, ptr %190, i64 0 -// CHECK-NEXT: %192 = getelementptr inbounds %reflect.StructField, ptr %191, i32 0, i32 0 -// CHECK-NEXT: %193 = getelementptr inbounds %reflect.StructField, ptr %191, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 1 }, ptr %192, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %9, ptr %193, align 8 -// CHECK-NEXT: %194 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %190, 0 -// CHECK-NEXT: %195 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %194, i64 1, 1 -// CHECK-NEXT: %196 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %195, i64 1, 2 -// CHECK-NEXT: %197 = call %"{{.*}}/runtime/internal/runtime.iface" @reflect.StructOf(%"{{.*}}/runtime/internal/runtime.Slice" %196) -// CHECK-NEXT: %198 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %197) -// CHECK-NEXT: %199 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %197, 0 -// CHECK-NEXT: %200 = getelementptr ptr, ptr %199, i64 12 -// CHECK-NEXT: %201 = load ptr, ptr %200, align 8 -// CHECK-NEXT: %202 = insertvalue { ptr, ptr } undef, ptr %201, 0 -// CHECK-NEXT: %203 = insertvalue { ptr, ptr } %202, ptr %198, 1 -// CHECK-NEXT: %204 = extractvalue { ptr, ptr } %203, 1 -// CHECK-NEXT: %205 = extractvalue { ptr, ptr } %203, 0 -// CHECK-NEXT: %206 = call %reflect.StructField %205(ptr %204, i64 0) -// CHECK-NEXT: %207 = extractvalue %reflect.StructField %206, 2 -// CHECK-NEXT: %208 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %207) -// CHECK-NEXT: %209 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %207, 1 -// CHECK-NEXT: %210 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %208, 0 -// CHECK-NEXT: %211 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %210, ptr %209, 1 -// CHECK-NEXT: %212 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %213 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 1 -// CHECK-NEXT: %214 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %212, 0 -// CHECK-NEXT: %215 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %214, ptr %213, 1 -// CHECK-NEXT: %216 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %211, %"{{.*}}/runtime/internal/runtime.eface" %215) -// CHECK-NEXT: %217 = xor i1 %216, true -// CHECK-NEXT: br i1 %217, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14 -// CHECK-NEXT: %218 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @19, i64 14 }, ptr %218, align 8 -// CHECK-NEXT: %219 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %218, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %219) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_14 -// CHECK-NEXT: %220 = alloca %reflect.Method, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %220, i8 0, i64 80, i1 false) -// CHECK-NEXT: %221 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %222 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %223 = getelementptr ptr, ptr %222, i64 {{(23|25)}} -// CHECK-NEXT: %224 = load ptr, ptr %223, align 8 -// CHECK-NEXT: %225 = insertvalue { ptr, ptr } undef, ptr %224, 0 -// CHECK-NEXT: %226 = insertvalue { ptr, ptr } %225, ptr %221, 1 -// CHECK-NEXT: %227 = extractvalue { ptr, ptr } %226, 1 -// CHECK-NEXT: %228 = extractvalue { ptr, ptr } %226, 0 -// CHECK-NEXT: %229 = call %reflect.Method %228(ptr %227, i64 0) -// CHECK-NEXT: store %reflect.Method %229, ptr %220, align 8 -// CHECK-NEXT: %230 = getelementptr inbounds %reflect.Method, ptr %220, i32 0, i32 0 -// CHECK-NEXT: %231 = load %"{{.*}}/runtime/internal/runtime.String", ptr %230, align 8 -// CHECK-NEXT: %232 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %231, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: %233 = xor i1 %232, true -// CHECK-NEXT: br i1 %233, label %_llgo_17, label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_16 -// CHECK-NEXT: %234 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 12 }, ptr %234, align 8 -// CHECK-NEXT: %235 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %234, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %235) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: %236 = alloca %reflect.Method, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %236, i8 0, i64 80, i1 false) -// CHECK-NEXT: %237 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %9) -// CHECK-NEXT: %238 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %9, 0 -// CHECK-NEXT: %239 = getelementptr ptr, ptr %238, i64 {{(24|26)}} -// CHECK-NEXT: %240 = load ptr, ptr %239, align 8 -// CHECK-NEXT: %241 = insertvalue { ptr, ptr } undef, ptr %240, 0 -// CHECK-NEXT: %242 = insertvalue { ptr, ptr } %241, ptr %237, 1 -// CHECK-NEXT: %243 = extractvalue { ptr, ptr } %242, 1 -// CHECK-NEXT: %244 = extractvalue { ptr, ptr } %242, 0 -// CHECK-NEXT: %245 = call { %reflect.Method, i1 } %244(ptr %243, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: %246 = extractvalue { %reflect.Method, i1 } %245, 0 -// CHECK-NEXT: store %reflect.Method %246, ptr %236, align 8 -// CHECK-NEXT: %247 = extractvalue { %reflect.Method, i1 } %245, 1 -// CHECK-NEXT: br i1 %247, label %_llgo_21, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_21, %_llgo_18 -// CHECK-NEXT: %248 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @21, i64 18 }, ptr %248, align 8 -// CHECK-NEXT: %249 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %248, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %249) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_21 -// CHECK-NEXT: %250 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %251 = getelementptr inbounds %main.Point, ptr %250, i32 0, i32 0 -// CHECK-NEXT: %252 = getelementptr inbounds %main.Point, ptr %250, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %251, align 8 -// CHECK-NEXT: store i64 2, ptr %252, align 8 -// CHECK-NEXT: %253 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Point", ptr undef }, ptr %250, 1 -// CHECK-NEXT: %254 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %253) -// CHECK-NEXT: %255 = call %reflect.Value @reflect.Value.Method(%reflect.Value %254, i64 1) -// CHECK-NEXT: %256 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %255, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: %257 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %256, 0 -// CHECK-NEXT: %258 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %256, 1 -// CHECK-NEXT: %259 = icmp uge i64 0, %258 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %259, i64 0, i1 true, i64 %258) -// CHECK-NEXT: %260 = getelementptr inbounds %reflect.Value, ptr %257, i64 0 -// CHECK-NEXT: %261 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %260) -// CHECK-NEXT: %262 = load %reflect.Value, ptr %261, align 8 -// CHECK-NEXT: %263 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %262) -// CHECK-NEXT: %264 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %263, %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 5 }) -// CHECK-NEXT: %265 = xor i1 %264, true -// CHECK-NEXT: br i1 %265, label %_llgo_22, label %_llgo_23 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_18 -// CHECK-NEXT: %266 = getelementptr inbounds %reflect.Method, ptr %236, i32 0, i32 0 -// CHECK-NEXT: %267 = load %"{{.*}}/runtime/internal/runtime.String", ptr %266, align 8 -// CHECK-NEXT: %268 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %267, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: %269 = xor i1 %268, true -// CHECK-NEXT: br i1 %269, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_20 -// CHECK-NEXT: %270 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 18 }, ptr %270, align 8 -// CHECK-NEXT: %271 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %270, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %271) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_20 -// CHECK-NEXT: %272 = call %reflect.Value @reflect.Value.MethodByName(%reflect.Value %254, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: %273 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %272, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: %274 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %273, 0 -// CHECK-NEXT: %275 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %273, 1 -// CHECK-NEXT: %276 = icmp uge i64 0, %275 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %276, i64 0, i1 true, i64 %275) -// CHECK-NEXT: %277 = getelementptr inbounds %reflect.Value, ptr %274, i64 0 -// CHECK-NEXT: %278 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %277) -// CHECK-NEXT: %279 = load %reflect.Value, ptr %278, align 8 -// CHECK-NEXT: %280 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %279) -// CHECK-NEXT: %281 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %280, %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 5 }) -// CHECK-NEXT: %282 = xor i1 %281, true -// CHECK-NEXT: br i1 %282, label %_llgo_24, label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_23 -// CHECK-NEXT: %283 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @24, i64 24 }, ptr %283, align 8 -// CHECK-NEXT: %284 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %283, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %284) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_23 -// CHECK-NEXT: call void @main.method(i64 1) -// CHECK-NEXT: call void @main.methodByName(%"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 6 }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Type.Method's returned Method is stored and its Name field is what reaches +// StringEqual. MethodByName additionally carries the tuple's ok bit to a branch. +// CHECK: %[[METHOD_SLOT:[0-9]+]] = alloca %reflect.Method +// CHECK: %[[METHOD:[0-9]+]] = call %reflect.Method %{{[0-9]+}}(ptr %{{[0-9]+}}, i64 0) +// CHECK: store %reflect.Method %[[METHOD]], ptr %[[METHOD_SLOT]] +// CHECK: %[[METHOD_NAME_PTR:[0-9]+]] = getelementptr inbounds %reflect.Method, ptr %[[METHOD_SLOT]], i32 0, i32 0 +// CHECK: %[[METHOD_NAME:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[METHOD_NAME_PTR]] +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %[[METHOD_NAME]],{{.*}}) +// CHECK: %[[NAMED_METHOD:[0-9]+]] = call { %reflect.Method, i1 } %{{[0-9]+}}(ptr %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) +// CHECK: extractvalue { %reflect.Method, i1 } %[[NAMED_METHOD]], 0 +// CHECK: %[[METHOD_OK:[0-9]+]] = extractvalue { %reflect.Method, i1 } %[[NAMED_METHOD]], 1 +// CHECK: br i1 %[[METHOD_OK]] + +// Value.Method and MethodByName must invoke the Value they return, range-check +// the returned slice, and compare the first result's string. +// CHECK: %[[VALUE:[0-9]+]] = call %reflect.Value @reflect.ValueOf +// CHECK: %[[INDEX_METHOD:[0-9]+]] = call %reflect.Value @reflect.Value.Method(%reflect.Value %[[VALUE]], i64 1) +// CHECK: %[[INDEX_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[INDEX_METHOD]], %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) +// CHECK: %[[INDEX_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[INDEX_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 0, i1 true, i64 %[[INDEX_LEN]]) +// CHECK: %[[INDEX_STRING:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %[[INDEX_STRING]],{{.*}}) +// CHECK: %[[NAME_METHOD:[0-9]+]] = call %reflect.Value @reflect.Value.MethodByName(%reflect.Value %[[VALUE]], %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) +// CHECK: %[[NAME_RESULTS:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[NAME_METHOD]], %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) +// CHECK: %[[NAME_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[NAME_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{[0-9]+}}, i64 0, i1 true, i64 %[[NAME_LEN]]) +// CHECK: %[[NAME_STRING:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %[[NAME_STRING]],{{.*}}) +// CHECK: call void @main.method(i64 1) +// CHECK: call void @main.methodByName(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) // CHECK-LABEL: define void @main.method(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Point", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %5 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = call %reflect.Value @reflect.Value.Method(%reflect.Value %5, i64 %0) -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %6, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %10 = icmp uge i64 0, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, i64 0, i1 true, i64 %9) -// CHECK-NEXT: %11 = getelementptr inbounds %reflect.Value, ptr %8, i64 0 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %11) -// CHECK-NEXT: %13 = load %reflect.Value, ptr %12, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %13) -// CHECK-NEXT: %15 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %14, %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 5 }) -// CHECK-NEXT: %16 = xor i1 %15, true -// CHECK-NEXT: br i1 %16, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 18 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[DYNAMIC_INDEX:[0-9]+]] = call %reflect.Value @reflect.Value.Method(%reflect.Value %{{[0-9]+}}, i64 %0) +// CHECK: call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[DYNAMIC_INDEX]], // CHECK-LABEL: define void @main.methodByName(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = getelementptr inbounds %main.Point, ptr %1, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.Point", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %5 = call %reflect.Value @reflect.ValueOf(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = call %reflect.Value @reflect.Value.MethodByName(%reflect.Value %5, %"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %6, %"{{.*}}/runtime/internal/runtime.Slice" zeroinitializer) -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %10 = icmp uge i64 0, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, i64 0, i1 true, i64 %9) -// CHECK-NEXT: %11 = getelementptr inbounds %reflect.Value, ptr %8, i64 0 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr %11) -// CHECK-NEXT: %13 = load %reflect.Value, ptr %12, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %13) -// CHECK-NEXT: %15 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %14, %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 5 }) -// CHECK-NEXT: %16 = xor i1 %15, true -// CHECK-NEXT: br i1 %16, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @24, i64 24 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[DYNAMIC_NAME:[0-9]+]] = call %reflect.Value @reflect.Value.MethodByName(%reflect.Value %{{[0-9]+}}, %"{{.*}}/runtime/internal/runtime.String" %0) +// CHECK: call %"{{.*}}/runtime/internal/runtime.Slice" @reflect.Value.Call(%reflect.Value %[[DYNAMIC_NAME]], diff --git a/cl/_testgo/reflectmkfn/in.go b/cl/_testgo/reflectmkfn/in.go index 60d5c06c0e..1db2284a15 100644 --- a/cl/_testgo/reflectmkfn/in.go +++ b/cl/_testgo/reflectmkfn/in.go @@ -7,13 +7,21 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK: call %"g{{.*}}/runtime/internal/runtime.iface" @reflect.FuncOf( -// CHECK: call %reflect.Value @reflect.MakeFunc( -// CHECK: call %"g{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface( -// CHECK: call i1 @"g{{.*}}/runtime/internal/runtime.MatchesClosure"( -// CHECK: call ptr asm "", "=r,0"(ptr %{{.*}}) -// CHECK-NEXT: call %"g{{.*}}/runtime/internal/runtime.String" %{{.*}}(ptr {{(nest|swiftself)}} %{{.*}}, %"g{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 3 }, i64 2) -// CHECK: call i1 @"g{{.*}}/runtime/internal/runtime.StringEqual"( +// CHECK: %[[FUNC_TYPE:[0-9]+]] = call %"g{{.*}}/runtime/internal/runtime.iface" @reflect.FuncOf( +// CHECK: %[[FUNC_VALUE:[0-9]+]] = call %reflect.Value @reflect.MakeFunc(%"g{{.*}}/runtime/internal/runtime.iface" %[[FUNC_TYPE]], { ptr, ptr } { ptr @"main.main$1", ptr null }) +// CHECK: %[[FUNC_IFACE:[0-9]+]] = call %"g{{.*}}/runtime/internal/runtime.eface" @reflect.Value.Interface(%reflect.Value %[[FUNC_VALUE]]) +// CHECK: %[[DYNAMIC_TYPE:[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.eface" %[[FUNC_IFACE]], 0 +// CHECK: %[[MATCH:[0-9]+]] = call i1 @"g{{.*}}/runtime/internal/runtime.MatchesClosure"({{.*}}ptr %[[DYNAMIC_TYPE]]) +// CHECK: br i1 %[[MATCH]] +// CHECK: %[[FUNC_DATA:[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.eface" %[[FUNC_IFACE]], 1 +// CHECK: %[[FUNC_PAIR:[0-9]+]] = load { ptr, ptr }, ptr %[[FUNC_DATA]] +// CHECK: %[[CALL_DATA:[0-9]+]] = extractvalue { ptr, ptr } %[[FUNC_PAIR]], 1 +// CHECK: %[[CALL_PTR:[0-9]+]] = extractvalue { ptr, ptr } %[[FUNC_PAIR]], 0 +// CHECK: %[[CALL_CODE:__llgo_funcval_code]] = call ptr asm "", "=r,0"(ptr %[[CALL_PTR]]) +// CHECK: %[[RESULT:[0-9]+]] = call %"g{{.*}}/runtime/internal/runtime.String" %[[CALL_CODE]](ptr {{(nest|swiftself)}} %[[CALL_DATA]], %"g{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 3 }, i64 2) +// CHECK: %[[EQUAL:[0-9]+]] = call i1 @"g{{.*}}/runtime/internal/runtime.StringEqual"(%"g{{.*}}/runtime/internal/runtime.String" %[[RESULT]],{{.*}}) +// CHECK: %[[NOT_EQUAL:[0-9]+]] = xor i1 %[[EQUAL]], true +// CHECK: br i1 %[[NOT_EQUAL]] func main() { typ := reflect.FuncOf([]reflect.Type{reflect.TypeOf(""), reflect.TypeOf(0)}, []reflect.Type{reflect.TypeOf("")}, false) fn := reflect.MakeFunc(typ, func(args []reflect.Value) []reflect.Value { @@ -27,9 +35,25 @@ func main() { } // CHECK-LABEL: define %"g{{.*}}/runtime/internal/runtime.Slice" @"main.main$1"(%"g{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK: call %"g{{.*}}/runtime/internal/runtime.String" @reflect.Value.String( -// CHECK: call i64 @reflect.Value.Int( -// CHECK: call %"g{{.*}}/runtime/internal/runtime.String" @strings.Repeat( -// CHECK: call %reflect.Value @reflect.ValueOf( -// CHECK: ret %"g{{.*}}/runtime/internal/runtime.Slice" -// CHECK: } +// CHECK: [[ARG0_DATA:%[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.Slice" %0, 0 +// CHECK: [[ARG0_LEN:%[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: call void @"g{{.*}}/runtime/internal/runtime.CheckIndexRange"({{.*}}i64 0,{{.*}}i64 [[ARG0_LEN]]) +// CHECK: [[ARG0_PTR:%[0-9]+]] = getelementptr inbounds %reflect.Value, ptr [[ARG0_DATA]], i64 0 +// CHECK: [[ARG0_SAFE:%[0-9]+]] = call ptr @"g{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[ARG0_PTR]]) +// CHECK-NEXT: [[ARG0:%[0-9]+]] = load %reflect.Value, ptr [[ARG0_SAFE]] +// CHECK-NEXT: [[TEXT:%[0-9]+]] = call %"g{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value [[ARG0]]) +// CHECK: [[ARG1_DATA:%[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.Slice" %0, 0 +// CHECK: [[ARG1_LEN:%[0-9]+]] = extractvalue %"g{{.*}}/runtime/internal/runtime.Slice" %0, 1 +// CHECK: call void @"g{{.*}}/runtime/internal/runtime.CheckIndexRange"({{.*}}i64 1,{{.*}}i64 [[ARG1_LEN]]) +// CHECK: [[ARG1_PTR:%[0-9]+]] = getelementptr inbounds %reflect.Value, ptr [[ARG1_DATA]], i64 1 +// CHECK: [[ARG1_SAFE:%[0-9]+]] = call ptr @"g{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[ARG1_PTR]]) +// CHECK-NEXT: [[ARG1:%[0-9]+]] = load %reflect.Value, ptr [[ARG1_SAFE]] +// CHECK-NEXT: [[COUNT:%[0-9]+]] = call i64 @reflect.Value.Int(%reflect.Value [[ARG1]]) +// CHECK-NEXT: [[REPEATED:%[0-9]+]] = call %"g{{.*}}/runtime/internal/runtime.String" @strings.Repeat(%"g{{.*}}/runtime/internal/runtime.String" [[TEXT]], i64 [[COUNT]]) +// CHECK: store %"g{{.*}}/runtime/internal/runtime.String" [[REPEATED]], ptr [[RESULT_TEXT:%[0-9]+]] +// CHECK-NEXT: [[RESULT_BOX:%[0-9]+]] = insertvalue %"g{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr [[RESULT_TEXT]], 1 +// CHECK-NEXT: [[RESULT_VALUE:%[0-9]+]] = call %reflect.Value @reflect.ValueOf(%"g{{.*}}/runtime/internal/runtime.eface" [[RESULT_BOX]]) +// CHECK: [[RESULT_SLICE0:%[0-9]+]] = insertvalue %"g{{.*}}/runtime/internal/runtime.Slice" undef, ptr %{{[0-9]+}}, 0 +// CHECK-NEXT: [[RESULT_SLICE1:%[0-9]+]] = insertvalue %"g{{.*}}/runtime/internal/runtime.Slice" [[RESULT_SLICE0]], i64 1, 1 +// CHECK-NEXT: [[RESULT_SLICE:%[0-9]+]] = insertvalue %"g{{.*}}/runtime/internal/runtime.Slice" [[RESULT_SLICE1]], i64 1, 2 +// CHECK-NEXT: ret %"g{{.*}}/runtime/internal/runtime.Slice" [[RESULT_SLICE]] diff --git a/cl/_testgo/returnorder/in.go b/cl/_testgo/returnorder/in.go index de98fd2b9b..81fb2b16ed 100644 --- a/cl/_testgo/returnorder/in.go +++ b/cl/_testgo/returnorder/in.go @@ -1,24 +1,36 @@ // LITTEST package main +// Evaluate the mutating second result before loading the first result value. +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[MAIN_RESULT:%[0-9]+]] = call { %main.state, i64 } @main.returnStateAndMut() +// CHECK-NEXT: [[MAIN_STATE:%[0-9]+]] = extractvalue { %main.state, i64 } [[MAIN_RESULT]], 0 +// CHECK: [[MAIN_MUTATED:%[0-9]+]] = extractvalue { %main.state, i64 } [[MAIN_RESULT]], 1 +// CHECK: [[MAIN_VALUE:%[0-9]+]] = load i64, ptr %{{[0-9]+}} +// CHECK-NEXT: [[MAIN_BAD_STATE:%[0-9]+]] = icmp ne i64 [[MAIN_VALUE]], 2 +// CHECK-NEXT: br i1 [[MAIN_BAD_STATE]], label %{{.*}}, label %{{.*}} +// CHECK: [[MAIN_BAD_RESULT:%[0-9]+]] = icmp ne i64 [[MAIN_MUTATED]], 2 +// CHECK-NEXT: br i1 [[MAIN_BAD_RESULT]], label %{{.*}}, label %{{.*}} +// CHECK-LABEL: define { %main.state, i64 } @main.returnStateAndMut(){{.*}} { +// CHECK: [[RETURN_MUTATED:%[0-9]+]] = call i64 @"main.(*state).mutate"(ptr [[RETURN_STATE:%[0-9]+]], i64 2) +// CHECK-NEXT: [[RETURN_VALUE:%[0-9]+]] = load %main.state, ptr [[RETURN_STATE]] +// CHECK-NEXT: [[RETURN_PAIR0:%[0-9]+]] = insertvalue { %main.state, i64 } undef, %main.state [[RETURN_VALUE]], 0 +// CHECK-NEXT: [[RETURN_PAIR:%[0-9]+]] = insertvalue { %main.state, i64 } [[RETURN_PAIR0]], i64 [[RETURN_MUTATED]], 1 +// CHECK-NEXT: ret { %main.state, i64 } [[RETURN_PAIR]] +// CHECK-LABEL: define i64 @"main.(*state).mutate"(ptr %0, i64 %1){{.*}} { +// CHECK: [[MUTATE_FIELD:%[0-9]+]] = getelementptr inbounds %main.state, ptr %0, i32 0, i32 0 +// CHECK-NEXT: store i64 %1, ptr [[MUTATE_FIELD]] +// CHECK: [[MUTATE_RESULT_FIELD:%[0-9]+]] = getelementptr inbounds %main.state, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[MUTATE_VALUE:%[0-9]+]] = load i64, ptr [[MUTATE_RESULT_FIELD]] +// CHECK-NEXT: ret i64 [[MUTATE_VALUE]] + import "fmt" type state struct { v int } -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call { %main.state, i64 } @main.returnStateAndMut() - // CHECK: extractvalue { %main.state, i64 } %1, 0 - // CHECK: extractvalue { %main.state, i64 } %1, 1 - // CHECK: icmp ne i64 %5, 2 - // CHECK: call %"{{.*}}String" @fmt.Sprintf - // CHECK: call void @"{{.*}}Panic" - // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @3, i64 2 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK: icmp ne i64 %3, 2 a, b := returnStateAndMut() if a.v != 2 || b != 2 { panic(fmt.Sprintf("return order mismatch: got (%d,%d), want (2,2)", a.v, b)) @@ -26,28 +38,11 @@ func main() { println("ok") } -// CHECK-LABEL: define { %main.state, i64 } @main.returnStateAndMut(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %main.state, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call i64 @"main.(*state).mutate"(ptr %0, i64 2) -// CHECK-NEXT: %3 = load %main.state, ptr %0, align 8 -// CHECK-NEXT: %4 = insertvalue { %main.state, i64 } undef, %main.state %3, 0 -// CHECK-NEXT: %5 = insertvalue { %main.state, i64 } %4, i64 %2, 1 -// CHECK-NEXT: ret { %main.state, i64 } %5 func returnStateAndMut() (state, int) { x := state{v: 1} return x, x.mutate(2) } -// CHECK-LABEL: define i64 @"main.(*state).mutate"(ptr %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.state, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 %1, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.state, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: ret i64 %4 func (s *state) mutate(next int) int { s.v = next return s.v diff --git a/cl/_testgo/rewrite/main.go b/cl/_testgo/rewrite/main.go index 6a5de10b1f..9fd04ec4bf 100644 --- a/cl/_testgo/rewrite/main.go +++ b/cl/_testgo/rewrite/main.go @@ -8,11 +8,23 @@ import ( dep "github.com/goplus/llgo/cl/_testgo/rewrite/dep" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [12 x i8] c"main.VarName", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [13 x i8] c"main.VarPlain", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [16 x i8] c"runtime.GOROOT()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [17 x i8] c"runtime.Version()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [7 x i8] c"%s: %s\0A", align 1{{$}} +// Keep the package globals and imported/runtime calls distinct after name +// rewriting. +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[VAR_NAME:%[0-9]+]] = load %"{{.*}}String", ptr @main.VarName +// CHECK-NEXT: call void @main.printLine(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 12 }, %"{{.*}}String" [[VAR_NAME]]) +// CHECK-NEXT: [[VAR_PLAIN:%[0-9]+]] = load %"{{.*}}String", ptr @main.VarPlain +// CHECK-NEXT: call void @main.printLine(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 13 }, %"{{.*}}String" [[VAR_PLAIN]]) +// CHECK-NEXT: call void @"{{.*}}/rewrite/dep.PrintVar"() +// CHECK-NEXT: [[GOROOT:%[0-9]+]] = call %"{{.*}}String" @runtime.GOROOT() +// CHECK-NEXT: call void @main.printLine(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 16 }, %"{{.*}}String" [[GOROOT]]) +// CHECK-NEXT: [[VERSION:%[0-9]+]] = call %"{{.*}}String" @runtime.Version() +// CHECK-NEXT: call void @main.printLine(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 17 }, %"{{.*}}String" [[VERSION]]) +// CHECK-LABEL: define void @main.printLine(%"{{.*}}String" %0, %"{{.*}}String" %1){{.*}} { +// CHECK: store %"{{.*}}String" %0, ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}String" %1, ptr %{{[0-9]+}} +// CHECK: [[PRINT_ARGS:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 2, 2 +// CHECK-NEXT: call { i64, %"{{.*}}iface" } @fmt.Printf(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 7 }, %"{{.*}}Slice" [[PRINT_ARGS]]) var VarName = "main-default" var VarPlain string @@ -28,52 +40,3 @@ func main() { printLine("runtime.GOROOT()", runtime.GOROOT()) printLine("runtime.Version()", runtime.Version()) } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/rewrite/dep.init"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load %"{{.*}}/runtime/internal/runtime.String", ptr @main.VarName, align 8 -// CHECK-NEXT: call void @main.printLine(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 12 }, %"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: %1 = load %"{{.*}}/runtime/internal/runtime.String", ptr @main.VarPlain, align 8 -// CHECK-NEXT: call void @main.printLine(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 13 }, %"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/rewrite/dep.PrintVar"() -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.String" @runtime.GOROOT() -// CHECK-NEXT: call void @main.printLine(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 16 }, %"{{.*}}/runtime/internal/runtime.String" %2) -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.String" @runtime.Version() -// CHECK-NEXT: call void @main.printLine(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 17 }, %"{{.*}}/runtime/internal/runtime.String" %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.printLine(%"{{.*}}/runtime/internal/runtime.String" %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %2, i64 0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %5, ptr %3, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %2, i64 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %1, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %8, ptr %6, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %2, 0 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %9, i64 2, 1 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %10, i64 2, 2 -// CHECK-NEXT: %12 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Printf(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 7 }, %"{{.*}}/runtime/internal/runtime.Slice" %11) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/runextest/main.go b/cl/_testgo/runextest/main.go index 693054653e..ea732d5fcd 100644 --- a/cl/_testgo/runextest/main.go +++ b/cl/_testgo/runextest/main.go @@ -6,9 +6,20 @@ import ( "github.com/goplus/llgo/cl/_testgo/runextest/foo" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"foo.Foo()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"bar.Bar()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"Zoo()", align 1{{$}} +// Check that the external test packages participate in initialization and +// remain direct calls from the executable package. +// CHECK-LABEL: define i64 @main.Zoo(){{.*}} { +// CHECK: ret i64 3 +// CHECK-LABEL: define void @main.init(){{.*}} { +// CHECK: call void @"{{.*}}/runextest/bar.init"() +// CHECK-NEXT: call void @"{{.*}}/runextest/foo.init"() +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[EXT_FOO:%[0-9]+]] = call i64 @"{{.*}}/runextest/foo.Foo"() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[EXT_FOO]]) +// CHECK: [[EXT_BAR:%[0-9]+]] = call i64 @"{{.*}}/runextest/bar.Bar"() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[EXT_BAR]]) +// CHECK: [[EXT_ZOO:%[0-9]+]] = call i64 @main.Zoo() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[EXT_ZOO]]) func Zoo() int { return 3 @@ -19,43 +30,3 @@ func main() { println("bar.Bar()", bar.Bar()) println("Zoo()", Zoo()) } - -// CHECK-LABEL: define i64 @main.Zoo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/runextest/bar.init"() -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/runextest/foo.init"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"{{.*}}/cl/_testgo/runextest/foo.Foo"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %1 = call i64 @"{{.*}}/cl/_testgo/runextest/bar.Bar"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %2 = call i64 @main.Zoo() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/runtest/main.go b/cl/_testgo/runtest/main.go index 50bbb0cafa..3b79f5b70a 100644 --- a/cl/_testgo/runtest/main.go +++ b/cl/_testgo/runtest/main.go @@ -6,9 +6,18 @@ import ( "github.com/goplus/llgo/cl/_testgo/runtest/foo" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"foo.Foo()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"bar.Bar()", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"Zoo()", align 1{{$}} +// CHECK-LABEL: define i64 @main.Zoo(){{.*}} { +// CHECK: ret i64 3 +// CHECK-LABEL: define void @main.init(){{.*}} { +// CHECK: call void @"{{.*}}/runtest/bar.init"() +// CHECK-NEXT: call void @"{{.*}}/runtest/foo.init"() +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[FOO:%[0-9]+]] = call i64 @"{{.*}}/runtest/foo.Foo"() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[FOO]]) +// CHECK: [[BAR:%[0-9]+]] = call i64 @"{{.*}}/runtest/bar.Bar"() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[BAR]]) +// CHECK: [[ZOO:%[0-9]+]] = call i64 @main.Zoo() +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZOO]]) func Zoo() int { return 3 @@ -19,43 +28,3 @@ func main() { println("bar.Bar()", bar.Bar()) println("Zoo()", Zoo()) } - -// CHECK-LABEL: define i64 @main.Zoo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/runtest/bar.init"() -// CHECK-NEXT: call void @"{{.*}}/cl/_testgo/runtest/foo.init"() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"{{.*}}/cl/_testgo/runtest/foo.Foo"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %1 = call i64 @"{{.*}}/cl/_testgo/runtest/bar.Bar"() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 9 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %2 = call i64 @main.Zoo() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testgo/select/in.go b/cl/_testgo/select/in.go index 0ead117209..19a40e88fd 100644 --- a/cl/_testgo/select/in.go +++ b/cl/_testgo/select/in.go @@ -1,10 +1,105 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"exit", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"ch1", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"ch2", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [31 x i8] c"blocking select matched no case", align 1{{$}} +// Blocking send selection and receive-with-default use different runtime +// entry points and result shapes. +// CHECK: @[[EXIT_TEXT:[0-9]+]] = private unnamed_addr constant [4 x i8] c"exit" +// CHECK: @[[CH1_TEXT:[0-9]+]] = private unnamed_addr constant [3 x i8] c"ch1" +// CHECK: @[[CH2_TEXT:[0-9]+]] = private unnamed_addr constant [3 x i8] c"ch2" +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.send() +// CHECK-NEXT: call void @main.recv() +// CHECK-NEXT: ret void +// CHECK-LABEL: define void @main.recv(){{.*}} { +// CHECK: [[RECV_CH1_OBJ:%[0-9]+]] = call ptr @"{{.*}}NewChan"(i64 16, i64 0) +// CHECK: [[RECV_CH2_OBJ:%[0-9]+]] = call ptr @"{{.*}}NewChan"(i64 16, i64 0) +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1", ptr %{{[0-9]+}}, i64 0) +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2", ptr %{{[0-9]+}}, i64 0) +// CHECK: [[RECV_CH1:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK-NEXT: [[RECV_CH2:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: [[RECV_BUF1:%[0-9]+]] = alloca %"{{.*}}String" +// CHECK: [[RECV_OP1_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[RECV_CH1]], 0 +// CHECK-NEXT: [[RECV_OP1_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP1_0]], ptr [[RECV_BUF1]], 1 +// CHECK-NEXT: [[RECV_OP1_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP1_1]], i32 16, 2 +// CHECK-NEXT: [[RECV_OP1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP1_2]], i1 false, 3 +// CHECK: [[RECV_BUF2:%[0-9]+]] = alloca %"{{.*}}String" +// CHECK: [[RECV_OP2_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[RECV_CH2]], 0 +// CHECK-NEXT: [[RECV_OP2_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP2_0]], ptr [[RECV_BUF2]], 1 +// CHECK-NEXT: [[RECV_OP2_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP2_1]], i32 16, 2 +// CHECK-NEXT: [[RECV_OP2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[RECV_OP2_2]], i1 false, 3 +// CHECK: store %"{{.*}}ChanOp" [[RECV_OP1]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}ChanOp" [[RECV_OP2]], ptr %{{[0-9]+}} +// CHECK: [[RECV_CASES:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 2, 2 +// CHECK-NEXT: [[TRY_SELECT:%[0-9]+]] = call { i64, i1, i1 } @"{{.*}}TrySelect"(%"{{.*}}Slice" [[RECV_CASES]]) +// CHECK-NEXT: [[TRY_INDEX:%[0-9]+]] = extractvalue { i64, i1, i1 } [[TRY_SELECT]], 0 +// CHECK-NEXT: [[TRY_OK:%[0-9]+]] = extractvalue { i64, i1, i1 } [[TRY_SELECT]], 1 +// CHECK-NEXT: [[TRY_SELECTED:%[0-9]+]] = extractvalue { i64, i1, i1 } [[TRY_SELECT]], 2 +// CHECK-NEXT: [[TRY_DISPATCH:%[0-9]+]] = select i1 [[TRY_SELECTED]], i64 [[TRY_INDEX]], i64 -1 +// CHECK: [[RECV_DATA1:%[0-9]+]] = extractvalue %"{{.*}}ChanOp" [[RECV_OP1]], 1 +// CHECK-NEXT: [[RECV_VALUE1:%[0-9]+]] = load %"{{.*}}String", ptr [[RECV_DATA1]] +// CHECK-NEXT: [[RECV_DATA2:%[0-9]+]] = extractvalue %"{{.*}}ChanOp" [[RECV_OP2]], 1 +// CHECK-NEXT: [[RECV_VALUE2:%[0-9]+]] = load %"{{.*}}String", ptr [[RECV_DATA2]] +// CHECK: [[RECV_RESULT0:%[0-9]+]] = insertvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } undef, i64 [[TRY_DISPATCH]], 0 +// CHECK-NEXT: [[RECV_RESULT1:%[0-9]+]] = insertvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT0]], i1 [[TRY_OK]], 1 +// CHECK-NEXT: [[RECV_RESULT2:%[0-9]+]] = insertvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT1]], %"{{.*}}String" [[RECV_VALUE1]], 2 +// CHECK-NEXT: [[RECV_RESULT:%[0-9]+]] = insertvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT2]], %"{{.*}}String" [[RECV_VALUE2]], 3 +// CHECK-NEXT: [[RECV_CASE:%[0-9]+]] = extractvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT]], 0 +// CHECK-NEXT: [[RECV_IS_CASE0:%[0-9]+]] = icmp eq i64 [[RECV_CASE]], 0 +// CHECK: [[RECV_PRINT1:%[0-9]+]] = extractvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT]], 2 +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[RECV_PRINT1]]) +// CHECK: [[RECV_IS_CASE1:%[0-9]+]] = icmp eq i64 [[RECV_CASE]], 1 +// CHECK: [[RECV_PRINT2:%[0-9]+]] = extractvalue { i64, i1, %"{{.*}}String", %"{{.*}}String" } [[RECV_RESULT]], 3 +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[RECV_PRINT2]]) +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @[[EXIT_TEXT]], i64 4 }) +// CHECK-LABEL: define void @"main.recv$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[RECV1_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[RECV1_CH_SLOT:%[0-9]+]] = extractvalue { ptr } [[RECV1_ENV]], 0 +// CHECK-NEXT: [[RECV1_CH:%[0-9]+]] = load ptr, ptr [[RECV1_CH_SLOT]] +// CHECK: store %"{{.*}}String" { ptr @[[CH1_TEXT]], i64 3 }, ptr [[RECV1_VALUE:%[0-9]+]] +// CHECK-NEXT: call i1 @"{{.*}}ChanSend"(ptr [[RECV1_CH]], ptr [[RECV1_VALUE]], i64 16) +// CHECK-LABEL: define void @"main.recv$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[RECV2_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[RECV2_CH_SLOT:%[0-9]+]] = extractvalue { ptr } [[RECV2_ENV]], 0 +// CHECK-NEXT: [[RECV2_CH:%[0-9]+]] = load ptr, ptr [[RECV2_CH_SLOT]] +// CHECK: store %"{{.*}}String" { ptr @[[CH2_TEXT]], i64 3 }, ptr [[RECV2_VALUE:%[0-9]+]] +// CHECK-NEXT: call i1 @"{{.*}}ChanSend"(ptr [[RECV2_CH]], ptr [[RECV2_VALUE]], i64 16) +// CHECK-LABEL: define void @main.send(){{.*}} { +// CHECK: [[SEND_CH1_OBJ:%[0-9]+]] = call ptr @"{{.*}}NewChan"(i64 8, i64 0) +// CHECK: [[SEND_CH2_OBJ:%[0-9]+]] = call ptr @"{{.*}}NewChan"(i64 8, i64 0) +// CHECK: [[SEND_CH1:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK-NEXT: [[SEND_CH2:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: store i64 100, ptr [[SEND_BUF1:%[0-9]+]] +// CHECK-NEXT: [[SEND_OP1_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[SEND_CH1]], 0 +// CHECK-NEXT: [[SEND_OP1_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP1_0]], ptr [[SEND_BUF1]], 1 +// CHECK-NEXT: [[SEND_OP1_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP1_1]], i32 8, 2 +// CHECK-NEXT: [[SEND_OP1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP1_2]], i1 true, 3 +// CHECK: store i64 200, ptr [[SEND_BUF2:%[0-9]+]] +// CHECK-NEXT: [[SEND_OP2_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[SEND_CH2]], 0 +// CHECK-NEXT: [[SEND_OP2_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP2_0]], ptr [[SEND_BUF2]], 1 +// CHECK-NEXT: [[SEND_OP2_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP2_1]], i32 8, 2 +// CHECK-NEXT: [[SEND_OP2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[SEND_OP2_2]], i1 true, 3 +// CHECK: store %"{{.*}}ChanOp" [[SEND_OP1]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}ChanOp" [[SEND_OP2]], ptr %{{[0-9]+}} +// CHECK: [[SEND_CASES:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 2, 2 +// CHECK-NEXT: [[SEND_SELECT:%[0-9]+]] = call { i64, i1 } @"{{.*}}Select"(%"{{.*}}Slice" [[SEND_CASES]]) +// CHECK-NEXT: [[SEND_CASE:%[0-9]+]] = extractvalue { i64, i1 } [[SEND_SELECT]], 0 +// CHECK: [[SEND_DISPATCH:%[0-9]+]] = extractvalue { i64, i1 } %{{[0-9]+}}, 0 +// CHECK-NEXT: [[SEND_IS_CASE0:%[0-9]+]] = icmp eq i64 [[SEND_DISPATCH]], 0 +// CHECK: [[SEND_IS_CASE1:%[0-9]+]] = icmp eq i64 [[SEND_DISPATCH]], 1 +// CHECK-LABEL: define void @"main.send$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[SEND1_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[SEND1_CH_SLOT:%[0-9]+]] = extractvalue { ptr } [[SEND1_ENV]], 0 +// CHECK-NEXT: [[SEND1_CH:%[0-9]+]] = load ptr, ptr [[SEND1_CH_SLOT]] +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[SEND1_CH]], ptr [[SEND1_BUF:%[0-9]+]], i64 8) +// CHECK-NEXT: [[SEND1_VALUE:%[0-9]+]] = load i64, ptr [[SEND1_BUF]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[SEND1_VALUE]]) +// CHECK-LABEL: define void @"main.send$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[SEND2_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[SEND2_CH_SLOT:%[0-9]+]] = extractvalue { ptr } [[SEND2_ENV]], 0 +// CHECK-NEXT: [[SEND2_CH:%[0-9]+]] = load ptr, ptr [[SEND2_CH_SLOT]] +// CHECK: call i1 @"{{.*}}ChanRecv"(ptr [[SEND2_CH]], ptr [[SEND2_BUF:%[0-9]+]], i64 8) +// CHECK-NEXT: [[SEND2_VALUE:%[0-9]+]] = load i64, ptr [[SEND2_BUF]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[SEND2_VALUE]]) func main() { send() @@ -49,307 +144,3 @@ func recv() { } } } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.send() -// CHECK-NEXT: call void @main.recv() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.recv(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 16, i64 0) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 16, i64 0) -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %5 = getelementptr inbounds { ptr }, ptr %4, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } { ptr @"main.recv$1", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %8 = getelementptr inbounds { { ptr, ptr } }, ptr %7, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %6, ptr %8, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %7, i64 0) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %10 = getelementptr inbounds { ptr }, ptr %9, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %10, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } { ptr @"main.recv$2", ptr undef }, ptr %9, 1 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds { { ptr, ptr } }, ptr %12, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %11, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$2", ptr %12, i64 0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_0 -// CHECK-NEXT: %14 = phi i64 [ 0, %_llgo_0 ], [ %50, %_llgo_4 ] -// CHECK-NEXT: %15 = icmp slt i64 %14, 2 -// CHECK-NEXT: br i1 %15, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %16 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %17 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %18 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %19 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %19, i8 0, i64 16, i1 false) -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %16, 0 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %20, ptr %19, 1 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %21, i32 16, 2 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %22, i1 false, 3 -// CHECK-NEXT: %24 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %24, i8 0, i64 16, i1 false) -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %17, 0 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %25, ptr %24, 1 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %26, i32 16, 2 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %27, i1 false, 3 -// CHECK-NEXT: %29 = alloca i8, i64 48, align 1 -// CHECK-NEXT: %30 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %29, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %23, ptr %30, align 8 -// CHECK-NEXT: %31 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %29, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %28, ptr %31, align 8 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %29, 0 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %32, i64 2, 1 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %33, i64 2, 2 -// CHECK-NEXT: %35 = call { i64, i1, i1 } @"{{.*}}/runtime/internal/runtime.TrySelect"(%"{{.*}}/runtime/internal/runtime.Slice" %34) -// CHECK-NEXT: %36 = extractvalue { i64, i1, i1 } %35, 0 -// CHECK-NEXT: %37 = extractvalue { i64, i1, i1 } %35, 1 -// CHECK-NEXT: %38 = extractvalue { i64, i1, i1 } %35, 2 -// CHECK-NEXT: %39 = select i1 %38, i64 %36, i64 -1 -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %23, 1 -// CHECK-NEXT: %41 = load %"{{.*}}/runtime/internal/runtime.String", ptr %40, align 8 -// CHECK-NEXT: %42 = extractvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %28, 1 -// CHECK-NEXT: %43 = load %"{{.*}}/runtime/internal/runtime.String", ptr %42, align 8 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %18) -// CHECK-NEXT: %44 = insertvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } undef, i64 %39, 0 -// CHECK-NEXT: %45 = insertvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %44, i1 %37, 1 -// CHECK-NEXT: %46 = insertvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %45, %"{{.*}}/runtime/internal/runtime.String" %41, 2 -// CHECK-NEXT: %47 = insertvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %46, %"{{.*}}/runtime/internal/runtime.String" %43, 3 -// CHECK-NEXT: %48 = extractvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %47, 0 -// CHECK-NEXT: %49 = icmp eq i64 %48, 0 -// CHECK-NEXT: br i1 %49, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_8, %_llgo_7, %_llgo_5 -// CHECK-NEXT: %50 = add i64 %14, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_2 -// CHECK-NEXT: %51 = extractvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %47, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %51) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_2 -// CHECK-NEXT: %52 = icmp eq i64 %48, 1 -// CHECK-NEXT: br i1 %52, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %53 = extractvalue { i64, i1, %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.String" } %47, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %53) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.recv$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %5, align 8 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %3, ptr %5, i64 16) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.recv$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %5, align 8 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %3, ptr %5, i64 16) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.send(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %5 = getelementptr inbounds { ptr }, ptr %4, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } { ptr @"main.send$1", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %8 = getelementptr inbounds { { ptr, ptr } }, ptr %7, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %6, ptr %8, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$3", ptr %7, i64 0) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %10 = getelementptr inbounds { ptr }, ptr %9, i32 0, i32 0 -// CHECK-NEXT: store ptr %2, ptr %10, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } { ptr @"main.send$2", ptr undef }, ptr %9, 1 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds { { ptr, ptr } }, ptr %12, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %11, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$4", ptr %12, i64 0) -// CHECK-NEXT: %14 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %15 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %16 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %17 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %17, i8 0, i64 8, i1 false) -// CHECK-NEXT: store i64 100, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %14, 0 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %18, ptr %17, 1 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %19, i32 8, 2 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %20, i1 true, 3 -// CHECK-NEXT: %22 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %22, i8 0, i64 8, i1 false) -// CHECK-NEXT: store i64 200, ptr %22, align 8 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %15, 0 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %23, ptr %22, 1 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %24, i32 8, 2 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %25, i1 true, 3 -// CHECK-NEXT: %27 = alloca i8, i64 48, align 1 -// CHECK-NEXT: %28 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %27, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %21, ptr %28, align 8 -// CHECK-NEXT: %29 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %27, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %26, ptr %29, align 8 -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %27, 0 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, i64 2, 1 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, i64 2, 2 -// CHECK-NEXT: %33 = call { i64, i1 } @"{{.*}}/runtime/internal/runtime.Select"(%"{{.*}}/runtime/internal/runtime.Slice" %32) -// CHECK-NEXT: %34 = extractvalue { i64, i1 } %33, 0 -// CHECK-NEXT: %35 = extractvalue { i64, i1 } %33, 1 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %16) -// CHECK-NEXT: %36 = insertvalue { i64, i1 } undef, i64 %34, 0 -// CHECK-NEXT: %37 = insertvalue { i64, i1 } %36, i1 %35, 1 -// CHECK-NEXT: %38 = extractvalue { i64, i1 } %37, 0 -// CHECK-NEXT: %39 = icmp eq i64 %38, 0 -// CHECK-NEXT: br i1 %39, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %40 = icmp eq i64 %38, 1 -// CHECK-NEXT: br i1 %40, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %41 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 31 }, ptr %41, align 8 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %41, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %42) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.send$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 8, i1 false) -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %3, ptr %5, i64 8) -// CHECK-NEXT: %7 = load i64, ptr %5, align 8 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.send$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca i64, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 8, i1 false) -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %3, ptr %5, i64 8) -// CHECK-NEXT: %7 = load i64, ptr %5, align 8 -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$3"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$4"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } diff --git a/cl/_testgo/selects/in.go b/cl/_testgo/selects/in.go index a271116251..96e7be7a66 100644 --- a/cl/_testgo/selects/in.go +++ b/cl/_testgo/selects/in.go @@ -1,13 +1,60 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [4 x i8] c"c1<-", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [4 x i8] c"<-c2", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [4 x i8] c"<-c4", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [31 x i8] c"blocking select matched no case", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [4 x i8] c"<-c1", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [4 x i8] c"c2<-", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [4 x i8] c"<-c3", align 1{{$}} +// Select cases are nondeterministic at runtime; check only that both the main +// function and its goroutine lower their case table through runtime.Select. +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[C1:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) +// CHECK: [[C2:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) +// CHECK: [[C3:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) +// CHECK: [[C4:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) +// CHECK: [[MAIN_CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr [[MAIN_ENV:%[0-9]+]], 1 +// CHECK: store { ptr, ptr } [[MAIN_CLOSURE]], ptr %{{[0-9]+}} +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %{{[0-9]+}}, i64 0) +// CHECK: [[MAIN_C1:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr [[MAIN_C1]], ptr [[C1_VALUE:%[0-9]+]], i64 0) +// CHECK: [[MAIN_C2:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: [[MAIN_RECV2_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[MAIN_C2]], 0 +// CHECK-NEXT: [[MAIN_RECV2_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV2_0]], ptr [[MAIN_RECV2_BUF:%[0-9]+]], 1 +// CHECK-NEXT: [[MAIN_RECV2_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV2_1]], i32 0, 2 +// CHECK-NEXT: [[MAIN_RECV2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV2_2]], i1 false, 3 +// CHECK: [[MAIN_RECV4_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[C4]], 0 +// CHECK-NEXT: [[MAIN_RECV4_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV4_0]], ptr [[MAIN_RECV4_BUF:%[0-9]+]], 1 +// CHECK-NEXT: [[MAIN_RECV4_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV4_1]], i32 0, 2 +// CHECK-NEXT: [[MAIN_RECV4:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[MAIN_RECV4_2]], i1 false, 3 +// CHECK: store %"{{.*}}ChanOp" [[MAIN_RECV2]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}ChanOp" [[MAIN_RECV4]], ptr %{{[0-9]+}} +// CHECK: [[MAIN_CASES:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 2, 2 +// CHECK-NEXT: [[MAIN_SELECT:%[0-9]+]] = call { i64, i1 } @"{{.*}}/runtime/internal/runtime.Select"(%"{{.*}}Slice" [[MAIN_CASES]]) +// CHECK-NEXT: [[MAIN_SELECTED:%[0-9]+]] = extractvalue { i64, i1 } [[MAIN_SELECT]], 0 +// CHECK: [[MAIN_DISPATCH:%[0-9]+]] = extractvalue { i64, i1, {}, {} } %{{[0-9]+}}, 0 +// CHECK-NEXT: [[MAIN_CASE0:%[0-9]+]] = icmp eq i64 [[MAIN_DISPATCH]], 0 +// CHECK: [[MAIN_CASE1:%[0-9]+]] = icmp eq i64 [[MAIN_DISPATCH]], 1 +// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[GOR_ENV:%[0-9]+]] = load { ptr, ptr, ptr }, ptr %0 +// CHECK-NEXT: [[GOR_C1_SLOT:%[0-9]+]] = extractvalue { ptr, ptr, ptr } [[GOR_ENV]], 0 +// CHECK-NEXT: [[GOR_C1:%[0-9]+]] = load ptr, ptr [[GOR_C1_SLOT]] +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr [[GOR_C1]], ptr [[GOR_C1_BUF:%[0-9]+]], i64 0) +// CHECK: [[GOR_C2_SLOT:%[0-9]+]] = extractvalue { ptr, ptr, ptr } [[GOR_ENV]], 1 +// CHECK-NEXT: [[GOR_C2:%[0-9]+]] = load ptr, ptr [[GOR_C2_SLOT]] +// CHECK-NEXT: [[GOR_C3_SLOT:%[0-9]+]] = extractvalue { ptr, ptr, ptr } [[GOR_ENV]], 2 +// CHECK-NEXT: [[GOR_C3:%[0-9]+]] = load ptr, ptr [[GOR_C3_SLOT]] +// CHECK: [[GOR_SEND2_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[GOR_C2]], 0 +// CHECK-NEXT: [[GOR_SEND2_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_SEND2_0]], ptr [[GOR_SEND2_BUF:%[0-9]+]], 1 +// CHECK-NEXT: [[GOR_SEND2_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_SEND2_1]], i32 0, 2 +// CHECK-NEXT: [[GOR_SEND2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_SEND2_2]], i1 true, 3 +// CHECK: [[GOR_RECV3_0:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" undef, ptr [[GOR_C3]], 0 +// CHECK-NEXT: [[GOR_RECV3_1:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_RECV3_0]], ptr [[GOR_RECV3_BUF:%[0-9]+]], 1 +// CHECK-NEXT: [[GOR_RECV3_2:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_RECV3_1]], i32 0, 2 +// CHECK-NEXT: [[GOR_RECV3:%[0-9]+]] = insertvalue %"{{.*}}ChanOp" [[GOR_RECV3_2]], i1 false, 3 +// CHECK: store %"{{.*}}ChanOp" [[GOR_SEND2]], ptr %{{[0-9]+}} +// CHECK: store %"{{.*}}ChanOp" [[GOR_RECV3]], ptr %{{[0-9]+}} +// CHECK: [[GOR_CASES:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 2, 2 +// CHECK-NEXT: [[GOR_SELECT:%[0-9]+]] = call { i64, i1 } @"{{.*}}/runtime/internal/runtime.Select"(%"{{.*}}Slice" [[GOR_CASES]]) +// CHECK-NEXT: [[GOR_SELECTED:%[0-9]+]] = extractvalue { i64, i1 } [[GOR_SELECT]], 0 +// CHECK: [[GOR_DISPATCH:%[0-9]+]] = extractvalue { i64, i1, {} } %{{[0-9]+}}, 0 +// CHECK-NEXT: [[GOR_CASE0:%[0-9]+]] = icmp eq i64 [[GOR_DISPATCH]], 0 +// CHECK: [[GOR_CASE1:%[0-9]+]] = icmp eq i64 [[GOR_DISPATCH]], 1 func main() { c1 := make(chan struct{}, 1) @@ -37,205 +84,3 @@ func main() { println("<-c4") } } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) -// CHECK-NEXT: store ptr %3, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) -// CHECK-NEXT: store ptr %5, ptr %4, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 0, i64 1) -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: %8 = getelementptr inbounds { ptr, ptr, ptr }, ptr %7, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds { ptr, ptr, ptr }, ptr %7, i32 0, i32 1 -// CHECK-NEXT: store ptr %2, ptr %9, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds { ptr, ptr, ptr }, ptr %7, i32 0, i32 2 -// CHECK-NEXT: store ptr %4, ptr %10, align 8 -// CHECK-NEXT: %11 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %7, 1 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds { { ptr, ptr } }, ptr %12, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %11, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %12, i64 0) -// CHECK-NEXT: %14 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %15 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %16 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %16, i8 0, i64 0, i1 false) -// CHECK-NEXT: store {} zeroinitializer, ptr %16, align 1 -// CHECK-NEXT: %17 = call i1 @"{{.*}}/runtime/internal/runtime.ChanSend"(ptr %14, ptr %16, i64 0) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %19 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %20 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %20, i8 0, i64 0, i1 false) -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %18, 0 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %21, ptr %20, 1 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %22, i32 0, 2 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %23, i1 false, 3 -// CHECK-NEXT: %25 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %25, i8 0, i64 0, i1 false) -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %6, 0 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %26, ptr %25, 1 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %27, i32 0, 2 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %28, i1 false, 3 -// CHECK-NEXT: %30 = alloca i8, i64 48, align 1 -// CHECK-NEXT: %31 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %30, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %24, ptr %31, align 8 -// CHECK-NEXT: %32 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %30, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %29, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %30, 0 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %33, i64 2, 1 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, i64 2, 2 -// CHECK-NEXT: %36 = call { i64, i1 } @"{{.*}}/runtime/internal/runtime.Select"(%"{{.*}}/runtime/internal/runtime.Slice" %35) -// CHECK-NEXT: %37 = extractvalue { i64, i1 } %36, 0 -// CHECK-NEXT: %38 = extractvalue { i64, i1 } %36, 1 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %24, 1 -// CHECK-NEXT: %40 = icmp eq ptr %39, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %40) -// CHECK-NEXT: %41 = extractvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %29, 1 -// CHECK-NEXT: %42 = icmp eq ptr %41, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %42) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %19) -// CHECK-NEXT: %43 = insertvalue { i64, i1, {}, {} } undef, i64 %37, 0 -// CHECK-NEXT: %44 = insertvalue { i64, i1, {}, {} } %43, i1 %38, 1 -// CHECK-NEXT: %45 = insertvalue { i64, i1, {}, {} } %44, {} zeroinitializer, 2 -// CHECK-NEXT: %46 = insertvalue { i64, i1, {}, {} } %45, {} zeroinitializer, 3 -// CHECK-NEXT: %47 = extractvalue { i64, i1, {}, {} } %46, 0 -// CHECK-NEXT: %48 = icmp eq i64 %47, 0 -// CHECK-NEXT: br i1 %48, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %49 = icmp eq i64 %47, 1 -// CHECK-NEXT: br i1 %49, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: %50 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %50, align 8 -// CHECK-NEXT: %51 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %50, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %51) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr, ptr, ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr, ptr, ptr } %1, 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %5 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %5, i8 0, i64 0, i1 false) -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.ChanRecv"(ptr %3, ptr %5, i64 0) -// CHECK-NEXT: %7 = icmp eq ptr %5, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %7) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %8 = extractvalue { ptr, ptr, ptr } %1, 1 -// CHECK-NEXT: %9 = load ptr, ptr %8, align 8 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr, ptr } %1, 2 -// CHECK-NEXT: %11 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %12 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: %13 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %13, i8 0, i64 0, i1 false) -// CHECK-NEXT: store {} zeroinitializer, ptr %13, align 1 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %9, 0 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %14, ptr %13, 1 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %15, i32 0, 2 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %16, i1 true, 3 -// CHECK-NEXT: %18 = alloca {}, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 0, i1 false) -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" undef, ptr %11, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %19, ptr %18, 1 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %20, i32 0, 2 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %21, i1 false, 3 -// CHECK-NEXT: %23 = alloca i8, i64 48, align 1 -// CHECK-NEXT: %24 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %23, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %17, ptr %24, align 8 -// CHECK-NEXT: %25 = getelementptr %"{{.*}}/runtime/internal/runtime.ChanOp", ptr %23, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.ChanOp" %22, ptr %25, align 8 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %23, 0 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, i64 2, 1 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %27, i64 2, 2 -// CHECK-NEXT: %29 = call { i64, i1 } @"{{.*}}/runtime/internal/runtime.Select"(%"{{.*}}/runtime/internal/runtime.Slice" %28) -// CHECK-NEXT: %30 = extractvalue { i64, i1 } %29, 0 -// CHECK-NEXT: %31 = extractvalue { i64, i1 } %29, 1 -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.ChanOp" %22, 1 -// CHECK-NEXT: %33 = icmp eq ptr %32, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %33) -// CHECK-NEXT: call void @llvm.stackrestore.p0(ptr %12) -// CHECK-NEXT: %34 = insertvalue { i64, i1, {} } undef, i64 %30, 0 -// CHECK-NEXT: %35 = insertvalue { i64, i1, {} } %34, i1 %31, 1 -// CHECK-NEXT: %36 = insertvalue { i64, i1, {} } %35, {} zeroinitializer, 2 -// CHECK-NEXT: %37 = extractvalue { i64, i1, {} } %36, 0 -// CHECK-NEXT: %38 = icmp eq i64 %37, 0 -// CHECK-NEXT: br i1 %38, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_4, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %39 = icmp eq i64 %37, 1 -// CHECK-NEXT: br i1 %39, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: %40 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 31 }, ptr %40, align 8 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %40, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %41) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { { ptr, ptr } } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %2, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %2, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %4) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %3) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } diff --git a/cl/_testgo/sigsegv/in.go b/cl/_testgo/sigsegv/in.go index 0daf701773..09652641a5 100644 --- a/cl/_testgo/sigsegv/in.go +++ b/cl/_testgo/sigsegv/in.go @@ -10,7 +10,7 @@ func f() *T { } // CHECK: ; Function Attrs: null_pointer_is_valid -// CHECK: define void @"main.init#1"() #0 { +// CHECK-LABEL: define void @"main.init#1"() #0 { func init() { println("init") defer func() { @@ -19,7 +19,9 @@ func init() { println("recover", e.Error()) } }() - // CHECK: call ptr @main.f() + // CHECK: %[[NIL_T:[0-9]+]] = call ptr @main.f() + // CHECK: %[[FIELD:[0-9]+]] = getelementptr inbounds %main.T, ptr %[[NIL_T]], i32 0, i32 0 + // CHECK: load i64, ptr %[[FIELD]] println(f().s) } diff --git a/cl/_testgo/strucintf/in.go b/cl/_testgo/strucintf/in.go index 4fd3284217..97cf4210ce 100644 --- a/cl/_testgo/strucintf/in.go +++ b/cl/_testgo/strucintf/in.go @@ -4,55 +4,62 @@ package main import "github.com/goplus/llgo/cl/_testdata/foo" // CHECK-LABEL: define %"{{.*}}eface" @main.Foo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca { i64 }, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds { i64 }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = load { i64 }, ptr %0, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store { i64 } %2, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}eface" { ptr @"{{.*}}/cl/_testgo/strucintf.struct{{.*}}", ptr undef }, ptr %3, 1 -// CHECK-NEXT: ret %"{{.*}}eface" %4 +// CHECK: store i64 1, ptr %{{[0-9]+}} +// CHECK: [[FOO_STRUCT:%[0-9]+]] = load { i64 }, ptr %{{[0-9]+}} +// CHECK-NEXT: [[FOO_BOX:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store { i64 } [[FOO_STRUCT]], ptr [[FOO_BOX]] +// CHECK-NEXT: [[FOO_EFACE:%[0-9]+]] = insertvalue %"{{.*}}eface" { ptr [[LOCAL_STRUCT:@"[^"]*/cl/_testgo/strucintf\.struct\$[^"]+"]], ptr undef }, ptr [[FOO_BOX]], 1 +// CHECK-NEXT: ret %"{{.*}}eface" [[FOO_EFACE]] func Foo() any { return struct{ v int }{1} } // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call %"{{.*}}eface" @main.Foo() - // CHECK: icmp eq ptr %{{[0-9]+}}, @"{{.*}}/cl/_testgo/strucintf.struct{{.*}}" + // CHECK: [[LOCAL_VALUE:%[0-9]+]] = call %"{{.*}}eface" @main.Foo() + // CHECK: [[LOCAL_TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[LOCAL_VALUE]], 0 + // CHECK-NEXT: [[LOCAL_MATCH:%[0-9]+]] = icmp eq ptr [[LOCAL_TYPE]], [[LOCAL_STRUCT]] + // CHECK-NEXT: br i1 [[LOCAL_MATCH]], label %{{.*}}, label %{{.*}} v := Foo() if x, ok := v.(struct{ v int }); ok { - // CHECK: call void @"{{.*}}PrintInt"(i64 %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) println(x.v) } else { println("Foo: not ok") } - // CHECK: call %"{{.*}}eface" @"{{.*}}foo.Bar"() - // CHECK: icmp eq ptr %{{[0-9]+}}, @"{{.*}}struct{{.*}}" + // CHECK: [[BAR_VALUE:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}foo.Bar"() + // CHECK: [[BAR_TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[BAR_VALUE]], 0 + // CHECK-NEXT: [[BAR_MATCH:%[0-9]+]] = icmp eq ptr [[BAR_TYPE]], [[BAR_STRUCT:@"_llgo_struct\$[^"]+"]] + // CHECK-NEXT: br i1 [[BAR_MATCH]], label %{{.*}}, label %{{.*}} bar := foo.Bar() if x, ok := bar.(struct{ V int }); ok { - // CHECK: call void @"{{.*}}PrintInt"(i64 %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) println(x.V) } else { println("Bar: not ok") } - // CHECK: call %"{{.*}}eface" @"{{.*}}foo.F"() - // CHECK: icmp eq ptr %{{[0-9]+}}, @"{{.*}}/cl/_testgo/strucintf.struct{{.*}}" + // CHECK: [[F_VALUE:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}foo.F"() + // CHECK-NEXT: [[F_TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[F_VALUE]], 0 + // CHECK-NEXT: [[F_MATCH:%[0-9]+]] = icmp eq ptr [[F_TYPE]], [[LOCAL_STRUCT]] + // CHECK-NEXT: br i1 [[F_MATCH]], label %{{.*}}, label %{{.*}} if x, ok := foo.F().(struct{ v int }); ok { - // CHECK: call void @"{{.*}}PrintInt"(i64 %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) println(x.v) } else { - // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 9 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) println("F: not ok") } } + +// CHECK: [[LOCAL_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[LOCAL_VALUE]], 1 +// CHECK-NEXT: [[LOCAL_STRUCT_VALUE:%[0-9]+]] = load { i64 }, ptr [[LOCAL_DATA]] +// CHECK: [[LOCAL_OK:%[0-9]+]] = extractvalue { { i64 }, i1 } %{{[0-9]+}}, 1 +// CHECK-NEXT: br i1 [[LOCAL_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[BAR_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[BAR_VALUE]], 1 +// CHECK-NEXT: [[BAR_STRUCT_VALUE:%[0-9]+]] = load { i64 }, ptr [[BAR_DATA]] +// CHECK: [[BAR_OK:%[0-9]+]] = extractvalue { { i64 }, i1 } %{{[0-9]+}}, 1 +// CHECK-NEXT: br i1 [[BAR_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[F_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[F_VALUE]], 1 +// CHECK-NEXT: [[F_STRUCT_VALUE:%[0-9]+]] = load { i64 }, ptr [[F_DATA]] +// CHECK: [[F_OK:%[0-9]+]] = extractvalue { { i64 }, i1 } %{{[0-9]+}}, 1 +// CHECK-NEXT: br i1 [[F_OK]], label %{{.*}}, label %{{.*}} diff --git a/cl/_testgo/struczero/in.go b/cl/_testgo/struczero/in.go index 4e210cf0df..3e067d9f91 100644 --- a/cl/_testgo/struczero/in.go +++ b/cl/_testgo/struczero/in.go @@ -1,85 +1,238 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.Bar\E|\Qmain.Foo\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/llgo/cl/_testdata/foo" +// CHECK: {{^}}@[[GLOB11:[0-9]+]] = private unnamed_addr constant [6 x i8] c"notOk:", align 1{{$}} + type bar struct { pb *byte f float32 } -// CHECK-LABEL: define { %"{{.*}}foo.Foo", i1 } @main.Bar(%"{{.*}}eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}eface" %0, 0 -// CHECK-NEXT: %2 = icmp eq ptr %1, @"_llgo_{{.*}}foo.Foo" -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK: _llgo_1: -// CHECK-NEXT: %3 = extractvalue %"{{.*}}eface" %0, 1 -// CHECK-NEXT: %4 = load %"{{.*}}foo.Foo", ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { %"{{.*}}foo.Foo", i1 } undef, %"{{.*}}foo.Foo" %4, 0 -// CHECK-NEXT: %6 = insertvalue { %"{{.*}}foo.Foo", i1 } %5, i1 true, 1 -// CHECK: _llgo_3: -// CHECK-NEXT: %7 = phi { %"{{.*}}foo.Foo", i1 } [ %6, %_llgo_1 ], [ zeroinitializer, %_llgo_2 ] -// CHECK-NEXT: %8 = extractvalue { %"{{.*}}foo.Foo", i1 } %7, 0 -// CHECK-NEXT: %9 = extractvalue { %"{{.*}}foo.Foo", i1 } %7, 1 -// CHECK-NEXT: %10 = insertvalue { %"{{.*}}foo.Foo", i1 } undef, %"{{.*}}foo.Foo" %8, 0 -// CHECK-NEXT: %11 = insertvalue { %"{{.*}}foo.Foo", i1 } %10, i1 %9, 1 -// CHECK-NEXT: ret { %"{{.*}}foo.Foo", i1 } %11 +// A comma-ok assertion must pair the asserted value with its success bit and +// use an all-zero pair on failure, preserving zero values across packages. func Bar(v any) (ret foo.Foo, ok bool) { ret, ok = v.(foo.Foo) return } -// CHECK-LABEL: define { %main.bar, i1 } @main.Foo(%"{{.*}}eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}eface" %0, 0 -// CHECK-NEXT: %2 = icmp eq ptr %1, @_llgo_main.bar -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK: _llgo_1: -// CHECK-NEXT: %3 = extractvalue %"{{.*}}eface" %0, 1 -// CHECK-NEXT: %4 = load %main.bar, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { %main.bar, i1 } undef, %main.bar %4, 0 -// CHECK-NEXT: %6 = insertvalue { %main.bar, i1 } %5, i1 true, 1 -// CHECK: _llgo_3: -// CHECK-NEXT: %7 = phi { %main.bar, i1 } [ %6, %_llgo_1 ], [ zeroinitializer, %_llgo_2 ] -// CHECK-NEXT: %8 = extractvalue { %main.bar, i1 } %7, 0 -// CHECK-NEXT: %9 = extractvalue { %main.bar, i1 } %7, 1 -// CHECK-NEXT: %10 = insertvalue { %main.bar, i1 } undef, %main.bar %8, 0 -// CHECK-NEXT: %11 = insertvalue { %main.bar, i1 } %10, i1 %9, 1 -// CHECK-NEXT: ret { %main.bar, i1 } %11 func Foo(v any) (ret bar, ok bool) { ret, ok = v.(bar) return } -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call { %main.bar, i1 } @main.Foo(%"{{.*}}eface" zeroinitializer) - // CHECK: call void @"{{.*}}PrintPointer"(ptr %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: %{{[0-9]+}} = fpext float %{{[0-9]+}} to double - // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 6 }) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintBool"(i1 %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) ret, ok := Foo(nil) println(ret.pb, ret.f, "notOk:", !ok) - // CHECK: call ptr @"{{.*}}AllocU"(i64 16) - // CHECK: store %"{{.*}}foo.Foo" zeroinitializer, ptr %{{[0-9]+}}, align 8 - // CHECK: insertvalue %"{{.*}}eface" { ptr @"_llgo_{{.*}}foo.Foo", ptr undef }, ptr %{{[0-9]+}}, 1 - // CHECK: call { %"{{.*}}foo.Foo", i1 } @main.Bar(%"{{.*}}eface" %{{[0-9]+}}) - // CHECK: call ptr @"{{.*}}foo.Foo.Pb"(%"{{.*}}foo.Foo" %{{[0-9]+}}) - // CHECK: call void @"{{.*}}PrintPointer"(ptr %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: %{{[0-9]+}} = fpext float %{{[0-9]+}} to double - // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}PrintBool"(i1 %{{[0-9]+}}) - // CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) - // CHECK-NEXT: ret void ret2, ok2 := Bar(foo.Foo{}) println(ret2.Pb(), ret2.F, ok2) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca { %"{{.*}}/cl/_testdata/foo.Foo", i1 }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca { %main.bar, i1 }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca %main.bar, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: call void @main.Foo(ptr sret({ %main.bar, i1 }) %[[TMP2]], %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load { %main.bar, i1 }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP4]], 0 +// DARWIN-ARM64-NEXT: store %main.bar %[[TMP5]], ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.bar, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { %"{{.*}}/cl/_testdata/foo.Foo", i1 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca { %main.bar, i1 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %main.bar, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP6]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" zeroinitializer, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main.bar, ptr %[[TMP3]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = load float, ptr %[[TMP9]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = xor i1 %[[TMP6]], true +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: call void @main.Foo(ptr sret({ %main.bar, i1 }) %[[TMP5]], ptr %[[TMP8]], ptr %[[TMP10]]) +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load { %main.bar, i1 }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP11]], 0 +// LINUX-AMD64-NEXT: store %main.bar %[[TMP12]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP11]], 1 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %main.bar, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %main.bar, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load float, ptr %[[TMP16]], align 4 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = xor i1 %[[TMP13]], true +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP15]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = fpext float %[[TMP10]] to double +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = fpext float %[[TMP17]] to double +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP19]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB11]], i64 6 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB11]], i64 6 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load i64, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP21]], i64 %[[TMP23]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP11]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP18]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP13]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" zeroinitializer, ptr %[[TMP14]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_{{.*}}/cl/_testdata/foo.Foo", ptr undef }, ptr %[[TMP14]], 1 +// DARWIN-ARM64-NEXT: call void @main.Bar(ptr sret({ %"{{.*}}/cl/_testdata/foo.Foo", i1 }) %[[TMP1]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP15]]) +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = load { %"{{.*}}/cl/_testdata/foo.Foo", i1 }, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP16]], 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP17]], ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP16]], 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP19]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = load [2 x i64], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"([2 x i64] %[[TMP20]]) +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP13]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = load float, ptr %[[TMP22]], align 4 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP21]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = alloca %"{{.*}}/cl/_testdata/foo.Foo", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP24]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" zeroinitializer, ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_{{.*}}/cl/_testdata/foo.Foo", ptr undef }, ptr %[[TMP25]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP26]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP29]], align 8 +// LINUX-AMD64-NEXT: call void @main.Bar(ptr sret({ %"{{.*}}/cl/_testdata/foo.Foo", i1 }) %[[TMP2]], ptr %[[TMP28]], ptr %[[TMP30]]) +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load { %"{{.*}}/cl/_testdata/foo.Foo", i1 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP31]], 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP32]], ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP31]], 1 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP34]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = load ptr, ptr %[[TMP35]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds { ptr, float }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = load float, ptr %[[TMP37]], align 4 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = call ptr @"{{.*}}/cl/_testdata/foo.Foo.Pb"(ptr %[[TMP36]], float %[[TMP38]]) +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = getelementptr inbounds %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP24]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = load float, ptr %[[TMP40]], align 4 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP39]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = fpext float %[[TMP23]] to double +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP24]]) +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = fpext float %[[TMP41]] to double +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %[[TMP42]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP18]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP33]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.Bar( +// DARWIN-ARM64-SAME: ptr sret({ %"{{.*}}/cl/_testdata/foo.Foo", i1 }) %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret({ %"{{.*}}/cl/_testdata/foo.Foo", i1 }) %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = icmp eq ptr %[[TMP2]], @"_llgo_{{.*}}/cl/_testdata/foo.Foo" +// DARWIN-ARM64-NEXT: br i1 %[[TMP3]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = icmp eq ptr %[[TMP7]], @"_llgo_{{.*}}/cl/_testdata/foo.Foo" +// LINUX-AMD64-NEXT: br i1 %[[TMP8]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } undef, %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP6]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load %"{{.*}}/cl/_testdata/foo.Foo", ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } undef, %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP10]], 0 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP11]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: br label %_llgo_[[BB3]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = phi { %"{{.*}}/cl/_testdata/foo.Foo", i1 } [ %[[TMP7]], %_llgo_[[BB1]] ], [ zeroinitializer, %_llgo_[[BB2]] ] +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP8]], 0 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP8]], 1 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } undef, %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP9]], 0 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP11]], i1 %[[TMP10]], 1 +// DARWIN-ARM64-NEXT: store { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP12]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = phi { %"{{.*}}/cl/_testdata/foo.Foo", i1 } [ %[[TMP12]], %_llgo_[[BB1]] ], [ zeroinitializer, %_llgo_[[BB2]] ] +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP13]], 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP13]], 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } undef, %"{{.*}}/cl/_testdata/foo.Foo" %[[TMP14]], 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = insertvalue { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP16]], i1 %[[TMP15]], 1 +// LINUX-AMD64-NEXT: store { %"{{.*}}/cl/_testdata/foo.Foo", i1 } %[[TMP17]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.Foo( +// DARWIN-ARM64-SAME: ptr sret({ %main.bar, i1 }) %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret({ %main.bar, i1 }) %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = icmp eq ptr %[[TMP2]], @_llgo_main.bar +// DARWIN-ARM64-NEXT: br i1 %[[TMP3]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = icmp eq ptr %[[TMP7]], @_llgo_main.bar +// LINUX-AMD64-NEXT: br i1 %[[TMP8]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load %main.bar, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue { %main.bar, i1 } undef, %main.bar %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue { %main.bar, i1 } %[[TMP6]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load %main.bar, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = insertvalue { %main.bar, i1 } undef, %main.bar %[[TMP10]], 0 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = insertvalue { %main.bar, i1 } %[[TMP11]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: br label %_llgo_[[BB3]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = phi { %main.bar, i1 } [ %[[TMP7]], %_llgo_[[BB1]] ], [ zeroinitializer, %_llgo_[[BB2]] ] +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP8]], 0 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP8]], 1 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = insertvalue { %main.bar, i1 } undef, %main.bar %[[TMP9]], 0 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = insertvalue { %main.bar, i1 } %[[TMP11]], i1 %[[TMP10]], 1 +// DARWIN-ARM64-NEXT: store { %main.bar, i1 } %[[TMP12]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = phi { %main.bar, i1 } [ %[[TMP12]], %_llgo_[[BB1]] ], [ zeroinitializer, %_llgo_[[BB2]] ] +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP13]], 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { %main.bar, i1 } %[[TMP13]], 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = insertvalue { %main.bar, i1 } undef, %main.bar %[[TMP14]], 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = insertvalue { %main.bar, i1 } %[[TMP16]], i1 %[[TMP15]], 1 +// LINUX-AMD64-NEXT: store { %main.bar, i1 } %[[TMP17]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testgo/syncmap/in.go b/cl/_testgo/syncmap/in.go index b5c0ccd613..c0fc5f7118 100644 --- a/cl/_testgo/syncmap/in.go +++ b/cl/_testgo/syncmap/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -6,9 +8,9 @@ import ( "sync" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [1 x i8] c"1", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [7 x i8] c"%#v %v\0A", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [1 x i8] c"1", align 1{{$}} +// CHECK: {{^}}@[[GLOB5:[0-9]+]] = private unnamed_addr constant [7 x i8] c"%#v %v\0A", align 1{{$}} func main() { var m sync.Map @@ -22,70 +24,170 @@ func main() { }) } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @fmt.init() -// CHECK-NEXT: call void @sync.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 {{(64|96)}}) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %3, 1 -// CHECK-NEXT: call void @"sync.(*Map).Store"(ptr %0, %"{{.*}}/runtime/internal/runtime.eface" %2, %"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }, ptr %5, align 8 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %5, 1 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %7, 1 -// CHECK-NEXT: call void @"sync.(*Map).Store"(ptr %0, %"{{.*}}/runtime/internal/runtime.eface" %6, %"{{.*}}/runtime/internal/runtime.eface" %8) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 1 }, ptr %9, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %9, 1 -// CHECK-NEXT: %11 = call { %"{{.*}}/runtime/internal/runtime.eface", i1 } @"sync.(*Map).Load"(ptr %0, %"{{.*}}/runtime/internal/runtime.eface" %10) -// CHECK-NEXT: %12 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %11, 0 -// CHECK-NEXT: %13 = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %11, 1 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %15 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %14, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %12, ptr %15, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %14, i64 1 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i1 %13, ptr %17, align 1 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %17, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %18, ptr %16, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %14, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %19, i64 2, 1 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %20, i64 2, 2 -// CHECK-NEXT: %22 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Println(%"{{.*}}/runtime/internal/runtime.Slice" %21) -// CHECK-NEXT: call void @"sync.(*Map).Range"(ptr %0, { ptr, ptr } { ptr @"main.main$1", ptr null }) +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca { %"{{.*}}/runtime/internal/runtime.eface", i1 }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 96) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 5 }, ptr %[[TMP6]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: call void @"sync.(*Map).Store"(ptr %[[TMP3]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]]) +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 1 }, ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP8]], 1 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { %"{{.*}}/runtime/internal/runtime.eface", i1 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 96) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP10]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP10]], 1 +// DARWIN-ARM64-NEXT: call void @"sync.(*Map).Store"(ptr %[[TMP3]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]]) +// CHECK-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 1 }, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 5 }, ptr %[[TMP12]], align 8 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP12]], 1 +// DARWIN-ARM64-NEXT: call void @"sync.(*Map).Load"(ptr sret({ %"{{.*}}/runtime/internal/runtime.eface", i1 }) %[[TMP2]], ptr %[[TMP3]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP13]]) +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = load { %"{{.*}}/runtime/internal/runtime.eface", i1 }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %[[TMP14]], 0 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %[[TMP14]], 1 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP17]], i64 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP15]], ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP17]], i64 1 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) +// DARWIN-ARM64-NEXT: store i1 %[[TMP16]], ptr %[[TMP20]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %[[TMP20]], 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP21]], ptr %[[TMP19]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP17]], 0 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP22]], i64 2, 1 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP23]], i64 2, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP24]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: call void @fmt.Println(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP1]], ptr %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: call void @"sync.(*Map).Range"(ptr %[[TMP3]], { ptr, ptr } { ptr @"main.main$1", ptr null }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP13]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load ptr, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: call void @"sync.(*Map).Store"(ptr %[[TMP9]], ptr %[[TMP15]], ptr %[[TMP17]], ptr %[[TMP19]], ptr %[[TMP21]]) +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 1 }, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP22]], 1 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP23]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP5]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load ptr, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP25]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load ptr, ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load ptr, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: call void @"sync.(*Map).Store"(ptr %[[TMP9]], ptr %[[TMP27]], ptr %[[TMP29]], ptr %[[TMP31]], ptr %[[TMP33]]) +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 1 }, ptr %[[TMP34]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP34]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP35]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = load ptr, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = load ptr, ptr %[[TMP38]], align 8 +// LINUX-AMD64-NEXT: call void @"sync.(*Map).Load"(ptr sret({ %"{{.*}}/runtime/internal/runtime.eface", i1 }) %[[TMP4]], ptr %[[TMP9]], ptr %[[TMP37]], ptr %[[TMP39]]) +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load { %"{{.*}}/runtime/internal/runtime.eface", i1 }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %[[TMP40]], 0 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.eface", i1 } %[[TMP40]], 1 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP43]], i64 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP41]], ptr %[[TMP44]], align 8 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP43]], i64 1 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) +// LINUX-AMD64-NEXT: store i1 %[[TMP42]], ptr %[[TMP46]], align 1 +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef }, ptr %[[TMP46]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP47]], ptr %[[TMP45]], align 8 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP43]], 0 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP48]], i64 2, 1 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP49]], i64 2, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP50]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: call void @fmt.Println(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP2]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.main$1", ptr null }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = load ptr, ptr %[[TMP52]], align 8 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = load ptr, ptr %[[TMP54]], align 8 +// LINUX-AMD64-NEXT: call void @"sync.(*Map).Range"(ptr %[[TMP9]], ptr %[[TMP53]], ptr %[[TMP55]]) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define i1 @"main.main$1"(%"{{.*}}/runtime/internal/runtime.eface" %0, %"{{.*}}/runtime/internal/runtime.eface" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %2, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %2, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %1, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %2, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 2, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, i64 2, 2 -// CHECK-NEXT: %8 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @fmt.Printf(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 7 }, %"{{.*}}/runtime/internal/runtime.Slice" %7) +// CHECK-LABEL: define i1 @"main.main$1"( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]], ptr %[[TMP3:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP4]], i64 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP4]], i64 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], ptr %[[TMP6]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP4]], 0 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], i64 2, 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP8]], i64 2, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: call void @fmt.Printf(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP3]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 7 }, ptr %[[TMP2]]) +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP3]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca { i64, %"{{.*}}/runtime/internal/runtime.iface" }, align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP15]], i64 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]], ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP15]], i64 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP15]], 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP18]], i64 2, 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP19]], i64 2, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 7 }, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = load ptr, ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = load i64, ptr %[[TMP23]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP20]], ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: call void @fmt.Printf(ptr sret({ i64, %"{{.*}}/runtime/internal/runtime.iface" }) %[[TMP14]], ptr %[[TMP22]], i64 %[[TMP24]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load { i64, %"{{.*}}/runtime/internal/runtime.iface" }, ptr %[[TMP14]], align 8 // CHECK-NEXT: ret i1 true // CHECK-NEXT: } diff --git a/cl/_testgo/tpindex/in.go b/cl/_testgo/tpindex/in.go index fde18a07e5..0fcb5edd9b 100644 --- a/cl/_testgo/tpindex/in.go +++ b/cl/_testgo/tpindex/in.go @@ -1,19 +1,12 @@ // LITTEST package main -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 40) - // CHECK: store i64 1, ptr %1, align 8 - // CHECK: store i64 3, ptr %2, align 8 - // CHECK: store i64 5, ptr %3, align 8 - // CHECK: store i64 2, ptr %4, align 8 - // CHECK: store i64 4, ptr %5, align 8 - // CHECK: call i64 @"main.index[int]"(%"{{.*}}Slice" %8, i64 3) - // CHECK: call void @"{{.*}}PrintInt"(i64 %9) - // CHECK: call i64 @"main.index[int]"(%"{{.*}}Slice" %8, i64 6) - // CHECK: call void @"{{.*}}PrintInt"(i64 %10) - // CHECK: ret void + // CHECK-LABEL: define void @main.main(){{.*}} { + // CHECK: [[INDEX3:%[0-9]+]] = call i64 @"main.index[int]"(%"{{.*}}Slice" %{{[0-9]+}}, i64 3) + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[INDEX3]]) + // CHECK: [[INDEX6:%[0-9]+]] = call i64 @"main.index[int]"(%"{{.*}}Slice" %{{[0-9]+}}, i64 6) + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[INDEX6]]) s := []int{1, 3, 5, 2, 4} println(index(s, 3)) println(index(s, 6)) @@ -22,33 +15,15 @@ func main() { // The index function returns the index of the first occurrence of v in s, // or -1 if not present. // CHECK-LABEL: define linkonce i64 @"main.index[int]"(%"{{.*}}Slice" %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue %"{{.*}}Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: -// CHECK-NEXT: %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] -// CHECK-NEXT: %4 = add i64 %3, 1 -// CHECK-NEXT: %5 = icmp slt i64 %4, %2 -// CHECK-NEXT: br i1 %5, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: -// CHECK-NEXT: %6 = extractvalue %"{{.*}}Slice" %0, 0 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}Slice" %0, 1 -// CHECK-NEXT: %8 = icmp slt i64 %4, 0 -// CHECK-NEXT: %9 = icmp uge i64 %4, %7 -// CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}CheckIndexRange"(i1 %10, {{.*}}) -// CHECK-NEXT: %11 = getelementptr inbounds i64, ptr %6, i64 %4 -// CHECK-NEXT: %12 = load i64, ptr %11, align 8 -// CHECK-NEXT: %13 = icmp eq i64 %1, %12 -// CHECK-NEXT: br i1 %13, label %_llgo_4, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: -// CHECK-NEXT: ret i64 -1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: -// CHECK-NEXT: ret i64 %4 +// CHECK: [[INDEX_POS:%[0-9]+]] = add i64 %{{[0-9]+}}, 1 +// CHECK: [[INDEX_DATA:%[0-9]+]] = extractvalue %"{{.*}}Slice" %0, 0 +// CHECK: [[INDEX_LEN:%[0-9]+]] = extractvalue %"{{.*}}Slice" %0, 1 +// CHECK: call void @"{{.*}}CheckIndexRange"(i1 %{{[0-9]+}}, i64 [[INDEX_POS]], i1 true, i64 [[INDEX_LEN]]) +// CHECK-NEXT: [[INDEX_ITEM_PTR:%[0-9]+]] = getelementptr inbounds i64, ptr [[INDEX_DATA]], i64 [[INDEX_POS]] +// CHECK-NEXT: [[INDEX_ITEM:%[0-9]+]] = load i64, ptr [[INDEX_ITEM_PTR]] +// CHECK-NEXT: [[INDEX_MATCH:%[0-9]+]] = icmp eq i64 %1, [[INDEX_ITEM]] +// CHECK: ret i64 -1 +// CHECK: ret i64 [[INDEX_POS]] func index[E comparable](s []E, v E) int { for i, vs := range s { if v == vs { diff --git a/cl/_testgo/tpinst/main.go b/cl/_testgo/tpinst/main.go index 258dc8cd93..d2817a4736 100644 --- a/cl/_testgo/tpinst/main.go +++ b/cl/_testgo/tpinst/main.go @@ -1,8 +1,6 @@ // LITTEST package main -// CHECK: {{^}}@8 = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} - type M[T interface{}] struct { v T } @@ -42,138 +40,53 @@ func (pt *M[T]) value() T { } // CHECK-LABEL: define void @main.demo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds %"main.M[int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.M[int]") -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %2, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %3, ptr %0, 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 0 -// CHECK-NEXT: %7 = getelementptr ptr, ptr %6, i64 3 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = insertvalue { ptr, ptr } undef, ptr %8, 0 -// CHECK-NEXT: %10 = insertvalue { ptr, ptr } %9, ptr %5, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %10, 1 -// CHECK-NEXT: %12 = extractvalue { ptr, ptr } %10, 0 -// CHECK-NEXT: %13 = call i64 %12(ptr %11) -// CHECK-NEXT: %14 = icmp ne i64 %13, 100 -// CHECK-NEXT: br i1 %14, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %15, align 8 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %15, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %16) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %18 = getelementptr inbounds %"main.M[float64]", ptr %17, i32 0, i32 0 -// CHECK-NEXT: store double 1.001000e+02, ptr %18, align 8 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.M[float64]") -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %19, 0 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %20, ptr %17, 1 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %21) -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %21, 0 -// CHECK-NEXT: %24 = getelementptr ptr, ptr %23, i64 3 -// CHECK-NEXT: %25 = load ptr, ptr %24, align 8 -// CHECK-NEXT: %26 = insertvalue { ptr, ptr } undef, ptr %25, 0 -// CHECK-NEXT: %27 = insertvalue { ptr, ptr } %26, ptr %22, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %27, 1 -// CHECK-NEXT: %29 = extractvalue { ptr, ptr } %27, 0 -// CHECK-NEXT: %30 = call double %29(ptr %28) -// CHECK-NEXT: %31 = fcmp une double %30, 1.001000e+02 -// CHECK-NEXT: br i1 %31, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %32, align 8 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %33) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %4) -// CHECK-NEXT: %35 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @"{{.*}}/cl/_testgo/tpinst.iface${{[-A-Za-z0-9_]+}}", ptr %34) -// CHECK-NEXT: br i1 %35, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_7 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 5 }, ptr %36, align 8 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %37) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_7 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_4 -// CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %4, 1 -// CHECK-NEXT: %39 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/tpinst.iface${{[-A-Za-z0-9_]+}}", ptr %34) -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %39, 0 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %40, ptr %38, 1 -// CHECK-NEXT: %42 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %41) -// CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %41, 0 -// CHECK-NEXT: %44 = getelementptr ptr, ptr %43, i64 3 -// CHECK-NEXT: %45 = load ptr, ptr %44, align 8 -// CHECK-NEXT: %46 = insertvalue { ptr, ptr } undef, ptr %45, 0 -// CHECK-NEXT: %47 = insertvalue { ptr, ptr } %46, ptr %42, 1 -// CHECK-NEXT: %48 = extractvalue { ptr, ptr } %47, 1 -// CHECK-NEXT: %49 = extractvalue { ptr, ptr } %47, 0 -// CHECK-NEXT: %50 = call i64 %49(ptr %48) -// CHECK-NEXT: %51 = icmp ne i64 %50, 100 -// CHECK-NEXT: br i1 %51, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr @"_llgo_main.I[int]", ptr %34, ptr @"{{.*}}/cl/_testgo/tpinst.iface${{[-A-Za-z0-9_]+}}") -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.demo() -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[INT_OBJ:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: %[[INT_ITAB:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.M[int]") +// CHECK: %[[INT_IFACE0:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[INT_ITAB]], 0 +// CHECK: %[[INT_IFACE:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[INT_IFACE0]], ptr %[[INT_OBJ]], 1 +// CHECK: %[[INT_DATA:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[INT_IFACE]]) +// CHECK: %[[INT_IFACE_TYPE:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[INT_IFACE]], 0 +// CHECK: %[[INT_METHOD_SLOT:[0-9]+]] = getelementptr ptr, ptr %[[INT_IFACE_TYPE]], i64 3 +// CHECK: %[[INT_METHOD:[0-9]+]] = load ptr, ptr %[[INT_METHOD_SLOT]] +// CHECK: %[[INT_CALL0:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[INT_METHOD]], 0 +// CHECK: %[[INT_CALL:[0-9]+]] = insertvalue { ptr, ptr } %[[INT_CALL0]], ptr %[[INT_DATA]], 1 +// CHECK: %[[INT_CALL_DATA:[0-9]+]] = extractvalue { ptr, ptr } %[[INT_CALL]], 1 +// CHECK: %[[INT_CALL_CODE:[0-9]+]] = extractvalue { ptr, ptr } %[[INT_CALL]], 0 +// CHECK: %[[INT_RESULT:[0-9]+]] = call i64 %[[INT_CALL_CODE]](ptr %[[INT_CALL_DATA]]) +// CHECK: %[[INT_BAD:[0-9]+]] = icmp ne i64 %[[INT_RESULT]], 100 +// CHECK: br i1 %[[INT_BAD]] +// CHECK: %[[FLOAT_OBJ:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: %[[FLOAT_ITAB:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.M[float64]") +// CHECK: %[[FLOAT_IFACE0:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[FLOAT_ITAB]], 0 +// CHECK: %[[FLOAT_IFACE:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[FLOAT_IFACE0]], ptr %[[FLOAT_OBJ]], 1 +// CHECK: %[[FLOAT_DATA:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[FLOAT_IFACE]]) +// CHECK: %[[FLOAT_IFACE_TYPE:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[FLOAT_IFACE]], 0 +// CHECK: getelementptr ptr, ptr %[[FLOAT_IFACE_TYPE]], i64 3 +// CHECK: insertvalue { ptr, ptr } %{{[0-9]+}}, ptr %[[FLOAT_DATA]], 1 +// CHECK: %[[FLOAT_RESULT:[0-9]+]] = call double %{{[0-9]+}}(ptr %{{[0-9]+}}) +// CHECK: %[[FLOAT_BAD:[0-9]+]] = fcmp une double %[[FLOAT_RESULT]], 1.001000e+02 +// CHECK: br i1 %[[FLOAT_BAD]] +// CHECK: %[[INT_TYPE:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %[[INT_IFACE]]) +// CHECK: %[[IMPLEMENTS:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @"{{.*}}/cl/_testgo/tpinst.iface${{[-A-Za-z0-9_]+}}", ptr %[[INT_TYPE]]) +// CHECK: br i1 %[[IMPLEMENTS]] +// CHECK: %[[PRIVATE_ITAB:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"{{.*}}/cl/_testgo/tpinst.iface${{[-A-Za-z0-9_]+}}", ptr %[[INT_TYPE]]) // CHECK-LABEL: define linkonce i64 @"main.(*M[int]).Value"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"main.M[int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[INT_VALUE_FIELD:%[0-9]+]] = getelementptr inbounds %"main.M[int]", ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[INT_VALUE:%[0-9]+]] = load i64, ptr [[INT_VALUE_FIELD]] +// CHECK-NEXT: ret i64 [[INT_VALUE]] // CHECK-LABEL: define linkonce i64 @"main.(*M[int]).value"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"main.M[int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[INT_PRIVATE_FIELD:%[0-9]+]] = getelementptr inbounds %"main.M[int]", ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[INT_PRIVATE_VALUE:%[0-9]+]] = load i64, ptr [[INT_PRIVATE_FIELD]] +// CHECK-NEXT: ret i64 [[INT_PRIVATE_VALUE]] // CHECK-LABEL: define linkonce double @"main.(*M[float64]).Value"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"main.M[float64]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load double, ptr %1, align 8 -// CHECK-NEXT: ret double %2 -// CHECK-NEXT: } +// CHECK: [[FLOAT_VALUE_FIELD:%[0-9]+]] = getelementptr inbounds %"main.M[float64]", ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[FLOAT_VALUE:%[0-9]+]] = load double, ptr [[FLOAT_VALUE_FIELD]] +// CHECK-NEXT: ret double [[FLOAT_VALUE]] // CHECK-LABEL: define linkonce double @"main.(*M[float64]).value"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"main.M[float64]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load double, ptr %1, align 8 -// CHECK-NEXT: ret double %2 -// CHECK-NEXT: } +// CHECK: [[FLOAT_PRIVATE_FIELD:%[0-9]+]] = getelementptr inbounds %"main.M[float64]", ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[FLOAT_PRIVATE_VALUE:%[0-9]+]] = load double, ptr [[FLOAT_PRIVATE_FIELD]] +// CHECK-NEXT: ret double [[FLOAT_PRIVATE_VALUE]] diff --git a/cl/_testgo/tplocaltype/in.go b/cl/_testgo/tplocaltype/in.go index 68d14f1fff..ac843b5823 100644 --- a/cl/_testgo/tplocaltype/in.go +++ b/cl/_testgo/tplocaltype/in.go @@ -2,28 +2,24 @@ package main // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @main.use1() -// CHECK-NEXT: %1 = call i64 @main.use2() -// CHECK-NEXT: ret void +// CHECK: call i64 @main.use1() +// CHECK-NEXT: call i64 @main.use2() func main() { _ = use1() _ = use2() } // CHECK-LABEL: define i64 @main.use1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"main.id[{{.*}}T.1.0]"(i64 1) -// CHECK-NEXT: ret i64 %0 +// CHECK: [[USE1:%[0-9]+]] = call i64 @"main.id[{{.*}}T.1.0]"(i64 1) +// CHECK-NEXT: ret i64 [[USE1]] func use1() int { type T int return int(id[T](1)) } // CHECK-LABEL: define i64 @main.use2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"main.id[{{.*}}T.2.0]"(i64 2) -// CHECK-NEXT: ret i64 %0 +// CHECK: [[USE2:%[0-9]+]] = call i64 @"main.id[{{.*}}T.2.0]"(i64 2) +// CHECK-NEXT: ret i64 [[USE2]] func use2() int { type T int return int(id[T](2)) @@ -34,9 +30,7 @@ func id[T ~int](v T) T { } // CHECK-LABEL: define linkonce i64 @"main.id[{{.*}}T.1.0]"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 %0 +// CHECK: ret i64 %0 // CHECK-LABEL: define linkonce i64 @"main.id[{{.*}}T.2.0]"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 %0 +// CHECK: ret i64 %0 diff --git a/cl/_testgo/tpnamed/in.go b/cl/_testgo/tpnamed/in.go index ca5a244a08..0cd03d6427 100644 --- a/cl/_testgo/tpnamed/in.go +++ b/cl/_testgo/tpnamed/in.go @@ -7,36 +7,16 @@ type Future[T any] func() T type IO[T any] func() Future[T] // CHECK-LABEL: define %"main.IO[error]" @main.WriteFile(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"main.IO[error]" { ptr @"main.WriteFile$1", ptr null } -// CHECK-NEXT: } +// CHECK: ret %"main.IO[error]" { ptr @"main.WriteFile$1", ptr null } func WriteFile(fileName string) IO[error] { // CHECK-LABEL: define %"main.Future[error]" @"main.WriteFile$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret %"main.Future[error]" { ptr @"main.WriteFile$1$1", ptr null } - // CHECK-NEXT: } + // CHECK: ret %"main.Future[error]" { ptr @"main.WriteFile$1$1", ptr null } return func() Future[error] { // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @"main.WriteFile$1$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer - // CHECK-NEXT: } - - // CHECK-LABEL: define void @main.init(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 - // CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 - // CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 - // CHECK-NEXT: br label %_llgo_2 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 - // CHECK-NEXT: ret void - // CHECK-NEXT: } return func() error { return nil @@ -45,25 +25,13 @@ func WriteFile(fileName string) IO[error] { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call [0 x i8] @"main.RunIO{{\[\[0\]byte\]}}"(%"main.IO{{\[\[0\]byte\]}}" { ptr @"main.main$1", ptr null }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call [0 x i8] @"main.RunIO{{\[\[0\]byte\]}}"(%"main.IO{{\[\[0\]byte\]}}" { ptr @"main.main$1", ptr null }) +// CHECK-NEXT: ret void func main() { - // CHECK-LABEL: define %"main.Future{{\[\[0\]byte\]}}" @"main.main$1"() - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret %"main.Future{{\[\[0\]byte\]}}" { ptr @"main.main$1$1", ptr null } - // CHECK-NEXT: } - RunIO[Void](func() Future[Void] { - // CHECK-LABEL: define [0 x i8] @"main.main$1$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret [0 x i8] zeroinitializer - // CHECK-NEXT: } - return func() (ret Void) { return } @@ -75,16 +43,12 @@ func RunIO[T any](call IO[T]) T { } // CHECK-LABEL: define linkonce [0 x i8] @"main.RunIO{{\[\[0\]byte\]}}"(%"main.IO{{\[\[0\]byte\]}}" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"main.IO{{\[\[0\]byte\]}}" %0, 1 -// CHECK-NEXT: %2 = extractvalue %"main.IO{{\[\[0\]byte\]}}" %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %2) -// CHECK-NEXT: %3 = call %"main.Future{{\[\[0\]byte\]}}" %__llgo_funcval_code(ptr {{(nest|swiftself)}} %1) -// CHECK-NEXT: %4 = extractvalue %"main.Future{{\[\[0\]byte\]}}" %3, 1 -// CHECK-NEXT: %5 = extractvalue %"main.Future{{\[\[0\]byte\]}}" %3, 0 -// CHECK-NEXT: %6 = icmp eq ptr %5, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %6) -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: %7 = call [0 x i8] %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %4) -// CHECK-NEXT: ret [0 x i8] %7 -// CHECK-NEXT: } +// CHECK: [[IO_ENV:%[0-9]+]] = extractvalue %"main.IO{{\[\[0\]byte\]}}" %0, 1 +// CHECK-NEXT: [[IO_CODE:%[0-9]+]] = extractvalue %"main.IO{{\[\[0\]byte\]}}" %0, 0 +// CHECK: [[FUTURE:%[0-9]+]] = call %"main.Future{{\[\[0\]byte\]}}" %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[IO_ENV]]) +// CHECK-NEXT: [[FUTURE_ENV:%[0-9]+]] = extractvalue %"main.Future{{\[\[0\]byte\]}}" [[FUTURE]], 1 +// CHECK-NEXT: [[FUTURE_CODE:%[0-9]+]] = extractvalue %"main.Future{{\[\[0\]byte\]}}" [[FUTURE]], 0 +// CHECK-NEXT: [[FUTURE_NIL:%[0-9]+]] = icmp eq ptr [[FUTURE_CODE]], null +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[FUTURE_NIL]]) +// CHECK: [[IO_RESULT:%[0-9]+]] = call [0 x i8] %__llgo_funcval_code1(ptr {{(nest|swiftself)}} [[FUTURE_ENV]]) +// CHECK-NEXT: ret [0 x i8] [[IO_RESULT]] diff --git a/cl/_testgo/tprecur/in.go b/cl/_testgo/tprecur/in.go index fe4d4e2497..f8aa75fa60 100644 --- a/cl/_testgo/tprecur/in.go +++ b/cl/_testgo/tprecur/in.go @@ -1,7 +1,9 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.recursive\E|\Qmain.recur1[main.T.1.0]\E|\Qmain.recur2[main.T.1.0]\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} func main() { recursive() @@ -14,42 +16,6 @@ func recursive() { } } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.recursive() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.recursive(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"main.recur1[main.T.1.0]"(i64 5) -// CHECK-NEXT: %1 = icmp ne i64 %0, 110 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - type Integer interface { ~int | ~int32 | ~int64 } @@ -74,75 +40,119 @@ func recur2[T Integer](n T) T { return sum + recur1(n-1) } -// CHECK-LABEL: define linkonce i64 @"main.recur1[main.T.1.0]"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq i64 %0, 0 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_3 +// recur1 preserves both base cases and passes n-1 to recur2 before multiplying. + +// recur2 builds [1..n], sums it, and adds recur1(n-1). + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: call void @main.recursive() +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.recursive(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call i64 @"main.recur1[main.T.1.0]"(i64 5) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = icmp ne i64 %[[TMP0]], 110 +// DARWIN-ARM64-NEXT: br i1 %[[TMP1]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = call i64 @"main.recur1[main.T.1.0]"(i64 5) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = icmp ne i64 %[[TMP1]], 110 +// LINUX-AMD64-NEXT: br i1 %[[TMP2]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP3]]) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP3]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP6]], ptr %[[TMP8]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define linkonce i64 @"main.recur1[main.T.1.0]"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp eq i64 %[[TMP0]], 0 +// CHECK-NEXT: br i1 %[[TMP1]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB3:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_0 +// CHECK-NEXT: _llgo_[[BB1]]: // CHECK-NEXT: ret i64 1 // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3 -// CHECK-NEXT: %2 = sub i64 %0, 1 -// CHECK-NEXT: %3 = call i64 @"main.recur2[main.T.1.0]"(i64 %2) -// CHECK-NEXT: %4 = mul i64 %0, %3 -// CHECK-NEXT: ret i64 %4 +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = sub i64 %[[TMP0]], 1 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call i64 @"main.recur2[main.T.1.0]"(i64 %[[TMP2]]) +// CHECK-NEXT: %[[TMP4:[0-9]+]] = mul i64 %[[TMP0]], %[[TMP3]] +// CHECK-NEXT: ret i64 %[[TMP4]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %5 = icmp eq i64 %0, 1 -// CHECK-NEXT: br i1 %5, label %_llgo_1, label %_llgo_2 +// CHECK-NEXT: _llgo_[[BB3]]: +// CHECK-NEXT: %[[TMP5:[0-9]+]] = icmp eq i64 %[[TMP0]], 1 +// CHECK-NEXT: br i1 %[[TMP5]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] // CHECK-NEXT: } -// CHECK-LABEL: define linkonce i64 @"main.recur2[main.T.1.0]"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 %0, i64 %0, i64 8) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: br label %_llgo_1 +// CHECK-LABEL: define linkonce i64 @"main.recur2[main.T.1.0]"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.MakeSlice"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]], i64 %[[TMP0]], i64 %[[TMP0]], i64 8) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] -// CHECK-NEXT: %4 = add i64 %3, 1 -// CHECK-NEXT: %5 = icmp slt i64 %4, %2 -// CHECK-NEXT: br i1 %5, label %_llgo_2, label %_llgo_3 +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: %[[TMP4:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP5:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// CHECK-NEXT: %[[TMP5]] = add i64 %[[TMP4]], 1 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = icmp slt i64 %[[TMP5]], %[[TMP3]] +// CHECK-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %6 = add i64 %4, 1 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %9 = icmp slt i64 %4, 0 -// CHECK-NEXT: %10 = icmp uge i64 %4, %8 -// CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, {{.*}}) -// CHECK-NEXT: %12 = getelementptr inbounds i64, ptr %7, i64 %4 -// CHECK-NEXT: store i64 %6, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_1 +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: %[[TMP7:[0-9]+]] = add i64 %[[TMP5]], 1 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = icmp slt i64 %[[TMP5]], 0 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = icmp uge i64 %[[TMP5]], %[[TMP9]] +// CHECK-NEXT: %[[TMP12:[0-9]+]] = or i1 %[[TMP11]], %[[TMP10]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP12]], i64 %[[TMP5]], i1 true, i64 %[[TMP9]]) +// CHECK-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP8]], i64 %[[TMP5]] +// CHECK-NEXT: store i64 %[[TMP7]], ptr %[[TMP13]], align 8 +// CHECK-NEXT: br label %_llgo_[[BB1]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: br label %_llgo_4 +// CHECK-NEXT: _llgo_[[BB3]]: +// CHECK-NEXT: %[[TMP14:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 1 +// CHECK-NEXT: br label %_llgo_[[BB4:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_3 -// CHECK-NEXT: %14 = phi i64 [ 0, %_llgo_3 ], [ %25, %_llgo_5 ] -// CHECK-NEXT: %15 = phi i64 [ -1, %_llgo_3 ], [ %16, %_llgo_5 ] -// CHECK-NEXT: %16 = add i64 %15, 1 -// CHECK-NEXT: %17 = icmp slt i64 %16, %13 -// CHECK-NEXT: br i1 %17, label %_llgo_5, label %_llgo_6 +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: %[[TMP15:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB3]] ], [ %[[TMP26:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// CHECK-NEXT: %[[TMP16:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB3]] ], [ %[[TMP17:[0-9]+]], %_llgo_[[BB5]] ] +// CHECK-NEXT: %[[TMP17]] = add i64 %[[TMP16]], 1 +// CHECK-NEXT: %[[TMP18:[0-9]+]] = icmp slt i64 %[[TMP17]], %[[TMP14]] +// CHECK-NEXT: br i1 %[[TMP18]], label %_llgo_[[BB5]], label %_llgo_[[BB6:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %20 = icmp slt i64 %16, 0 -// CHECK-NEXT: %21 = icmp uge i64 %16, %19 -// CHECK-NEXT: %22 = or i1 %21, %20 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %22, {{.*}}) -// CHECK-NEXT: %23 = getelementptr inbounds i64, ptr %18, i64 %16 -// CHECK-NEXT: %24 = load i64, ptr %23, align 8 -// CHECK-NEXT: %25 = add i64 %14, %24 -// CHECK-NEXT: br label %_llgo_4 +// CHECK-NEXT: _llgo_[[BB5]]: +// CHECK-NEXT: %[[TMP19:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 0 +// CHECK-NEXT: %[[TMP20:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 1 +// CHECK-NEXT: %[[TMP21:[0-9]+]] = icmp slt i64 %[[TMP17]], 0 +// CHECK-NEXT: %[[TMP22:[0-9]+]] = icmp uge i64 %[[TMP17]], %[[TMP20]] +// CHECK-NEXT: %[[TMP23:[0-9]+]] = or i1 %[[TMP22]], %[[TMP21]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP23]], i64 %[[TMP17]], i1 true, i64 %[[TMP20]]) +// CHECK-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP19]], i64 %[[TMP17]] +// CHECK-NEXT: %[[TMP25:[0-9]+]] = load i64, ptr %[[TMP24]], align 8 +// CHECK-NEXT: %[[TMP26]] = add i64 %[[TMP15]], %[[TMP25]] +// CHECK-NEXT: br label %_llgo_[[BB4]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: %26 = sub i64 %0, 1 -// CHECK-NEXT: %27 = call i64 @"main.recur1[main.T.1.0]"(i64 %26) -// CHECK-NEXT: %28 = add i64 %14, %27 -// CHECK-NEXT: ret i64 %28 +// CHECK-NEXT: _llgo_[[BB6]]: +// CHECK-NEXT: %[[TMP27:[0-9]+]] = sub i64 %[[TMP0]], 1 +// CHECK-NEXT: %[[TMP28:[0-9]+]] = call i64 @"main.recur1[main.T.1.0]"(i64 %[[TMP27]]) +// CHECK-NEXT: %[[TMP29:[0-9]+]] = add i64 %[[TMP15]], %[[TMP28]] +// CHECK-NEXT: ret i64 %[[TMP29]] // CHECK-NEXT: } diff --git a/cl/_testgo/tprecurfn/in.go b/cl/_testgo/tprecurfn/in.go index c8e20a4707..b07ee122c9 100644 --- a/cl/_testgo/tprecurfn/in.go +++ b/cl/_testgo/tprecurfn/in.go @@ -6,30 +6,27 @@ type My[T any] struct { next *My[T] } -// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) - // CHECK-NEXT: %1 = getelementptr inbounds %"main.My[int]", ptr %0, i32 0, i32 1 - // CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) - // CHECK-NEXT: %3 = getelementptr inbounds %"main.My[int]", ptr %2, i32 0, i32 0 - // CHECK-NEXT: store { ptr, ptr } { ptr @"main.main$1", ptr null }, ptr %3, align 8 - // CHECK-NEXT: store ptr %2, ptr %1, align 8 - // CHECK-NEXT: %4 = getelementptr inbounds %"main.My[int]", ptr %0, i32 0, i32 1 - // CHECK-NEXT: %5 = load ptr, ptr %4, align 8 - // CHECK-NEXT: %6 = getelementptr inbounds %"main.My[int]", ptr %5, i32 0, i32 0 - // CHECK-NEXT: %7 = load { ptr, ptr }, ptr %6, align 8 - // CHECK-NEXT: %8 = extractvalue { ptr, ptr } %7, 1 - // CHECK-NEXT: %9 = extractvalue { ptr, ptr } %7, 0 - // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %9) - // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %8, i64 100) - // CHECK-NEXT: ret void - // CHECK-NEXT:} + // CHECK-LABEL: define void @main.main(){{.*}} { + // CHECK: [[OUTER:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 24) + // CHECK-NEXT: [[NEXT_FIELD:%[0-9]+]] = getelementptr inbounds %"main.My[int]", ptr [[OUTER]], i32 0, i32 1 + // CHECK-NEXT: [[INNER:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 24) + // CHECK-NEXT: [[FN_FIELD:%[0-9]+]] = getelementptr inbounds %"main.My[int]", ptr [[INNER]], i32 0, i32 0 + // CHECK-NEXT: store { ptr, ptr } { ptr @"main.main$1", ptr null }, ptr [[FN_FIELD]] + // CHECK-NEXT: store ptr [[INNER]], ptr [[NEXT_FIELD]] + // CHECK-NEXT: [[NEXT_FIELD_USE:%[0-9]+]] = getelementptr inbounds %"main.My[int]", ptr [[OUTER]], i32 0, i32 1 + // CHECK-NEXT: [[NEXT:%[0-9]+]] = load ptr, ptr [[NEXT_FIELD_USE]] + // CHECK-NEXT: [[FN_FIELD_USE:%[0-9]+]] = getelementptr inbounds %"main.My[int]", ptr [[NEXT]], i32 0, i32 0 + // CHECK-NEXT: [[FN:%[0-9]+]] = load { ptr, ptr }, ptr [[FN_FIELD_USE]] + // CHECK-NEXT: [[FN_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[FN]], 1 + // CHECK-NEXT: [[FN_RAW_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[FN]], 0 + // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr [[FN_RAW_CODE]]) + // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[FN_ENV]], i64 100) m := &My[int]{next: &My[int]{fn: func(n int) { println(n) }}} m.next.fn(100) } // CHECK-LABEL: define void @"main.main$1"(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}PrintByte"(i8 10) -// CHECK-NEXT: ret void +// CHECK: call void @"{{.*}}PrintInt"(i64 %0) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void diff --git a/cl/_testgo/tptypes/in.go b/cl/_testgo/tptypes/in.go index c6130848bd..06ef498dc2 100644 --- a/cl/_testgo/tptypes/in.go +++ b/cl/_testgo/tptypes/in.go @@ -1,20 +1,9 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain\E|\Q(*Slice[[]int,int]).Append\E|\Q(*Slice[[]string,string]).Append\E|\Q(*Slice[[]int,int]).Append2\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} type Data[T any] struct { v T @@ -53,129 +42,10 @@ type ( SliceString = Slice[[]string, string] ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %"main.Data[int]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %"main.Data[int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = load %"main.Data[int]", ptr %0, align 8 -// CHECK-NEXT: %3 = extractvalue %"main.Data[int]" %2, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %4 = alloca %"main.Data[string]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %4, i8 0, i64 16, i1 false) -// CHECK-NEXT: %5 = getelementptr inbounds %"main.Data[string]", ptr %4, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %5, align 8 -// CHECK-NEXT: %6 = load %"main.Data[string]", ptr %4, align 8 -// CHECK-NEXT: %7 = extractvalue %"main.Data[string]" %6, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %8 = alloca %"main.Data[int]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %8, i8 0, i64 8, i1 false) -// CHECK-NEXT: %9 = getelementptr inbounds %"main.Data[int]", ptr %8, i32 0, i32 0 -// CHECK-NEXT: store i64 100, ptr %9, align 8 -// CHECK-NEXT: %10 = load %"main.Data[int]", ptr %8, align 8 -// CHECK-NEXT: %11 = extractvalue %"main.Data[int]" %10, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = alloca %"main.Data[string]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %12, i8 0, i64 16, i1 false) -// CHECK-NEXT: %13 = getelementptr inbounds %"main.Data[string]", ptr %12, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %13, align 8 -// CHECK-NEXT: %14 = load %"main.Data[string]", ptr %12, align 8 -// CHECK-NEXT: %15 = extractvalue %"main.Data[string]" %14, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %18 = getelementptr inbounds i64, ptr %17, i64 0 -// CHECK-NEXT: store i64 100, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %17, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %19, i64 1, 1 -// CHECK-NEXT: %21 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %20, i64 1, 2 -// CHECK-NEXT: %22 = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]int,int\]}}).Append"(ptr %16, %"{{.*}}/runtime/internal/runtime.Slice" %21) -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %25 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %24, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %25, align 8 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %24, 0 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, i64 1, 1 -// CHECK-NEXT: %28 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %27, i64 1, 2 -// CHECK-NEXT: %29 = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]string,string\]}}).Append"(ptr %23, %"{{.*}}/runtime/internal/runtime.Slice" %28) -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %32 = getelementptr inbounds i64, ptr %31, i64 0 -// CHECK-NEXT: store i64 1, ptr %32, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds i64, ptr %31, i64 1 -// CHECK-NEXT: store i64 2, ptr %33, align 8 -// CHECK-NEXT: %34 = getelementptr inbounds i64, ptr %31, i64 2 -// CHECK-NEXT: store i64 3, ptr %34, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds i64, ptr %31, i64 3 -// CHECK-NEXT: store i64 4, ptr %35, align 8 -// CHECK-NEXT: %36 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %31, 0 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %36, i64 4, 1 -// CHECK-NEXT: %38 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %37, i64 4, 2 -// CHECK-NEXT: %39 = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]int,int\]}}).Append"(ptr %30, %"{{.*}}/runtime/internal/runtime.Slice" %38) -// CHECK-NEXT: %40 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %41 = getelementptr inbounds i64, ptr %40, i64 0 -// CHECK-NEXT: store i64 1, ptr %41, align 8 -// CHECK-NEXT: %42 = getelementptr inbounds i64, ptr %40, i64 1 -// CHECK-NEXT: store i64 2, ptr %42, align 8 -// CHECK-NEXT: %43 = getelementptr inbounds i64, ptr %40, i64 2 -// CHECK-NEXT: store i64 3, ptr %43, align 8 -// CHECK-NEXT: %44 = getelementptr inbounds i64, ptr %40, i64 3 -// CHECK-NEXT: store i64 4, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %40, 0 -// CHECK-NEXT: %46 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %45, i64 4, 1 -// CHECK-NEXT: %47 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %46, i64 4, 2 -// CHECK-NEXT: %48 = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]int,int\]}}).Append2"(ptr %30, %"{{.*}}/runtime/internal/runtime.Slice" %47) -// CHECK-NEXT: %49 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %16, i32 0, i32 0 -// CHECK-NEXT: %50 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %49, align 8 -// CHECK-NEXT: %51 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %16, i32 0, i32 0 -// CHECK-NEXT: %52 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %51, align 8 -// CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 0 -// CHECK-NEXT: %54 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 1 -// CHECK-NEXT: %55 = icmp uge i64 0, %54 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %55, {{.*}}) -// CHECK-NEXT: %56 = getelementptr inbounds i64, ptr %53, i64 0 -// CHECK-NEXT: %57 = load i64, ptr %56, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %57) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %58 = getelementptr inbounds %"main.Slice{{\[\[\]string,string\]}}", ptr %23, i32 0, i32 0 -// CHECK-NEXT: %59 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %58, align 8 -// CHECK-NEXT: %60 = getelementptr inbounds %"main.Slice{{\[\[\]string,string\]}}", ptr %23, i32 0, i32 0 -// CHECK-NEXT: %61 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %60, align 8 -// CHECK-NEXT: %62 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %61, 0 -// CHECK-NEXT: %63 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %61, 1 -// CHECK-NEXT: %64 = icmp uge i64 0, %63 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %64, {{.*}}) -// CHECK-NEXT: %65 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %62, i64 0 -// CHECK-NEXT: %66 = load %"{{.*}}/runtime/internal/runtime.String", ptr %65, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %59) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %66) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %67 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %30, i32 0, i32 0 -// CHECK-NEXT: %68 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %67, align 8 -// CHECK-NEXT: %69 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %30, i32 0, i32 0 -// CHECK-NEXT: %70 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %69, align 8 -// CHECK-NEXT: %71 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %70, 0 -// CHECK-NEXT: %72 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %70, 1 -// CHECK-NEXT: %73 = icmp uge i64 0, %72 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %73, {{.*}}) -// CHECK-NEXT: %74 = getelementptr inbounds i64, ptr %71, i64 0 -// CHECK-NEXT: %75 = load i64, ptr %74, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %68) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %75) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Type aliases and direct instantiations retain their concrete field types. +// SliceInt.Append receives a one-element []int containing 100. +// SliceString.Append receives one string element with the 16-byte stride. +// The direct v3 instantiation is updated twice through Append and Append2. func main() { println(DataInt{1}.v) @@ -202,44 +72,354 @@ func main() { println(v3.Data, v3.Data[0]) } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]int,int\]}}).Append"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 8) -// CHECK-NEXT: %7 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %6, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %8, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %9 +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = alloca %"main.Data[int]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP11]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"main.Data[int]", ptr %[[TMP11]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = load %"main.Data[int]", ptr %[[TMP11]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = extractvalue %"main.Data[int]" %[[TMP13]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP14]]) +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca %"main.Data[int]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP14]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %"main.Data[int]", ptr %[[TMP14]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load %"main.Data[int]", ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = extractvalue %"main.Data[int]" %[[TMP16]], 0 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP17]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = alloca %"main.Data[string]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP15]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %"main.Data[string]", ptr %[[TMP15]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP16]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = load %"main.Data[string]", ptr %[[TMP15]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"main.Data[string]" %[[TMP17]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP18]]) +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = alloca %"main.Data[string]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP18]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %"main.Data[string]", ptr %[[TMP18]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP19]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = load %"main.Data[string]", ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = extractvalue %"main.Data[string]" %[[TMP20]], 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP21]], ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP13]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP13]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load i64, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP23]], i64 %[[TMP25]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = alloca %"main.Data[int]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP19]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %"main.Data[int]", ptr %[[TMP19]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP20]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = load %"main.Data[int]", ptr %[[TMP19]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = extractvalue %"main.Data[int]" %[[TMP21]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP22]]) +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = alloca %"main.Data[int]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP26]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds %"main.Data[int]", ptr %[[TMP26]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = load %"main.Data[int]", ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = extractvalue %"main.Data[int]" %[[TMP28]], 0 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP29]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = alloca %"main.Data[string]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP23]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds %"main.Data[string]", ptr %[[TMP23]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP24]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = load %"main.Data[string]", ptr %[[TMP23]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = extractvalue %"main.Data[string]" %[[TMP25]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP26]]) +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = alloca %"main.Data[string]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP30]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = getelementptr inbounds %"main.Data[string]", ptr %[[TMP30]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP31]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = load %"main.Data[string]", ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = extractvalue %"main.Data[string]" %[[TMP32]], 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP33]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = load ptr, ptr %[[TMP34]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = load i64, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP35]], i64 %[[TMP37]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP28]], i64 0 +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP29]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP28]], 0 +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP30]], i64 1, 1 +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP31]], i64 1, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP32]], ptr %[[TMP9]], align 8 +// DARWIN-ARM64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP10]], ptr %[[TMP27]], ptr %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP10]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP34:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// DARWIN-ARM64-NEXT: %[[TMP35:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP35]], i64 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP36]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP37:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP35]], 0 +// DARWIN-ARM64-NEXT: %[[TMP38:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP37]], i64 1, 1 +// DARWIN-ARM64-NEXT: %[[TMP39:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP38]], i64 1, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP39]], ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: call void @"main.(*Slice{{\[\[}}]string,string]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP8]], ptr %[[TMP34]], ptr %[[TMP7]]) +// DARWIN-ARM64-NEXT: %[[TMP40:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP41:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// DARWIN-ARM64-NEXT: %[[TMP42:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// DARWIN-ARM64-NEXT: %[[TMP43:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP42]], i64 0 +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP43]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP44:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP42]], i64 1 +// DARWIN-ARM64-NEXT: store i64 2, ptr %[[TMP44]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP42]], i64 2 +// DARWIN-ARM64-NEXT: store i64 3, ptr %[[TMP45]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP46:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP42]], i64 3 +// DARWIN-ARM64-NEXT: store i64 4, ptr %[[TMP46]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP47:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP42]], 0 +// DARWIN-ARM64-NEXT: %[[TMP48:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP47]], i64 4, 1 +// DARWIN-ARM64-NEXT: %[[TMP49:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP48]], i64 4, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP49]], ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP6]], ptr %[[TMP41]], ptr %[[TMP5]]) +// DARWIN-ARM64-NEXT: %[[TMP50:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP6]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP51:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// DARWIN-ARM64-NEXT: %[[TMP52:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP51]], i64 0 +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP52]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP53:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP51]], i64 1 +// DARWIN-ARM64-NEXT: store i64 2, ptr %[[TMP53]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP54:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP51]], i64 2 +// DARWIN-ARM64-NEXT: store i64 3, ptr %[[TMP54]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP55:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP51]], i64 3 +// DARWIN-ARM64-NEXT: store i64 4, ptr %[[TMP55]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP56:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP51]], 0 +// DARWIN-ARM64-NEXT: %[[TMP57:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP56]], i64 4, 1 +// DARWIN-ARM64-NEXT: %[[TMP58:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP57]], i64 4, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP58]], ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append2"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP4]], ptr %[[TMP41]], ptr %[[TMP3]]) +// DARWIN-ARM64-NEXT: %[[TMP59:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP60:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP27]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP61:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP60]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP62:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP27]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP63:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP62]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP64:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP63]], 0 +// DARWIN-ARM64-NEXT: %[[TMP65:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP63]], 1 +// DARWIN-ARM64-NEXT: %[[TMP66:[0-9]+]] = icmp uge i64 0, %[[TMP65]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP66]], i64 0, i1 true, i64 %[[TMP65]]) +// DARWIN-ARM64-NEXT: %[[TMP67:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP64]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP68:[0-9]+]] = load i64, ptr %[[TMP67]], align 8 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP61]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr %[[TMP2]]) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP68]]) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP69:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP34]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP70:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP69]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP71:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP34]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP39]], i64 0 +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP40]], align 8 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP39]], 0 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP41]], i64 1, 1 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP42]], i64 1, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP43]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP11]], ptr %[[TMP38]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP10]]) +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP46]], i64 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP47]], align 8 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP46]], 0 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP48]], i64 1, 1 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP49]], i64 1, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP50]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: call void @"main.(*Slice{{\[\[}}]string,string]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP9]], ptr %[[TMP45]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP53]], i64 0 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP54]], align 8 +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP53]], i64 1 +// LINUX-AMD64-NEXT: store i64 2, ptr %[[TMP55]], align 8 +// LINUX-AMD64-NEXT: %[[TMP56:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP53]], i64 2 +// LINUX-AMD64-NEXT: store i64 3, ptr %[[TMP56]], align 8 +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP53]], i64 3 +// LINUX-AMD64-NEXT: store i64 4, ptr %[[TMP57]], align 8 +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP53]], 0 +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP58]], i64 4, 1 +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP59]], i64 4, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP60]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP7]], ptr %[[TMP52]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP6]]) +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP62]], i64 0 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP63]], align 8 +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP62]], i64 1 +// LINUX-AMD64-NEXT: store i64 2, ptr %[[TMP64]], align 8 +// LINUX-AMD64-NEXT: %[[TMP65:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP62]], i64 2 +// LINUX-AMD64-NEXT: store i64 3, ptr %[[TMP65]], align 8 +// LINUX-AMD64-NEXT: %[[TMP66:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP62]], i64 3 +// LINUX-AMD64-NEXT: store i64 4, ptr %[[TMP66]], align 8 +// LINUX-AMD64-NEXT: %[[TMP67:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP62]], 0 +// LINUX-AMD64-NEXT: %[[TMP68:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP67]], i64 4, 1 +// LINUX-AMD64-NEXT: %[[TMP69:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP68]], i64 4, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP69]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: call void @"main.(*Slice{{\[\[}}]int,int]).Append2"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr %[[TMP52]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP4]]) +// LINUX-AMD64-NEXT: %[[TMP70:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP71:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP38]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP72:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP71]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP73:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP72]], 0 +// DARWIN-ARM64-NEXT: %[[TMP74:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP72]], 1 +// DARWIN-ARM64-NEXT: %[[TMP75:[0-9]+]] = icmp uge i64 0, %[[TMP74]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP75]], i64 0, i1 true, i64 %[[TMP74]]) +// DARWIN-ARM64-NEXT: %[[TMP76:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP73]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP77:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP76]], align 8 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP70]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP73:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP38]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP74:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP73]], align 8 +// LINUX-AMD64-NEXT: %[[TMP75:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP74]], 0 +// LINUX-AMD64-NEXT: %[[TMP76:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP74]], 1 +// LINUX-AMD64-NEXT: %[[TMP77:[0-9]+]] = icmp uge i64 0, %[[TMP76]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP77]], i64 0, i1 true, i64 %[[TMP76]]) +// LINUX-AMD64-NEXT: %[[TMP78:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP75]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP79:[0-9]+]] = load i64, ptr %[[TMP78]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP72]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP3]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP77]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP79]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP78:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP41]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP79:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP78]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP80:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP41]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP80:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP45]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP81:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP80]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP82:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP81]], 0 +// DARWIN-ARM64-NEXT: %[[TMP83:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP81]], 1 +// DARWIN-ARM64-NEXT: %[[TMP84:[0-9]+]] = icmp uge i64 0, %[[TMP83]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP84]], i64 0, i1 true, i64 %[[TMP83]]) +// DARWIN-ARM64-NEXT: %[[TMP85:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP82]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP86:[0-9]+]] = load i64, ptr %[[TMP85]], align 8 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP79]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr %[[TMP0]]) +// LINUX-AMD64-NEXT: %[[TMP82:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP45]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP83:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP82]], align 8 +// LINUX-AMD64-NEXT: %[[TMP84:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP83]], 0 +// LINUX-AMD64-NEXT: %[[TMP85:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP83]], 1 +// LINUX-AMD64-NEXT: %[[TMP86:[0-9]+]] = icmp uge i64 0, %[[TMP85]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP86]], i64 0, i1 true, i64 %[[TMP85]]) +// LINUX-AMD64-NEXT: %[[TMP87:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP84]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP88:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP87]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP81]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP2]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP86]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP88]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP89:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP90:[0-9]+]] = load ptr, ptr %[[TMP89]], align 8 +// LINUX-AMD64-NEXT: %[[TMP91:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP92:[0-9]+]] = load i64, ptr %[[TMP91]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP90]], i64 %[[TMP92]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// LINUX-AMD64-NEXT: %[[TMP93:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP52]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP94:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP93]], align 8 +// LINUX-AMD64-NEXT: %[[TMP95:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP52]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP96:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP95]], align 8 +// LINUX-AMD64-NEXT: %[[TMP97:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP96]], 0 +// LINUX-AMD64-NEXT: %[[TMP98:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP96]], 1 +// LINUX-AMD64-NEXT: %[[TMP99:[0-9]+]] = icmp uge i64 0, %[[TMP98]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP99]], i64 0, i1 true, i64 %[[TMP98]]) +// LINUX-AMD64-NEXT: %[[TMP100:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP97]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP101:[0-9]+]] = load i64, ptr %[[TMP100]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP94]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP101]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define linkonce void @"main.(*Slice{{\[\[}}]int,int]).Append"( +// DARWIN-ARM64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 8) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 8) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], ptr %[[TMP11]], align 8 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP12]], align 8 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP13]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]string,string\]}}).Append"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"main.Slice{{\[\[\]string,string\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 16) -// CHECK-NEXT: %7 = getelementptr inbounds %"main.Slice{{\[\[\]string,string\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %6, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"main.Slice{{\[\[\]string,string\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %8, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %9 +// CHECK-LABEL: define linkonce void @"main.(*Slice{{\[\[}}]string,string]).Append"( +// DARWIN-ARM64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 16) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 16) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], ptr %[[TMP11]], align 8 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]string,string]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP12]], align 8 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP13]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[\]int,int\]}}).Append2"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %2, align 8 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %3, ptr %4, i64 %5, i64 8) -// CHECK-NEXT: %7 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %6, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"main.Slice{{\[\[\]int,int\]}}", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %8, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %9 +// CHECK-LABEL: define linkonce void @"main.(*Slice{{\[\[}}]int,int]).Append2"( +// DARWIN-ARM64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 8) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceAppend"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP5]], ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP4]], ptr %[[TMP8]], i64 %[[TMP9]], i64 8) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], ptr %[[TMP11]], align 8 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"main.Slice{{\[\[}}]int,int]", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP12]], align 8 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP13]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testgo/typerecur/in.go b/cl/_testgo/typerecur/in.go index cd7492b2f9..e94a9b67bf 100644 --- a/cl/_testgo/typerecur/in.go +++ b/cl/_testgo/typerecur/in.go @@ -10,15 +10,13 @@ type counter struct { } // CHECK-LABEL: define %main.stateFn @main.countState(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.counter, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: %3 = add i64 %2, 1 -// CHECK-NEXT: %4 = getelementptr inbounds %main.counter, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i64 %3, ptr %4, align 8 -// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @0, i64 6 }) -// CHECK: call void @"{{.*}}PrintInt"(i64 %6) -// CHECK: icmp sge i64 %8, %10 +// CHECK: %[[VALUE_PTR1:[0-9]+]] = getelementptr inbounds %main.counter, ptr %0, i32 0, i32 0 +// CHECK-NEXT: %[[OLD_VALUE:[0-9]+]] = load i64, ptr %[[VALUE_PTR1]] +// CHECK-NEXT: %[[NEW_VALUE:[0-9]+]] = add i64 %[[OLD_VALUE]], 1 +// CHECK: store i64 %[[NEW_VALUE]], ptr %{{[0-9]+}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[PRINTED_VALUE:[0-9]+]]) +// CHECK: %[[DONE:[0-9]+]] = icmp sge i64 %{{[0-9]+}}, %{{[0-9]+}} +// CHECK-NEXT: br i1 %[[DONE]], label %{{.*}}, label %{{.*}} // CHECK: ret %main.stateFn zeroinitializer // CHECK: ret %main.stateFn { ptr @main.countState, ptr null } func countState(c *counter) stateFn { @@ -32,15 +30,17 @@ func countState(c *counter) stateFn { } // CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: %[[COUNTER_OBJ:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK: %[[MAX_SLOT:[0-9]+]] = getelementptr inbounds %main.counter, ptr %[[COUNTER_OBJ]], i32 0, i32 1 +// CHECK-NEXT: %[[STATE_SLOT:[0-9]+]] = getelementptr inbounds %main.counter, ptr %[[COUNTER_OBJ]], i32 0, i32 2 +// CHECK-NEXT: store i64 5, ptr %[[MAX_SLOT]] +// CHECK-NEXT: store %main.stateFn { ptr @main.countState, ptr null }, ptr %[[STATE_SLOT]] +// CHECK: %[[STATE:[0-9]+]] = load %main.stateFn, ptr %{{[0-9]+}} +// CHECK-NEXT: %[[STATE_ENV:[0-9]+]] = extractvalue %main.stateFn %[[STATE]], 1 +// CHECK-NEXT: %[[STATE_CODE:[0-9]+]] = extractvalue %main.stateFn %[[STATE]], 0 +// CHECK: %[[NEXT_STATE:[0-9]+]] = call %main.stateFn %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[STATE_ENV]], ptr %[[COUNTER_OBJ]]) +// CHECK: store %main.stateFn %[[NEXT_STATE]], ptr %{{[0-9]+}} func main() { - // CHECK: call ptr @"{{.*}}AllocZ"(i64 32) - // CHECK: store i64 5, ptr %1, align 8 - // CHECK: store %main.stateFn { ptr @main.countState, ptr null }, ptr %2, align 8 - // CHECK: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) - // CHECK: call %main.stateFn %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5, ptr %0) - // CHECK: store %main.stateFn %7, ptr %8, align 8 - // CHECK: icmp ne ptr %11, null - // CHECK: br i1 %12, label %_llgo_1, label %_llgo_2 c := &counter{max: 5, state: countState} for c.state != nil { diff --git a/cl/_testlibc/allocacstrs/in.go b/cl/_testlibc/allocacstrs/in.go index 51e892f288..c418de9024 100644 --- a/cl/_testlibc/allocacstrs/in.go +++ b/cl/_testlibc/allocacstrs/in.go @@ -1,69 +1,19 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/lib/c" -// CHECK-LABEL: define void @main.main(){{.*}} { +// AllocaCStrs builds a stack-resident, null-terminated pointer array and copies +// every Go string into stack storage. + +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [1 x i8] c"a", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [1 x i8] c"b", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [1 x i8] c"c", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1{{$}} + func main() { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) - // CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 0 - // CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %1, align 8 - // CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 1 - // CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 1 }, ptr %2, align 8 - // CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 2 - // CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %3, align 8 - // CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 - // CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 3, 1 - // CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 3, 2 - // CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 - // CHECK-NEXT: %8 = add i64 %7, 1 - // CHECK-NEXT: %9 = alloca ptr, i64 %8, align 8 - // CHECK-NEXT: br label %_llgo_4 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_6 - // CHECK-NEXT: %10 = phi i64 [ 0, %_llgo_6 ], [ %15, %_llgo_3 ] - // CHECK-NEXT: %11 = getelementptr ptr, ptr %9, i64 %10 - // CHECK-NEXT: %12 = load ptr, ptr %11, align 8 - // CHECK-NEXT: %13 = icmp eq ptr %12, null - // CHECK-NEXT: br i1 %13, label %_llgo_2, label %_llgo_3 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 - // CHECK-NEXT: ret void - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 - // CHECK-NEXT: %14 = call i32 (ptr, ...) @printf(ptr @3, ptr %12) - // CHECK-NEXT: %15 = add i64 %10, 1 - // CHECK-NEXT: br label %_llgo_1 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_0 - // CHECK-NEXT: %16 = phi i64 [ 0, %_llgo_0 ], [ %30, %_llgo_5 ] - // CHECK-NEXT: %17 = icmp slt i64 %16, %7 - // CHECK-NEXT: br i1 %17, label %_llgo_5, label %_llgo_6 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 - // CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 - // CHECK-NEXT: %19 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 - // CHECK-NEXT: %20 = icmp slt i64 %16, 0 - // CHECK-NEXT: %21 = icmp uge i64 %16, %19 - // CHECK-NEXT: %22 = or i1 %21, %20 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %22, {{.*}}) - // CHECK-NEXT: %23 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %18, i64 %16 - // CHECK-NEXT: %24 = load %"{{.*}}/runtime/internal/runtime.String", ptr %23, align 8 - // CHECK-NEXT: %25 = getelementptr ptr, ptr %9, i64 %16 - // CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %24, 1 - // CHECK-NEXT: %27 = add i64 %26, 1 - // CHECK-NEXT: %28 = alloca i8, i64 %27, align 1 - // CHECK-NEXT: %29 = call ptr @"{{.*}}/runtime/internal/runtime.CStrCopy"(ptr %28, %"{{.*}}/runtime/internal/runtime.String" %24) - // CHECK-NEXT: store ptr %29, ptr %25, align 8 - // CHECK-NEXT: %30 = add i64 %16, 1 - // CHECK-NEXT: br label %_llgo_4 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 - // CHECK-NEXT: %31 = getelementptr ptr, ptr %9, i64 %7 - // CHECK-NEXT: store ptr null, ptr %31, align 8 - // CHECK-NEXT: br label %_llgo_1 - // CHECK-NEXT: } cstrs := c.AllocaCStrs([]string{"a", "b", "c"}, true) n := 0 for { @@ -75,3 +25,110 @@ func main() { n++ } } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP0]], i64 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 1 }, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP0]], i64 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 1 }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP0]], i64 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 1 }, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP4]], i64 3, 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP5]], i64 3, 2 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = add i64 %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = alloca ptr, i64 %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 1 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 1 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 1 }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP1]], 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP5]], i64 3, 1 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], i64 3, 2 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = add i64 %[[TMP8]], 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = alloca ptr, i64 %[[TMP9]], align 8 +// CHECK-NEXT: br label %_llgo_[[BB4:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB6:[0-9]+]] ], [ %[[TMP15:[0-9]+]], %_llgo_[[BB3:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = getelementptr ptr, ptr %[[TMP9]], i64 %[[TMP10]] +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = icmp eq ptr %[[TMP12]], null +// DARWIN-ARM64-NEXT: br i1 %[[TMP13]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB3]] +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB6:[0-9]+]] ], [ %[[TMP16:[0-9]+]], %_llgo_[[BB3:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr ptr, ptr %[[TMP10]], i64 %[[TMP11]] +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = icmp eq ptr %[[TMP13]], null +// LINUX-AMD64-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB3]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB3]], ptr %[[TMP12]]) +// DARWIN-ARM64-NEXT: %[[TMP15]] = add i64 %[[TMP10]], 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB3]], ptr %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP16]] = add i64 %[[TMP11]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4]]: +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB0]] ], [ %[[TMP30:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = icmp slt i64 %[[TMP16]], %[[TMP7]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB5]], label %_llgo_[[BB6]] +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB0]] ], [ %[[TMP35:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = icmp slt i64 %[[TMP17]], %[[TMP8]] +// LINUX-AMD64-NEXT: br i1 %[[TMP18]], label %_llgo_[[BB5]], label %_llgo_[[BB6]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], 0 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = icmp slt i64 %[[TMP16]], 0 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = icmp uge i64 %[[TMP16]], %[[TMP19]] +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = or i1 %[[TMP21]], %[[TMP20]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP22]], i64 %[[TMP16]], i1 true, i64 %[[TMP19]]) +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP18]], i64 %[[TMP16]] +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP23]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = getelementptr ptr, ptr %[[TMP9]], i64 %[[TMP16]] +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" %[[TMP24]], 1 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = add i64 %[[TMP26]], 1 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = alloca i8, i64 %[[TMP27]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.CStrCopy"(ptr %[[TMP28]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP24]]) +// DARWIN-ARM64-NEXT: store ptr %[[TMP29]], ptr %[[TMP25]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP30]] = add i64 %[[TMP16]], 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], 0 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = icmp slt i64 %[[TMP17]], 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = icmp uge i64 %[[TMP17]], %[[TMP20]] +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = or i1 %[[TMP22]], %[[TMP21]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP23]], i64 %[[TMP17]], i1 true, i64 %[[TMP20]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP19]], i64 %[[TMP17]] +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr ptr, ptr %[[TMP10]], i64 %[[TMP17]] +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.String" %[[TMP25]], 1 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = add i64 %[[TMP27]], 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = alloca i8, i64 %[[TMP28]], align 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP25]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load ptr, ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load i64, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.CStrCopy"(ptr %[[TMP29]], ptr %[[TMP31]], i64 %[[TMP33]]) +// LINUX-AMD64-NEXT: store ptr %[[TMP34]], ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35]] = add i64 %[[TMP17]], 1 +// CHECK-NEXT: br label %_llgo_[[BB4]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB6]]: +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = getelementptr ptr, ptr %[[TMP9]], i64 %[[TMP7]] +// DARWIN-ARM64-NEXT: store ptr null, ptr %[[TMP31]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr ptr, ptr %[[TMP10]], i64 %[[TMP8]] +// LINUX-AMD64-NEXT: store ptr null, ptr %[[TMP36]], align 8 +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-NEXT: } diff --git a/cl/_testlibc/argv/in.go b/cl/_testlibc/argv/in.go index a139be25dd..a8f74f18e4 100644 --- a/cl/_testlibc/argv/in.go +++ b/cl/_testlibc/argv/in.go @@ -6,27 +6,17 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[ARGV_INDEX:%[0-9]+]] = phi i32 [ 0, %{{.*}} ], [ %{{[0-9]+}}, %{{.*}} ] +// CHECK: [[ARGV_COUNT:%[0-9]+]] = load i32, ptr @__llgo_argc +// CHECK-NEXT: [[ARGV_MORE:%[0-9]+]] = icmp slt i32 [[ARGV_INDEX]], [[ARGV_COUNT]] +// CHECK-NEXT: br i1 [[ARGV_MORE]], label %{{.*}}, label %{{.*}} +// CHECK: [[ARGV_BASE:%[0-9]+]] = load ptr, ptr @__llgo_argv +// CHECK-NEXT: [[ARGV_SLOT:%[0-9]+]] = getelementptr ptr, ptr [[ARGV_BASE]], i32 [[ARGV_INDEX]] +// CHECK-NEXT: [[ARGV_VALUE:%[0-9]+]] = load ptr, ptr [[ARGV_SLOT]] +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, ptr [[ARGV_VALUE]]) +// CHECK: [[ARGV_NEXT:%[0-9]+]] = add i32 [[ARGV_INDEX]], 1 + func main() { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: br label %_llgo_1 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 - // CHECK-NEXT: %0 = phi i32 [ 0, %_llgo_0 ], [ %7, %_llgo_2 ] - // CHECK-NEXT: %1 = load i32, ptr @__llgo_argc, align 4 - // CHECK-NEXT: %2 = icmp slt i32 %0, %1 - // CHECK-NEXT: br i1 %2, label %_llgo_2, label %_llgo_3 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 - // CHECK-NEXT: %3 = load ptr, ptr @__llgo_argv, align 8 - // CHECK-NEXT: %4 = getelementptr ptr, ptr %3, i32 %0 - // CHECK-NEXT: %5 = load ptr, ptr %4, align 8 - // CHECK-NEXT: %6 = call i32 (ptr, ...) @printf(ptr @0, ptr %5) - // CHECK-NEXT: %7 = add i32 %0, 1 - // CHECK-NEXT: br label %_llgo_1 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 - // CHECK-NEXT: ret void - // CHECK-NEXT: } for i := c.Int(0); i < c.Argc; i++ { c.Printf(c.Str("%s\n"), c.Index(c.Argv, i)) } diff --git a/cl/_testlibc/atomic/in.go b/cl/_testlibc/atomic/in.go index f1681d9c38..8e660e1b2c 100644 --- a/cl/_testlibc/atomic/in.go +++ b/cl/_testlibc/atomic/in.go @@ -10,23 +10,36 @@ import ( func main() { var v int64 - // CHECK: store atomic i64 100, ptr %0 seq_cst, align 8 + // All operations target the same slot and retain sequential consistency. + // CHECK: [[V:%.*]] = call ptr @"{{.*}}AllocZ"(i64 8) + // CHECK: store atomic i64 100, ptr [[V]] seq_cst atomic.Store(&v, 100) - // CHECK: %1 = load atomic i64, ptr %0 seq_cst, align 8 + // CHECK: [[LOADED:%.*]] = load atomic i64, ptr [[V]] seq_cst + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[LOADED]]) c.Printf(c.Str("store: %ld\n"), atomic.Load(&v)) - // CHECK: %3 = atomicrmw add ptr %0, i64 1 seq_cst, align 8 + // CHECK: [[ADD_OLD:%.*]] = atomicrmw add ptr [[V]], i64 1 seq_cst + // CHECK: [[ADD_CURRENT:%.*]] = load i64, ptr [[V]] + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[ADD_OLD]], i64 [[ADD_CURRENT]]) ret := atomic.Add(&v, 1) c.Printf(c.Str("ret: %ld, v: %ld\n"), ret, v) - // CHECK: %6 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 + // CHECK: [[CAS100:%.*]] = cmpxchg ptr [[V]], i64 100, i64 102 seq_cst seq_cst + // CHECK: [[CAS100_OLD:%.*]] = extractvalue { i64, i1 } [[CAS100]], 0 + // CHECK: [[CAS100_CURRENT:%.*]] = load i64, ptr [[V]] + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[CAS100_OLD]], i64 [[CAS100_CURRENT]]) ret, _ = atomic.CompareAndExchange(&v, 100, 102) c.Printf(c.Str("ret: %ld vs 100, v: %ld\n"), ret, v) - // CHECK: %11 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 + // CHECK: [[CAS101:%.*]] = cmpxchg ptr [[V]], i64 101, i64 102 seq_cst seq_cst + // CHECK: [[CAS101_OLD:%.*]] = extractvalue { i64, i1 } [[CAS101]], 0 + // CHECK: [[CAS101_CURRENT:%.*]] = load i64, ptr [[V]] + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[CAS101_OLD]], i64 [[CAS101_CURRENT]]) ret, _ = atomic.CompareAndExchange(&v, 101, 102) c.Printf(c.Str("ret: %ld vs 101, v: %ld\n"), ret, v) - // CHECK: %16 = atomicrmw sub ptr %0, i64 1 seq_cst, align 8 + // CHECK: [[SUB_OLD:%.*]] = atomicrmw sub ptr [[V]], i64 1 seq_cst + // CHECK: [[SUB_CURRENT:%.*]] = load i64, ptr [[V]] + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[SUB_OLD]], i64 [[SUB_CURRENT]]) ret = atomic.Sub(&v, 1) c.Printf(c.Str("ret: %ld, v: %ld\n"), ret, v) } diff --git a/cl/_testlibc/complex/in.go b/cl/_testlibc/complex/in.go index 7b96b704c7..e04ba79cf1 100644 --- a/cl/_testlibc/complex/in.go +++ b/cl/_testlibc/complex/in.go @@ -6,10 +6,19 @@ import ( "github.com/goplus/lib/c/math/cmplx" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"addr:", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"abs(3+4i):", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"real(3+4i):", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"imag(3+4i):", align 1{{$}} +// CHECK-LABEL: define void @main.f({ float, float } %0, { float, float } %1, ptr %2){{.*}} { +// CHECK: call void @"{{.*}}PrintPointer"(ptr %2) +// CHECK: [[ABS32:%[0-9]+]] = call float @cabsf({ float, float } %0) +// CHECK: [[ABS64:%[0-9]+]] = fpext float [[ABS32]] to double +// CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[ABS64]]) +// CHECK: [[REAL32:%[0-9]+]] = extractvalue { float, float } %1, 0 +// CHECK: [[REAL64:%[0-9]+]] = fpext float [[REAL32]] to double +// CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[REAL64]]) +// CHECK: [[IMAG32:%[0-9]+]] = extractvalue { float, float } %1, 1 +// CHECK: [[IMAG64:%[0-9]+]] = fpext float [[IMAG32]] to double +// CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[IMAG64]]) +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.f({ float, float } { float 3.000000e+00, float 4.000000e+00 }, { float, float } { float 3.000000e+00, float 4.000000e+00 }, ptr @main.f) func f(c, z complex64, addr c.Pointer) { println("addr:", addr) @@ -25,49 +34,3 @@ func main() { x := complex(re, im) f(x, z, c.Func(f)) } - -// CHECK-LABEL: define void @main.f({ float, float } %0, { float, float } %1, ptr %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %3 = call float @cabsf({ float, float } %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %4 = fpext float %3 to double -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %5 = extractvalue { float, float } %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 11 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %6 = fpext float %5 to double -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %7 = extractvalue { float, float } %1, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 11 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %8 = fpext float %7 to double -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.f({ float, float } { float 3.000000e+00, float 4.000000e+00 }, { float, float } { float 3.000000e+00, float 4.000000e+00 }, ptr @main.f) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testlibc/defer/in.go b/cl/_testlibc/defer/in.go index efebce573e..e9c94a42b3 100644 --- a/cl/_testlibc/defer/in.go +++ b/cl/_testlibc/defer/in.go @@ -3,10 +3,84 @@ package main import "github.com/goplus/lib/c" -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [7 x i8] c"world\0A\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [5 x i8] c"bye\0A\00", align 1{{$}} +// C varargs defers still use the Go defer chain, and each deferred printf is +// guarded by a recover frame at invocation time. +// CHECK: [[HELLO:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" +// CHECK: [[FORMAT:@[0-9]+]] = private unnamed_addr constant [4 x i8] c"%s\0A\00" +// CHECK: [[WORLD:@[0-9]+]] = private unnamed_addr constant [7 x i8] c"world\0A\00" +// CHECK: [[BYE:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"bye\0A\00" +// CHECK-LABEL: define i1 @main.f(%"{{.*}}String" %0){{.*}} { +// CHECK: [[F_LEN:%.*]] = extractvalue %"{{.*}}String" %0, 1 +// CHECK-NEXT: [[F_RESULT:%.*]] = icmp sgt i64 [[F_LEN]], 2 +// CHECK-NEXT: ret i1 [[F_RESULT]] + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[GO_DEFER_DATA:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[COND:%.*]] = call i1 @main.f(%"{{.*}}String" { ptr [[HELLO]], i64 5 }) +// CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) +// CHECK: [[FLAGS:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 1 +// CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 +// True branch: copy the Go string to stable C storage and keep format+argument. +// CHECK: [[CSTR_BUF:%.*]] = alloca i8, i64 6 +// CHECK-NEXT: [[CSTR:%.*]] = call ptr @"{{.*}}CStrCopy"(ptr [[CSTR_BUF]], %"{{.*}}String" { ptr [[HELLO]], i64 5 }) +// CHECK: [[FORMAT_FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[FORMAT_FLAGS:%.*]] = or i64 [[FORMAT_FLAGS0]], 1 +// CHECK-NEXT: store i64 [[FORMAT_FLAGS]], ptr [[FLAGS]] +// CHECK: [[FORMAT_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[FORMAT_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: store ptr [[FORMAT_PREV]], ptr {{%.*}} +// CHECK: store ptr [[FORMAT]], ptr {{%.*}} +// CHECK: store ptr [[CSTR]], ptr {{%.*}} +// CHECK: store ptr [[FORMAT_NODE]], ptr [[HEAD]] +// Common path: bye is always the newest node. +// CHECK: [[BYE_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[BYE_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 24) +// CHECK: store ptr [[BYE_PREV]], ptr {{%.*}} +// CHECK: store i64 2, ptr {{%.*}} +// CHECK: store ptr [[BYE]], ptr {{%.*}} +// CHECK: store ptr [[BYE_NODE]], ptr [[HEAD]] +// False branch: world has its own flag and node. +// CHECK: [[WORLD_FLAGS0:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[WORLD_FLAGS:%.*]] = or i64 [[WORLD_FLAGS0]], 2 +// CHECK-NEXT: store i64 [[WORLD_FLAGS]], ptr [[FLAGS]] +// CHECK: [[WORLD_PREV:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[WORLD_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 24) +// CHECK: store ptr [[WORLD_PREV]], ptr {{%.*}} +// CHECK: store ptr [[WORLD]], ptr {{%.*}} +// CHECK: store ptr [[WORLD_NODE]], ptr [[HEAD]] +// CHECK: br i1 [[COND]], label %{{.*}}, label %{{.*}} +// Cleanup order in the IR is bye, conditional world, then conditional %s. +// CHECK: [[FORMAT_MASK:%.*]] = and i64 {{%.*}}, 1 +// CHECK: [[WORLD_MASK:%.*]] = and i64 {{%.*}}, 2 +// CHECK: [[BYE_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: [[BYE_VALUE:%.*]] = load { ptr, i64, ptr }, ptr [[BYE_ACTIVE]] +// CHECK: [[BYE_CALL_FORMAT:%.*]] = extractvalue { ptr, i64, ptr } [[BYE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[BYE_ACTIVE]]) +// CHECK-NEXT: [[BYE_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @printf) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr [[BYE_CALL_FORMAT]]) +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[BYE_RECOVER]]) +// CHECK: [[WORLD_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[WORLD_CANDIDATE]], null +// CHECK: [[WORLD_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: [[WORLD_VALUE:%.*]] = load { ptr, i64, ptr }, ptr [[WORLD_ACTIVE]] +// CHECK: [[WORLD_CALL_FORMAT:%.*]] = extractvalue { ptr, i64, ptr } [[WORLD_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[WORLD_ACTIVE]]) +// CHECK-NEXT: [[WORLD_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @printf) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr [[WORLD_CALL_FORMAT]]) +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[WORLD_RECOVER]]) +// CHECK: [[FORMAT_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[FORMAT_CANDIDATE]], null +// CHECK: [[FORMAT_ACTIVE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: [[FORMAT_VALUE:%.*]] = load { ptr, i64, ptr, ptr }, ptr [[FORMAT_ACTIVE]] +// CHECK: [[CALL_FORMAT:%.*]] = extractvalue { ptr, i64, ptr, ptr } [[FORMAT_VALUE]], 2 +// CHECK-NEXT: [[CALL_CSTR:%.*]] = extractvalue { ptr, i64, ptr, ptr } [[FORMAT_VALUE]], 3 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[FORMAT_ACTIVE]]) +// CHECK-NEXT: [[FORMAT_RECOVER:%.*]] = call %"{{.*}}recoverState" @"{{.*}}StartRecoverFrame"(ptr @printf) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr [[CALL_FORMAT]], ptr [[CALL_CSTR]]) +// CHECK-NEXT: call void @"{{.*}}EndRecoverFrame"(%"{{.*}}recoverState" [[FORMAT_RECOVER]]) func f(s string) bool { return len(s) > 2 @@ -21,201 +95,3 @@ func main() { } defer c.Printf(c.Str("bye\n")) } - -// CHECK-LABEL: define i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = icmp sgt i64 %1, 2 -// CHECK-NEXT: ret i1 %2 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = call i1 @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %3 = alloca i8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 0 -// CHECK-NEXT: store ptr %3, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 2 -// CHECK-NEXT: store ptr %2, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_6), ptr %8, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %4) -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 1 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 3 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 4 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %12, align 8 -// CHECK-NEXT: %13 = call i32 @{{(__)?}}sigsetjmp(ptr %3, i32 0) -// CHECK-NEXT: %14 = icmp eq i32 %13, 0 -// CHECK-NEXT: br i1 %14, label %_llgo_5, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %15 = alloca i8, i64 6, align 1 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.CStrCopy"(ptr %15, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) -// CHECK-NEXT: %17 = load i64, ptr %9, align 8 -// CHECK-NEXT: %18 = or i64 %17, 1 -// CHECK-NEXT: store i64 %18, ptr %9, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %20, i32 0, i32 0 -// CHECK-NEXT: store ptr %19, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %20, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %20, i32 0, i32 2 -// CHECK-NEXT: store ptr @{{[0-9]+}}, ptr %23, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds { ptr, i64, ptr, ptr }, ptr %20, i32 0, i32 3 -// CHECK-NEXT: store ptr %16, ptr %24, align 8 -// CHECK-NEXT: store ptr %20, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_1 -// CHECK-NEXT: %25 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: %27 = getelementptr inbounds { ptr, i64, ptr }, ptr %26, i32 0, i32 0 -// CHECK-NEXT: store ptr %25, ptr %27, align 8 -// CHECK-NEXT: %28 = getelementptr inbounds { ptr, i64, ptr }, ptr %26, i32 0, i32 1 -// CHECK-NEXT: store i64 2, ptr %28, align 8 -// CHECK-NEXT: %29 = getelementptr inbounds { ptr, i64, ptr }, ptr %26, i32 0, i32 2 -// CHECK-NEXT: store ptr @{{[0-9]+}}, ptr %29, align 8 -// CHECK-NEXT: store ptr %26, ptr %12, align 8 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %11, align 8 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5 -// CHECK-NEXT: %30 = load i64, ptr %9, align 8 -// CHECK-NEXT: %31 = or i64 %30, 2 -// CHECK-NEXT: store i64 %31, ptr %9, align 8 -// CHECK-NEXT: %32 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: %34 = getelementptr inbounds { ptr, i64, ptr }, ptr %33, i32 0, i32 0 -// CHECK-NEXT: store ptr %32, ptr %34, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds { ptr, i64, ptr }, ptr %33, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %35, align 8 -// CHECK-NEXT: %36 = getelementptr inbounds { ptr, i64, ptr }, ptr %33, i32 0, i32 2 -// CHECK-NEXT: store ptr @{{[0-9]+}}, ptr %36, align 8 -// CHECK-NEXT: store ptr %33, ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_7 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8, %_llgo_2 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_11), ptr %10, align 8 -// CHECK-NEXT: %37 = load i64, ptr %9, align 8 -// CHECK-NEXT: %38 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %39 = icmp ne ptr %38, null -// CHECK-NEXT: br i1 %39, label %_llgo_12, label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_8, %_llgo_19 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %2) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_7), ptr %11, align 8 -// CHECK-NEXT: %40 = load ptr, ptr %10, align 8 -// CHECK-NEXT: indirectbr ptr %40, [label %_llgo_7, label %_llgo_10, label %_llgo_11, label %_llgo_6] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_19 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_8, %_llgo_15 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_7), ptr %10, align 8 -// CHECK-NEXT: %41 = load i64, ptr %9, align 8 -// CHECK-NEXT: %42 = and i64 %41, 1 -// CHECK-NEXT: %43 = icmp ne i64 %42, 0 -// CHECK-NEXT: br i1 %43, label %_llgo_18, label %_llgo_19 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_8, %_llgo_13 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %10, align 8 -// CHECK-NEXT: %44 = load i64, ptr %9, align 8 -// CHECK-NEXT: %45 = and i64 %44, 2 -// CHECK-NEXT: %46 = icmp ne i64 %45, 0 -// CHECK-NEXT: br i1 %46, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_6 -// CHECK-NEXT: %47 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %48 = load { ptr, i64, ptr }, ptr %47, align 8 -// CHECK-NEXT: %49 = extractvalue { ptr, i64, ptr } %48, 0 -// CHECK-NEXT: store ptr %49, ptr %12, align 8 -// CHECK-NEXT: %50 = extractvalue { ptr, i64, ptr } %48, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %47) -// CHECK-NEXT: %51 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @printf) -// CHECK-NEXT: %52 = call i32 (ptr, ...) @printf(ptr %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %51) -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_12, %_llgo_6 -// CHECK-NEXT: br label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_11 -// CHECK-NEXT: %53 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %54 = icmp ne ptr %53, null -// CHECK-NEXT: br i1 %54, label %_llgo_16, label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_17, %_llgo_11 -// CHECK-NEXT: br label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_14 -// CHECK-NEXT: %55 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %56 = load { ptr, i64, ptr }, ptr %55, align 8 -// CHECK-NEXT: %57 = extractvalue { ptr, i64, ptr } %56, 0 -// CHECK-NEXT: store ptr %57, ptr %12, align 8 -// CHECK-NEXT: %58 = extractvalue { ptr, i64, ptr } %56, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %55) -// CHECK-NEXT: %59 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @printf) -// CHECK-NEXT: %60 = call i32 (ptr, ...) @printf(ptr %58) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %59) -// CHECK-NEXT: br label %_llgo_17 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_16, %_llgo_14 -// CHECK-NEXT: br label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_10 -// CHECK-NEXT: %61 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %62 = icmp ne ptr %61, null -// CHECK-NEXT: br i1 %62, label %_llgo_20, label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_21, %_llgo_10 -// CHECK-NEXT: %63 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %4, align 8 -// CHECK-NEXT: %64 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %63, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %64) -// CHECK-NEXT: %65 = load ptr, ptr %11, align 8 -// CHECK-NEXT: indirectbr ptr %65, [label %_llgo_7, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_18 -// CHECK-NEXT: %66 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %67 = load { ptr, i64, ptr, ptr }, ptr %66, align 8 -// CHECK-NEXT: %68 = extractvalue { ptr, i64, ptr, ptr } %67, 0 -// CHECK-NEXT: store ptr %68, ptr %12, align 8 -// CHECK-NEXT: %69 = extractvalue { ptr, i64, ptr, ptr } %67, 2 -// CHECK-NEXT: %70 = extractvalue { ptr, i64, ptr, ptr } %67, 3 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %66) -// CHECK-NEXT: %71 = call %"{{.*}}/runtime/internal/runtime.recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @printf) -// CHECK-NEXT: %72 = call i32 (ptr, ...) @printf(ptr %69, ptr %70) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}/runtime/internal/runtime.recoverState" %71) -// CHECK-NEXT: br label %_llgo_21 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_20, %_llgo_18 -// CHECK-NEXT: br label %_llgo_19 -// CHECK-NEXT: } diff --git a/cl/_testlibc/demangle/in.go b/cl/_testlibc/demangle/in.go index c649248785..8da2ec4780 100644 --- a/cl/_testlibc/demangle/in.go +++ b/cl/_testlibc/demangle/in.go @@ -6,11 +6,14 @@ import ( "github.com/goplus/lib/cpp/llvm" ) -// CHECK: @0 = private unnamed_addr constant [29 x i8] c"__ZNK9INIReader10ParseErrorEv", align 1 +// CHECK: [[MANGLED:@[0-9]+]] = private unnamed_addr constant [29 x i8] c"__ZNK9INIReader10ParseErrorEv", align 1 // CHECK-LABEL: define void @main.main(){{.*}} { func main() { mangledName := "__ZNK9INIReader10ParseErrorEv" - // CHECK: %0 = call ptr @_ZN4llvm15itaniumDemangleENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEb(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 29 }, i1 true) + // CHECK: [[DEMANGLED:%[0-9]+]] = call ptr @_ZN4llvm15itaniumDemangleENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEb(%"{{.*}}/runtime/internal/runtime.String" { ptr [[MANGLED]], i64 29 }, i1 true) + // CHECK-NEXT: [[OK:%[0-9]+]] = icmp ne ptr [[DEMANGLED]], null + // CHECK-NEXT: br i1 [[OK]], label %{{[^,]+}}, label %{{[^ ]+}} + // CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, ptr [[DEMANGLED]]) if name := llvm.ItaniumDemangle(mangledName, true); name != nil { c.Printf(c.Str("%s\n"), name) } else { diff --git a/cl/_testlibc/once/in.go b/cl/_testlibc/once/in.go index e0323a7cb9..48a82651e3 100644 --- a/cl/_testlibc/once/in.go +++ b/cl/_testlibc/once/in.go @@ -6,9 +6,26 @@ import ( "github.com/goplus/lib/c/pthread/sync" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"Do once\0A\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [16 x i8] c"sync.Once demo\0A\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [16 x i8] c"sync.Once demo\0A\00", align 1{{$}} +// The C-backed Once implementation must lower to pthread_once with a concrete +// callback, rather than duplicating the closure body at each call site. +// CHECK-LABEL: define void @main.f(){{.*}} { +// CHECK: call i32 @pthread_once(ptr @main.once, ptr @"main.f$1") +// CHECK-NEXT: ret void +// CHECK-LABEL: define void @"main.f$1"(){{.*}} { +// CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}) +// CHECK-NEXT: ret void +// CHECK-LABEL: define void @main.init(){{.*}} { +// pthread_once_t is a named aggregate on Darwin and i32 on Linux. In both +// cases, preserve the association from the runtime initializer to main.once. +// CHECK: [[ONCE_INIT:%[0-9]+]] = load [[ONCE_TYPE:(i32|%"[^"]*Once")]], ptr @llgoSyncOnceInitVal +// CHECK-NEXT: store [[ONCE_TYPE]] [[ONCE_INIT]], ptr @main.once +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[PREFIX:%[0-9]+]] = call %"{{.*}}String" @"{{.*}}StringFrom"(ptr @{{[0-9]+}}, i64 9) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[PREFIX]]) +// CHECK: [[WHOLE:%[0-9]+]] = call %"{{.*}}String" @"{{.*}}StringFromCStr"(ptr @{{[0-9]+}}) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[WHOLE]]) +// CHECK: call void @main.f() +// CHECK-NEXT: call void @main.f() var once sync.Once = sync.OnceInit @@ -24,43 +41,3 @@ func main() { f() f() } - -// CHECK-LABEL: define void @main.f(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 @pthread_once(ptr @main.once, ptr @"main.f$1") -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.f$1"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: %1 = load {{.*}}, ptr @llgoSyncOnceInitVal -// CHECK-NEXT: store {{.*}} %1, ptr @main.once -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFrom"(ptr @{{[0-9]+}}, i64 9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromCStr"(ptr @{{[0-9]+}}) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @main.f() -// CHECK-NEXT: call void @main.f() -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testlibc/setjmp/in.go b/cl/_testlibc/setjmp/in.go index 136f26c76c..3c1124e912 100644 --- a/cl/_testlibc/setjmp/in.go +++ b/cl/_testlibc/setjmp/in.go @@ -5,9 +5,19 @@ import ( "github.com/goplus/lib/c" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [18 x i8] c"??Hello, setjmp!\0A\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"%s\00", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [10 x i8] c"exception:", align 1{{$}} +// CHECK-LABEL: define void @main.main(){{.*}} { +// The libc ABI controls the sigjmp_buf size and libc symbol spellings. +// CHECK: [[JMPBUF:%[0-9]+]] = alloca i8, i64 {{(196|200)}} +// CHECK-NEXT: [[RET:%[0-9]+]] = call i32 @{{(__)?sigsetjmp}}(ptr [[JMPBUF]], i32 0) +// CHECK-NEXT: [[FIRST:%[0-9]+]] = icmp eq i32 [[RET]], 0 +// CHECK-NEXT: br i1 [[FIRST]], label %{{[^,]+}}, label %{{[^ ]+}} +// CHECK: {{^_llgo_[0-9]+:}} +// CHECK: [[STDERR:%[0-9]+]] = load ptr, ptr @{{(__stderrp|stderr)}} +// CHECK-NEXT: call i32 (ptr, ptr, ...) @fprintf(ptr [[STDERR]], ptr @{{[0-9]+}}, ptr getelementptr (i8, ptr getelementptr (i8, ptr @{{[0-9]+}}, i64 1), i64 1)) +// CHECK-NEXT: call void @siglongjmp(ptr [[JMPBUF]], i32 1) +// CHECK: {{^_llgo_[0-9]+:}} +// CHECK: [[PRINT_RET:%[0-9]+]] = sext i32 [[RET]] to i64 +// CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[PRINT_RET]]) func main() { jb := c.AllocaSigjmpBuf() @@ -20,41 +30,3 @@ func main() { println("exception:", ret) } } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca i8 -// CHECK-NEXT: %1 = call i32 @{{(__)?}}sigsetjmp(ptr %0, i32 0) -// CHECK-NEXT: %2 = icmp eq i32 %1, 0 -// CHECK-NEXT: br i1 %2, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = load ptr, ptr @{{(__stderrp|stderr)}}, align 8 -// CHECK-NEXT: %4 = call i32 (ptr, ptr, ...) @fprintf(ptr %3, ptr @{{[0-9]+}}, ptr getelementptr (i8, ptr getelementptr (i8, ptr @{{[0-9]+}}, i64 1), i64 1)) -// CHECK-NEXT: call void @siglongjmp(ptr %0, i32 1) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 10 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %5 = sext i32 %1 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-NEXT: } diff --git a/cl/_testlibc/sqlite/in.go b/cl/_testlibc/sqlite/in.go index 6c2e65e92d..bff39cccbd 100644 --- a/cl/_testlibc/sqlite/in.go +++ b/cl/_testlibc/sqlite/in.go @@ -6,21 +6,27 @@ import ( "github.com/goplus/lib/c/sqlite" ) -// CHECK: define void @main.check +// CHECK-LABEL: define void @main.check(i32 %0){{.*}} { +// CHECK: %[[IS_ERROR:[0-9]+]] = icmp ne i32 %0, 0 +// CHECK: br i1 %[[IS_ERROR]] func check(err sqlite.Errno) { if err != sqlite.OK { - // CHECK: %2 = call ptr @sqlite3_errstr(i32 %0) + // CHECK: %[[ERRSTR:[0-9]+]] = call ptr @sqlite3_errstr(i32 %0) + // CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i32 %0, ptr %[[ERRSTR]]) c.Printf(c.Str("==> Error: (%d) %s\n"), err, err.Errstr()) c.Exit(1) } } -// CHECK: define void @main.main +// CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: %0 = call { ptr, i32 } @"github.com/goplus/lib/c/sqlite.OpenV2"(ptr @1, i32 130, ptr null) + // CHECK: %[[OPEN:[0-9]+]] = call { ptr, i32 } @"github.com/goplus/lib/c/sqlite.OpenV2"(ptr @{{[0-9]+}}, i32 130, ptr null) + // CHECK: %[[DB:[0-9]+]] = extractvalue { ptr, i32 } %[[OPEN]], 0 + // CHECK: %[[OPEN_ERR:[0-9]+]] = extractvalue { ptr, i32 } %[[OPEN]], 1 + // CHECK: call void @main.check(i32 %[[OPEN_ERR]]) db, err := sqlite.OpenV2(c.Str(":memory:"), sqlite.OpenReadWrite|sqlite.OpenMemory, nil) check(err) - // CHECK: %3 = call i32 @sqlite3_close(ptr %1) + // CHECK: call i32 @sqlite3_close(ptr %[[DB]]) db.Close() } diff --git a/cl/_testlibgo/atomic/in.go b/cl/_testlibgo/atomic/in.go index d97635e548..e7d8f2d894 100644 --- a/cl/_testlibgo/atomic/in.go +++ b/cl/_testlibgo/atomic/in.go @@ -5,36 +5,49 @@ import ( "sync/atomic" ) +// Cover the LLVM operations and orderings selected for the four atomic APIs; +// the runtime golden checks their returned values. // CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[ATOMIC:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 8) +// CHECK-NEXT: store atomic i64 100, ptr [[ATOMIC]] seq_cst +// CHECK-NEXT: [[LOADED:%[0-9]+]] = load atomic i64, ptr [[ATOMIC]] seq_cst +// CHECK: call void @"{{.*}}PrintInt"(i64 [[LOADED]]) +// CHECK: [[ADD_OLD:%[0-9]+]] = atomicrmw add ptr [[ATOMIC]], i64 1 seq_cst +// CHECK-NEXT: [[ADD_RESULT:%[0-9]+]] = add i64 [[ADD_OLD]], 1 +// CHECK-NEXT: [[ADD_VALUE:%[0-9]+]] = load i64, ptr [[ATOMIC]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ADD_RESULT]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ADD_VALUE]]) +// CHECK: [[CAS0_PAIR:%[0-9]+]] = cmpxchg ptr [[ATOMIC]], i64 100, i64 102 seq_cst seq_cst +// CHECK-NEXT: [[CAS0_OK:%[0-9]+]] = extractvalue { i64, i1 } [[CAS0_PAIR]], 1 +// CHECK-NEXT: [[CAS0_VALUE:%[0-9]+]] = load i64, ptr [[ATOMIC]] +// CHECK: call void @"{{.*}}PrintBool"(i1 [[CAS0_OK]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[CAS0_VALUE]]) +// CHECK: [[CAS1_PAIR:%[0-9]+]] = cmpxchg ptr [[ATOMIC]], i64 101, i64 102 seq_cst seq_cst +// CHECK-NEXT: [[CAS1_OK:%[0-9]+]] = extractvalue { i64, i1 } [[CAS1_PAIR]], 1 +// CHECK-NEXT: [[CAS1_VALUE:%[0-9]+]] = load i64, ptr [[ATOMIC]] +// CHECK: call void @"{{.*}}PrintBool"(i1 [[CAS1_OK]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[CAS1_VALUE]]) +// CHECK: [[SUB_OLD:%[0-9]+]] = atomicrmw add ptr [[ATOMIC]], i64 -1 seq_cst +// CHECK-NEXT: [[SUB_RESULT:%[0-9]+]] = add i64 [[SUB_OLD]], -1 +// CHECK-NEXT: [[SUB_VALUE:%[0-9]+]] = load i64, ptr [[ATOMIC]] +// CHECK: call void @"{{.*}}PrintInt"(i64 [[SUB_RESULT]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[SUB_VALUE]]) + func main() { var v int64 - // CHECK: store atomic i64 100, ptr %0 seq_cst, align 8 - // CHECK: %1 = load atomic i64, ptr %0 seq_cst, align 8 atomic.StoreInt64(&v, 100) println("store:", atomic.LoadInt64(&v)) - // CHECK: %2 = atomicrmw add ptr %0, i64 1 seq_cst, align 8 - // CHECK: %3 = add i64 %2, 1 - // CHECK: %4 = load i64, ptr %0, align 8 ret := atomic.AddInt64(&v, 1) println("ret:", ret, "v:", v) - // CHECK: %5 = cmpxchg ptr %0, i64 100, i64 102 seq_cst seq_cst, align 8 - // CHECK: %6 = extractvalue { i64, i1 } %5, 1 - // CHECK: %7 = load i64, ptr %0, align 8 swp := atomic.CompareAndSwapInt64(&v, 100, 102) println("swp:", swp, "v:", v) - // CHECK: %8 = cmpxchg ptr %0, i64 101, i64 102 seq_cst seq_cst, align 8 - // CHECK: %9 = extractvalue { i64, i1 } %8, 1 - // CHECK: %10 = load i64, ptr %0, align 8 swp = atomic.CompareAndSwapInt64(&v, 101, 102) println("swp:", swp, "v:", v) - // CHECK: %11 = atomicrmw add ptr %0, i64 -1 seq_cst, align 8 - // CHECK: %12 = add i64 %11, -1 - // CHECK: %13 = load i64, ptr %0, align 8 ret = atomic.AddInt64(&v, -1) println("ret:", ret, "v:", v) } diff --git a/cl/_testlibgo/bytes/in.go b/cl/_testlibgo/bytes/in.go index c577de6d5d..136c43ff0e 100644 --- a/cl/_testlibgo/bytes/in.go +++ b/cl/_testlibgo/bytes/in.go @@ -6,26 +6,18 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 6 }) -// CHECK-NEXT: %2 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1) -// CHECK-NEXT: %3 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 5 }) -// CHECK-NEXT: %4 = call %"{{.*}}/runtime/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %0) -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 3 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 2 }) -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 2 }) -// CHECK-NEXT: %8 = call i1 @bytes.EqualFold(%"{{.*}}/runtime/internal/runtime.Slice" %6, %"{{.*}}/runtime/internal/runtime.Slice" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[BUFFER:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 40) +// CHECK-NEXT: [[HELLO:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}StringToBytes"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 6 }) +// CHECK-NEXT: call { i64, %"{{.*}}iface" } @"bytes.(*Buffer).Write"(ptr [[BUFFER]], %"{{.*}}Slice" [[HELLO]]) +// CHECK-NEXT: call { i64, %"{{.*}}iface" } @"bytes.(*Buffer).WriteString"(ptr [[BUFFER]], %"{{.*}}String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[BYTES:%[0-9]+]] = call %"{{.*}}Slice" @"bytes.(*Buffer).Bytes"(ptr [[BUFFER]]) +// CHECK-NEXT: [[STRING:%[0-9]+]] = call %"{{.*}}String" @"bytes.(*Buffer).String"(ptr [[BUFFER]]) +// CHECK: call void @"{{.*}}PrintSlice"(%"{{.*}}Slice" [[BYTES]]) +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" [[STRING]]) +// CHECK: [[UPPER:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}StringToBytes"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 2 }) +// CHECK-NEXT: [[LOWER:%[0-9]+]] = call %"{{.*}}Slice" @"{{.*}}StringToBytes"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 2 }) +// CHECK-NEXT: [[EQUAL:%[0-9]+]] = call i1 @bytes.EqualFold(%"{{.*}}Slice" [[UPPER]], %"{{.*}}Slice" [[LOWER]]) +// CHECK-NEXT: call void @"{{.*}}PrintBool"(i1 [[EQUAL]]) func main() { var b bytes.Buffer // A Buffer needs no initialization. b.Write([]byte("Hello ")) diff --git a/cl/_testlibgo/complex/in.go b/cl/_testlibgo/complex/in.go index 0444ab045b..d771f276f6 100644 --- a/cl/_testlibgo/complex/in.go +++ b/cl/_testlibgo/complex/in.go @@ -7,11 +7,14 @@ import ( // CHECK-LABEL: define void @main.f({ double, double } %0, { double, double } %1){{.*}} { func f(c, z complex128) { - // CHECK: %2 = call double @"math/cmplx.Abs"({ double, double } %0) + // CHECK: [[COMPLEX_ABS:%[0-9]+]] = call double @"math/cmplx.Abs"({ double, double } %0) + // CHECK: call void @"{{.*}}.PrintFloat"(double [[COMPLEX_ABS]]) println("abs(3+4i):", cmplx.Abs(c)) - // CHECK: %3 = extractvalue { double, double } %1, 0 - // CHECK: %4 = extractvalue { double, double } %1, 1 + // CHECK: [[COMPLEX_REAL:%[0-9]+]] = extractvalue { double, double } %1, 0 + // CHECK: call void @"{{.*}}.PrintFloat"(double [[COMPLEX_REAL]]) println("real(3+4i):", real(z)) + // CHECK: [[COMPLEX_IMAG:%[0-9]+]] = extractvalue { double, double } %1, 1 + // CHECK: call void @"{{.*}}.PrintFloat"(double [[COMPLEX_IMAG]]) println("imag(3+4i):", imag(z)) } diff --git a/cl/_testlibgo/deferpanic/in.go b/cl/_testlibgo/deferpanic/in.go index 01f3657230..22079f907e 100644 --- a/cl/_testlibgo/deferpanic/in.go +++ b/cl/_testlibgo/deferpanic/in.go @@ -1,13 +1,35 @@ // LITTEST package main -// CHECK: define void @main.main(){{.*}} { +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[DEFER_HEAD:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr [[DEFER_RECORD:%[0-9]+]]) +// CHECK: [[PANIC_PREV:%[0-9]+]] = load ptr, ptr [[PANIC_LIST_SLOT:%[0-9]+]] +// CHECK: [[PANIC_NODE_ALLOC:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) +// CHECK: store %"{{.*}}eface" [[PANIC_VALUE:%[0-9]+]], ptr %{{[0-9]+}} +// CHECK-NEXT: store ptr [[PANIC_NODE_ALLOC]], ptr [[PANIC_LIST_SLOT]] +// CHECK: [[RECOVER_STATE:%[0-9]+]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.main$1") +// CHECK-NEXT: call void @"main.main$1"() +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RECOVER_STATE]]) +// CHECK: [[PANIC_NODE:%[0-9]+]] = load ptr, ptr [[PANIC_LIST_SLOT]] +// CHECK-NEXT: [[PANIC_RECORD:%[0-9]+]] = load { ptr, i64, %"{{.*}}eface" }, ptr [[PANIC_NODE]] +// CHECK: [[DEFERRED_PANIC:%[0-9]+]] = extractvalue { ptr, i64, %"{{.*}}eface" } [[PANIC_RECORD]], 2 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr [[PANIC_NODE]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}eface" [[DEFERRED_PANIC]]) +// CHECK-NEXT: unreachable +// CHECK-LABEL: define void @"main.main$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.main$1", ptr [[RECOVER_TOKEN:%[0-9]+]]) +// CHECK-NEXT: [[RECOVERED:%[0-9]+]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RECOVER_TOKEN]]) +// CHECK-NEXT: [[RECOVERED_TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[RECOVERED]], 0 +// CHECK-NEXT: [[RECOVERED_IS_STRING:%[0-9]+]] = icmp eq ptr [[RECOVERED_TYPE]], @_llgo_string +// CHECK: [[RECOVERED_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[RECOVERED]], 1 +// CHECK-NEXT: [[RECOVERED_STRING:%[0-9]+]] = load %"{{.*}}String", ptr [[RECOVERED_DATA]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[RECOVERED_STRING]]) func main() { defer func() { e := recover() println(e.(string)) }() - // CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic" defer panic("panic in defer") println("run main") } diff --git a/cl/_testlibgo/errors/in.go b/cl/_testlibgo/errors/in.go index 2cc0160cd1..39f1e4a2c0 100644 --- a/cl/_testlibgo/errors/in.go +++ b/cl/_testlibgo/errors/in.go @@ -4,15 +4,12 @@ package main import "errors" // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.iface" @errors.New(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 1 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %1, 0 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %3, ptr %2, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// CHECK: [[ERR:%[0-9]+]] = call %"{{.*}}iface" @errors.New(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[ERR_TYPE:%[0-9]+]] = call ptr @"{{.*}}IfaceType"(%"{{.*}}iface" [[ERR]]) +// CHECK-NEXT: [[ERR_DATA:%[0-9]+]] = extractvalue %"{{.*}}iface" [[ERR]], 1 +// CHECK-NEXT: [[PANIC0:%[0-9]+]] = insertvalue %"{{.*}}eface" undef, ptr [[ERR_TYPE]], 0 +// CHECK-NEXT: [[PANIC_VALUE:%[0-9]+]] = insertvalue %"{{.*}}eface" [[PANIC0]], ptr [[ERR_DATA]], 1 +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[PANIC_VALUE]]) func main() { err := errors.New("error") panic(err) diff --git a/cl/_testlibgo/mapzero/in.go b/cl/_testlibgo/mapzero/in.go index e54305e265..829147b33b 100644 --- a/cl/_testlibgo/mapzero/in.go +++ b/cl/_testlibgo/mapzero/in.go @@ -5,12 +5,32 @@ import "fmt" var a = 0 +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[RECOVER_STATE:%.*]] = call %"{{.*}}recoverState" @"{{.*}}/runtime/internal/runtime.StartRecoverFrame"(ptr @"main.main$1") +// CHECK: call void @"main.main$1"() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.EndRecoverFrame"(%"{{.*}}recoverState" [[RECOVER_STATE]]) +// The zero-length array check uses a as the index; the lowered nil map is still explicit. +// CHECK: [[INDEX:%.*]] = load i64, ptr @main.a +// CHECK: [[INDEX_NEG:%.*]] = icmp slt i64 [[INDEX]], 0 +// CHECK: [[INDEX_OOB:%.*]] = icmp uge i64 [[INDEX]], 0 +// CHECK: [[INDEX_BAD:%.*]] = or i1 [[INDEX_OOB]], [[INDEX_NEG]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 [[INDEX_BAD]], i64 [[INDEX]], i1 true, i64 0) +// CHECK: store i64 0, ptr [[KEY:%[-A-Za-z0-9_.]+]] +// CHECK: [[MAP_VALUE_PTR:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_int", ptr null, ptr [[KEY]]) +// CHECK: [[MAP_VALUE:%.*]] = load i64, ptr [[MAP_VALUE_PTR]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[MAP_VALUE]]) + +// CHECK-LABEL: define void @"main.main$1"(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.BindRecoverFrame"(ptr @"main.main$1", ptr [[RECOVER_SLOT:%.*]]) +// CHECK: [[RECOVERED:%.*]] = call %"{{.*}}eface" @"{{.*}}/runtime/internal/runtime.Recover"(ptr [[RECOVER_SLOT]]) +// CHECK: store %"{{.*}}eface" [[RECOVERED]], ptr %{{.*}} +// CHECK: call { i64, %"{{.*}}iface" } @fmt.Println + func main() { defer func() { err := recover() fmt.Println(err) }() - // CHECK: call ptr @"github.com/goplus/llgo/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_int", ptr null, ptr {{%.*}}) m := [0]map[int]int{}[a][0] print(m) } diff --git a/cl/_testlibgo/math/in.go b/cl/_testlibgo/math/in.go index ec560ae784..04dd3fb36c 100644 --- a/cl/_testlibgo/math/in.go +++ b/cl/_testlibgo/math/in.go @@ -7,9 +7,13 @@ import ( // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: %0 = call double @math.Sqrt(double 2.000000e+00) - // CHECK: %1 = call double @math.Abs(double -1.200000e+00) - // CHECK: %2 = call double @math.Ldexp(double 1.200000e+00, i64 3) + // Each math result must flow unchanged to the corresponding print. + // CHECK: [[SQRT:%.*]] = call double @math.Sqrt(double 2.000000e+00) + // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[SQRT]]) + // CHECK: [[ABS:%.*]] = call double @math.Abs(double -1.200000e+00) + // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[ABS]]) + // CHECK: [[LDEXP:%.*]] = call double @math.Ldexp(double 1.200000e+00, i64 3) + // CHECK-NEXT: call void @"{{.*}}PrintFloat"(double [[LDEXP]]) println(math.Sqrt(2)) println(math.Abs(-1.2)) println(math.Ldexp(1.2, 3)) diff --git a/cl/_testlibgo/mathbits/in.go b/cl/_testlibgo/mathbits/in.go index 408bd081d9..0bf727f2f5 100644 --- a/cl/_testlibgo/mathbits/in.go +++ b/cl/_testlibgo/mathbits/in.go @@ -7,8 +7,10 @@ import ( // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: %0 = call i64 @"math/bits.Len8"(i8 20) - // CHECK: %1 = call i64 @"math/bits.OnesCount"(i64 20) + // CHECK: [[LEN8:%[0-9]+]] = call i64 @"math/bits.Len8"(i8 20) + // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[LEN8]]) + // CHECK: [[ONES:%[0-9]+]] = call i64 @"math/bits.OnesCount"(i64 20) + // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[ONES]]) println(bits.Len8(20)) println(bits.OnesCount(20)) } diff --git a/cl/_testlibgo/nettextproto/in.go b/cl/_testlibgo/nettextproto/in.go index 157686493b..be9961669e 100644 --- a/cl/_testlibgo/nettextproto/in.go +++ b/cl/_testlibgo/nettextproto/in.go @@ -5,6 +5,7 @@ import "net/textproto" // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK: %0 = call %"{{.*}}/runtime/internal/runtime.String" @"net/textproto.CanonicalMIMEHeaderKey"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) + // CHECK: [[HEADER:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"net/textproto.CanonicalMIMEHeaderKey"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) + // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" [[HEADER]]) println(textproto.CanonicalMIMEHeaderKey("host")) } diff --git a/cl/_testlibgo/os/in.go b/cl/_testlibgo/os/in.go index 2545a4968f..2440a0de45 100644 --- a/cl/_testlibgo/os/in.go +++ b/cl/_testlibgo/os/in.go @@ -5,20 +5,16 @@ import "os" // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %0 = call { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } @os.Getwd() - // CHECK-NEXT: %1 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %0, 0 - // CHECK-NEXT: %2 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", %"{{.*}}/runtime/internal/runtime.iface" } %0, 1 - // CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %2) - // CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %2, 1 - // CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %3, 0 - // CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %5, ptr %4, 1 - // CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) - // CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %7, 0 - // CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %8, ptr null, 1 - // CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %6, %"{{.*}}/runtime/internal/runtime.eface" %9) - // CHECK-NEXT: %11 = xor i1 %10, true - // CHECK-NEXT: br i1 %11, label %_llgo_1, label %_llgo_2 + // CHECK: [[GETWD:%[0-9]+]] = call { %"{{.*}}String", %"{{.*}}iface" } @os.Getwd() + // CHECK-NEXT: [[CWD:%[0-9]+]] = extractvalue { %"{{.*}}String", %"{{.*}}iface" } [[GETWD]], 0 + // CHECK-NEXT: [[GETWD_ERR:%[0-9]+]] = extractvalue { %"{{.*}}String", %"{{.*}}iface" } [[GETWD]], 1 + // CHECK: [[ERR_TYPE:%[0-9]+]] = call ptr @"{{.*}}IfaceType"(%"{{.*}}iface" [[GETWD_ERR]]) + // CHECK: [[ERR_EFACE:%[0-9]+]] = insertvalue %"{{.*}}eface" %{{[0-9]+}}, ptr %{{[0-9]+}}, 1 + // CHECK: [[NO_ERR_TYPE:%[0-9]+]] = call ptr @"{{.*}}IfaceType"(%"{{.*}}iface" zeroinitializer) + // CHECK: [[NO_ERR:%[0-9]+]] = insertvalue %"{{.*}}eface" %{{[0-9]+}}, ptr null, 1 + // CHECK-NEXT: [[ERR_IS_NIL:%[0-9]+]] = call i1 @"{{.*}}EfaceEqual"(%"{{.*}}eface" [[ERR_EFACE]], %"{{.*}}eface" [[NO_ERR]]) + // CHECK-NEXT: [[HAS_ERR:%[0-9]+]] = xor i1 [[ERR_IS_NIL]], true + // CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[CWD]]) wd, err := os.Getwd() if err != nil { panic(err) diff --git a/cl/_testlibgo/strings/in.go b/cl/_testlibgo/strings/in.go index f7239b2229..0eb080d1fe 100644 --- a/cl/_testlibgo/strings/in.go +++ b/cl/_testlibgo/strings/in.go @@ -6,36 +6,23 @@ import ( "unicode" ) +// CHECK: [[HELLO:@[0-9]+]] = private unnamed_addr constant [6 x i8] c"Hello " +// CHECK: [[WORLD:@[0-9]+]] = private unnamed_addr constant [5 x i8] c"World" +// CHECK: [[WITH_HAN:@[0-9]+]] = private unnamed_addr constant [13 x i8] c"Hello, \E4\B8\96\E7\95\8C" +// CHECK: [[WITHOUT_HAN:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"Hello, world" // CHECK-LABEL: define void @main.main(){{.*}} { func main() { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) - // CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 6 }) - // CHECK-NEXT: %2 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"strings.(*Builder).Write"(ptr %0, %"{{.*}}/runtime/internal/runtime.Slice" %1) - // CHECK-NEXT: %3 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"strings.(*Builder).WriteString"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 5 }) - // CHECK-NEXT: %4 = call i64 @"strings.(*Builder).Len"(ptr %0) - // CHECK-NEXT: %5 = call i64 @"strings.(*Builder).Cap"(ptr %0) - // CHECK-NEXT: %6 = call %"{{.*}}/runtime/internal/runtime.String" @"strings.(*Builder).String"(ptr %0) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 4 }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %4) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 4 }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %5) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 7 }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %6) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: %7 = call i64 @strings.IndexFunc(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 13 }, { ptr, ptr } { ptr @"main.main$1", ptr null }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %7) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: %8 = call i64 @strings.IndexFunc(%"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 12 }, { ptr, ptr } { ptr @"main.main$1", ptr null }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %8) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } + // All Builder operations use one receiver, and the queried values are printed. + // CHECK: [[BUILDER:%.*]] = call ptr @"{{.*}}AllocZ"(i64 32) + // CHECK: [[HELLO_BYTES:%.*]] = call %"{{.*}}Slice" @"{{.*}}StringToBytes"(%"{{.*}}String" { ptr [[HELLO]], i64 6 }) + // CHECK: call { i64, %"{{.*}}iface" } @"strings.(*Builder).Write"(ptr [[BUILDER]], %"{{.*}}Slice" [[HELLO_BYTES]]) + // CHECK: call { i64, %"{{.*}}iface" } @"strings.(*Builder).WriteString"(ptr [[BUILDER]], %"{{.*}}String" { ptr [[WORLD]], i64 5 }) + // CHECK: [[BUILDER_LEN:%.*]] = call i64 @"strings.(*Builder).Len"(ptr [[BUILDER]]) + // CHECK: [[BUILDER_CAP:%.*]] = call i64 @"strings.(*Builder).Cap"(ptr [[BUILDER]]) + // CHECK: [[BUILDER_STRING:%.*]] = call %"{{.*}}String" @"strings.(*Builder).String"(ptr [[BUILDER]]) + // CHECK: call void @"{{.*}}PrintInt"(i64 [[BUILDER_LEN]]) + // CHECK: call void @"{{.*}}PrintInt"(i64 [[BUILDER_CAP]]) + // CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" [[BUILDER_STRING]]) var b strings.Builder b.Write([]byte("Hello ")) b.WriteString("World") @@ -45,6 +32,15 @@ func main() { f := func(c rune) bool { return unicode.Is(unicode.Han, c) } + // CHECK: [[WITH_HAN_INDEX:%.*]] = call i64 @strings.IndexFunc(%"{{.*}}String" { ptr [[WITH_HAN]], i64 13 }, { ptr, ptr } { ptr @"main.main$1", ptr null }) + // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[WITH_HAN_INDEX]]) + // CHECK: [[WITHOUT_HAN_INDEX:%.*]] = call i64 @strings.IndexFunc(%"{{.*}}String" { ptr [[WITHOUT_HAN]], i64 12 }, { ptr, ptr } { ptr @"main.main$1", ptr null }) + // CHECK-NEXT: call void @"{{.*}}PrintInt"(i64 [[WITHOUT_HAN_INDEX]]) println(strings.IndexFunc("Hello, 世界", f)) println(strings.IndexFunc("Hello, world", f)) } + +// CHECK-LABEL: define i1 @"main.main$1"(i32 %0){{.*}} { +// CHECK: [[HAN_TABLE:%.*]] = load ptr, ptr @unicode.Han +// CHECK-NEXT: [[IS_HAN:%.*]] = call i1 @unicode.Is(ptr [[HAN_TABLE]], i32 %0) +// CHECK-NEXT: ret i1 [[IS_HAN]] diff --git a/cl/_testlibgo/sync/in.go b/cl/_testlibgo/sync/in.go index 75b1e300c5..bf209d16ac 100644 --- a/cl/_testlibgo/sync/in.go +++ b/cl/_testlibgo/sync/in.go @@ -5,8 +5,24 @@ import ( "sync" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [7 x i8] c"Do once", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"Do twice", align 1{{$}} +// The closure passed to Once.Do must own the argument string, and the callback +// must recover that exact capture before printing it. +// CHECK-LABEL: define void @main.f(%"{{.*}}String" %0){{.*}} { +// CHECK: [[STRING_ADDR:%[0-9]+]] = call ptr @"{{.*}}AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}String" %0, ptr [[STRING_ADDR]] +// CHECK-NEXT: [[ENV:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK-NEXT: [[CAPTURE:%[0-9]+]] = getelementptr inbounds { ptr }, ptr [[ENV]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[STRING_ADDR]], ptr [[CAPTURE]] +// CHECK-NEXT: [[CLOSURE:%[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.f$1", ptr undef }, ptr [[ENV]], 1 +// CHECK-NEXT: call void @"sync.(*Once).Do"(ptr @main.once, { ptr, ptr } [[CLOSURE]]) +// CHECK-LABEL: define void @"main.f$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[CAPTURED_ENV:%[0-9]+]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[CAPTURED_ADDR:%[0-9]+]] = extractvalue { ptr } [[CAPTURED_ENV]], 0 +// CHECK-NEXT: [[CAPTURED_STRING:%[0-9]+]] = load %"{{.*}}String", ptr [[CAPTURED_ADDR]] +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[CAPTURED_STRING]]) +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.f(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 7 }) +// CHECK-NEXT: call void @main.f(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 8 }) var once sync.Once @@ -20,46 +36,3 @@ func main() { f("Do once") f("Do twice") } - -// CHECK-LABEL: define void @main.f(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.f$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: call void @"sync.(*Once).Do"(ptr @main.once, { ptr, ptr } %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.f$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.String", ptr %2, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @sync.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 7 }) -// CHECK-NEXT: call void @main.f(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 8 }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testlibgo/waitgroup/in.go b/cl/_testlibgo/waitgroup/in.go index 76cadc9ce7..744bebe610 100644 --- a/cl/_testlibgo/waitgroup/in.go +++ b/cl/_testlibgo/waitgroup/in.go @@ -5,9 +5,53 @@ import ( "sync" ) -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [4 x i8] c"done", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"work 1", align 1{{$}} -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [6 x i8] c"work 2", align 1{{$}} +// CHECK-LABEL: define void @main.main(){{.*}} { +// Both goroutines capture the same WaitGroup that Add and Wait operate on. +// CHECK: [[WG:%.*]] = call ptr @"{{.*}}AllocZ"(i64 16) +// CHECK-NEXT: call void @"sync.(*WaitGroup).Add"(ptr [[WG]], i64 2) +// CHECK: [[WG1_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[WG]], ptr {{%.*}} +// CHECK: [[WG1_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr [[WG1_ENV]], 1 +// CHECK: store { ptr, ptr } [[WG1_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$1", ptr {{%.*}}, i64 0) +// CHECK: [[WG2_ENV:%.*]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK: store ptr [[WG]], ptr {{%.*}} +// CHECK: [[WG2_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr [[WG2_ENV]], 1 +// CHECK: store { ptr, ptr } [[WG2_CLOSURE]], ptr {{%.*}} +// CHECK: call void @"{{.*}}NewProc"(ptr @"main._llgo_routine$2", ptr {{%.*}}, i64 0) +// CHECK-NEXT: call void @"sync.(*WaitGroup).Wait"(ptr [[WG]]) + +// Each worker stores its captured WaitGroup in a defer node and calls Done only +// after its work body, using the value recovered from that same node. +// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[WG1_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[WG1_VALUE:%.*]] = extractvalue { ptr } [[WG1_CAPTURE]], 0 +// CHECK: [[WG1_HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr {{%.*}}, i32 0, i32 5 +// CHECK: [[WG1_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 24) +// CHECK: [[WG1_NODE_DATA:%.*]] = getelementptr inbounds { ptr, i64, ptr }, ptr [[WG1_NODE]], i32 0, i32 2 +// CHECK-NEXT: store ptr [[WG1_VALUE]], ptr [[WG1_NODE_DATA]] +// CHECK-NEXT: store ptr [[WG1_NODE]], ptr [[WG1_HEAD]] +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 6 }) +// CHECK: [[WG1_ACTIVE:%.*]] = load ptr, ptr [[WG1_HEAD]] +// CHECK-NEXT: [[WG1_NODE_VALUE:%.*]] = load { ptr, i64, ptr }, ptr [[WG1_ACTIVE]] +// CHECK: [[WG1_DONE_VALUE:%.*]] = extractvalue { ptr, i64, ptr } [[WG1_NODE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[WG1_ACTIVE]]) +// CHECK-NEXT: call void @"sync.(*WaitGroup).Done"(ptr [[WG1_DONE_VALUE]]) + +// CHECK-LABEL: define void @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[WG2_CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK-NEXT: [[WG2_VALUE:%.*]] = extractvalue { ptr } [[WG2_CAPTURE]], 0 +// CHECK: [[WG2_HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr {{%.*}}, i32 0, i32 5 +// CHECK: [[WG2_NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 24) +// CHECK: [[WG2_NODE_DATA:%.*]] = getelementptr inbounds { ptr, i64, ptr }, ptr [[WG2_NODE]], i32 0, i32 2 +// CHECK-NEXT: store ptr [[WG2_VALUE]], ptr [[WG2_NODE_DATA]] +// CHECK-NEXT: store ptr [[WG2_NODE]], ptr [[WG2_HEAD]] +// CHECK: call void @"{{.*}}PrintString"(%"{{.*}}String" { ptr @{{[0-9]+}}, i64 6 }) +// CHECK: [[WG2_ACTIVE:%.*]] = load ptr, ptr [[WG2_HEAD]] +// CHECK-NEXT: [[WG2_NODE_VALUE:%.*]] = load { ptr, i64, ptr }, ptr [[WG2_ACTIVE]] +// CHECK: [[WG2_DONE_VALUE:%.*]] = extractvalue { ptr, i64, ptr } [[WG2_NODE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[WG2_ACTIVE]]) +// CHECK-NEXT: call void @"sync.(*WaitGroup).Done"(ptr [[WG2_DONE_VALUE]]) func main() { var wg sync.WaitGroup @@ -23,235 +67,3 @@ func main() { wg.Wait() println("done") } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @sync.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: call void @"sync.(*WaitGroup).Add"(ptr %0, i64 2) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %5 = getelementptr inbounds { { ptr, ptr } }, ptr %4, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %5, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$1", ptr %4, i64 0) -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %7 = getelementptr inbounds { ptr }, ptr %6, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue { ptr, ptr } { ptr @"main.main$2", ptr undef }, ptr %6, 1 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocRoot"(i64 16) -// CHECK-NEXT: %10 = getelementptr inbounds { { ptr, ptr } }, ptr %9, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %8, ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.NewProc"(ptr @"main._llgo_routine$2", ptr %9, i64 0) -// CHECK-NEXT: call void @"sync.(*WaitGroup).Wait"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %4 = alloca i8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 0 -// CHECK-NEXT: store ptr %4, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 2 -// CHECK-NEXT: store ptr %3, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.main$1", %_llgo_2), ptr %9, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %5) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 4 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %13, align 8 -// CHECK-NEXT: %14 = call i32 @{{(__)?}}sigsetjmp(ptr %4, i32 0) -// CHECK-NEXT: %15 = icmp eq i32 %14, 0 -// CHECK-NEXT: br i1 %15, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.main$1", %_llgo_3), ptr %11, align 8 -// CHECK-NEXT: %16 = load i64, ptr %10, align 8 -// CHECK-NEXT: %17 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %18 = icmp ne ptr %17, null -// CHECK-NEXT: br i1 %18, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %3) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %19 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 0 -// CHECK-NEXT: store ptr %19, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 2 -// CHECK-NEXT: store ptr %2, ptr %23, align 8 -// CHECK-NEXT: store ptr %20, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.main$1", %_llgo_6), ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.main$1", %_llgo_3), ptr %12, align 8 -// CHECK-NEXT: %24 = load ptr, ptr %11, align 8 -// CHECK-NEXT: indirectbr ptr %24, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %25 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %26 = load { ptr, i64, ptr }, ptr %25, align 8 -// CHECK-NEXT: %27 = extractvalue { ptr, i64, ptr } %26, 0 -// CHECK-NEXT: store ptr %27, ptr %13, align 8 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, ptr } %26, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %25) -// CHECK-NEXT: call void @"sync.(*WaitGroup).Done"(ptr %28) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %29 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, align 8 -// CHECK-NEXT: %30 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %29, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %30) -// CHECK-NEXT: %31 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %31, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define void @"main.main$2"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %4 = alloca i8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 0 -// CHECK-NEXT: store ptr %4, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %7, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 2 -// CHECK-NEXT: store ptr %3, ptr %8, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@"main.main$2", %_llgo_2), ptr %9, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %5) -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 1 -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 3 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 4 -// CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %13, align 8 -// CHECK-NEXT: %14 = call i32 @{{(__)?}}sigsetjmp(ptr %4, i32 0) -// CHECK-NEXT: %15 = icmp eq i32 %14, 0 -// CHECK-NEXT: br i1 %15, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: store ptr blockaddress(@"main.main$2", %_llgo_3), ptr %11, align 8 -// CHECK-NEXT: %16 = load i64, ptr %10, align 8 -// CHECK-NEXT: %17 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %18 = icmp ne ptr %17, null -// CHECK-NEXT: br i1 %18, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_5, %_llgo_8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %3) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: %19 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 0 -// CHECK-NEXT: store ptr %19, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds { ptr, i64, ptr }, ptr %20, i32 0, i32 2 -// CHECK-NEXT: store ptr %2, ptr %23, align 8 -// CHECK-NEXT: store ptr %20, ptr %13, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: store ptr blockaddress(@"main.main$2", %_llgo_6), ptr %12, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@"main.main$2", %_llgo_3), ptr %12, align 8 -// CHECK-NEXT: %24 = load ptr, ptr %11, align 8 -// CHECK-NEXT: indirectbr ptr %24, [label %_llgo_3, label %_llgo_2] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %25 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %26 = load { ptr, i64, ptr }, ptr %25, align 8 -// CHECK-NEXT: %27 = extractvalue { ptr, i64, ptr } %26, 0 -// CHECK-NEXT: store ptr %27, ptr %13, align 8 -// CHECK-NEXT: %28 = extractvalue { ptr, i64, ptr } %26, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %25) -// CHECK-NEXT: call void @"sync.(*WaitGroup).Done"(ptr %28) -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_2 -// CHECK-NEXT: %29 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %5, align 8 -// CHECK-NEXT: %30 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %29, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %30) -// CHECK-NEXT: %31 = load ptr, ptr %12, align 8 -// CHECK-NEXT: indirectbr ptr %31, [label %_llgo_3, label %_llgo_6] -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$1"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { { ptr, ptr } } %3, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @"main._llgo_routine$2"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"{{.*}}/runtime/internal/runtime.LocalContext", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: %2 = call i64 @"{{.*}}/runtime/internal/runtime.EnterLocalContext"(ptr %1) -// CHECK-NEXT: %3 = load { { ptr, ptr } }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { { ptr, ptr } } %3, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeRoot"(ptr %0) -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.LeaveLocalContext"(ptr %1, i64 %2) -// CHECK-NEXT: ret ptr null -// CHECK-NEXT: } diff --git a/cl/_testpy/callpy/in.go b/cl/_testpy/callpy/in.go index 65128e3d07..04c572c805 100644 --- a/cl/_testpy/callpy/in.go +++ b/cl/_testpy/callpy/in.go @@ -8,11 +8,6 @@ import ( "github.com/goplus/lib/py/os" ) -// CHECK: @0 = private unnamed_addr constant [16 x i8] c"sqrt(2) = %.6f\0A\00", align 1 -// CHECK: @1 = private unnamed_addr constant [13 x i8] c"cwd ok = %d\0A\00", align 1 -// CHECK: @2 = private unnamed_addr constant [5 x i8] c"sqrt\00", align 1 -// CHECK: @3 = private unnamed_addr constant [7 x i8] c"getcwd\00", align 1 - func main() { x := math.Sqrt(py.Float(2)) wd := os.Getcwd() @@ -21,35 +16,19 @@ func main() { } // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"github.com/goplus/lib/py/math.init"() -// CHECK-NEXT: call void @"github.com/goplus/lib/py/os.init"() -// CHECK-NEXT: %1 = load ptr, ptr @__llgo_py.math, align 8 -// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @2, ptr @__llgo_py.math.sqrt, ptr null) -// CHECK-NEXT: %2 = load ptr, ptr @__llgo_py.os, align 8 -// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr %2, ptr @3, ptr @__llgo_py.os.getcwd, ptr null) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MATH_MOD:%[0-9]+]] = load ptr, ptr @__llgo_py.math +// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr [[MATH_MOD]], ptr @{{[0-9]+}}, ptr @__llgo_py.math.sqrt, ptr null) +// CHECK-NEXT: [[OS_MOD:%[0-9]+]] = load ptr, ptr @__llgo_py.os +// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr [[OS_MOD]], ptr @{{[0-9]+}}, ptr @__llgo_py.os.getcwd, ptr null) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @PyFloat_FromDouble(double 2.000000e+00) -// CHECK-NEXT: %1 = load ptr, ptr @__llgo_py.math.sqrt, align 8 -// CHECK-NEXT: %2 = call ptr @PyObject_CallOneArg(ptr %1, ptr %0) -// CHECK-NEXT: %3 = load ptr, ptr @__llgo_py.os.getcwd, align 8 -// CHECK-NEXT: %4 = call ptr @PyObject_CallNoArgs(ptr %3) -// CHECK-NEXT: %5 = call double @PyFloat_AsDouble(ptr %2) -// CHECK-NEXT: %6 = call i32 (ptr, ...) @printf(ptr @0, double %5) -// CHECK-NEXT: %7 = call i32 @PyObject_IsTrue(ptr %4) -// CHECK-NEXT: %8 = sext i32 %7 to i64 -// CHECK-NEXT: %9 = call i32 (ptr, ...) @printf(ptr @1, i64 %8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[TWO:%[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.000000e+00) +// CHECK-NEXT: [[SQRT_FN:%[0-9]+]] = load ptr, ptr @__llgo_py.math.sqrt +// CHECK-NEXT: [[SQRT:%[0-9]+]] = call ptr @PyObject_CallOneArg(ptr [[SQRT_FN]], ptr [[TWO]]) +// CHECK-NEXT: [[GETCWD_FN:%[0-9]+]] = load ptr, ptr @__llgo_py.os.getcwd +// CHECK-NEXT: [[CWD:%[0-9]+]] = call ptr @PyObject_CallNoArgs(ptr [[GETCWD_FN]]) +// CHECK-NEXT: [[SQRT_VALUE:%[0-9]+]] = call double @PyFloat_AsDouble(ptr [[SQRT]]) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, double [[SQRT_VALUE]]) +// CHECK-NEXT: [[CWD_TRUE:%[0-9]+]] = call i32 @PyObject_IsTrue(ptr [[CWD]]) +// CHECK-NEXT: [[CWD_INT:%[0-9]+]] = sext i32 [[CWD_TRUE]] to i64 +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[CWD_INT]]) diff --git a/cl/_testpy/gcd/in.go b/cl/_testpy/gcd/in.go index fe6def4d22..229b99e5bc 100644 --- a/cl/_testpy/gcd/in.go +++ b/cl/_testpy/gcd/in.go @@ -8,16 +8,13 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @PyLong_FromLong(i64 60) -// CHECK-NEXT: %1 = call ptr @PyLong_FromLong(i64 20) -// CHECK-NEXT: %2 = call ptr @PyLong_FromLong(i64 25) -// CHECK-NEXT: %3 = load ptr, ptr @__llgo_py.math.gcd, align 8 -// CHECK-NEXT: %4 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %3, ptr %0, ptr %1, ptr %2, ptr null) -// CHECK-NEXT: %5 = call i64 @PyLong_AsLong(ptr %4) -// CHECK-NEXT: %6 = call i32 (ptr, ...) @printf(ptr @0, i64 %5) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[G0:%[0-9]+]] = call ptr @PyLong_FromLong(i64 60) +// CHECK-NEXT: [[G1:%[0-9]+]] = call ptr @PyLong_FromLong(i64 20) +// CHECK-NEXT: [[G2:%[0-9]+]] = call ptr @PyLong_FromLong(i64 25) +// CHECK-NEXT: [[GCD_FN:%[0-9]+]] = load ptr, ptr @__llgo_py.math.gcd +// CHECK-NEXT: [[GCD:%[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr [[GCD_FN]], ptr [[G0]], ptr [[G1]], ptr [[G2]], ptr null) +// CHECK-NEXT: [[GCD_VALUE:%[0-9]+]] = call i64 @PyLong_AsLong(ptr [[GCD]]) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[GCD_VALUE]]) func main() { x := math.Gcd(py.Long(60), py.Long(20), py.Long(25)) c.Printf(c.Str("gcd(60, 20, 25) = %d\n"), x.Long()) diff --git a/cl/_testpy/list/in.go b/cl/_testpy/list/in.go index ed7e618e53..f3b2f3f19e 100644 --- a/cl/_testpy/list/in.go +++ b/cl/_testpy/list/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.init\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -10,14 +12,14 @@ import ( "github.com/goplus/lib/py/std" ) -// CHECK: @0 = private unnamed_addr constant [5 x i8] c"world", align 1 -// CHECK: @1 = private unnamed_addr constant [5 x i8] c"hello", align 1 -// CHECK: @2 = private unnamed_addr constant [3 x i8] c"pi\00", align 1 -// CHECK: @3 = private unnamed_addr constant [14 x i8] c"lens = %d %d\0A\00", align 1 -// CHECK: @4 = private unnamed_addr constant [14 x i8] c"ptrs = %d %d\0A\00", align 1 -// CHECK: @5 = private unnamed_addr constant [12 x i8] c"pi = %.15g\0A\00", align 1 -// CHECK: @6 = private unnamed_addr constant [4 x i8] c"abs\00", align 1 -// CHECK: @7 = private unnamed_addr constant [6 x i8] c"print\00", align 1 +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [3 x i8] c"pi\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [14 x i8] c"lens = %d %d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB4:[0-9]+]] = private unnamed_addr constant [14 x i8] c"ptrs = %d %d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB5:[0-9]+]] = private unnamed_addr constant [12 x i8] c"pi = %.15g\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB6:[0-9]+]] = private unnamed_addr constant [4 x i8] c"abs\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB7:[0-9]+]] = private unnamed_addr constant [6 x i8] c"print\00", align 1{{$}} func main() { v := 100 @@ -29,92 +31,178 @@ func main() { c.Printf(c.Str("pi = %.15g\n"), y.ListItem(2).Float64()) } +// Python module symbol binding belongs to package initialization, not main's +// list construction. + +// Each Go value must be converted to the corresponding Python object and +// inserted into the same 14-element list at its source position. +// The second list contains the two loaded builtins and math.Pi, and all later +// observations must read back from the correct list and index. + // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = load i1, ptr @"main.init$guard", align 1 +// CHECK-NEXT: br i1 %[[TMP0]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB1:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 +// CHECK-NEXT: _llgo_[[BB1]]: // CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 // CHECK-NEXT: call void @"github.com/goplus/lib/py/math.init"() // CHECK-NEXT: call void @"github.com/goplus/lib/py/std.init"() -// CHECK-NEXT: %1 = load ptr, ptr @__llgo_py.builtins, align 8 -// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @6, ptr @__llgo_py.builtins.abs, ptr @7, ptr @__llgo_py.builtins.print, ptr null) -// CHECK-NEXT: br label %_llgo_2 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load ptr, ptr @__llgo_py.builtins, align 8 +// CHECK-NEXT: call void (ptr, ...) @llgoLoadPyModSyms(ptr %[[TMP1]], ptr @[[GLOB6]], ptr @__llgo_py.builtins.abs, ptr @[[GLOB7]], ptr @__llgo_py.builtins.print, ptr null) +// CHECK-NEXT: br label %_llgo_[[BB2]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 +// CHECK-NEXT: _llgo_[[BB2]]: // CHECK-NEXT: ret void // CHECK-NEXT: } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 100, ptr %0, align 8 -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }) -// CHECK-NEXT: %2 = alloca [3 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %2, i8 0, i64 3, i1 false) -// CHECK-NEXT: %3 = getelementptr inbounds i8, ptr %2, i64 0 -// CHECK-NEXT: %4 = getelementptr inbounds i8, ptr %2, i64 1 -// CHECK-NEXT: %5 = getelementptr inbounds i8, ptr %2, i64 2 -// CHECK-NEXT: store i8 1, ptr %3, align 1 -// CHECK-NEXT: store i8 2, ptr %4, align 1 -// CHECK-NEXT: store i8 3, ptr %5, align 1 -// CHECK-NEXT: %6 = load [3 x i8], ptr %2, align 1 -// CHECK-NEXT: %7 = call ptr @PyList_New(i64 14) -// CHECK-NEXT: %8 = call ptr @PyBool_FromLong(i32 -1) -// CHECK-NEXT: %9 = call i32 @PyList_SetItem(ptr %7, i64 0, ptr %8) -// CHECK-NEXT: %10 = call ptr @PyBool_FromLong(i32 0) -// CHECK-NEXT: %11 = call i32 @PyList_SetItem(ptr %7, i64 1, ptr %10) -// CHECK-NEXT: %12 = call ptr @PyLong_FromLongLong(i64 1) -// CHECK-NEXT: %13 = call i32 @PyList_SetItem(ptr %7, i64 2, ptr %12) -// CHECK-NEXT: %14 = call ptr @PyFloat_FromDouble(double 0x4000CCCCC0000000) -// CHECK-NEXT: %15 = call i32 @PyList_SetItem(ptr %7, i64 3, ptr %14) -// CHECK-NEXT: %16 = call ptr @PyFloat_FromDouble(double 3.100000e+00) -// CHECK-NEXT: %17 = call i32 @PyList_SetItem(ptr %7, i64 4, ptr %16) -// CHECK-NEXT: %18 = call ptr @PyLong_FromUnsignedLongLong(i64 4) -// CHECK-NEXT: %19 = call i32 @PyList_SetItem(ptr %7, i64 5, ptr %18) -// CHECK-NEXT: %20 = call ptr @PyComplex_FromDoubles(double 1.000000e+00, double 2.000000e+00) -// CHECK-NEXT: %21 = call i32 @PyList_SetItem(ptr %7, i64 6, ptr %20) -// CHECK-NEXT: %22 = call ptr @PyComplex_FromDoubles(double 3.000000e+00, double 4.000000e+00) -// CHECK-NEXT: %23 = call i32 @PyList_SetItem(ptr %7, i64 7, ptr %22) -// CHECK-NEXT: %24 = call ptr @PyUnicode_FromStringAndSize(ptr @1, i64 5) -// CHECK-NEXT: %25 = call i32 @PyList_SetItem(ptr %7, i64 8, ptr %24) -// CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 0 -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %1, 1 -// CHECK-NEXT: %28 = call ptr @PyByteArray_FromStringAndSize(ptr %26, i64 %27) -// CHECK-NEXT: %29 = call i32 @PyList_SetItem(ptr %7, i64 9, ptr %28) -// CHECK-NEXT: %30 = alloca [3 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %30, i8 0, i64 3, i1 false) -// CHECK-NEXT: store [3 x i8] %6, ptr %30, align 1 -// CHECK-NEXT: %31 = getelementptr inbounds ptr, ptr %30, i64 0 -// CHECK-NEXT: %32 = call ptr @PyBytes_FromStringAndSize(ptr %31, i64 3) -// CHECK-NEXT: %33 = call i32 @PyList_SetItem(ptr %7, i64 10, ptr %32) -// CHECK-NEXT: %34 = call ptr @PyBytes_FromStringAndSize(ptr null, i64 0) -// CHECK-NEXT: %35 = call i32 @PyList_SetItem(ptr %7, i64 11, ptr %34) -// CHECK-NEXT: %36 = ptrtoint ptr %0 to i64 -// CHECK-NEXT: %37 = call ptr @PyLong_FromUnsignedLongLong(i64 %36) -// CHECK-NEXT: %38 = call i32 @PyList_SetItem(ptr %7, i64 12, ptr %37) -// CHECK-NEXT: %39 = ptrtoint ptr %0 to i64 -// CHECK-NEXT: %40 = call ptr @PyLong_FromUnsignedLongLong(i64 %39) -// CHECK-NEXT: %41 = call i32 @PyList_SetItem(ptr %7, i64 13, ptr %40) -// CHECK-NEXT: %42 = load ptr, ptr @__llgo_py.math, align 8 -// CHECK-NEXT: %43 = call ptr @PyObject_GetAttrString(ptr %42, ptr @2) -// CHECK-NEXT: %44 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %45 = load ptr, ptr @__llgo_py.builtins.abs, align 8 -// CHECK-NEXT: %46 = call i32 @PyList_SetItem(ptr %44, i64 0, ptr %45) -// CHECK-NEXT: %47 = load ptr, ptr @__llgo_py.builtins.print, align 8 -// CHECK-NEXT: %48 = call i32 @PyList_SetItem(ptr %44, i64 1, ptr %47) -// CHECK-NEXT: %49 = call i32 @PyList_SetItem(ptr %44, i64 2, ptr %43) -// CHECK-NEXT: %50 = call i64 @PyList_Size(ptr %7) -// CHECK-NEXT: %51 = call i64 @PyList_Size(ptr %44) -// CHECK-NEXT: %52 = call i32 (ptr, ...) @printf(ptr @3, i64 %50, i64 %51) -// CHECK-NEXT: %53 = call ptr @PyList_GetItem(ptr %7, i64 12) -// CHECK-NEXT: %54 = call i32 @PyObject_IsTrue(ptr %53) -// CHECK-NEXT: %55 = call ptr @PyList_GetItem(ptr %7, i64 13) -// CHECK-NEXT: %56 = call i32 @PyObject_IsTrue(ptr %55) -// CHECK-NEXT: %57 = call i32 (ptr, ...) @printf(ptr @4, i32 %54, i32 %56) -// CHECK-NEXT: %58 = call ptr @PyList_GetItem(ptr %44, i64 2) -// CHECK-NEXT: %59 = call double @PyFloat_AsDouble(ptr %58) -// CHECK-NEXT: %60 = call i32 (ptr, ...) @printf(ptr @5, double %59) +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.StringToBytes"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca [3 x i8], align 1 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 3, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP3]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP3]], i64 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP3]], i64 2 +// DARWIN-ARM64-NEXT: store i8 1, ptr %[[TMP4]], align 1 +// DARWIN-ARM64-NEXT: store i8 2, ptr %[[TMP5]], align 1 +// DARWIN-ARM64-NEXT: store i8 3, ptr %[[TMP6]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = load [3 x i8], ptr %[[TMP3]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = call ptr @PyList_New(i64 14) +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = call ptr @PyBool_FromLong(i32 -1) +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 0, ptr %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call ptr @PyBool_FromLong(i32 0) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 1, ptr %[[TMP11]]) +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = call ptr @PyLong_FromLongLong(i64 1) +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 2, ptr %[[TMP13]]) +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = call ptr @PyFloat_FromDouble(double 0x4000CCCCC0000000) +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 3, ptr %[[TMP15]]) +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.100000e+00) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 4, ptr %[[TMP17]]) +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 4) +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 5, ptr %[[TMP19]]) +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = call ptr @PyComplex_FromDoubles(double 1.000000e+00, double 2.000000e+00) +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 6, ptr %[[TMP21]]) +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = call ptr @PyComplex_FromDoubles(double 3.000000e+00, double 4.000000e+00) +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 7, ptr %[[TMP23]]) +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = call ptr @PyUnicode_FromStringAndSize(ptr @[[GLOB1]], i64 5) +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 8, ptr %[[TMP25]]) +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = call ptr @PyByteArray_FromStringAndSize(ptr %[[TMP27]], i64 %[[TMP28]]) +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 9, ptr %[[TMP29]]) +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = alloca [3 x i8], align 1 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP31]], i8 0, i64 3, i1 false) +// DARWIN-ARM64-NEXT: store [3 x i8] %[[TMP7]], ptr %[[TMP31]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds ptr, ptr %[[TMP31]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = call ptr @PyBytes_FromStringAndSize(ptr %[[TMP32]], i64 3) +// DARWIN-ARM64-NEXT: %[[TMP34:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 10, ptr %[[TMP33]]) +// DARWIN-ARM64-NEXT: %[[TMP35:[0-9]+]] = call ptr @PyBytes_FromStringAndSize(ptr null, i64 0) +// DARWIN-ARM64-NEXT: %[[TMP36:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 11, ptr %[[TMP35]]) +// DARWIN-ARM64-NEXT: %[[TMP37:[0-9]+]] = ptrtoint ptr %[[TMP1]] to i64 +// DARWIN-ARM64-NEXT: %[[TMP38:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 %[[TMP37]]) +// DARWIN-ARM64-NEXT: %[[TMP39:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 12, ptr %[[TMP38]]) +// DARWIN-ARM64-NEXT: %[[TMP40:[0-9]+]] = ptrtoint ptr %[[TMP1]] to i64 +// DARWIN-ARM64-NEXT: %[[TMP41:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 %[[TMP40]]) +// DARWIN-ARM64-NEXT: %[[TMP42:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 13, ptr %[[TMP41]]) +// DARWIN-ARM64-NEXT: %[[TMP43:[0-9]+]] = load ptr, ptr @__llgo_py.math, align 8 +// DARWIN-ARM64-NEXT: %[[TMP44:[0-9]+]] = call ptr @PyObject_GetAttrString(ptr %[[TMP43]], ptr @[[GLOB2]]) +// DARWIN-ARM64-NEXT: %[[TMP45:[0-9]+]] = call ptr @PyList_New(i64 3) +// DARWIN-ARM64-NEXT: %[[TMP46:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.abs, align 8 +// DARWIN-ARM64-NEXT: %[[TMP47:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP45]], i64 0, ptr %[[TMP46]]) +// DARWIN-ARM64-NEXT: %[[TMP48:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.print, align 8 +// DARWIN-ARM64-NEXT: %[[TMP49:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP45]], i64 1, ptr %[[TMP48]]) +// DARWIN-ARM64-NEXT: %[[TMP50:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP45]], i64 2, ptr %[[TMP44]]) +// DARWIN-ARM64-NEXT: %[[TMP51:[0-9]+]] = call i64 @PyList_Size(ptr %[[TMP8]]) +// DARWIN-ARM64-NEXT: %[[TMP52:[0-9]+]] = call i64 @PyList_Size(ptr %[[TMP45]]) +// DARWIN-ARM64-NEXT: %[[TMP53:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB3]], i64 %[[TMP51]], i64 %[[TMP52]]) +// DARWIN-ARM64-NEXT: %[[TMP54:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP8]], i64 12) +// DARWIN-ARM64-NEXT: %[[TMP55:[0-9]+]] = call i32 @PyObject_IsTrue(ptr %[[TMP54]]) +// DARWIN-ARM64-NEXT: %[[TMP56:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP8]], i64 13) +// DARWIN-ARM64-NEXT: %[[TMP57:[0-9]+]] = call i32 @PyObject_IsTrue(ptr %[[TMP56]]) +// DARWIN-ARM64-NEXT: %[[TMP58:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB4]], i32 %[[TMP55]], i32 %[[TMP57]]) +// DARWIN-ARM64-NEXT: %[[TMP59:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP45]], i64 2) +// DARWIN-ARM64-NEXT: %[[TMP60:[0-9]+]] = call double @PyFloat_AsDouble(ptr %[[TMP59]]) +// DARWIN-ARM64-NEXT: %[[TMP61:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB5]], double %[[TMP60]]) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load i64, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.StringToBytes"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]], ptr %[[TMP4]], i64 %[[TMP6]]) +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca [3 x i8], align 1 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP8]], i8 0, i64 3, i1 false) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP8]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP8]], i64 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds i8, ptr %[[TMP8]], i64 2 +// LINUX-AMD64-NEXT: store i8 1, ptr %[[TMP9]], align 1 +// LINUX-AMD64-NEXT: store i8 2, ptr %[[TMP10]], align 1 +// LINUX-AMD64-NEXT: store i8 3, ptr %[[TMP11]], align 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load [3 x i8], ptr %[[TMP8]], align 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = call ptr @PyList_New(i64 14) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call ptr @PyBool_FromLong(i32 -1) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 0, ptr %[[TMP14]]) +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = call ptr @PyBool_FromLong(i32 0) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 1, ptr %[[TMP16]]) +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = call ptr @PyLong_FromLongLong(i64 1) +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 2, ptr %[[TMP18]]) +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = call ptr @PyFloat_FromDouble(double 0x4000CCCCC0000000) +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 3, ptr %[[TMP20]]) +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.100000e+00) +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 4, ptr %[[TMP22]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 4) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 5, ptr %[[TMP24]]) +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = call ptr @PyComplex_FromDoubles(double 1.000000e+00, double 2.000000e+00) +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 6, ptr %[[TMP26]]) +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = call ptr @PyComplex_FromDoubles(double 3.000000e+00, double 4.000000e+00) +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 7, ptr %[[TMP28]]) +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = call ptr @PyUnicode_FromStringAndSize(ptr @[[GLOB1]], i64 5) +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 8, ptr %[[TMP30]]) +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], 0 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = call ptr @PyByteArray_FromStringAndSize(ptr %[[TMP32]], i64 %[[TMP33]]) +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 9, ptr %[[TMP34]]) +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = alloca [3 x i8], align 1 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP36]], i8 0, i64 3, i1 false) +// LINUX-AMD64-NEXT: store [3 x i8] %[[TMP12]], ptr %[[TMP36]], align 1 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds ptr, ptr %[[TMP36]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = call ptr @PyBytes_FromStringAndSize(ptr %[[TMP37]], i64 3) +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 10, ptr %[[TMP38]]) +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = call ptr @PyBytes_FromStringAndSize(ptr null, i64 0) +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 11, ptr %[[TMP40]]) +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = ptrtoint ptr %[[TMP2]] to i64 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 %[[TMP42]]) +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 12, ptr %[[TMP43]]) +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = ptrtoint ptr %[[TMP2]] to i64 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = call ptr @PyLong_FromUnsignedLongLong(i64 %[[TMP45]]) +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP13]], i64 13, ptr %[[TMP46]]) +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = load ptr, ptr @__llgo_py.math, align 8 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = call ptr @PyObject_GetAttrString(ptr %[[TMP48]], ptr @[[GLOB2]]) +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = call ptr @PyList_New(i64 3) +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.abs, align 8 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP50]], i64 0, ptr %[[TMP51]]) +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.print, align 8 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP50]], i64 1, ptr %[[TMP53]]) +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP50]], i64 2, ptr %[[TMP49]]) +// LINUX-AMD64-NEXT: %[[TMP56:[0-9]+]] = call i64 @PyList_Size(ptr %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = call i64 @PyList_Size(ptr %[[TMP50]]) +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB3]], i64 %[[TMP56]], i64 %[[TMP57]]) +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP13]], i64 12) +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = call i32 @PyObject_IsTrue(ptr %[[TMP59]]) +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP13]], i64 13) +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = call i32 @PyObject_IsTrue(ptr %[[TMP61]]) +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB4]], i32 %[[TMP60]], i32 %[[TMP62]]) +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = call ptr @PyList_GetItem(ptr %[[TMP50]], i64 2) +// LINUX-AMD64-NEXT: %[[TMP65:[0-9]+]] = call double @PyFloat_AsDouble(ptr %[[TMP64]]) +// LINUX-AMD64-NEXT: %[[TMP66:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB5]], double %[[TMP65]]) // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testpy/math/in.go b/cl/_testpy/math/in.go index e7ad1da82c..39961b5eac 100644 --- a/cl/_testpy/math/in.go +++ b/cl/_testpy/math/in.go @@ -8,24 +8,12 @@ import ( ) // CHECK-LABEL: define void @"{{.*}}/cl/_testpy/math.init"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"{{.*}}/cl/_testpy/math.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"{{.*}}/cl/_testpy/math.init$guard", align 1 -// CHECK-NEXT: %1 = load ptr, ptr @__llgo_py.math, align 8 -// CHECK-NEXT: %2 = icmp ne ptr %1, null -// CHECK-NEXT: br i1 %2, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %3 = call ptr @PyImport_ImportModule(ptr @0) -// CHECK-NEXT: store ptr %3, ptr @__llgo_py.math, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-NEXT: } +// CHECK: [[GUARD:%[0-9]+]] = load i1, ptr @"{{.*}}/cl/_testpy/math.init$guard" +// CHECK: store i1 true, ptr @"{{.*}}/cl/_testpy/math.init$guard" +// CHECK-NEXT: [[OLD_MATH:%[0-9]+]] = load ptr, ptr @__llgo_py.math +// CHECK-NEXT: [[HAS_MATH:%[0-9]+]] = icmp ne ptr [[OLD_MATH]], null +// CHECK: [[MATH:%[0-9]+]] = call ptr @PyImport_ImportModule(ptr @{{[0-9]+}}) +// CHECK-NEXT: store ptr [[MATH]], ptr @__llgo_py.math const ( LLGoPackage = "py.math" diff --git a/cl/_testpy/matrix/in.go b/cl/_testpy/matrix/in.go index 8c7cedf3fb..61ffc20e72 100644 --- a/cl/_testpy/matrix/in.go +++ b/cl/_testpy/matrix/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -7,71 +9,14 @@ import ( "github.com/goplus/lib/py/numpy" ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %1 = call ptr @PyFloat_FromDouble(double 1.000000e+00) -// CHECK-NEXT: %2 = call i32 @PyList_SetItem(ptr %0, i64 0, ptr %1) -// CHECK-NEXT: %3 = call ptr @PyFloat_FromDouble(double 2.000000e+00) -// CHECK-NEXT: %4 = call i32 @PyList_SetItem(ptr %0, i64 1, ptr %3) -// CHECK-NEXT: %5 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %6 = call i32 @PyList_SetItem(ptr %0, i64 2, ptr %5) -// CHECK-NEXT: %7 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %8 = call ptr @PyFloat_FromDouble(double 4.000000e+00) -// CHECK-NEXT: %9 = call i32 @PyList_SetItem(ptr %7, i64 0, ptr %8) -// CHECK-NEXT: %10 = call ptr @PyFloat_FromDouble(double 5.000000e+00) -// CHECK-NEXT: %11 = call i32 @PyList_SetItem(ptr %7, i64 1, ptr %10) -// CHECK-NEXT: %12 = call ptr @PyFloat_FromDouble(double 6.000000e+00) -// CHECK-NEXT: %13 = call i32 @PyList_SetItem(ptr %7, i64 2, ptr %12) -// CHECK-NEXT: %14 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %15 = call ptr @PyFloat_FromDouble(double 7.000000e+00) -// CHECK-NEXT: %16 = call i32 @PyList_SetItem(ptr %14, i64 0, ptr %15) -// CHECK-NEXT: %17 = call ptr @PyFloat_FromDouble(double 8.000000e+00) -// CHECK-NEXT: %18 = call i32 @PyList_SetItem(ptr %14, i64 1, ptr %17) -// CHECK-NEXT: %19 = call ptr @PyFloat_FromDouble(double 9.000000e+00) -// CHECK-NEXT: %20 = call i32 @PyList_SetItem(ptr %14, i64 2, ptr %19) -// CHECK-NEXT: %21 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %22 = call i32 @PyList_SetItem(ptr %21, i64 0, ptr %0) -// CHECK-NEXT: %23 = call i32 @PyList_SetItem(ptr %21, i64 1, ptr %7) -// CHECK-NEXT: %24 = call i32 @PyList_SetItem(ptr %21, i64 2, ptr %14) -// CHECK-NEXT: %25 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %26 = call ptr @PyFloat_FromDouble(double 9.000000e+00) -// CHECK-NEXT: %27 = call i32 @PyList_SetItem(ptr %25, i64 0, ptr %26) -// CHECK-NEXT: %28 = call ptr @PyFloat_FromDouble(double 8.000000e+00) -// CHECK-NEXT: %29 = call i32 @PyList_SetItem(ptr %25, i64 1, ptr %28) -// CHECK-NEXT: %30 = call ptr @PyFloat_FromDouble(double 7.000000e+00) -// CHECK-NEXT: %31 = call i32 @PyList_SetItem(ptr %25, i64 2, ptr %30) -// CHECK-NEXT: %32 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %33 = call ptr @PyFloat_FromDouble(double 6.000000e+00) -// CHECK-NEXT: %34 = call i32 @PyList_SetItem(ptr %32, i64 0, ptr %33) -// CHECK-NEXT: %35 = call ptr @PyFloat_FromDouble(double 5.000000e+00) -// CHECK-NEXT: %36 = call i32 @PyList_SetItem(ptr %32, i64 1, ptr %35) -// CHECK-NEXT: %37 = call ptr @PyFloat_FromDouble(double 4.000000e+00) -// CHECK-NEXT: %38 = call i32 @PyList_SetItem(ptr %32, i64 2, ptr %37) -// CHECK-NEXT: %39 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %40 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %41 = call i32 @PyList_SetItem(ptr %39, i64 0, ptr %40) -// CHECK-NEXT: %42 = call ptr @PyFloat_FromDouble(double 2.000000e+00) -// CHECK-NEXT: %43 = call i32 @PyList_SetItem(ptr %39, i64 1, ptr %42) -// CHECK-NEXT: %44 = call ptr @PyFloat_FromDouble(double 1.000000e+00) -// CHECK-NEXT: %45 = call i32 @PyList_SetItem(ptr %39, i64 2, ptr %44) -// CHECK-NEXT: %46 = call ptr @PyList_New(i64 3) -// CHECK-NEXT: %47 = call i32 @PyList_SetItem(ptr %46, i64 0, ptr %25) -// CHECK-NEXT: %48 = call i32 @PyList_SetItem(ptr %46, i64 1, ptr %32) -// CHECK-NEXT: %49 = call i32 @PyList_SetItem(ptr %46, i64 2, ptr %39) -// CHECK-NEXT: %50 = load ptr, ptr @__llgo_py.numpy.add, align 8 -// CHECK-NEXT: %51 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %50, ptr %21, ptr %46, ptr null) -// CHECK-NEXT: %52 = call ptr @PyObject_Str(ptr %21) -// CHECK-NEXT: %53 = call ptr @PyUnicode_AsUTF8(ptr %52) -// CHECK-NEXT: %54 = call i32 (ptr, ...) @printf(ptr @0, ptr %53) -// CHECK-NEXT: %55 = call ptr @PyObject_Str(ptr %46) -// CHECK-NEXT: %56 = call ptr @PyUnicode_AsUTF8(ptr %55) -// CHECK-NEXT: %57 = call i32 (ptr, ...) @printf(ptr @1, ptr %56) -// CHECK-NEXT: %58 = call ptr @PyObject_Str(ptr %51) -// CHECK-NEXT: %59 = call ptr @PyUnicode_AsUTF8(ptr %58) -// CHECK-NEXT: %60 = call i32 (ptr, ...) @printf(ptr @2, ptr %59) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [10 x i8] c"a+b = %s\0A\00", align 1{{$}} + +// Build each row from its own scalar objects, then insert those rows into the +// corresponding outer matrix. This prevents a flat sequence of SetItem calls +// from accidentally satisfying the test with crossed lists or indices. +// Each printed C string must derive from the corresponding matrix/result. func main() { a := py.List( py.List(1.0, 2.0, 3.0), @@ -88,3 +33,69 @@ func main() { c.Printf(c.Str("a = %s\n"), b.Str().CStr()) c.Printf(c.Str("a+b = %s\n"), x.Str().CStr()) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @PyFloat_FromDouble(double 1.000000e+00) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP0]], i64 0, ptr %[[TMP1]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.000000e+00) +// CHECK-NEXT: %[[TMP4:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP0]], i64 1, ptr %[[TMP3]]) +// CHECK-NEXT: %[[TMP5:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: %[[TMP6:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP0]], i64 2, ptr %[[TMP5]]) +// CHECK-NEXT: %[[TMP7:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP8:[0-9]+]] = call ptr @PyFloat_FromDouble(double 4.000000e+00) +// CHECK-NEXT: %[[TMP9:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP7]], i64 0, ptr %[[TMP8]]) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = call ptr @PyFloat_FromDouble(double 5.000000e+00) +// CHECK-NEXT: %[[TMP11:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP7]], i64 1, ptr %[[TMP10]]) +// CHECK-NEXT: %[[TMP12:[0-9]+]] = call ptr @PyFloat_FromDouble(double 6.000000e+00) +// CHECK-NEXT: %[[TMP13:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP7]], i64 2, ptr %[[TMP12]]) +// CHECK-NEXT: %[[TMP14:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP15:[0-9]+]] = call ptr @PyFloat_FromDouble(double 7.000000e+00) +// CHECK-NEXT: %[[TMP16:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP14]], i64 0, ptr %[[TMP15]]) +// CHECK-NEXT: %[[TMP17:[0-9]+]] = call ptr @PyFloat_FromDouble(double 8.000000e+00) +// CHECK-NEXT: %[[TMP18:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP14]], i64 1, ptr %[[TMP17]]) +// CHECK-NEXT: %[[TMP19:[0-9]+]] = call ptr @PyFloat_FromDouble(double 9.000000e+00) +// CHECK-NEXT: %[[TMP20:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP14]], i64 2, ptr %[[TMP19]]) +// CHECK-NEXT: %[[TMP21:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP22:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP21]], i64 0, ptr %[[TMP0]]) +// CHECK-NEXT: %[[TMP23:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP21]], i64 1, ptr %[[TMP7]]) +// CHECK-NEXT: %[[TMP24:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP21]], i64 2, ptr %[[TMP14]]) +// CHECK-NEXT: %[[TMP25:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP26:[0-9]+]] = call ptr @PyFloat_FromDouble(double 9.000000e+00) +// CHECK-NEXT: %[[TMP27:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP25]], i64 0, ptr %[[TMP26]]) +// CHECK-NEXT: %[[TMP28:[0-9]+]] = call ptr @PyFloat_FromDouble(double 8.000000e+00) +// CHECK-NEXT: %[[TMP29:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP25]], i64 1, ptr %[[TMP28]]) +// CHECK-NEXT: %[[TMP30:[0-9]+]] = call ptr @PyFloat_FromDouble(double 7.000000e+00) +// CHECK-NEXT: %[[TMP31:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP25]], i64 2, ptr %[[TMP30]]) +// CHECK-NEXT: %[[TMP32:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP33:[0-9]+]] = call ptr @PyFloat_FromDouble(double 6.000000e+00) +// CHECK-NEXT: %[[TMP34:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP32]], i64 0, ptr %[[TMP33]]) +// CHECK-NEXT: %[[TMP35:[0-9]+]] = call ptr @PyFloat_FromDouble(double 5.000000e+00) +// CHECK-NEXT: %[[TMP36:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP32]], i64 1, ptr %[[TMP35]]) +// CHECK-NEXT: %[[TMP37:[0-9]+]] = call ptr @PyFloat_FromDouble(double 4.000000e+00) +// CHECK-NEXT: %[[TMP38:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP32]], i64 2, ptr %[[TMP37]]) +// CHECK-NEXT: %[[TMP39:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP40:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: %[[TMP41:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP39]], i64 0, ptr %[[TMP40]]) +// CHECK-NEXT: %[[TMP42:[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.000000e+00) +// CHECK-NEXT: %[[TMP43:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP39]], i64 1, ptr %[[TMP42]]) +// CHECK-NEXT: %[[TMP44:[0-9]+]] = call ptr @PyFloat_FromDouble(double 1.000000e+00) +// CHECK-NEXT: %[[TMP45:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP39]], i64 2, ptr %[[TMP44]]) +// CHECK-NEXT: %[[TMP46:[0-9]+]] = call ptr @PyList_New(i64 3) +// CHECK-NEXT: %[[TMP47:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP46]], i64 0, ptr %[[TMP25]]) +// CHECK-NEXT: %[[TMP48:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP46]], i64 1, ptr %[[TMP32]]) +// CHECK-NEXT: %[[TMP49:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP46]], i64 2, ptr %[[TMP39]]) +// CHECK-NEXT: %[[TMP50:[0-9]+]] = load ptr, ptr @__llgo_py.numpy.add, align 8 +// CHECK-NEXT: %[[TMP51:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP50]], ptr %[[TMP21]], ptr %[[TMP46]], ptr null) +// CHECK-NEXT: %[[TMP52:[0-9]+]] = call ptr @PyObject_Str(ptr %[[TMP21]]) +// CHECK-NEXT: %[[TMP53:[0-9]+]] = call ptr @PyUnicode_AsUTF8(ptr %[[TMP52]]) +// CHECK-NEXT: %[[TMP54:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], ptr %[[TMP53]]) +// CHECK-NEXT: %[[TMP55:[0-9]+]] = call ptr @PyObject_Str(ptr %[[TMP46]]) +// CHECK-NEXT: %[[TMP56:[0-9]+]] = call ptr @PyUnicode_AsUTF8(ptr %[[TMP55]]) +// CHECK-NEXT: %[[TMP57:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], ptr %[[TMP56]]) +// CHECK-NEXT: %[[TMP58:[0-9]+]] = call ptr @PyObject_Str(ptr %[[TMP51]]) +// CHECK-NEXT: %[[TMP59:[0-9]+]] = call ptr @PyUnicode_AsUTF8(ptr %[[TMP58]]) +// CHECK-NEXT: %[[TMP60:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], ptr %[[TMP59]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testpy/max/in.go b/cl/_testpy/max/in.go index 50a507de2c..444663edb5 100644 --- a/cl/_testpy/max/in.go +++ b/cl/_testpy/max/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -6,46 +8,8 @@ import ( "github.com/goplus/lib/py/std" ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %1 = call ptr @PyFloat_FromDouble(double 9.000000e+00) -// CHECK-NEXT: %2 = call ptr @PyFloat_FromDouble(double 2.300000e+01) -// CHECK-NEXT: %3 = call ptr @PyFloat_FromDouble(double 1.000000e+02) -// CHECK-NEXT: %4 = load ptr, ptr @__llgo_py.builtins.max, align 8 -// CHECK-NEXT: %5 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %4, ptr %0, ptr %1, ptr %2, ptr %3, ptr null) -// CHECK-NEXT: %6 = load ptr, ptr @__llgo_py.builtins.print, align 8 -// CHECK-NEXT: %7 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %6, ptr %5, ptr null) -// CHECK-NEXT: %8 = call ptr @PyList_New(i64 4) -// CHECK-NEXT: %9 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %10 = call i32 @PyList_SetItem(ptr %8, i64 0, ptr %9) -// CHECK-NEXT: %11 = call ptr @PyFloat_FromDouble(double 9.000000e+00) -// CHECK-NEXT: %12 = call i32 @PyList_SetItem(ptr %8, i64 1, ptr %11) -// CHECK-NEXT: %13 = call ptr @PyFloat_FromDouble(double 2.300000e+01) -// CHECK-NEXT: %14 = call i32 @PyList_SetItem(ptr %8, i64 2, ptr %13) -// CHECK-NEXT: %15 = call ptr @PyFloat_FromDouble(double 1.000000e+02) -// CHECK-NEXT: %16 = call i32 @PyList_SetItem(ptr %8, i64 3, ptr %15) -// CHECK-NEXT: %17 = load ptr, ptr @__llgo_py.builtins.iter, align 8 -// CHECK-NEXT: %18 = call ptr @PyObject_CallOneArg(ptr %17, ptr %8) -// CHECK-NEXT: %19 = load ptr, ptr @__llgo_py.builtins.max, align 8 -// CHECK-NEXT: %20 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %19, ptr %18, ptr null) -// CHECK-NEXT: %21 = load ptr, ptr @__llgo_py.builtins.print, align 8 -// CHECK-NEXT: %22 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %21, ptr %20, ptr null) -// CHECK-NEXT: %23 = call ptr @PyTuple_New(i64 3) -// CHECK-NEXT: %24 = call ptr @PyFloat_FromDouble(double 1.000000e+00) -// CHECK-NEXT: %25 = call i32 @PyTuple_SetItem(ptr %23, i64 0, ptr %24) -// CHECK-NEXT: %26 = call ptr @PyFloat_FromDouble(double 2.000000e+00) -// CHECK-NEXT: %27 = call i32 @PyTuple_SetItem(ptr %23, i64 1, ptr %26) -// CHECK-NEXT: %28 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %29 = call i32 @PyTuple_SetItem(ptr %23, i64 2, ptr %28) -// CHECK-NEXT: %30 = load ptr, ptr @__llgo_py.builtins.iter, align 8 -// CHECK-NEXT: %31 = call ptr @PyObject_CallOneArg(ptr %30, ptr %23) -// CHECK-NEXT: %32 = load ptr, ptr @__llgo_py.builtins.max, align 8 -// CHECK-NEXT: %33 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %32, ptr %31, ptr null) -// CHECK-NEXT: %34 = load ptr, ptr @__llgo_py.builtins.print, align 8 -// CHECK-NEXT: %35 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %34, ptr %33, ptr null) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Direct variadic Max passes the four converted objects to the loaded builtin, +// and Print consumes the returned object. func main() { x := std.Max(py.Float(3.0), py.Float(9.0), py.Float(23.0), py.Float(100.0)) std.Print(x) @@ -58,3 +22,44 @@ func main() { z := std.Max(std.Iter(tuple)) std.Print(z) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @PyFloat_FromDouble(double 9.000000e+00) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.300000e+01) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @PyFloat_FromDouble(double 1.000000e+02) +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.max, align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP4]], ptr %[[TMP0]], ptr %[[TMP1]], ptr %[[TMP2]], ptr %[[TMP3]], ptr null) +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.print, align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP6]], ptr %[[TMP5]], ptr null) +// CHECK-NEXT: %[[TMP8:[0-9]+]] = call ptr @PyList_New(i64 4) +// CHECK-NEXT: %[[TMP9:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 0, ptr %[[TMP9]]) +// CHECK-NEXT: %[[TMP11:[0-9]+]] = call ptr @PyFloat_FromDouble(double 9.000000e+00) +// CHECK-NEXT: %[[TMP12:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 1, ptr %[[TMP11]]) +// CHECK-NEXT: %[[TMP13:[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.300000e+01) +// CHECK-NEXT: %[[TMP14:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 2, ptr %[[TMP13]]) +// CHECK-NEXT: %[[TMP15:[0-9]+]] = call ptr @PyFloat_FromDouble(double 1.000000e+02) +// CHECK-NEXT: %[[TMP16:[0-9]+]] = call i32 @PyList_SetItem(ptr %[[TMP8]], i64 3, ptr %[[TMP15]]) +// CHECK-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.iter, align 8 +// CHECK-NEXT: %[[TMP18:[0-9]+]] = call ptr @PyObject_CallOneArg(ptr %[[TMP17]], ptr %[[TMP8]]) +// CHECK-NEXT: %[[TMP19:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.max, align 8 +// CHECK-NEXT: %[[TMP20:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP19]], ptr %[[TMP18]], ptr null) +// CHECK-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.print, align 8 +// CHECK-NEXT: %[[TMP22:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP21]], ptr %[[TMP20]], ptr null) +// CHECK-NEXT: %[[TMP23:[0-9]+]] = call ptr @PyTuple_New(i64 3) +// CHECK-NEXT: %[[TMP24:[0-9]+]] = call ptr @PyFloat_FromDouble(double 1.000000e+00) +// CHECK-NEXT: %[[TMP25:[0-9]+]] = call i32 @PyTuple_SetItem(ptr %[[TMP23]], i64 0, ptr %[[TMP24]]) +// CHECK-NEXT: %[[TMP26:[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.000000e+00) +// CHECK-NEXT: %[[TMP27:[0-9]+]] = call i32 @PyTuple_SetItem(ptr %[[TMP23]], i64 1, ptr %[[TMP26]]) +// CHECK-NEXT: %[[TMP28:[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: %[[TMP29:[0-9]+]] = call i32 @PyTuple_SetItem(ptr %[[TMP23]], i64 2, ptr %[[TMP28]]) +// CHECK-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.iter, align 8 +// CHECK-NEXT: %[[TMP31:[0-9]+]] = call ptr @PyObject_CallOneArg(ptr %[[TMP30]], ptr %[[TMP23]]) +// CHECK-NEXT: %[[TMP32:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.max, align 8 +// CHECK-NEXT: %[[TMP33:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP32]], ptr %[[TMP31]], ptr null) +// CHECK-NEXT: %[[TMP34:[0-9]+]] = load ptr, ptr @__llgo_py.builtins.print, align 8 +// CHECK-NEXT: %[[TMP35:[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %[[TMP34]], ptr %[[TMP33]], ptr null) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testpy/pi/in.go b/cl/_testpy/pi/in.go index 2a34bc6082..439f5a9d9e 100644 --- a/cl/_testpy/pi/in.go +++ b/cl/_testpy/pi/in.go @@ -7,13 +7,10 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @__llgo_py.math, align 8 -// CHECK-NEXT: %1 = call ptr @PyObject_GetAttrString(ptr %0, ptr @1) -// CHECK-NEXT: %2 = call double @PyFloat_AsDouble(ptr %1) -// CHECK-NEXT: %3 = call i32 (ptr, ...) @printf(ptr @0, double %2) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MATH:%[0-9]+]] = load ptr, ptr @__llgo_py.math +// CHECK-NEXT: [[PI:%[0-9]+]] = call ptr @PyObject_GetAttrString(ptr [[MATH]], ptr @{{[0-9]+}}) +// CHECK-NEXT: [[PI_VALUE:%[0-9]+]] = call double @PyFloat_AsDouble(ptr [[PI]]) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, double [[PI_VALUE]]) func main() { c.Printf(c.Str("pi = %f\n"), math.Pi.Float64()) } diff --git a/cl/_testpy/pow/in.go b/cl/_testpy/pow/in.go index c1dace5212..b86392b83f 100644 --- a/cl/_testpy/pow/in.go +++ b/cl/_testpy/pow/in.go @@ -8,15 +8,12 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @PyFloat_FromDouble(double 2.000000e+00) -// CHECK-NEXT: %1 = call ptr @PyFloat_FromDouble(double 3.000000e+00) -// CHECK-NEXT: %2 = load ptr, ptr @__llgo_py.math.pow, align 8 -// CHECK-NEXT: %3 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %2, ptr %0, ptr %1, ptr null) -// CHECK-NEXT: %4 = call double @PyFloat_AsDouble(ptr %3) -// CHECK-NEXT: %5 = call i32 (ptr, ...) @printf(ptr @0, double %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[BASE:%[0-9]+]] = call ptr @PyFloat_FromDouble(double 2.000000e+00) +// CHECK-NEXT: [[EXP:%[0-9]+]] = call ptr @PyFloat_FromDouble(double 3.000000e+00) +// CHECK-NEXT: [[POW_FN:%[0-9]+]] = load ptr, ptr @__llgo_py.math.pow +// CHECK-NEXT: [[POW:%[0-9]+]] = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr [[POW_FN]], ptr [[BASE]], ptr [[EXP]], ptr null) +// CHECK-NEXT: [[POW_VALUE:%[0-9]+]] = call double @PyFloat_AsDouble(ptr [[POW]]) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, double [[POW_VALUE]]) func main() { x := math.Pow(py.Float(2), py.Float(3)) c.Printf(c.Str("pow(2, 3) = %f\n"), x.Float64()) diff --git a/cl/_testrt/abinamed/in.go b/cl/_testrt/abinamed/in.go index 88b0b7e136..c076d7dbb1 100644 --- a/cl/_testrt/abinamed/in.go +++ b/cl/_testrt/abinamed/in.go @@ -7,201 +7,14 @@ import ( "github.com/goplus/llgo/runtime/abi" ) +// Converting the two named values to interface{} must select their distinct +// runtime type descriptors; the test body then exercises pointer-to-this and +// element links from those descriptors. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: store %main.T zeroinitializer, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.T, ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call ptr @main.toEface(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 72) -// CHECK-NEXT: store %"{{.*}}/runtime/abi.Type" zeroinitializer, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_{{.*}}/runtime/abi.Type", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = call ptr @main.toEface(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %6 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %7 = load ptr, ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %8 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %9 = load ptr, ptr %8, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %9, i32 0, i32 10 -// CHECK-NEXT: %11 = load ptr, ptr %10, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = getelementptr inbounds %main.eface, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %14 = getelementptr inbounds %main.eface, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %15 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %15, i32 0, i32 10 -// CHECK-NEXT: %17 = load ptr, ptr %16, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = alloca %"{{.*}}/runtime/abi.StructField", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 56, i1 false) -// CHECK-NEXT: %19 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %20 = load ptr, ptr %19, align 8 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/abi.(*Type).StructType"(ptr %20) -// CHECK-NEXT: %22 = getelementptr inbounds %"{{.*}}/runtime/abi.StructType", ptr %21, i32 0, i32 2 -// CHECK-NEXT: %23 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %22, align 8 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 0 -// CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 1 -// CHECK-NEXT: %26 = icmp uge i64 0, %25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, {{.*}}) -// CHECK-NEXT: %27 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %24, i64 0 -// CHECK-NEXT: %28 = load %"{{.*}}/runtime/abi.StructField", ptr %27, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %28, ptr %18, align 8 -// CHECK-NEXT: %29 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %18, i32 0, i32 1 -// CHECK-NEXT: %30 = load ptr, ptr %29, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %32 = load ptr, ptr %31, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %32, i32 0, i32 10 -// CHECK-NEXT: %34 = load ptr, ptr %33, align 8 -// CHECK-NEXT: %35 = icmp ne ptr %30, %34 -// CHECK-NEXT: br i1 %35, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 13 }, ptr %36, align 8 -// CHECK-NEXT: %37 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %36, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %37) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %38 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %18, i32 0, i32 1 -// CHECK-NEXT: %39 = load ptr, ptr %38, align 8 -// CHECK-NEXT: %40 = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %39) -// CHECK-NEXT: %41 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %42 = load ptr, ptr %41, align 8 -// CHECK-NEXT: %43 = icmp ne ptr %40, %42 -// CHECK-NEXT: br i1 %43, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %44 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 18 }, ptr %44, align 8 -// CHECK-NEXT: %45 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %44, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %45) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %46 = alloca %"{{.*}}/runtime/abi.StructField", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %46, i8 0, i64 56, i1 false) -// CHECK-NEXT: %47 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %48 = load ptr, ptr %47, align 8 -// CHECK-NEXT: %49 = call ptr @"{{.*}}/runtime/abi.(*Type).StructType"(ptr %48) -// CHECK-NEXT: %50 = getelementptr inbounds %"{{.*}}/runtime/abi.StructType", ptr %49, i32 0, i32 2 -// CHECK-NEXT: %51 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %50, align 8 -// CHECK-NEXT: %52 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %51, 0 -// CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %51, 1 -// CHECK-NEXT: %54 = icmp uge i64 1, %53 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %54, {{.*}}) -// CHECK-NEXT: %55 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %52, i64 1 -// CHECK-NEXT: %56 = load %"{{.*}}/runtime/abi.StructField", ptr %55, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %56, ptr %46, align 8 -// CHECK-NEXT: %57 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %46, i32 0, i32 1 -// CHECK-NEXT: %58 = load ptr, ptr %57, align 8 -// CHECK-NEXT: %59 = getelementptr inbounds %main.eface, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %60 = load ptr, ptr %59, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %60, i32 0, i32 10 -// CHECK-NEXT: %62 = load ptr, ptr %61, align 8 -// CHECK-NEXT: %63 = icmp ne ptr %58, %62 -// CHECK-NEXT: br i1 %63, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %64 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 13 }, ptr %64, align 8 -// CHECK-NEXT: %65 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %64, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %65) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: %66 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %46, i32 0, i32 1 -// CHECK-NEXT: %67 = load ptr, ptr %66, align 8 -// CHECK-NEXT: %68 = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %67) -// CHECK-NEXT: %69 = getelementptr inbounds %main.eface, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %70 = load ptr, ptr %69, align 8 -// CHECK-NEXT: %71 = icmp ne ptr %68, %70 -// CHECK-NEXT: br i1 %71, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %72 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 18 }, ptr %72, align 8 -// CHECK-NEXT: %73 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %72, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %73) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: %74 = alloca %"{{.*}}/runtime/abi.StructField", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %74, i8 0, i64 56, i1 false) -// CHECK-NEXT: %75 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %76 = load ptr, ptr %75, align 8 -// CHECK-NEXT: %77 = call ptr @"{{.*}}/runtime/abi.(*Type).StructType"(ptr %76) -// CHECK-NEXT: %78 = getelementptr inbounds %"{{.*}}/runtime/abi.StructType", ptr %77, i32 0, i32 2 -// CHECK-NEXT: %79 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %78, align 8 -// CHECK-NEXT: %80 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %79, 0 -// CHECK-NEXT: %81 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %79, 1 -// CHECK-NEXT: %82 = icmp uge i64 2, %81 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %82, {{.*}}) -// CHECK-NEXT: %83 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %80, i64 2 -// CHECK-NEXT: %84 = load %"{{.*}}/runtime/abi.StructField", ptr %83, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %84, ptr %74, align 8 -// CHECK-NEXT: %85 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %74, i32 0, i32 1 -// CHECK-NEXT: %86 = load ptr, ptr %85, align 8 -// CHECK-NEXT: %87 = getelementptr inbounds %main.eface, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %88 = load ptr, ptr %87, align 8 -// CHECK-NEXT: %89 = call ptr @"{{.*}}/runtime/abi.(*Type).StructType"(ptr %88) -// CHECK-NEXT: %90 = getelementptr inbounds %"{{.*}}/runtime/abi.StructType", ptr %89, i32 0, i32 2 -// CHECK-NEXT: %91 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %90, align 8 -// CHECK-NEXT: %92 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %91, 0 -// CHECK-NEXT: %93 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %91, 1 -// CHECK-NEXT: %94 = icmp uge i64 0, %93 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %94, {{.*}}) -// CHECK-NEXT: %95 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %92, i64 0 -// CHECK-NEXT: %96 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %95, i32 0, i32 1 -// CHECK-NEXT: %97 = load ptr, ptr %96, align 8 -// CHECK-NEXT: %98 = icmp ne ptr %86, %97 -// CHECK-NEXT: br i1 %98, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8 -// CHECK-NEXT: %99 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 13 }, ptr %99, align 8 -// CHECK-NEXT: %100 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %99, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %100) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_8 -// CHECK-NEXT: %101 = alloca %"{{.*}}/runtime/abi.StructField", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %101, i8 0, i64 56, i1 false) -// CHECK-NEXT: %102 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %103 = load ptr, ptr %102, align 8 -// CHECK-NEXT: %104 = call ptr @"{{.*}}/runtime/abi.(*Type).StructType"(ptr %103) -// CHECK-NEXT: %105 = getelementptr inbounds %"{{.*}}/runtime/abi.StructType", ptr %104, i32 0, i32 2 -// CHECK-NEXT: %106 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %105, align 8 -// CHECK-NEXT: %107 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %106, 0 -// CHECK-NEXT: %108 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %106, 1 -// CHECK-NEXT: %109 = icmp uge i64 3, %108 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %109, {{.*}}) -// CHECK-NEXT: %110 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %107, i64 3 -// CHECK-NEXT: %111 = load %"{{.*}}/runtime/abi.StructField", ptr %110, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %111, ptr %101, align 8 -// CHECK-NEXT: %112 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %101, i32 0, i32 1 -// CHECK-NEXT: %113 = load ptr, ptr %112, align 8 -// CHECK-NEXT: %114 = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %113) -// CHECK-NEXT: %115 = getelementptr inbounds %main.eface, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %116 = load ptr, ptr %115, align 8 -// CHECK-NEXT: %117 = icmp ne ptr %114, %116 -// CHECK-NEXT: br i1 %117, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10 -// CHECK-NEXT: %118 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 13 }, ptr %118, align 8 -// CHECK-NEXT: %119 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %118, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %119) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: insertvalue %"{{.*}}eface" { ptr @_llgo_main.T, +// CHECK: insertvalue %"{{.*}}eface" { ptr @"_llgo_{{.*}}/runtime/abi.Type", +// CHECK: call ptr @"{{.*}}/runtime/abi.(*Type).StructType" +// CHECK: call ptr @"{{.*}}/runtime/abi.(*Type).Elem" type T struct { p *T @@ -248,12 +61,10 @@ func main() { } } -// CHECK-LABEL: define ptr @main.toEface(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr %1, align 8 -// CHECK-NEXT: ret ptr %1 -// CHECK-NEXT: } func toEface(i any) *eface { + // CHECK-LABEL: define ptr @main.toEface(%"{{.*}}eface" %{{[0-9]+}}){{.*}} { + // CHECK: [[TO_EFACE_ADDR:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) + // CHECK-NEXT: store %"{{.*}}eface" [[TO_EFACE_VALUE:%[0-9]+]], ptr [[TO_EFACE_ADDR]] + // CHECK-NEXT: ret ptr [[TO_EFACE_ADDR]] return (*eface)(unsafe.Pointer(&i)) } diff --git a/cl/_testrt/abitype/in.go b/cl/_testrt/abitype/in.go index ced9c0c2d7..22af44107d 100644 --- a/cl/_testrt/abitype/in.go +++ b/cl/_testrt/abitype/in.go @@ -8,48 +8,23 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store i32 0, ptr %1, align 4 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %1, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %2, ptr %0, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.eface, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/abi.(*Type).String"(ptr %4) -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %5, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }) -// CHECK-NEXT: %7 = xor i1 %6, true -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 14 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK-NEXT: store i8 0, ptr %10, align 1 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %10, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %11, ptr %0, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.eface, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %13 = load ptr, ptr %12, align 8 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/abi.(*Type).String"(ptr %13) -// CHECK-NEXT: %15 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %14, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 5 }) -// CHECK-NEXT: %16 = xor i1 %15, true -// CHECK-NEXT: br i1 %16, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 14 }, ptr %17, align 8 -// CHECK-NEXT: %18 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %17, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %18) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[EFACE_STORAGE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: [[RUNE_EFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int32, ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" [[RUNE_EFACE]], ptr [[EFACE_STORAGE]] +// CHECK: [[RUNE_TYPE_SLOT:%[0-9]+]] = getelementptr inbounds %main.eface, ptr [[EFACE_STORAGE]], i32 0, i32 0 +// CHECK-NEXT: [[RUNE_TYPE:%[0-9]+]] = load ptr, ptr [[RUNE_TYPE_SLOT]] +// CHECK-NEXT: [[RUNE_NAME:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/abi.(*Type).String"(ptr [[RUNE_TYPE]]) +// CHECK-NEXT: [[RUNE_MATCH:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" [[RUNE_NAME]], %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[RUNE_BAD:%[0-9]+]] = xor i1 [[RUNE_MATCH]], true +// CHECK-NEXT: br i1 [[RUNE_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: [[BYTE_EFACE:%[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_uint8, ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" [[BYTE_EFACE]], ptr [[EFACE_STORAGE]] +// CHECK: [[BYTE_TYPE_SLOT:%[0-9]+]] = getelementptr inbounds %main.eface, ptr [[EFACE_STORAGE]], i32 0, i32 0 +// CHECK-NEXT: [[BYTE_TYPE:%[0-9]+]] = load ptr, ptr [[BYTE_TYPE_SLOT]] +// CHECK-NEXT: [[BYTE_NAME:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/abi.(*Type).String"(ptr [[BYTE_TYPE]]) +// CHECK-NEXT: [[BYTE_MATCH:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" [[BYTE_NAME]], %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[BYTE_BAD:%[0-9]+]] = xor i1 [[BYTE_MATCH]], true +// CHECK-NEXT: br i1 [[BYTE_BAD]], label %{{.*}}, label %{{.*}} type eface struct { typ *abi.Type diff --git a/cl/_testrt/alloca/in.go b/cl/_testrt/alloca/in.go index dbcf7bbd56..38d4617a9f 100644 --- a/cl/_testrt/alloca/in.go +++ b/cl/_testrt/alloca/in.go @@ -11,9 +11,9 @@ import ( func main() { s := c.Str("Hi\n") s2 := c.Alloca(4) - // CHECK: alloca i8, i64 4, align 1 - // CHECK-NEXT: @memcpy(ptr {{%[0-9]+}}, ptr @0, i64 4) - // CHECK-NEXT: @printf(ptr @1, ptr {{%[0-9]+}}) + // CHECK: [[ALLOCA_BUF:%[0-9]+]] = alloca i8, i64 4, align 1 + // CHECK-NEXT: [[ALLOCA_COPY:%[0-9]+]] = call ptr @memcpy(ptr [[ALLOCA_BUF]], ptr @0, i64 4) + // CHECK-NEXT: [[ALLOCA_PRINT:%[0-9]+]] = call i32 (ptr, ...) @printf(ptr @1, ptr [[ALLOCA_BUF]]) // CHECK-NEXT: ret void c.Memcpy(s2, c.Pointer(s), 4) c.Printf(c.Str("%s"), s2) diff --git a/cl/_testrt/allocstr/in.go b/cl/_testrt/allocstr/in.go index 573ca9ff7f..f3636493f6 100644 --- a/cl/_testrt/allocstr/in.go +++ b/cl/_testrt/allocstr/in.go @@ -5,27 +5,20 @@ import ( "github.com/goplus/lib/c" ) -// CHECK: {{^}}%"{{.*}}/runtime/internal/runtime.String" = type { ptr, i64 }{{$}} -// CHECK: {{^}}@0 = private unnamed_addr constant [12 x i8] c"Hello world\0A", align 1{{$}} - +// CHECK: [[HELLO_TEXT:@[0-9]+]] = private unnamed_addr constant [12 x i8] c"Hello world\0A" // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.hello(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 12 } -// CHECK-NEXT: } +// CHECK: ret %"{{.*}}/runtime/internal/runtime.String" { ptr [[HELLO_TEXT]], i64 12 } func hello() string { return "Hello world\n" } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.String" @main.hello() -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %0, 1 -// CHECK-NEXT: %2 = add i64 %1, 1 -// CHECK-NEXT: %3 = alloca i8, i64 %2, align 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.CStrCopy"(ptr %3, %"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: %5 = call i32 (ptr, ...) @printf(ptr %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[TEXT:%[0-9]+]] = call %"{{.*}}String" @main.hello() +// CHECK-NEXT: [[TEXT_LEN:%[0-9]+]] = extractvalue %"{{.*}}String" [[TEXT]], 1 +// CHECK-NEXT: [[CSTR_LEN:%[0-9]+]] = add i64 [[TEXT_LEN]], 1 +// CHECK-NEXT: [[CSTR_BUF:%[0-9]+]] = alloca i8, i64 [[CSTR_LEN]] +// CHECK-NEXT: [[CSTR:%[0-9]+]] = call ptr @"{{.*}}CStrCopy"(ptr [[CSTR_BUF]], %"{{.*}}String" [[TEXT]]) +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr [[CSTR]]) func main() { c.Printf(c.AllocaCStr(hello())) } diff --git a/cl/_testrt/any/in.go b/cl/_testrt/any/in.go index 3cbfc346ed..824d9e5e37 100644 --- a/cl/_testrt/any/in.go +++ b/cl/_testrt/any/in.go @@ -1,12 +1,14 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.hi\E|\Qmain.incVal\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "github.com/goplus/lib/c" ) -// CHECK: {{^}}@2 = private unnamed_addr constant [7 x i8] c"%s %d\0A\00", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [6 x i8] c"Hello\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [7 x i8] c"%s %d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [6 x i8] c"Hello\00", align 1{{$}} func hi(a any) *c.Char { return a.(*c.Char) @@ -20,58 +22,93 @@ func main() { c.Printf(c.Str("%s %d\n"), hi(c.Str("Hello")), incVal(100)) } -// CHECK-LABEL: define ptr @main.hi(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %2 = icmp eq ptr %1, @"*_llgo_int8" -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: ret ptr %3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %1, ptr @"*_llgo_int8") -// CHECK-NEXT: unreachable +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call ptr @main.hi(%"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_int8", ptr @[[GLOB3]] }) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call i64 @main.incVal(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]]) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], ptr %[[TMP0]], i64 %[[TMP3]]) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_int8", ptr @[[GLOB3]] }, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = load ptr, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = call ptr @main.hi(ptr %[[TMP3]], ptr %[[TMP5]]) +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP7]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = call i64 @main.incVal(ptr %[[TMP10]], ptr %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], ptr %[[TMP6]], i64 %[[TMP13]]) +// CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define i64 @main.incVal(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 0 -// CHECK-NEXT: %2 = icmp eq ptr %1, @_llgo_int -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 +// CHECK-LABEL: define ptr @main.hi( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = icmp eq ptr %[[TMP1]], @"*_llgo_int8" +// DARWIN-ARM64-NEXT: br i1 %[[TMP2]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = icmp eq ptr %[[TMP6]], @"*_llgo_int8" +// LINUX-AMD64-NEXT: br i1 %[[TMP7]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %0, 1 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: %5 = add i64 %4, 1 -// CHECK-NEXT: ret i64 %5 +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], 1 +// DARWIN-ARM64-NEXT: ret ptr %[[TMP3]] +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 1 +// LINUX-AMD64-NEXT: ret ptr %[[TMP8]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %1, ptr @_llgo_int) +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP1]], ptr @"*_llgo_int8") +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP6]], ptr @"*_llgo_int8") // CHECK-NEXT: unreachable // CHECK-NEXT: } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 +// CHECK-LABEL: define i64 @main.incVal( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = icmp eq ptr %[[TMP1]], @_llgo_int +// DARWIN-ARM64-NEXT: br i1 %[[TMP2]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = icmp eq ptr %[[TMP6]], @_llgo_int +// LINUX-AMD64-NEXT: br i1 %[[TMP7]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], 1 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load i64, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = add i64 %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: ret i64 %[[TMP5]] +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load i64, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = add i64 %[[TMP9]], 1 +// LINUX-AMD64-NEXT: ret i64 %[[TMP10]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main.hi(%"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_int8", ptr @3 }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %1, 1 -// CHECK-NEXT: %3 = call i64 @main.incVal(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: %4 = call i32 (ptr, ...) @printf(ptr @2, ptr %0, i64 %3) -// CHECK-NEXT: ret void +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP1]], ptr @_llgo_int) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP6]], ptr @_llgo_int) +// CHECK-NEXT: unreachable // CHECK-NEXT: } diff --git a/cl/_testrt/asm/in.go b/cl/_testrt/asm/in.go index b37c80c886..1c26713177 100644 --- a/cl/_testrt/asm/in.go +++ b/cl/_testrt/asm/in.go @@ -7,10 +7,7 @@ import _ "unsafe" func asm(instruction string) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void asm sideeffect "nop", ""() -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void asm sideeffect "nop", ""() func main() { asm("nop") } diff --git a/cl/_testrt/asmfull/in.go b/cl/_testrt/asmfull/in.go index 437504b970..f48483806f 100644 --- a/cl/_testrt/asmfull/in.go +++ b/cl/_testrt/asmfull/in.go @@ -7,17 +7,12 @@ import _ "unsafe" func asmFull(instruction string, regs map[string]any) uintptr // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void asm sideeffect "nop", ""() -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_any", i64 1) -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 42, ptr {{%[0-9]+}}, align 8 -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef } +// CHECK: call void asm sideeffect "nop", ""() // CHECK: call void asm sideeffect "# test value ${0}", "r"(i64 42) -// CHECK: call i64 asm sideeffect "mov $0, ${1}", "=&r,r"(i64 42) -// CHECK: call i64 asm sideeffect "# calc ${1} + ${2} -> $0", "=&r,r,r"(i64 25, i64 17) -// CHECK: ret void -// CHECK-NEXT: } +// CHECK: [[ASM_RESULT:%[0-9]+]] = call i64 asm sideeffect "mov $0, ${1}", "=&r,r"(i64 42) +// CHECK: call void @"{{.*}}.PrintUint"(i64 [[ASM_RESULT]]) +// CHECK: [[ASM_UNUSED:%[0-9]+]] = call i64 asm sideeffect "# calc ${1} + ${2} -> $0", "=&r,r,r"(i64 25, i64 17) +// CHECK-NEXT: ret void func main() { // no input,no return value asmFull("nop", nil) diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index 19cc37f376..b19978b70c 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -5,12 +5,6 @@ import ( "unsafe" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [3 x i8] c"def", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [4 x i8] c"ABCD", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [7 x i8] c"\E4\B8\ADabcd", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [2 x i8] c"fn", align 1{{$}} - var a int64 = 1<<63 - 1 var b int64 = -1 << 63 var n uint64 = 1<<64 - 1 @@ -28,31 +22,19 @@ const ( ) // CHECK-LABEL: define double @main.Float64frombits(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 %0, ptr %1, align 8 -// CHECK-NEXT: %2 = load double, ptr %1, align 8 -// CHECK-NEXT: ret double %2 -// CHECK-NEXT: } +// CHECK: [[BITS_ADDR:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: store i64 %0, ptr [[BITS_ADDR]] +// CHECK: [[FLOAT:%.*]] = load double, ptr [[BITS_ADDR]] +// CHECK: ret double [[FLOAT]] func Float64frombits(b uint64) float64 { return *(*float64)(unsafe.Pointer(&b)) } // CHECK-LABEL: define double @main.Inf(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp sge i64 %0, 0 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_3, %_llgo_1 -// CHECK-NEXT: %2 = phi i64 [ 9218868437227405312, %_llgo_1 ], [ -4503599627370496, %_llgo_3 ] -// CHECK-NEXT: %3 = call double @main.Float64frombits(i64 %2) -// CHECK-NEXT: ret double %3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-NEXT: } +// CHECK: [[NONNEG:%.*]] = icmp sge i64 %0, 0 +// CHECK: br i1 [[NONNEG]], label %{{.*}}, label %{{.*}} +// CHECK: [[INF_BITS:%.*]] = phi i64 [ 9218868437227405312, %{{.*}} ], [ -4503599627370496, %{{.*}} ] +// CHECK: [[INF:%.*]] = call double @main.Float64frombits(i64 [[INF_BITS]]) +// CHECK: ret double [[INF]] // Inf returns positive infinity if sign >= 0, negative infinity if sign < 0. func Inf(sign int) float64 { @@ -66,386 +48,69 @@ func Inf(sign int) float64 { } // CHECK-LABEL: define i1 @main.IsNaN(double %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = fcmp une double %0, %0 -// CHECK-NEXT: ret i1 %1 -// CHECK-NEXT: } +// CHECK: [[IS_NAN:%.*]] = fcmp une double %0, %0 +// CHECK: ret i1 [[IS_NAN]] func IsNaN(f float64) (is bool) { return f != f } // CHECK-LABEL: define double @main.NaN(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call double @main.Float64frombits(i64 9221120237041090561) -// CHECK-NEXT: ret double %0 -// CHECK-NEXT: } +// CHECK: [[NAN:%.*]] = call double @main.Float64frombits(i64 9221120237041090561) +// CHECK: ret double [[NAN]] // NaN returns an IEEE 754 “not-a-number” value. func NaN() float64 { return Float64frombits(uvnan) } -// CHECK-LABEL: define void @main.demo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } - func demo() { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: store i64 2, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: store i64 3, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %0, i64 3 -// CHECK-NEXT: store i64 4, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 4, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, i64 4, 2 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %9 = getelementptr inbounds i64, ptr %8, i64 0 -// CHECK-NEXT: %10 = getelementptr inbounds i64, ptr %8, i64 1 -// CHECK-NEXT: %11 = getelementptr inbounds i64, ptr %8, i64 2 -// CHECK-NEXT: %12 = getelementptr inbounds i64, ptr %8, i64 3 -// CHECK-NEXT: store i64 1, ptr %9, align 8 -// CHECK-NEXT: store i64 2, ptr %10, align 8 -// CHECK-NEXT: store i64 3, ptr %11, align 8 -// CHECK-NEXT: store i64 4, ptr %12, align 8 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 10) -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %14, 1 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %14, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %20 = getelementptr inbounds i64, ptr %19, i64 0 -// CHECK-NEXT: store i64 1, ptr %20, align 8 -// CHECK-NEXT: %21 = getelementptr inbounds i64, ptr %19, i64 1 -// CHECK-NEXT: store i64 2, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds i64, ptr %19, i64 2 -// CHECK-NEXT: store i64 3, ptr %22, align 8 -// CHECK-NEXT: %23 = getelementptr inbounds i64, ptr %19, i64 3 -// CHECK-NEXT: store i64 4, ptr %23, align 8 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %19, 0 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, i64 4, 1 -// CHECK-NEXT: %26 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %25, i64 4, 2 -// CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %27) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %28 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %29 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %30 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %36 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %36, 2 -// CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %40 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %41 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %40, 1 -// CHECK-NEXT: %42 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %44 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %45 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %44, 2 -// CHECK-NEXT: %46 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %47 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %48 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %49 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %48, 1 -// CHECK-NEXT: %50 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 -// CHECK-NEXT: %51 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %52 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %41) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %53) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %54 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %54, 1 -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %56, 2 -// CHECK-NEXT: %58 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %59 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %58, 1 -// CHECK-NEXT: %60 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %61 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %60, 2 -// CHECK-NEXT: %62 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %63 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %62, 1 -// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %65 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %64, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %55) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %57) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %59) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %61) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %63) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %65) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %66 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) -// CHECK-NEXT: %67 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) -// CHECK-NEXT: %68 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) -// CHECK-NEXT: %69 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %68, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %66) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %67) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %69) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %70 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %71 = getelementptr inbounds i64, ptr %70, i64 0 -// CHECK-NEXT: store i64 5, ptr %71, align 8 -// CHECK-NEXT: %72 = getelementptr inbounds i64, ptr %70, i64 1 -// CHECK-NEXT: store i64 6, ptr %72, align 8 -// CHECK-NEXT: %73 = getelementptr inbounds i64, ptr %70, i64 2 -// CHECK-NEXT: store i64 7, ptr %73, align 8 -// CHECK-NEXT: %74 = getelementptr inbounds i64, ptr %70, i64 3 -// CHECK-NEXT: store i64 8, ptr %74, align 8 -// CHECK-NEXT: %75 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %70, 0 -// CHECK-NEXT: %76 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %75, i64 4, 1 -// CHECK-NEXT: %77 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %76, i64 4, 2 -// CHECK-NEXT: %78 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %77, 0 -// CHECK-NEXT: %79 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %77, 1 -// CHECK-NEXT: %80 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %7, ptr %78, i64 %79, i64 8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %80) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %81 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 3) -// CHECK-NEXT: %82 = getelementptr inbounds i8, ptr %81, i64 0 -// CHECK-NEXT: store i8 97, ptr %82, align 1 -// CHECK-NEXT: %83 = getelementptr inbounds i8, ptr %81, i64 1 -// CHECK-NEXT: store i8 98, ptr %83, align 1 -// CHECK-NEXT: %84 = getelementptr inbounds i8, ptr %81, i64 2 -// CHECK-NEXT: store i8 99, ptr %84, align 1 -// CHECK-NEXT: %85 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %81, 0 -// CHECK-NEXT: %86 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %85, i64 3, 1 -// CHECK-NEXT: %87 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %86, i64 3, 2 -// CHECK-NEXT: %88 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" %87, ptr @1, i64 3, i64 1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %88) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %89 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %90 = getelementptr inbounds { ptr, ptr }, ptr %89, i64 0 -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.main$1", ptr null }, ptr %90, align 8 -// CHECK-NEXT: %91 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %89, 0 -// CHECK-NEXT: %92 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %91, i64 1, 1 -// CHECK-NEXT: %93 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %92, i64 1, 2 -// CHECK-NEXT: %94 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %93, 0 -// CHECK-NEXT: %95 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %93, 1 -// CHECK-NEXT: %96 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %94, i64 %95, i64 16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %96) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %97 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %98 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 100, ptr %98, align 8 -// CHECK-NEXT: %99 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %98, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %99, ptr %97, align 8 -// CHECK-NEXT: %100 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %97, align 8 -// CHECK-NEXT: %101 = ptrtoint ptr %97 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 100) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 -100) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 255) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 -100) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 0.000000e+00) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 1.005000e+02) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintEface"(%"{{.*}}/runtime/internal/runtime.eface" %100) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %97) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %101) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %102 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 3) -// CHECK-NEXT: %103 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %104 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %102, 0 -// CHECK-NEXT: %105 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %104, i64 3, 1 -// CHECK-NEXT: %106 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %105, i64 3, 2 -// CHECK-NEXT: %107 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %88, 0 -// CHECK-NEXT: %108 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %88, 1 -// CHECK-NEXT: %109 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %106, ptr %107, i64 %108, i64 1) -// CHECK-NEXT: store i64 %109, ptr %103, align 8 -// CHECK-NEXT: %110 = load i64, ptr %103, align 8 -// CHECK-NEXT: %111 = getelementptr inbounds i8, ptr %102, i64 0 -// CHECK-NEXT: %112 = load i8, ptr %111, align 1 -// CHECK-NEXT: %113 = getelementptr inbounds i8, ptr %102, i64 1 -// CHECK-NEXT: %114 = load i8, ptr %113, align 1 -// CHECK-NEXT: %115 = getelementptr inbounds i8, ptr %102, i64 2 -// CHECK-NEXT: %116 = load i8, ptr %115, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %110) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %117 = zext i8 %112 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %117) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %118 = zext i8 %114 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %118) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %119 = zext i8 %116 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %119) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %120 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) -// CHECK-NEXT: %121 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %120, ptr @3, i64 4, i64 1) -// CHECK-NEXT: store i64 %121, ptr %103, align 8 -// CHECK-NEXT: %122 = load i64, ptr %103, align 8 -// CHECK-NEXT: %123 = getelementptr inbounds i8, ptr %102, i64 0 -// CHECK-NEXT: %124 = load i8, ptr %123, align 1 -// CHECK-NEXT: %125 = getelementptr inbounds i8, ptr %102, i64 1 -// CHECK-NEXT: %126 = load i8, ptr %125, align 1 -// CHECK-NEXT: %127 = getelementptr inbounds i8, ptr %102, i64 2 -// CHECK-NEXT: %128 = load i8, ptr %127, align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %122) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %129 = zext i8 %124 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %129) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %130 = zext i8 %126 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %130) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %131 = zext i8 %128 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %131) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %132 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %133 = getelementptr inbounds { ptr }, ptr %132, i32 0, i32 0 -// CHECK-NEXT: store ptr %103, ptr %133, align 8 -// CHECK-NEXT: %134 = insertvalue { ptr, ptr } { ptr @"main.main$3", ptr undef }, ptr %132, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @main.demo) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @main.demo) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @"main.main$2") -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %135 = extractvalue { ptr, ptr } %134, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %135) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %136 = call ptr @"{{.*}}/runtime/internal/runtime.NewStringIter"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 7 }) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %137 = call { i1, i64, i32 } @"{{.*}}/runtime/internal/runtime.StringIterNext"(ptr %136) -// CHECK-NEXT: %138 = extractvalue { i1, i64, i32 } %137, 0 -// CHECK-NEXT: br i1 %138, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %139 = extractvalue { i1, i64, i32 } %137, 1 -// CHECK-NEXT: %140 = extractvalue { i1, i64, i32 } %137, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %139) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %141 = sext i32 %140 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %141) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %142 = call double @main.Inf(i64 1) -// CHECK-NEXT: %143 = call double @main.Inf(i64 -1) -// CHECK-NEXT: %144 = call double @main.NaN() -// CHECK-NEXT: %145 = call double @main.NaN() -// CHECK-NEXT: %146 = call i1 @main.IsNaN(double %145) -// CHECK-NEXT: %147 = call i1 @main.IsNaN(double 1.000000e+00) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %142) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %143) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double %144) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %146) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %147) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %148 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 7 }) -// CHECK-NEXT: %149 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %148) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %149) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %150 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromBytes"(%"{{.*}}/runtime/internal/runtime.Slice" %148) -// CHECK-NEXT: %151 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromRunes"(%"{{.*}}/runtime/internal/runtime.Slice" %149) -// CHECK-NEXT: %152 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %148, 0 -// CHECK-NEXT: %153 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %148, 1 -// CHECK-NEXT: %154 = icmp uge i64 3, %153 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %154, {{.*}}) -// CHECK-NEXT: %155 = getelementptr inbounds i8, ptr %152, i64 3 -// CHECK-NEXT: %156 = load i8, ptr %155, align 1 -// CHECK-NEXT: %157 = zext i8 %156 to i64 -// CHECK-NEXT: %158 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 %157) -// CHECK-NEXT: %159 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %149, 0 -// CHECK-NEXT: %160 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %149, 1 -// CHECK-NEXT: %161 = icmp uge i64 0, %160 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %161, {{.*}}) -// CHECK-NEXT: %162 = getelementptr inbounds i32, ptr %159, i64 0 -// CHECK-NEXT: %163 = load i32, ptr %162, align 4 -// CHECK-NEXT: %164 = sext i32 %163 to i64 -// CHECK-NEXT: %165 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromInt64"(i64 %164) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %150) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %151) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %158) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %165) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// make([]byte, 4, 10) must preserve both the requested length and capacity. +// CHECK: [[D_STORAGE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 10) +// CHECK: [[D:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr [[D_STORAGE]], i64 1, i64 10, i64 0, i64 4, i1 true, i1 true, i1 true) +// append(s, 5, 6, 7, 8) forwards the materialized four-element tail. +// CHECK: call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringSlice2"(%"{{.*}}String" { ptr @{{.*}}, i64 5 }, i64 5, i64 5, i1 true, i1 true) +// CHECK: [[INT_TAIL:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK: [[INT_TAIL_0:%.*]] = getelementptr inbounds i64, ptr [[INT_TAIL]], i64 0 +// CHECK: store i64 5, ptr [[INT_TAIL_0]] +// CHECK: [[INT_TAIL_PTR:%.*]] = extractvalue %"{{.*}}Slice" %{{.*}}, 0 +// CHECK: [[INT_TAIL_LEN:%.*]] = extractvalue %"{{.*}}Slice" %{{.*}}, 1 +// CHECK: [[INT_APPEND:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}Slice" %{{.*}}, ptr [[INT_TAIL_PTR]], i64 [[INT_TAIL_LEN]], i64 8) +// append(data, "def"...) uses three one-byte elements. +// CHECK: [[DATA_APPEND:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}Slice" %{{.*}}, ptr @{{.*}}, i64 3, i64 1) +// Appending a function closure uses the two-word function representation. +// CHECK: [[FN_PTR:%.*]] = extractvalue %"{{.*}}Slice" [[FN_SLICE:%.*]], 0 +// CHECK: [[FN_LEN:%.*]] = extractvalue %"{{.*}}Slice" [[FN_SLICE]], 1 +// CHECK: [[FN_APPEND:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.SliceAppend"(%"{{.*}}Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr [[FN_PTR]], i64 [[FN_LEN]], i64 16) +// Both copy forms retain destination/source lengths and the byte element size. +// CHECK: [[COPY_DATA:%.*]] = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}Slice" %{{.*}}, ptr %{{.*}}, i64 %{{.*}}, i64 1) +// CHECK: store i64 [[COPY_DATA]], ptr [[COPY_N:%.*]] +// CHECK: [[COPY_LITERAL:%.*]] = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}Slice" %{{.*}}, ptr @{{.*}}, i64 4, i64 1) +// CHECK: store i64 [[COPY_LITERAL]], ptr [[COPY_N]] +// String range is lowered to one iterator whose yielded index/rune are consumed. +// CHECK: [[ITER:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.NewStringIter"(%"{{.*}}String" { ptr @{{.*}}, i64 7 }) +// CHECK: [[NEXT:%.*]] = call { i1, i64, i32 } @"{{.*}}/runtime/internal/runtime.StringIterNext"(ptr [[ITER]]) +// CHECK: [[HAS_NEXT:%.*]] = extractvalue { i1, i64, i32 } [[NEXT]], 0 +// CHECK: br i1 [[HAS_NEXT]], label %{{.*}}, label %{{.*}} +// Floating-point helpers are exercised with both infinity signs and NaN results. +// CHECK: [[POS_INF:%.*]] = call double @main.Inf(i64 1) +// CHECK: [[NEG_INF:%.*]] = call double @main.Inf(i64 -1) +// CHECK: [[NAN_VALUE:%.*]] = call double @main.NaN() +// CHECK: [[NAN_INPUT:%.*]] = call double @main.NaN() +// CHECK: [[NAN_TRUE:%.*]] = call i1 @main.IsNaN(double [[NAN_INPUT]]) +// CHECK: [[NAN_FALSE:%.*]] = call i1 @main.IsNaN(double 1.000000e+00) +// Byte/rune conversions are round-tripped through their originating slices. +// CHECK: [[BYTES:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.StringToBytes"(%"{{.*}}String" { ptr @{{.*}}, i64 7 }) +// CHECK: [[RUNES:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.StringToRunes"(%"{{.*}}String" { ptr @{{.*}}, i64 7 }) +// CHECK: call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringFromBytes"(%"{{.*}}Slice" [[BYTES]]) +// CHECK: call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringFromRunes"(%"{{.*}}Slice" [[RUNES]]) +// CHECK: [[BYTE_VALUE:%.*]] = load i8, ptr %{{.*}} +// CHECK: [[BYTE64:%.*]] = zext i8 [[BYTE_VALUE]] to i64 +// CHECK: call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 [[BYTE64]]) +// CHECK: [[RUNE_VALUE:%.*]] = load i32, ptr %{{.*}} +// CHECK: [[RUNE64:%.*]] = sext i32 [[RUNE_VALUE]] to i64 +// CHECK: call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringFromInt64"(i64 [[RUNE64]]) func main() { var s = []int{1, 2, 3, 4} @@ -465,11 +130,6 @@ func main() { println(data) fns := []func(){} - // CHECK-LABEL: define void @"main.main$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret void - // CHECK-NEXT: } - fns = append(fns, func() {}) println(fns) var i any = 100 @@ -482,27 +142,10 @@ func main() { fn1 := demo - // CHECK-LABEL: define void @"main.main$2"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 2 }) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - fn2 := func() { println("fn") } - // CHECK-LABEL: define void @"main.main$3"(ptr {{(nest|swiftself)}} %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: %3 = load i64, ptr %2, align 8 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - fn3 := func() { println(n) } @@ -522,3 +165,9 @@ func main() { s2 := "abd" println(s1 == "abc", s1 == s2, s1 != s2, s1 < s2, s1 <= s2, s1 > s2, s1 >= s2) } + +// CHECK-LABEL: define void @"main.main$3"(ptr {{(nest|swiftself)}} %0){{.*}} { +// CHECK: [[CAPTURE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[N_ADDR:%.*]] = extractvalue { ptr } [[CAPTURE]], 0 +// CHECK: [[N:%.*]] = load i64, ptr [[N_ADDR]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[N]]) diff --git a/cl/_testrt/callback/in.go b/cl/_testrt/callback/in.go index 60c5c12d30..ef6893f4a1 100644 --- a/cl/_testrt/callback/in.go +++ b/cl/_testrt/callback/in.go @@ -6,33 +6,23 @@ import ( ) // CHECK-LABEL: define void @main.callback(ptr %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %3 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %3) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %2, ptr %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[CALLBACK_ENV:%[0-9]+]] = extractvalue { ptr, ptr } %1, 1 +// CHECK-NEXT: [[CALLBACK_CODE:%[0-9]+]] = extractvalue { ptr, ptr } %1, 0 +// CHECK: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[CALLBACK_ENV]], ptr %0) func callback(msg *c.Char, f func(*c.Char)) { f(msg) } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.callback(ptr @0, { ptr, ptr } { ptr @main.print, ptr null }) -// CHECK-NEXT: call void @main.callback(ptr @1, { ptr, ptr } { ptr @main.print, ptr null }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.callback(ptr @{{[0-9]+}}, { ptr, ptr } { ptr @main.print, ptr null }) +// CHECK-NEXT: call void @main.callback(ptr @{{[0-9]+}}, { ptr, ptr } { ptr @main.print, ptr null }) func main() { callback(c.Str("Hello\n"), print) callback(c.Str("callback\n"), print) } // CHECK-LABEL: define void @main.print(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call i32 (ptr, ...) @printf(ptr %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call i32 (ptr, ...) @printf(ptr %0) func print(msg *c.Char) { c.Printf(msg) diff --git a/cl/_testrt/cast/in.go b/cl/_testrt/cast/in.go index 96d232411a..f3f719c807 100644 --- a/cl/_testrt/cast/in.go +++ b/cl/_testrt/cast/in.go @@ -3,33 +3,19 @@ package main //"github.com/goplus/lib/c" -// CHECK: @0 = private unnamed_addr constant [5 x i8] c"error", align 1 - // CHECK-LABEL: define void @main.cvt32Fto32(float %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp ole float %0, 0xC1E0000000000000 -// CHECK-NEXT: %3 = fcmp oge float %0, 0x41E0000000000000 -// CHECK-NEXT: %4 = fcmp uno float %0, %0 -// CHECK-NEXT: %5 = select i1 %2, float 0.000000e+00, float %0 -// CHECK-NEXT: %6 = select i1 %3, float 0.000000e+00, float %5 -// CHECK-NEXT: %7 = select i1 %4, float 0.000000e+00, float %6 -// CHECK-NEXT: %8 = fptosi float %7 to i32 -// CHECK-NEXT: %9 = select i1 %2, i32 -2147483648, i32 %8 -// CHECK-NEXT: %10 = select i1 %3, i32 2147483647, i32 %9 -// CHECK-NEXT: %11 = select i1 %4, i32 0, i32 %10 -// CHECK-NEXT: %12 = icmp ne i32 %11, %1 -// CHECK-NEXT: br i1 %12, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %13, align 8 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %13, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %14) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F32_I32_BELOW:%.*]] = fcmp ole float %0, {{.*}} +// CHECK-NEXT: [[F32_I32_ABOVE:%.*]] = fcmp oge float %0, {{.*}} +// CHECK-NEXT: [[F32_I32_NAN:%.*]] = fcmp uno float %0, %0 +// CHECK-NEXT: [[F32_I32_CLAMP_LOW:%.*]] = select i1 [[F32_I32_BELOW]], float 0.000000e+00, float %0 +// CHECK-NEXT: [[F32_I32_CLAMP_HIGH:%.*]] = select i1 [[F32_I32_ABOVE]], float 0.000000e+00, float [[F32_I32_CLAMP_LOW]] +// CHECK-NEXT: [[F32_I32_FINITE:%.*]] = select i1 [[F32_I32_NAN]], float 0.000000e+00, float [[F32_I32_CLAMP_HIGH]] +// CHECK-NEXT: [[F32_I32_RAW:%.*]] = fptosi float [[F32_I32_FINITE]] to i32 +// CHECK-NEXT: [[F32_I32_LOW:%.*]] = select i1 [[F32_I32_BELOW]], i32 -2147483648, i32 [[F32_I32_RAW]] +// CHECK-NEXT: [[F32_I32_HIGH:%.*]] = select i1 [[F32_I32_ABOVE]], i32 2147483647, i32 [[F32_I32_LOW]] +// CHECK-NEXT: [[F32_I32_VALUE:%.*]] = select i1 [[F32_I32_NAN]], i32 0, i32 [[F32_I32_HIGH]] +// CHECK: [[F32_I32_BAD:%.*]] = icmp ne i32 [[F32_I32_VALUE]], %1 +// CHECK: br i1 [[F32_I32_BAD]], label %{{.*}}, label %{{.*}} func cvt32Fto32(a float32, b int32) { if int32(a) != b { @@ -38,31 +24,19 @@ func cvt32Fto32(a float32, b int32) { } // CHECK-LABEL: define void @main.cvt32Fto32U(float %0, i32 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp ole float %0, 0xC3E0000000000000 -// CHECK-NEXT: %3 = fcmp oge float %0, 0x43E0000000000000 -// CHECK-NEXT: %4 = fcmp uno float %0, %0 -// CHECK-NEXT: %5 = select i1 %2, float 0.000000e+00, float %0 -// CHECK-NEXT: %6 = select i1 %3, float 0.000000e+00, float %5 -// CHECK-NEXT: %7 = select i1 %4, float 0.000000e+00, float %6 -// CHECK-NEXT: %8 = fptosi float %7 to i64 -// CHECK-NEXT: %9 = select i1 %2, i64 -9223372036854775808, i64 %8 -// CHECK-NEXT: %10 = select i1 %3, i64 9223372036854775807, i64 %9 -// CHECK-NEXT: %11 = select i1 %4, i64 0, i64 %10 -// CHECK-NEXT: %12 = trunc i64 %11 to i32 -// CHECK-NEXT: %13 = icmp ne i32 %12, %1 -// CHECK-NEXT: br i1 %13, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %14, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F32_U32_BELOW:%.*]] = fcmp ole float %0, {{.*}} +// CHECK-NEXT: [[F32_U32_ABOVE:%.*]] = fcmp oge float %0, {{.*}} +// CHECK-NEXT: [[F32_U32_NAN:%.*]] = fcmp uno float %0, %0 +// CHECK-NEXT: [[F32_U32_CLAMP_LOW:%.*]] = select i1 [[F32_U32_BELOW]], float 0.000000e+00, float %0 +// CHECK-NEXT: [[F32_U32_CLAMP_HIGH:%.*]] = select i1 [[F32_U32_ABOVE]], float 0.000000e+00, float [[F32_U32_CLAMP_LOW]] +// CHECK-NEXT: [[F32_U32_FINITE:%.*]] = select i1 [[F32_U32_NAN]], float 0.000000e+00, float [[F32_U32_CLAMP_HIGH]] +// CHECK-NEXT: [[F32_U32_RAW:%.*]] = fptosi float [[F32_U32_FINITE]] to i64 +// CHECK-NEXT: [[F32_U32_LOW:%.*]] = select i1 [[F32_U32_BELOW]], i64 -9223372036854775808, i64 [[F32_U32_RAW]] +// CHECK-NEXT: [[F32_U32_HIGH:%.*]] = select i1 [[F32_U32_ABOVE]], i64 9223372036854775807, i64 [[F32_U32_LOW]] +// CHECK-NEXT: [[F32_U32_VALUE64:%.*]] = select i1 [[F32_U32_NAN]], i64 0, i64 [[F32_U32_HIGH]] +// CHECK: [[F32_U32_VALUE:%.*]] = trunc i64 [[F32_U32_VALUE64]] to i32 +// CHECK: [[F32_U32_BAD:%.*]] = icmp ne i32 [[F32_U32_VALUE]], %1 +// CHECK: br i1 [[F32_U32_BAD]], label %{{.*}}, label %{{.*}} func cvt32Fto32U(a float32, b uint32) { if uint32(a) != b { @@ -71,21 +45,9 @@ func cvt32Fto32U(a float32, b uint32) { } // CHECK-LABEL: define void @main.cvt32Fto64F(float %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fpext float %0 to double -// CHECK-NEXT: %3 = fcmp une double %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F32_F64_VALUE:%.*]] = fpext float %0 to double +// CHECK: [[F32_F64_BAD:%.*]] = fcmp une double [[F32_F64_VALUE]], %1 +// CHECK: br i1 [[F32_F64_BAD]], label %{{.*}}, label %{{.*}} func cvt32Fto64F(a float32, b float64) { if float64(a) != b { @@ -94,31 +56,19 @@ func cvt32Fto64F(a float32, b float64) { } // CHECK-LABEL: define void @main.cvt32Fto8(float %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp ole float %0, 0xC1E0000000000000 -// CHECK-NEXT: %3 = fcmp oge float %0, 0x41E0000000000000 -// CHECK-NEXT: %4 = fcmp uno float %0, %0 -// CHECK-NEXT: %5 = select i1 %2, float 0.000000e+00, float %0 -// CHECK-NEXT: %6 = select i1 %3, float 0.000000e+00, float %5 -// CHECK-NEXT: %7 = select i1 %4, float 0.000000e+00, float %6 -// CHECK-NEXT: %8 = fptosi float %7 to i32 -// CHECK-NEXT: %9 = select i1 %2, i32 -2147483648, i32 %8 -// CHECK-NEXT: %10 = select i1 %3, i32 2147483647, i32 %9 -// CHECK-NEXT: %11 = select i1 %4, i32 0, i32 %10 -// CHECK-NEXT: %12 = trunc i32 %11 to i8 -// CHECK-NEXT: %13 = icmp ne i8 %12, %1 -// CHECK-NEXT: br i1 %13, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %14, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F32_I8_BELOW:%.*]] = fcmp ole float %0, {{.*}} +// CHECK-NEXT: [[F32_I8_ABOVE:%.*]] = fcmp oge float %0, {{.*}} +// CHECK-NEXT: [[F32_I8_NAN:%.*]] = fcmp uno float %0, %0 +// CHECK-NEXT: [[F32_I8_CLAMP_LOW:%.*]] = select i1 [[F32_I8_BELOW]], float 0.000000e+00, float %0 +// CHECK-NEXT: [[F32_I8_CLAMP_HIGH:%.*]] = select i1 [[F32_I8_ABOVE]], float 0.000000e+00, float [[F32_I8_CLAMP_LOW]] +// CHECK-NEXT: [[F32_I8_FINITE:%.*]] = select i1 [[F32_I8_NAN]], float 0.000000e+00, float [[F32_I8_CLAMP_HIGH]] +// CHECK-NEXT: [[F32_I8_RAW:%.*]] = fptosi float [[F32_I8_FINITE]] to i32 +// CHECK-NEXT: [[F32_I8_LOW:%.*]] = select i1 [[F32_I8_BELOW]], i32 -2147483648, i32 [[F32_I8_RAW]] +// CHECK-NEXT: [[F32_I8_HIGH:%.*]] = select i1 [[F32_I8_ABOVE]], i32 2147483647, i32 [[F32_I8_LOW]] +// CHECK-NEXT: [[F32_I8_VALUE32:%.*]] = select i1 [[F32_I8_NAN]], i32 0, i32 [[F32_I8_HIGH]] +// CHECK: [[F32_I8_VALUE:%.*]] = trunc i32 [[F32_I8_VALUE32]] to i8 +// CHECK: [[F32_I8_BAD:%.*]] = icmp ne i8 [[F32_I8_VALUE]], %1 +// CHECK: br i1 [[F32_I8_BAD]], label %{{.*}}, label %{{.*}} func cvt32Fto8(a float32, b int8) { if int8(a) != b { @@ -127,31 +77,19 @@ func cvt32Fto8(a float32, b int8) { } // CHECK-LABEL: define void @main.cvt32Fto8U(float %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp ole float %0, 0xC1E0000000000000 -// CHECK-NEXT: %3 = fcmp oge float %0, 0x41E0000000000000 -// CHECK-NEXT: %4 = fcmp uno float %0, %0 -// CHECK-NEXT: %5 = select i1 %2, float 0.000000e+00, float %0 -// CHECK-NEXT: %6 = select i1 %3, float 0.000000e+00, float %5 -// CHECK-NEXT: %7 = select i1 %4, float 0.000000e+00, float %6 -// CHECK-NEXT: %8 = fptosi float %7 to i32 -// CHECK-NEXT: %9 = select i1 %2, i32 -2147483648, i32 %8 -// CHECK-NEXT: %10 = select i1 %3, i32 2147483647, i32 %9 -// CHECK-NEXT: %11 = select i1 %4, i32 0, i32 %10 -// CHECK-NEXT: %12 = trunc i32 %11 to i8 -// CHECK-NEXT: %13 = icmp ne i8 %12, %1 -// CHECK-NEXT: br i1 %13, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %14, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F32_U8_BELOW:%.*]] = fcmp ole float %0, {{.*}} +// CHECK-NEXT: [[F32_U8_ABOVE:%.*]] = fcmp oge float %0, {{.*}} +// CHECK-NEXT: [[F32_U8_NAN:%.*]] = fcmp uno float %0, %0 +// CHECK-NEXT: [[F32_U8_CLAMP_LOW:%.*]] = select i1 [[F32_U8_BELOW]], float 0.000000e+00, float %0 +// CHECK-NEXT: [[F32_U8_CLAMP_HIGH:%.*]] = select i1 [[F32_U8_ABOVE]], float 0.000000e+00, float [[F32_U8_CLAMP_LOW]] +// CHECK-NEXT: [[F32_U8_FINITE:%.*]] = select i1 [[F32_U8_NAN]], float 0.000000e+00, float [[F32_U8_CLAMP_HIGH]] +// CHECK-NEXT: [[F32_U8_RAW:%.*]] = fptosi float [[F32_U8_FINITE]] to i32 +// CHECK-NEXT: [[F32_U8_LOW:%.*]] = select i1 [[F32_U8_BELOW]], i32 -2147483648, i32 [[F32_U8_RAW]] +// CHECK-NEXT: [[F32_U8_HIGH:%.*]] = select i1 [[F32_U8_ABOVE]], i32 2147483647, i32 [[F32_U8_LOW]] +// CHECK-NEXT: [[F32_U8_VALUE32:%.*]] = select i1 [[F32_U8_NAN]], i32 0, i32 [[F32_U8_HIGH]] +// CHECK: [[F32_U8_VALUE:%.*]] = trunc i32 [[F32_U8_VALUE32]] to i8 +// CHECK: [[F32_U8_BAD:%.*]] = icmp ne i8 [[F32_U8_VALUE]], %1 +// CHECK: br i1 [[F32_U8_BAD]], label %{{.*}}, label %{{.*}} func cvt32Fto8U(a float32, b uint8) { if uint8(a) != b { @@ -160,21 +98,9 @@ func cvt32Fto8U(a float32, b uint8) { } // CHECK-LABEL: define void @main.cvt32to64(i32 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = sext i32 %0 to i64 -// CHECK-NEXT: %3 = icmp ne i64 %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[I32_I64_VALUE:%.*]] = sext i32 %0 to i64 +// CHECK: [[I32_I64_BAD:%.*]] = icmp ne i64 [[I32_I64_VALUE]], %1 +// CHECK: br i1 [[I32_I64_BAD]], label %{{.*}}, label %{{.*}} func cvt32to64(a int32, b int64) { if int64(a) != b { @@ -183,21 +109,9 @@ func cvt32to64(a int32, b int64) { } // CHECK-LABEL: define void @main.cvt64Fto32F(double %0, float %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fptrunc double %0 to float -// CHECK-NEXT: %3 = fcmp une float %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F64_F32_VALUE:%.*]] = fptrunc double %0 to float +// CHECK: [[F64_F32_BAD:%.*]] = fcmp une float [[F64_F32_VALUE]], %1 +// CHECK: br i1 [[F64_F32_BAD]], label %{{.*}}, label %{{.*}} func cvt64Fto32F(a float64, b float32) { if float32(a) != b { @@ -206,21 +120,9 @@ func cvt64Fto32F(a float64, b float32) { } // CHECK-LABEL: define void @main.cvt64Uto64F(i64 %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = uitofp i64 %0 to double -// CHECK-NEXT: %3 = fcmp une double %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[U64_F64_VALUE:%.*]] = uitofp i64 %0 to double +// CHECK: [[U64_F64_BAD:%.*]] = fcmp une double [[U64_F64_VALUE]], %1 +// CHECK: br i1 [[U64_F64_BAD]], label %{{.*}}, label %{{.*}} func cvt64Uto64F(a uint64, b float64) { if float64(a) != b { @@ -229,21 +131,9 @@ func cvt64Uto64F(a uint64, b float64) { } // CHECK-LABEL: define void @main.cvt64to64F(i64 %0, double %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = sitofp i64 %0 to double -// CHECK-NEXT: %3 = fcmp une double %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[I64_F64_VALUE:%.*]] = sitofp i64 %0 to double +// CHECK: [[I64_F64_BAD:%.*]] = fcmp une double [[I64_F64_VALUE]], %1 +// CHECK: br i1 [[I64_F64_BAD]], label %{{.*}}, label %{{.*}} func cvt64to64F(a int64, b float64) { if float64(a) != b { @@ -252,21 +142,9 @@ func cvt64to64F(a int64, b float64) { } // CHECK-LABEL: define void @main.cvt64to8(i64 %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = trunc i64 %0 to i8 -// CHECK-NEXT: %3 = icmp ne i8 %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[I64_I8_VALUE:%.*]] = trunc i64 %0 to i8 +// CHECK: [[I64_I8_BAD:%.*]] = icmp ne i8 [[I64_I8_VALUE]], %1 +// CHECK: br i1 [[I64_I8_BAD]], label %{{.*}}, label %{{.*}} func cvt64to8(a int64, b int8) { if int8(a) != b { @@ -275,21 +153,9 @@ func cvt64to8(a int64, b int8) { } // CHECK-LABEL: define void @main.cvt64to8U(i64 %0, i8 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = trunc i64 %0 to i8 -// CHECK-NEXT: %3 = icmp ne i8 %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[I64_U8_VALUE:%.*]] = trunc i64 %0 to i8 +// CHECK: [[I64_U8_BAD:%.*]] = icmp ne i8 [[I64_U8_VALUE]], %1 +// CHECK: br i1 [[I64_U8_BAD]], label %{{.*}}, label %{{.*}} func cvt64to8U(a int, b uint8) { if uint8(a) != b { @@ -298,30 +164,18 @@ func cvt64to8U(a int, b uint8) { } // CHECK-LABEL: define void @main.cvtFtoUintptr(double %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = fcmp olt double %0, 0.000000e+00 -// CHECK-NEXT: %3 = fcmp oge double %0, 0x43F0000000000000 -// CHECK-NEXT: %4 = fcmp uno double %0, %0 -// CHECK-NEXT: %5 = select i1 %2, double 0.000000e+00, double %0 -// CHECK-NEXT: %6 = select i1 %3, double 0.000000e+00, double %5 -// CHECK-NEXT: %7 = select i1 %4, double 0.000000e+00, double %6 -// CHECK-NEXT: %8 = fptoui double %7 to i64 -// CHECK-NEXT: %9 = select i1 %3, i64 -1, i64 %8 -// CHECK-NEXT: %10 = select i1 %2, i64 0, i64 %9 -// CHECK-NEXT: %11 = select i1 %4, i64 0, i64 %10 -// CHECK-NEXT: %12 = icmp ne i64 %11, %1 -// CHECK-NEXT: br i1 %12, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %13, align 8 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %13, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %14) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[F64_UINTPTR_BELOW:%.*]] = fcmp olt double %0, 0.000000e+00 +// CHECK-NEXT: [[F64_UINTPTR_ABOVE:%.*]] = fcmp oge double %0, {{.*}} +// CHECK-NEXT: [[F64_UINTPTR_NAN:%.*]] = fcmp uno double %0, %0 +// CHECK-NEXT: [[F64_UINTPTR_CLAMP_LOW:%.*]] = select i1 [[F64_UINTPTR_BELOW]], double 0.000000e+00, double %0 +// CHECK-NEXT: [[F64_UINTPTR_CLAMP_HIGH:%.*]] = select i1 [[F64_UINTPTR_ABOVE]], double 0.000000e+00, double [[F64_UINTPTR_CLAMP_LOW]] +// CHECK-NEXT: [[F64_UINTPTR_FINITE:%.*]] = select i1 [[F64_UINTPTR_NAN]], double 0.000000e+00, double [[F64_UINTPTR_CLAMP_HIGH]] +// CHECK-NEXT: [[F64_UINTPTR_RAW:%.*]] = fptoui double [[F64_UINTPTR_FINITE]] to i64 +// CHECK-NEXT: [[F64_UINTPTR_HIGH:%.*]] = select i1 [[F64_UINTPTR_ABOVE]], i64 -1, i64 [[F64_UINTPTR_RAW]] +// CHECK-NEXT: [[F64_UINTPTR_LOW:%.*]] = select i1 [[F64_UINTPTR_BELOW]], i64 0, i64 [[F64_UINTPTR_HIGH]] +// CHECK-NEXT: [[F64_UINTPTR_VALUE:%.*]] = select i1 [[F64_UINTPTR_NAN]], i64 0, i64 [[F64_UINTPTR_LOW]] +// CHECK: [[F64_UINTPTR_BAD:%.*]] = icmp ne i64 [[F64_UINTPTR_VALUE]], %1 +// CHECK: br i1 [[F64_UINTPTR_BAD]], label %{{.*}}, label %{{.*}} func cvtFtoUintptr(a float64, b uintptr) { if uintptr(a) != b { @@ -330,33 +184,12 @@ func cvtFtoUintptr(a float64, b uintptr) { } // CHECK-LABEL: define void @main.cvtUinptr(i32 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = sext i32 %0 to i64 -// CHECK-NEXT: %3 = icmp ne i64 %2, %1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %6 = trunc i64 %1 to i32 -// CHECK-NEXT: %7 = icmp ne i32 %6, %0 -// CHECK-NEXT: br i1 %7, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[INT_UINTPTR_VALUE:%.*]] = sext i32 %0 to i64 +// CHECK: [[INT_UINTPTR_BAD:%.*]] = icmp ne i64 [[INT_UINTPTR_VALUE]], %1 +// CHECK: br i1 [[INT_UINTPTR_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: [[UINTPTR_INT_VALUE:%.*]] = trunc i64 %1 to i32 +// CHECK: [[UINTPTR_INT_BAD:%.*]] = icmp ne i32 [[UINTPTR_INT_VALUE]], %0 +// CHECK: br i1 [[UINTPTR_INT_BAD]], label %{{.*}}, label %{{.*}} func cvtUinptr(a int32, b uintptr) { if uintptr(a) != b { @@ -447,76 +280,3 @@ func main() { cvtFtoUintptr(0.0, 0) cvtFtoUintptr(1e5, 100000) } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.cvt64to8(i64 0, i8 0) -// CHECK-NEXT: call void @main.cvt64to8(i64 127, i8 127) -// CHECK-NEXT: call void @main.cvt64to8(i64 128, i8 -128) -// CHECK-NEXT: call void @main.cvt64to8(i64 -128, i8 -128) -// CHECK-NEXT: call void @main.cvt64to8(i64 -129, i8 127) -// CHECK-NEXT: call void @main.cvt64to8(i64 256, i8 0) -// CHECK-NEXT: call void @main.cvt64to8U(i64 0, i8 0) -// CHECK-NEXT: call void @main.cvt64to8U(i64 255, i8 -1) -// CHECK-NEXT: call void @main.cvt64to8U(i64 256, i8 0) -// CHECK-NEXT: call void @main.cvt64to8U(i64 257, i8 1) -// CHECK-NEXT: call void @main.cvt64to8U(i64 -1, i8 -1) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0x3FB99999A0000000, i8 0) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0x405FC66660000000, i8 127) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0x4060033340000000, i8 -128) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0xC060033340000000, i8 -128) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0xC060233340000000, i8 127) -// CHECK-NEXT: call void @main.cvt32Fto8(float 0x40700199A0000000, i8 0) -// CHECK-NEXT: call void @main.cvt32Fto8U(float 0.000000e+00, i8 0) -// CHECK-NEXT: call void @main.cvt32Fto8U(float 2.550000e+02, i8 -1) -// CHECK-NEXT: call void @main.cvt32Fto8U(float 2.560000e+02, i8 0) -// CHECK-NEXT: call void @main.cvt32Fto8U(float 2.570000e+02, i8 1) -// CHECK-NEXT: call void @main.cvt32Fto8U(float -1.000000e+00, i8 -1) -// CHECK-NEXT: call void @main.cvt32Fto32(float 0.000000e+00, i32 0) -// CHECK-NEXT: call void @main.cvt32Fto32(float 1.500000e+00, i32 1) -// CHECK-NEXT: call void @main.cvt32Fto32(float 0x41D1194D80000000, i32 1147483648) -// CHECK-NEXT: call void @main.cvt32Fto32(float 0xC1E0000000000000, i32 -2147483648) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0.000000e+00, i32 0) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 1.500000e+00, i32 1) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0x41F0000000000000, i32 0) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0x41F3B9ACA0000000, i32 1000000000) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0xC1F0000000000000, i32 0) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0xC1D34BE880000000, i32 -1294967296) -// CHECK-NEXT: call void @main.cvt32Fto32U(float 0xBFF19999A0000000, i32 -1) -// CHECK-NEXT: call void @main.cvt32Fto64F(float 0.000000e+00, double 0.000000e+00) -// CHECK-NEXT: call void @main.cvt32Fto64F(float 1.500000e+00, double 1.500000e+00) -// CHECK-NEXT: call void @main.cvt32Fto64F(float 1.000000e+10, double 1.000000e+10) -// CHECK-NEXT: call void @main.cvt32Fto64F(float -1.000000e+10, double -1.000000e+10) -// CHECK-NEXT: call void @main.cvt64Fto32F(double 0.000000e+00, float 0.000000e+00) -// CHECK-NEXT: call void @main.cvt64Fto32F(double 1.500000e+00, float 1.500000e+00) -// CHECK-NEXT: call void @main.cvt64Fto32F(double 1.000000e+10, float 1.000000e+10) -// CHECK-NEXT: call void @main.cvt64Fto32F(double -1.000000e+10, float -1.000000e+10) -// CHECK-NEXT: call void @main.cvt64to64F(i64 0, double 0.000000e+00) -// CHECK-NEXT: call void @main.cvt64to64F(i64 10000000000, double 1.000000e+10) -// CHECK-NEXT: call void @main.cvt64to64F(i64 9223372036854775807, double 0x43E0000000000000) -// CHECK-NEXT: call void @main.cvt64to64F(i64 -9223372036854775807, double 0xC3E0000000000000) -// CHECK-NEXT: call void @main.cvt64Uto64F(i64 0, double 0.000000e+00) -// CHECK-NEXT: call void @main.cvt64Uto64F(i64 10000000000, double 1.000000e+10) -// CHECK-NEXT: call void @main.cvt64Uto64F(i64 9223372036854775807, double 0x43E0000000000000) -// CHECK-NEXT: call void @main.cvt64Uto64F(i64 -1, double 0x43F0000000000000) -// CHECK-NEXT: call void @main.cvt32to64(i32 0, i64 0) -// CHECK-NEXT: call void @main.cvt32to64(i32 2147483647, i64 2147483647) -// CHECK-NEXT: call void @main.cvtUinptr(i32 1024, i64 1024) -// CHECK-NEXT: call void @main.cvtFtoUintptr(double 1.000000e+02, i64 100) -// CHECK-NEXT: call void @main.cvtFtoUintptr(double 0.000000e+00, i64 0) -// CHECK-NEXT: call void @main.cvtFtoUintptr(double 1.000000e+05, i64 100000) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testrt/clear/in.go b/cl/_testrt/clear/in.go index 2c420824ba..832758ab58 100644 --- a/cl/_testrt/clear/in.go +++ b/cl/_testrt/clear/in.go @@ -2,44 +2,13 @@ package clear // CHECK-LABEL: define void @"{{.*}}/cl/_testrt/clear.Clear"(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: store i64 2, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: store i64 3, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %0, i64 3 -// CHECK-NEXT: store i64 4, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 4, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, i64 4, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceClear"(ptr @"[]_llgo_int", %"{{.*}}/runtime/internal/runtime.Slice" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 4) -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %9, align 8 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %9) -// CHECK-NEXT: store i64 1, ptr %10, align 8 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %11, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %11) -// CHECK-NEXT: store i64 2, ptr %12, align 8 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 3, ptr %13, align 8 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %13) -// CHECK-NEXT: store i64 3, ptr %14, align 8 -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 4, ptr %15, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %8, ptr %15) -// CHECK-NEXT: store i64 4, ptr %16, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.MapClear"(ptr @"map[_llgo_int]_llgo_int", ptr %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[CLEAR_SLICE:%[0-9]+]] = insertvalue %"{{.*}}Slice" %{{[0-9]+}}, i64 4, 2 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SliceClear"(ptr @"[]_llgo_int", %"{{.*}}Slice" [[CLEAR_SLICE]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}Slice" [[CLEAR_SLICE]]) +// CHECK: [[CLEAR_MAP:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 4) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.MapClear"(ptr @"map[_llgo_int]_llgo_int", ptr [[CLEAR_MAP]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr [[CLEAR_MAP]]) + func Clear() { a := []int{1, 2, 3, 4} clear(a) diff --git a/cl/_testrt/closure/in.go b/cl/_testrt/closure/in.go index 2fe0f79057..ef91277106 100644 --- a/cl/_testrt/closure/in.go +++ b/cl/_testrt/closure/in.go @@ -1,57 +1,69 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E|\Qmain.main$2\E|\Qmain.main$3\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"main.main$1"(i64 100, i64 200) -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.main$2", ptr null }, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.main$3", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %3, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %3, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1{{$}} + func main() { - // CHECK-LABEL: define void @"main.main$1"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = call i32 (ptr, ...) @printf(ptr @0, i64 %0, i64 %1) - // CHECK-NEXT: ret void - // CHECK-NEXT: } func(n1, n2 int) { c.Printf(c.Str("%d %d\n"), n1, n2) }(100, 200) - // CHECK-LABEL: define void @"main.main$2"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = call i32 (ptr, ...) @printf(ptr @1, i64 %0, i64 %1) - // CHECK-NEXT: ret void - // CHECK-NEXT: } fn1 := func(n1, n2 int) { c.Printf(c.Str("%d %d\n"), n1, n2) } - // CHECK-LABEL: define void @"main.main$3"(ptr {{(nest|swiftself)}} %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: %3 = load { ptr, ptr }, ptr %2, align 8 - // CHECK-NEXT: %4 = extractvalue { ptr, ptr } %3, 1 - // CHECK-NEXT: %5 = extractvalue { ptr, ptr } %3, 0 - // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) - // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, i64 100, i64 200) - // CHECK-NEXT: ret void - // CHECK-NEXT: } fn2 := func() { fn1(100, 200) } fn2() } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: call void @"main.main$1"(i64 100, i64 200) +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store { ptr, ptr } { ptr @"main.main$2", ptr null }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[TMP0]], ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$3", ptr undef }, ptr %[[TMP1]], 1 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 1 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP5]]) +// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP4]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$1"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP0]], i64 %[[TMP1]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$2"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i64 %[[TMP0]], i64 %[[TMP1]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$3"( +// CHECK-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = extractvalue { ptr } %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 1 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP5]]) +// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP4]], i64 100, i64 200) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testrt/closurebound/in.go b/cl/_testrt/closurebound/in.go index 9e5364b6b5..118533ce91 100644 --- a/cl/_testrt/closurebound/in.go +++ b/cl/_testrt/closurebound/in.go @@ -1,21 +1,11 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [52 x i8] c"{{.*}}/cl/_testrt/closurebound.demo1", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [6 x i8] c"encode", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [52 x i8] c"{{.*}}/cl/_testrt/closurebound.demo2", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} - var my = demo2{}.encode type demo1 struct { } -// CHECK-LABEL: define i64 @main.demo1.encode(%main.demo1 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 1 -// CHECK-NEXT: } - func (se demo1) encode() int { return 1 } @@ -35,74 +25,33 @@ func main() { } } +// Pointer receiver wrappers must guard nil before calling the value receiver. // CHECK-LABEL: define i64 @"main.(*demo1).encode"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 52 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 6 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call i64 @main.demo1.encode(%main.demo1 zeroinitializer) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } - -// CHECK-LABEL: define i64 @main.demo2.encode(%main.demo2 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret i64 2 -// CHECK-NEXT: } +// CHECK: %[[D1_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[D1_NIL]],{{.*}}) +// CHECK: call i64 @main.demo1.encode(%main.demo1 zeroinitializer) // CHECK-LABEL: define i64 @"main.(*demo2).encode"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 52 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 6 }) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %2) -// CHECK-NEXT: %3 = call i64 @main.demo2.encode(%main.demo2 zeroinitializer) -// CHECK-NEXT: ret i64 %3 -// CHECK-NEXT: } +// CHECK: %[[D2_NIL:[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[D2_NIL]],{{.*}}) +// CHECK: call i64 @main.demo2.encode(%main.demo2 zeroinitializer) +// The package-global method value stores both the selected bound wrapper and +// the zero-sized receiver in init. // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.demo2.encode$bound", ptr @"__llgo.moduleZeroSizedAlloc$" }, ptr @main.my, align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store { ptr, ptr } { ptr @"main.demo2.encode$bound", ptr @"__llgo.moduleZeroSizedAlloc$" }, ptr @main.my // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i64 @"main.demo1.encode$bound"(ptr {{(nest|swiftself)}} @"__llgo.moduleZeroSizedAlloc$") -// CHECK-NEXT: %1 = icmp ne i64 %0, 1 -// CHECK-NEXT: br i1 %1, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: %[[RESULT:[0-9]+]] = call i64 @"main.demo1.encode$bound"(ptr {{(nest|swiftself)}} @"__llgo.moduleZeroSizedAlloc$") +// CHECK: %[[BAD:[0-9]+]] = icmp ne i64 %[[RESULT]], 1 +// CHECK: br i1 %[[BAD]] // CHECK-LABEL: define i64 @"main.demo2.encode$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) -// CHECK-NEXT: %2 = call i64 @main.demo2.encode(%main.demo2 zeroinitializer) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %{{[0-9]+}}) +// CHECK: %[[D2_RESULT:[0-9]+]] = call i64 @main.demo2.encode(%main.demo2 zeroinitializer) +// CHECK: ret i64 %[[D2_RESULT]] // CHECK-LABEL: define i64 @"main.demo1.encode$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) -// CHECK-NEXT: %2 = call i64 @main.demo1.encode(%main.demo1 zeroinitializer) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %{{[0-9]+}}) +// CHECK: %[[D1_RESULT:[0-9]+]] = call i64 @main.demo1.encode(%main.demo1 zeroinitializer) +// CHECK: ret i64 %[[D1_RESULT]] diff --git a/cl/_testrt/closureconv/in.go b/cl/_testrt/closureconv/in.go index 6d63cf3c07..ba58628deb 100644 --- a/cl/_testrt/closureconv/in.go +++ b/cl/_testrt/closureconv/in.go @@ -9,45 +9,40 @@ type Call struct { n int } +// The bound method must forward both call arguments and read n from the same +// receiver captured in the function environment. // CHECK-LABEL: define i64 @"main.(*Call).add"(ptr %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = add i64 %1, %2 -// CHECK-NEXT: %4 = getelementptr inbounds %main.Call, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: %6 = add i64 %3, %5 -// CHECK-NEXT: ret i64 %6 -// CHECK-NEXT: } +// CHECK: [[ADD_AB:%.*]] = add i64 %1, %2 +// CHECK: [[ADD_N_FIELD:%.*]] = getelementptr inbounds %main.Call, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[ADD_N:%.*]] = load i64, ptr [[ADD_N_FIELD]] +// CHECK-NEXT: [[ADD_RESULT:%.*]] = add i64 [[ADD_AB]], [[ADD_N]] +// CHECK-NEXT: ret i64 [[ADD_RESULT]] func (c *Call) add(a int, b int) int { return a + b + c.n } // CHECK-LABEL: define i64 @main.add(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[ADD_PLAIN_RESULT:%.*]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[ADD_PLAIN_RESULT]] func add(a int, b int) int { return a + b } // CHECK-LABEL: define %main.Func @main.demo1(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %2 = getelementptr inbounds %main.Call, ptr %1, i32 0, i32 1 -// CHECK-NEXT: store i64 %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %4 = getelementptr inbounds { ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } { ptr @"main.(*Call).add$bound", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %6 = getelementptr inbounds %main.Call, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %7 = alloca %main.Func, align 8 -// CHECK-NEXT: store { ptr, ptr } %5, ptr %7, align 8 -// CHECK-NEXT: %8 = load %main.Func, ptr %7, align 8 -// CHECK-NEXT: store %main.Func %8, ptr %6, align 8 -// CHECK-NEXT: %9 = getelementptr inbounds %main.Call, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %10 = load %main.Func, ptr %9, align 8 -// CHECK-NEXT: ret %main.Func %10 -// CHECK-NEXT: } +// CHECK: [[DEMO1_CALL:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK: [[DEMO1_N:%.*]] = getelementptr inbounds %main.Call, ptr [[DEMO1_CALL]], i32 0, i32 1 +// CHECK: store i64 %0, ptr [[DEMO1_N]] +// CHECK: [[DEMO1_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: [[DEMO1_ENV_SLOT:%.*]] = getelementptr inbounds { ptr }, ptr [[DEMO1_ENV]], i32 0, i32 0 +// CHECK: store ptr [[DEMO1_CALL]], ptr [[DEMO1_ENV_SLOT]] +// CHECK: [[DEMO1_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.(*Call).add$bound", ptr undef }, ptr [[DEMO1_ENV]], 1 +// CHECK: [[DEMO1_FN_FIELD:%.*]] = getelementptr inbounds %main.Call, ptr [[DEMO1_CALL]], i32 0, i32 0 +// CHECK: store { ptr, ptr } [[DEMO1_BOUND]], ptr [[DEMO1_BOUND_SLOT:%.*]] +// CHECK-NEXT: [[DEMO1_BOUND_VALUE:%.*]] = load %main.Func, ptr [[DEMO1_BOUND_SLOT]] +// CHECK-NEXT: store %main.Func [[DEMO1_BOUND_VALUE]], ptr [[DEMO1_FN_FIELD]] +// CHECK: [[DEMO1_RET_FIELD:%.*]] = getelementptr inbounds %main.Call, ptr [[DEMO1_CALL]], i32 0, i32 0 +// CHECK: [[DEMO1_RET:%.*]] = load %main.Func, ptr [[DEMO1_RET_FIELD]] +// CHECK: ret %main.Func [[DEMO1_RET]] func demo1(n int) Func { m := &Call{n: n} m.fn = m.add @@ -55,17 +50,14 @@ func demo1(n int) Func { } // CHECK-LABEL: define %main.Func @main.demo2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.(*Call).add$bound", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = alloca %main.Func, align 8 -// CHECK-NEXT: store { ptr, ptr } %3, ptr %4, align 8 -// CHECK-NEXT: %5 = load %main.Func, ptr %4, align 8 -// CHECK-NEXT: ret %main.Func %5 -// CHECK-NEXT: } +// CHECK: [[DEMO2_CALL:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK: [[DEMO2_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: [[DEMO2_ENV_SLOT:%.*]] = getelementptr inbounds { ptr }, ptr [[DEMO2_ENV]], i32 0, i32 0 +// CHECK: store ptr [[DEMO2_CALL]], ptr [[DEMO2_ENV_SLOT]] +// CHECK: [[DEMO2_BOUND:%.*]] = insertvalue { ptr, ptr } { ptr @"main.(*Call).add$bound", ptr undef }, ptr [[DEMO2_ENV]], 1 +// CHECK: store { ptr, ptr } [[DEMO2_BOUND]], ptr [[DEMO2_OUT:%.*]] +// CHECK: [[DEMO2_RET:%.*]] = load %main.Func, ptr [[DEMO2_OUT]] +// CHECK: ret %main.Func [[DEMO2_RET]] func demo2() Func { m := &Call{} @@ -73,115 +65,78 @@ func demo2() Func { } // CHECK-LABEL: define %main.Func @main.demo3(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %main.Func { ptr @main.add, ptr null } -// CHECK-NEXT: } +// CHECK: ret %main.Func { ptr @main.add, ptr null } func demo3() Func { return add } // CHECK-LABEL: define %main.Func @main.demo4(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret %main.Func { ptr @"main.demo4$1", ptr null } -// CHECK-NEXT: } +// CHECK: ret %main.Func { ptr @"main.demo4$1", ptr null } // CHECK-LABEL: define i64 @"main.demo4$1"(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[DEMO4_RESULT:%.*]] = add i64 %0, %1 +// CHECK: ret i64 [[DEMO4_RESULT]] func demo4() Func { return func(a, b int) int { return a + b } } // CHECK-LABEL: define %main.Func @main.demo5(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 %0, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.demo5$1", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %5 = alloca %main.Func, align 8 -// CHECK-NEXT: store { ptr, ptr } %4, ptr %5, align 8 -// CHECK-NEXT: %6 = load %main.Func, ptr %5, align 8 -// CHECK-NEXT: ret %main.Func %6 -// CHECK-NEXT: } +// CHECK: [[DEMO5_CAPTURE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK: store i64 %0, ptr [[DEMO5_CAPTURE]] +// CHECK: [[DEMO5_ENV:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK: [[DEMO5_ENV_SLOT:%.*]] = getelementptr inbounds { ptr }, ptr [[DEMO5_ENV]], i32 0, i32 0 +// CHECK: store ptr [[DEMO5_CAPTURE]], ptr [[DEMO5_ENV_SLOT]] +// CHECK: [[DEMO5_FN:%.*]] = insertvalue { ptr, ptr } { ptr @"main.demo5$1", ptr undef }, ptr [[DEMO5_ENV]], 1 +// CHECK: store { ptr, ptr } [[DEMO5_FN]], ptr [[DEMO5_OUT:%.*]] +// CHECK: [[DEMO5_RET:%.*]] = load %main.Func, ptr [[DEMO5_OUT]] +// CHECK: ret %main.Func [[DEMO5_RET]] // CHECK-LABEL: define i64 @"main.demo5$1"(ptr {{(nest|swiftself)}} %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = add i64 %1, %2 -// CHECK-NEXT: %4 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %5 = extractvalue { ptr } %4, 0 -// CHECK-NEXT: %6 = load i64, ptr %5, align 8 -// CHECK-NEXT: %7 = add i64 %3, %6 -// CHECK-NEXT: ret i64 %7 -// CHECK-NEXT: } +// CHECK: [[DEMO5_SUM:%.*]] = add i64 %1, %2 +// CHECK: [[DEMO5_ENV_VALUE:%.*]] = load { ptr }, ptr %0 +// CHECK: [[DEMO5_CAPTURE_ADDR:%.*]] = extractvalue { ptr } [[DEMO5_ENV_VALUE]], 0 +// CHECK: [[DEMO5_CAPTURE_VALUE:%.*]] = load i64, ptr [[DEMO5_CAPTURE_ADDR]] +// CHECK: [[DEMO5_RESULT:%.*]] = add i64 [[DEMO5_SUM]], [[DEMO5_CAPTURE_VALUE]] +// CHECK: ret i64 [[DEMO5_RESULT]] func demo5(n int) Func { return func(a, b int) int { return a + b + n } } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %main.Func @main.demo1(i64 1) -// CHECK-NEXT: %1 = extractvalue %main.Func %0, 1 -// CHECK-NEXT: %2 = extractvalue %main.Func %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %2) -// CHECK-NEXT: %3 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %1, i64 99, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %4 = call %main.Func @main.demo2() -// CHECK-NEXT: %5 = extractvalue %main.Func %4, 1 -// CHECK-NEXT: %6 = extractvalue %main.Func %4, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %6) -// CHECK-NEXT: %7 = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %5, i64 100, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %8 = call %main.Func @main.demo3() -// CHECK-NEXT: %9 = extractvalue %main.Func %8, 1 -// CHECK-NEXT: %10 = extractvalue %main.Func %8, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %10) -// CHECK-NEXT: %11 = call i64 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %9, i64 100, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = call %main.Func @main.demo4() -// CHECK-NEXT: %13 = extractvalue %main.Func %12, 1 -// CHECK-NEXT: %14 = extractvalue %main.Func %12, 0 -// CHECK-NEXT: %__llgo_funcval_code3 = call ptr asm "", "=r,0"(ptr %14) -// CHECK-NEXT: %15 = call i64 %__llgo_funcval_code3(ptr {{(nest|swiftself)}} %13, i64 100, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = call %main.Func @main.demo5(i64 1) -// CHECK-NEXT: %17 = extractvalue %main.Func %16, 1 -// CHECK-NEXT: %18 = extractvalue %main.Func %16, 0 -// CHECK-NEXT: %__llgo_funcval_code4 = call ptr asm "", "=r,0"(ptr %18) -// CHECK-NEXT: %19 = call i64 %__llgo_funcval_code4(ptr {{(nest|swiftself)}} %17, i64 99, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %19) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %20 = call %main.Func @main.demo5(i64 1) -// CHECK-NEXT: %21 = alloca { ptr, ptr }, align 8 -// CHECK-NEXT: store %main.Func %20, ptr %21, align 8 -// CHECK-NEXT: %22 = load { ptr, ptr }, ptr %21, align 8 -// CHECK-NEXT: %23 = extractvalue { ptr, ptr } %22, 1 -// CHECK-NEXT: %24 = extractvalue { ptr, ptr } %22, 0 -// CHECK-NEXT: %__llgo_funcval_code5 = call ptr asm "", "=r,0"(ptr %24) -// CHECK-NEXT: %25 = call i64 %__llgo_funcval_code5(ptr {{(nest|swiftself)}} %23, i64 99, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %25) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %26 = call %main.Func @main.demo5(i64 1) -// CHECK-NEXT: %27 = extractvalue %main.Func %26, 0 -// CHECK-NEXT: %28 = insertvalue %main.Func2 undef, ptr %27, 0 -// CHECK-NEXT: %29 = extractvalue %main.Func %26, 1 -// CHECK-NEXT: %30 = insertvalue %main.Func2 %28, ptr %29, 1 -// CHECK-NEXT: %31 = extractvalue %main.Func2 %30, 1 -// CHECK-NEXT: %32 = extractvalue %main.Func2 %30, 0 -// CHECK-NEXT: %__llgo_funcval_code6 = call ptr asm "", "=r,0"(ptr %32) -// CHECK-NEXT: %33 = call i64 %__llgo_funcval_code6(ptr {{(nest|swiftself)}} %31, i64 99, i64 200) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Each returned function value supplies both the code and environment used by its call. +// CHECK: [[MAIN_F1:%.*]] = call %main.Func @main.demo1(i64 1) +// CHECK: [[MAIN_F1_ENV:%.*]] = extractvalue %main.Func [[MAIN_F1]], 1 +// CHECK: [[MAIN_F1_CODE_RAW:%.*]] = extractvalue %main.Func [[MAIN_F1]], 0 +// CHECK: [[MAIN_F1_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[MAIN_F1_CODE_RAW]]) +// CHECK: [[MAIN_R1:%.*]] = call i64 [[MAIN_F1_CODE]](ptr {{(nest|swiftself)}} [[MAIN_F1_ENV]], i64 99, i64 200) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[MAIN_R1]]) +// The individual demo2, demo3, and demo4 functions above check their distinct +// construction forms; one captured closure is enough to cover invocation here. +// CHECK: [[MAIN_F5:%.*]] = call %main.Func @main.demo5(i64 1) +// CHECK: [[MAIN_F5_ENV:%.*]] = extractvalue %main.Func [[MAIN_F5]], 1 +// CHECK: [[MAIN_F5_CODE_RAW:%.*]] = extractvalue %main.Func [[MAIN_F5]], 0 +// CHECK: [[MAIN_F5_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[MAIN_F5_CODE_RAW]]) +// CHECK: [[MAIN_R5:%.*]] = call i64 [[MAIN_F5_CODE]](ptr {{(nest|swiftself)}} [[MAIN_F5_ENV]], i64 99, i64 200) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[MAIN_R5]]) +// Conversion to the unnamed function type preserves the two function words. +// CHECK: [[PLAIN_SOURCE:%.*]] = call %main.Func @main.demo5(i64 1) +// CHECK: store %main.Func [[PLAIN_SOURCE]], ptr [[PLAIN_SLOT:%.*]] +// CHECK: [[PLAIN_FN:%.*]] = load { ptr, ptr }, ptr [[PLAIN_SLOT]] +// CHECK: [[PLAIN_ENV:%.*]] = extractvalue { ptr, ptr } [[PLAIN_FN]], 1 +// CHECK: [[PLAIN_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[PLAIN_FN]], 0 +// CHECK: [[PLAIN_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[PLAIN_CODE_RAW]]) +// CHECK: call i64 [[PLAIN_CODE]](ptr {{(nest|swiftself)}} [[PLAIN_ENV]], i64 99, i64 200) +// Conversion from Func to Func2 preserves code and environment independently. +// CHECK: [[FUNC2_SOURCE:%.*]] = call %main.Func @main.demo5(i64 1) +// CHECK: [[FUNC2_CODE:%.*]] = extractvalue %main.Func [[FUNC2_SOURCE]], 0 +// CHECK: [[FUNC2_0:%.*]] = insertvalue %main.Func2 undef, ptr [[FUNC2_CODE]], 0 +// CHECK: [[FUNC2_ENV:%.*]] = extractvalue %main.Func [[FUNC2_SOURCE]], 1 +// CHECK: [[FUNC2:%.*]] = insertvalue %main.Func2 [[FUNC2_0]], ptr [[FUNC2_ENV]], 1 +// CHECK: [[FUNC2_CALL_ENV:%.*]] = extractvalue %main.Func2 [[FUNC2]], 1 +// CHECK: [[FUNC2_CALL_CODE_RAW:%.*]] = extractvalue %main.Func2 [[FUNC2]], 0 +// CHECK: [[FUNC2_CALL_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[FUNC2_CALL_CODE_RAW]]) +// CHECK: call i64 [[FUNC2_CALL_CODE]](ptr {{(nest|swiftself)}} [[FUNC2_CALL_ENV]], i64 99, i64 200) func main() { n1 := demo1(1)(99, 200) @@ -207,9 +162,7 @@ func main() { } // CHECK-LABEL: define i64 @"main.(*Call).add$bound"(ptr {{(nest|swiftself)}} %0, i64 %1, i64 %2){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %3 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %4 = extractvalue { ptr } %3, 0 -// CHECK-NEXT: %5 = call i64 @"main.(*Call).add"(ptr %4, i64 %1, i64 %2) -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } +// CHECK: [[BOUND_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[BOUND_CALL:%.*]] = extractvalue { ptr } [[BOUND_ENV]], 0 +// CHECK: [[BOUND_RESULT:%.*]] = call i64 @"main.(*Call).add"(ptr [[BOUND_CALL]], i64 %1, i64 %2) +// CHECK: ret i64 [[BOUND_RESULT]] diff --git a/cl/_testrt/closureiface/in.go b/cl/_testrt/closureiface/in.go index 37f277e152..1b71a248ea 100644 --- a/cl/_testrt/closureiface/in.go +++ b/cl/_testrt/closureiface/in.go @@ -1,63 +1,12 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store i64 200, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %2 = getelementptr inbounds { ptr }, ptr %1, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %5, 0 -// CHECK-NEXT: %7 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %6) -// CHECK-NEXT: br i1 %7, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 5 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %10 = extractvalue { ptr, ptr } %18, 1 -// CHECK-NEXT: %11 = extractvalue { ptr, ptr } %18, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %11) -// CHECK-NEXT: %12 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %10, i64 100) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %5, 1 -// CHECK-NEXT: %14 = load { ptr, ptr }, ptr %13, align 8 -// CHECK-NEXT: %15 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %14, 0 -// CHECK-NEXT: %16 = insertvalue { { ptr, ptr }, i1 } %15, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %17 = phi { { ptr, ptr }, i1 } [ %16, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %18 = extractvalue { { ptr, ptr }, i1 } %17, 0 -// CHECK-NEXT: %19 = extractvalue { { ptr, ptr }, i1 } %17, 1 -// CHECK-NEXT: br i1 %19, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB5:[0-9]+]] = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} + func main() { var m int = 200 - // CHECK-LABEL: define i64 @"main.main$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %4 = load i64, ptr %3, align 8 - // CHECK-NEXT: %5 = add i64 %4, %1 - // CHECK-NEXT: ret i64 %5 - // CHECK-NEXT: } fn := func(n int) int { return m + n } @@ -68,3 +17,96 @@ func main() { } println(f(100)) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: store i64 200, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store ptr %[[TMP0]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store { ptr, ptr } %[[TMP3]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr undef }, ptr %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %[[TMP6]]) +// DARWIN-ARM64-NEXT: br i1 %[[TMP7]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: store i64 200, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[TMP2]], 1 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP4]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr undef }, ptr %[[TMP5]], 1 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$QIHBTaw1IFobr8yvWpq-2AJFm3xBNhdW_aNBicqUBGk", ptr %[[TMP7]]) +// LINUX-AMD64-NEXT: br i1 %[[TMP8]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 5 }, ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP8]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]]) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 5 }, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP9]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP10]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load ptr, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP12]], ptr %[[TMP14]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP18:[0-9]+]], 1 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP18]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP11]]) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP10]], i64 100) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP23:[0-9]+]], 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP23]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP16]]) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP15]], i64 100) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP17]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 1 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP14]], 0 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP15]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP19]], 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP20]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB5:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: br label %_llgo_[[BB5]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP16]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// DARWIN-ARM64-NEXT: %[[TMP18]] = extractvalue { { ptr, ptr }, i1 } %[[TMP17]], 0 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP17]], 1 +// DARWIN-ARM64-NEXT: br i1 %[[TMP19]], label %_llgo_[[BB2]], label %_llgo_[[BB1]] +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP21]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// LINUX-AMD64-NEXT: %[[TMP23]] = extractvalue { { ptr, ptr }, i1 } %[[TMP22]], 0 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP22]], 1 +// LINUX-AMD64-NEXT: br i1 %[[TMP24]], label %_llgo_[[BB2]], label %_llgo_[[BB1]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @"main.main$1"( +// CHECK-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = extractvalue { ptr } %[[TMP2]], 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load i64, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = add i64 %[[TMP4]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP5]] +// CHECK-NEXT: } diff --git a/cl/_testrt/complex/in.go b/cl/_testrt/complex/in.go index c954d7e6d7..9e629f2e9b 100644 --- a/cl/_testrt/complex/in.go +++ b/cl/_testrt/complex/in.go @@ -1,12 +1,10 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double -5.000000e+00, double 1.000000e+01 }) -// CHECK: call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } { double 1.000000e+00, double 2.000000e+00 }, { double, double } { double 3.000000e+00, double 4.000000e+00 }) -// CHECK: call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } { double 1.000000e+00, double 2.000000e+00 }, { double, double } zeroinitializer) -// CHECK: call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } zeroinitializer, { double, double } zeroinitializer) -// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) +// Constant arithmetic remains folded, while division is delegated to the +// runtime and its two components are reassembled for printing. type T complex64 func main() { @@ -25,3 +23,160 @@ func main() { println(a == b, a != b) println(complex128(T(a)) == a) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca { double, double }, align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = alloca { double, double }, align 8 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 1.000000e+00) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintFloat"(double 2.000000e+00) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double -1.000000e+00, double -2.000000e+00 }) +// LINUX-AMD64-NEXT: store { double, double } { double -1.000000e+00, double -2.000000e+00 }, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP15]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load double, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP15]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load double, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP17]], double %[[TMP19]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double 4.000000e+00, double 6.000000e+00 }) +// LINUX-AMD64-NEXT: store { double, double } { double 4.000000e+00, double 6.000000e+00 }, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP14]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load double, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP14]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load double, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP21]], double %[[TMP23]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double -2.000000e+00, double -2.000000e+00 }) +// LINUX-AMD64-NEXT: store { double, double } { double -2.000000e+00, double -2.000000e+00 }, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP13]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load double, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP13]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load double, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP25]], double %[[TMP27]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } { double -5.000000e+00, double 1.000000e+01 }) +// LINUX-AMD64-NEXT: store { double, double } { double -5.000000e+00, double 1.000000e+01 }, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load double, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load double, ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP29]], double %[[TMP31]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } { double 1.000000e+00, double 2.000000e+00 }, { double, double } { double 3.000000e+00, double 4.000000e+00 }) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = extractvalue { double, double } %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue { double, double } %[[TMP0]], 1 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = insertvalue { double, double } %[[TMP3]], double %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } %[[TMP4]]) +// LINUX-AMD64-NEXT: store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP9]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load double, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP9]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = load double, ptr %[[TMP34]], align 8 +// LINUX-AMD64-NEXT: store { double, double } { double 3.000000e+00, double 4.000000e+00 }, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP10]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = load double, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP10]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = load double, ptr %[[TMP38]], align 8 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"(double %[[TMP33]], double %[[TMP35]], double %[[TMP37]], double %[[TMP39]]) +// LINUX-AMD64-NEXT: store { double, double } %[[TMP40]], ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = load { double, double }, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { double, double } %[[TMP41]], 0 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = extractvalue { double, double } %[[TMP41]], 1 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP42]], 0 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = insertvalue { double, double } %[[TMP44]], double %[[TMP43]], 1 +// LINUX-AMD64-NEXT: store { double, double } %[[TMP45]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = load double, ptr %[[TMP46]], align 8 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = load double, ptr %[[TMP48]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP47]], double %[[TMP49]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } { double 1.000000e+00, double 2.000000e+00 }, { double, double } zeroinitializer) +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue { double, double } %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue { double, double } %[[TMP5]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP6]], 0 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = insertvalue { double, double } %[[TMP8]], double %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } %[[TMP9]]) +// LINUX-AMD64-NEXT: store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = load double, ptr %[[TMP50]], align 8 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP5]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = load double, ptr %[[TMP52]], align 8 +// LINUX-AMD64-NEXT: store { double, double } zeroinitializer, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = load double, ptr %[[TMP54]], align 8 +// LINUX-AMD64-NEXT: %[[TMP56:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = load double, ptr %[[TMP56]], align 8 +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"(double %[[TMP51]], double %[[TMP53]], double %[[TMP55]], double %[[TMP57]]) +// LINUX-AMD64-NEXT: store { double, double } %[[TMP58]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = load { double, double }, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = extractvalue { double, double } %[[TMP59]], 0 +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = extractvalue { double, double } %[[TMP59]], 1 +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP60]], 0 +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = insertvalue { double, double } %[[TMP62]], double %[[TMP61]], 1 +// LINUX-AMD64-NEXT: store { double, double } %[[TMP63]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP65:[0-9]+]] = load double, ptr %[[TMP64]], align 8 +// LINUX-AMD64-NEXT: %[[TMP66:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP67:[0-9]+]] = load double, ptr %[[TMP66]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP65]], double %[[TMP67]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"({ double, double } zeroinitializer, { double, double } zeroinitializer) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = extractvalue { double, double } %[[TMP10]], 0 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { double, double } %[[TMP10]], 1 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP11]], 0 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = insertvalue { double, double } %[[TMP13]], double %[[TMP12]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"({ double, double } %[[TMP14]]) +// LINUX-AMD64-NEXT: store { double, double } zeroinitializer, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP68:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP69:[0-9]+]] = load double, ptr %[[TMP68]], align 8 +// LINUX-AMD64-NEXT: %[[TMP70:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP71:[0-9]+]] = load double, ptr %[[TMP70]], align 8 +// LINUX-AMD64-NEXT: store { double, double } zeroinitializer, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP72:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP73:[0-9]+]] = load double, ptr %[[TMP72]], align 8 +// LINUX-AMD64-NEXT: %[[TMP74:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP75:[0-9]+]] = load double, ptr %[[TMP74]], align 8 +// LINUX-AMD64-NEXT: %[[TMP76:[0-9]+]] = call { double, double } @"{{.*}}/runtime/internal/runtime.Complex128Div"(double %[[TMP69]], double %[[TMP71]], double %[[TMP73]], double %[[TMP75]]) +// LINUX-AMD64-NEXT: store { double, double } %[[TMP76]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP77:[0-9]+]] = load { double, double }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP78:[0-9]+]] = extractvalue { double, double } %[[TMP77]], 0 +// LINUX-AMD64-NEXT: %[[TMP79:[0-9]+]] = extractvalue { double, double } %[[TMP77]], 1 +// LINUX-AMD64-NEXT: %[[TMP80:[0-9]+]] = insertvalue { double, double } undef, double %[[TMP78]], 0 +// LINUX-AMD64-NEXT: %[[TMP81:[0-9]+]] = insertvalue { double, double } %[[TMP80]], double %[[TMP79]], 1 +// LINUX-AMD64-NEXT: store { double, double } %[[TMP81]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP82:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP83:[0-9]+]] = load double, ptr %[[TMP82]], align 8 +// LINUX-AMD64-NEXT: %[[TMP84:[0-9]+]] = getelementptr inbounds { double, double }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP85:[0-9]+]] = load double, ptr %[[TMP84]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintComplex"(double %[[TMP83]], double %[[TMP85]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testrt/concat/in.go b/cl/_testrt/concat/in.go index f4eaf58579..4d6ae72d7a 100644 --- a/cl/_testrt/concat/in.go +++ b/cl/_testrt/concat/in.go @@ -1,33 +1,15 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.concat\E|\Qmain.info\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.concat(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %2 = phi %"{{.*}}/runtime/internal/runtime.String" [ zeroinitializer, %_llgo_0 ], [ %13, %_llgo_2 ] -// CHECK-NEXT: %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] -// CHECK-NEXT: %4 = add i64 %3, 1 -// CHECK-NEXT: %5 = icmp slt i64 %4, %1 -// CHECK-NEXT: br i1 %5, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %8 = icmp slt i64 %4, 0 -// CHECK-NEXT: %9 = icmp uge i64 %4, %7 -// CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) -// CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %6, i64 %4 -// CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 -// CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %2, %"{{.*}}/runtime/internal/runtime.String" %12) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %2 -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [3 x i8] c"...", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [5 x i8] c"Hello", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [1 x i8] c" ", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [5 x i8] c"World", align 1{{$}} + +// The loop carries both the accumulated string and the current index. The +// element selected by that index must be concatenated into the carried value. func concat(args ...string) (ret string) { for _, v := range args { ret += v @@ -35,34 +17,172 @@ func concat(args ...string) (ret string) { return } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.info(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" zeroinitializer, %"{{.*}}/runtime/internal/runtime.String" %0) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 3 }) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %2 -// CHECK-NEXT: } func info(s string) string { return "" + s + "..." } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 5 }, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 1 }, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %0, i64 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 5 }, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 3, 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 3, 2 -// CHECK-NEXT: %7 = call %"{{.*}}/runtime/internal/runtime.String" @main.concat(%"{{.*}}/runtime/internal/runtime.Slice" %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { result := concat("Hello", " ", "World") println(result) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 5 }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 1 }, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], i64 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 5 }, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP5]], i64 3, 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], i64 3, 2 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @main.concat(ptr %[[TMP0]]) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 48) +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], i64 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 5 }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], i64 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 1 }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], i64 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 5 }, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP3]], 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], i64 3, 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP8]], i64 3, 2 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = call { ptr, i64 } @main.concat(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]]) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP10]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP11]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load i64, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP13]], i64 %[[TMP15]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.concat( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, i64 } @main.concat( +// LINUX-AMD64-SAME: ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = phi %"{{.*}}/runtime/internal/runtime.String" [ zeroinitializer, %_llgo_[[BB0]] ], [ %[[TMP14:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP5:[0-9]+]], %_llgo_[[BB2]] ] +// DARWIN-ARM64-NEXT: %[[TMP5]] = add i64 %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = icmp slt i64 %[[TMP5]], %[[TMP2]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = phi %"{{.*}}/runtime/internal/runtime.String" [ zeroinitializer, %_llgo_[[BB0]] ], [ %[[TMP26:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP8:[0-9]+]], %_llgo_[[BB2]] ] +// LINUX-AMD64-NEXT: %[[TMP8]] = add i64 %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = icmp slt i64 %[[TMP8]], %[[TMP5]] +// LINUX-AMD64-NEXT: br i1 %[[TMP9]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = icmp slt i64 %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = icmp uge i64 %[[TMP5]], %[[TMP8]] +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = or i1 %[[TMP10]], %[[TMP9]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP11]], i64 %[[TMP5]], i1 true, i64 %[[TMP8]]) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP7]], i64 %[[TMP5]] +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP3]], %"{{.*}}/runtime/internal/runtime.String" %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = icmp slt i64 %[[TMP8]], 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = icmp uge i64 %[[TMP8]], %[[TMP11]] +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = or i1 %[[TMP13]], %[[TMP12]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP14]], i64 %[[TMP8]], i1 true, i64 %[[TMP11]]) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP10]], i64 %[[TMP8]] +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = load i64, ptr %[[TMP19]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP16]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = load ptr, ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = load i64, ptr %[[TMP23]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = call { ptr, i64 } @"{{.*}}/runtime/internal/runtime.StringCat"(ptr %[[TMP18]], i64 %[[TMP20]], ptr %[[TMP22]], i64 %[[TMP24]]) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP25]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP4]], align 8 +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %[[TMP3]] +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP6]], ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = load { ptr, i64 }, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, i64 } %[[TMP28]] +// CHECK-NEXT: } + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.info( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.String" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, i64 } @main.info( +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" zeroinitializer, %"{{.*}}/runtime/internal/runtime.String" %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP1]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 3 }) +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %[[TMP2]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" zeroinitializer, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load i64, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP5]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = load i64, ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = call { ptr, i64 } @"{{.*}}/runtime/internal/runtime.StringCat"(ptr %[[TMP11]], i64 %[[TMP13]], ptr %[[TMP16]], i64 %[[TMP18]]) +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP19]], ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP21]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load i64, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 3 }, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load i64, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = call { ptr, i64 } @"{{.*}}/runtime/internal/runtime.StringCat"(ptr %[[TMP23]], i64 %[[TMP25]], ptr %[[TMP27]], i64 %[[TMP29]]) +// LINUX-AMD64-NEXT: store { ptr, i64 } %[[TMP30]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP31]], ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load { ptr, i64 }, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, i64 } %[[TMP33]] +// CHECK-NEXT: } diff --git a/cl/_testrt/constuptr/in.go b/cl/_testrt/constuptr/in.go index 3280dd546e..ae62358d39 100644 --- a/cl/_testrt/constuptr/in.go +++ b/cl/_testrt/constuptr/in.go @@ -6,11 +6,7 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr inttoptr (i64 100 to ptr)) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr inttoptr (i64 100 to ptr)) func main() { a := unsafe.Pointer(uintptr(100)) println(a) diff --git a/cl/_testrt/cstr/in.go b/cl/_testrt/cstr/in.go index cd8b6e902a..47307b0bbb 100644 --- a/cl/_testrt/cstr/in.go +++ b/cl/_testrt/cstr/in.go @@ -3,19 +3,15 @@ package main import _ "unsafe" -// CHECK: {{^}}@0 = private unnamed_addr constant [14 x i8] c"Hello, world\0A\00", align 1{{$}} - //go:linkname cstr llgo.cstr func cstr(string) *int8 //go:linkname printf C.printf func printf(format *int8, __llgo_va_list ...any) +// CHECK: [[CSTR_TEXT:@[0-9]+]] = private unnamed_addr constant [14 x i8] c"Hello, world\0A\00" // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void (ptr, ...) @printf(ptr [[CSTR_TEXT]]) func main() { printf(cstr("Hello, world\n")) } diff --git a/cl/_testrt/cvar/in.go b/cl/_testrt/cvar/in.go index 2a7b0a0d97..408e4942eb 100644 --- a/cl/_testrt/cvar/in.go +++ b/cl/_testrt/cvar/in.go @@ -3,7 +3,7 @@ package main import _ "unsafe" -// CHECK: {{^}}@_bar_x = external global { [16 x i8], [2 x ptr] }, align 8{{$}} +// CHECK: {{^}}@_bar_x = external global { [16 x i8], [2 x ptr] } // //go:linkname barX _bar_x var barX struct { @@ -11,7 +11,7 @@ var barX struct { Callbacks [2]func() } -// CHECK: {{^}}@_bar_y = external global { [16 x i8] }, align 1{{$}} +// CHECK: {{^}}@_bar_y = external global { [16 x i8] } // //go:linkname barY _bar_y var barY struct { @@ -19,11 +19,8 @@ var barY struct { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load { [16 x i8], [2 x ptr] }, ptr @_bar_x, align 8 -// CHECK-NEXT: %1 = load { [16 x i8] }, ptr @_bar_y, align 1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: load { [16 x i8], [2 x ptr] }, ptr @_bar_x +// CHECK: load { [16 x i8] }, ptr @_bar_y func main() { _ = barX _ = barY diff --git a/cl/_testrt/eface/in.go b/cl/_testrt/eface/in.go index ff3bcf7e9a..54500f4e46 100644 --- a/cl/_testrt/eface/in.go +++ b/cl/_testrt/eface/in.go @@ -7,104 +7,39 @@ import ( "github.com/goplus/llgo/runtime/abi" ) -// CHECK-LABEL: define void @"main.(*T).Invoke"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 6 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func (t *T) Invoke() { println("invoke") } // CHECK-LABEL: define void @main.dump(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.eface, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: call void @main.dumpTyp(ptr %3, %"{{.*}}/runtime/internal/runtime.String" zeroinitializer) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store %"{{.*}}eface" %0, ptr [[DUMP_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[DUMP_TYPE_FIELD:%.*]] = getelementptr inbounds %main.eface, ptr [[DUMP_ADDR]], i32 0, i32 0 +// CHECK: [[DUMP_TYPE:%.*]] = load ptr, ptr [[DUMP_TYPE_FIELD]] +// CHECK: call void @main.dumpTyp(ptr [[DUMP_TYPE]], %"{{.*}}String" zeroinitializer) func dump(v any) { e := (*eface)(unsafe.Pointer(&v)) dumpTyp(e._type, "") } // CHECK-LABEL: define void @main.dumpTyp(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/abi.(*Type).String"(ptr %0) -// CHECK-NEXT: %3 = call i64 @"{{.*}}/runtime/abi.(*Type).Kind"(ptr %0) -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %7 = load i64, ptr %6, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %9 = load i32, ptr %8, align 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 3 -// CHECK-NEXT: %11 = load i8, ptr %10, align 1 -// CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 4 -// CHECK-NEXT: %13 = load i8, ptr %12, align 1 -// CHECK-NEXT: %14 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 10 -// CHECK-NEXT: %15 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %17 = zext i32 %9 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %18 = zext i8 %11 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %19 = zext i8 %13 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %19) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %0) -// CHECK-NEXT: %21 = icmp ne ptr %20, null -// CHECK-NEXT: br i1 %21, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %0) -// CHECK-NEXT: %23 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 7 }) -// CHECK-NEXT: call void @main.dumpTyp(ptr %22, %"{{.*}}/runtime/internal/runtime.String" %23) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) -// CHECK-NEXT: %25 = icmp ne ptr %24, null -// CHECK-NEXT: br i1 %25, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) -// CHECK-NEXT: %27 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 9 }) -// CHECK-NEXT: call void @main.dumpUncommon(ptr %26, %"{{.*}}/runtime/internal/runtime.String" %27) -// CHECK-NEXT: %28 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 10 -// CHECK-NEXT: %29 = load ptr, ptr %28, align 8 -// CHECK-NEXT: %30 = icmp ne ptr %29, null -// CHECK-NEXT: br i1 %30, label %_llgo_5, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_3, %_llgo_2 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_3 -// CHECK-NEXT: %31 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 10 -// CHECK-NEXT: %32 = load ptr, ptr %31, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %32) -// CHECK-NEXT: %34 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{.*}}, i64 9 }) -// CHECK-NEXT: call void @main.dumpUncommon(ptr %33, %"{{.*}}/runtime/internal/runtime.String" %34) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" %1) +// CHECK: [[TYPE_NAME:%.*]] = call %"{{.*}}String" @"{{.*}}/runtime/abi.(*Type).String"(ptr %0) +// CHECK: [[TYPE_KIND:%.*]] = call i64 @"{{.*}}/runtime/abi.(*Type).Kind"(ptr %0) +// CHECK: [[TYPE_UNCOMMON:%.*]] = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[TYPE_NAME]]) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 [[TYPE_KIND]]) +// CHECK: [[TYPE_ELEM:%.*]] = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %0) +// CHECK: [[HAS_ELEM:%.*]] = icmp ne ptr [[TYPE_ELEM]], null +// CHECK: br i1 [[HAS_ELEM]], label %{{.*}}, label %{{.*}} +// CHECK: [[RECURSE_ELEM:%.*]] = call ptr @"{{.*}}/runtime/abi.(*Type).Elem"(ptr %0) +// CHECK: [[ELEM_SEP:%.*]] = call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}String" %1, %"{{.*}}String" { ptr @{{.*}}, i64 7 }) +// CHECK: call void @main.dumpTyp(ptr [[RECURSE_ELEM]], %"{{.*}}String" [[ELEM_SEP]]) +// CHECK: [[RECHECK_UNCOMMON:%.*]] = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) +// CHECK: [[HAS_UNCOMMON:%.*]] = icmp ne ptr [[RECHECK_UNCOMMON]], null +// CHECK: br i1 [[HAS_UNCOMMON]], label %{{.*}}, label %{{.*}} +// CHECK: [[DUMP_UNCOMMON:%.*]] = call ptr @"{{.*}}/runtime/abi.(*Type).Uncommon"(ptr %0) +// CHECK: [[UNCOMMON_SEP:%.*]] = call %"{{.*}}String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}String" %1, %"{{.*}}String" { ptr @{{.*}}, i64 9 }) +// CHECK: call void @main.dumpUncommon(ptr [[DUMP_UNCOMMON]], %"{{.*}}String" [[UNCOMMON_SEP]]) func dumpTyp(t *abi.Type, sep string) { print(sep) println(t.String(), t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_, t.PtrToThis_, t.Uncommon()) @@ -120,24 +55,18 @@ func dumpTyp(t *abi.Type, sep string) { } // CHECK-LABEL: define void @main.dumpUncommon(ptr %0, %"{{.*}}/runtime/internal/runtime.String" %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %1) -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/runtime/abi.UncommonType", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.String", ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/abi.UncommonType", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %5 = load i16, ptr %4, align 2 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/abi.UncommonType", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %7 = load i16, ptr %6, align 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %8 = zext i16 %5 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %9 = zext i16 %7 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" %1) +// CHECK: [[PKG_FIELD:%.*]] = getelementptr inbounds %"{{.*}}UncommonType", ptr %0, i32 0, i32 0 +// CHECK: [[PKG_PATH:%.*]] = load %"{{.*}}String", ptr [[PKG_FIELD]] +// CHECK: [[MCOUNT_FIELD:%.*]] = getelementptr inbounds %"{{.*}}UncommonType", ptr %0, i32 0, i32 1 +// CHECK: [[MCOUNT:%.*]] = load i16, ptr [[MCOUNT_FIELD]] +// CHECK: [[XCOUNT_FIELD:%.*]] = getelementptr inbounds %"{{.*}}UncommonType", ptr %0, i32 0, i32 2 +// CHECK: [[XCOUNT:%.*]] = load i16, ptr [[XCOUNT_FIELD]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}String" [[PKG_PATH]]) +// CHECK: [[MCOUNT64:%.*]] = zext i16 [[MCOUNT]] to i64 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 [[MCOUNT64]]) +// CHECK: [[XCOUNT64:%.*]] = zext i16 [[XCOUNT]] to i64 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 [[XCOUNT64]]) func dumpUncommon(u *abi.UncommonType, sep string) { print(sep) @@ -152,21 +81,48 @@ type eface struct { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 1) -// CHECK: store i1 true, ptr {{%[0-9]+}}, align 1 -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_bool, ptr undef } -// CHECK: call void @main.dump -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK: store i64 0, ptr {{%[0-9]+}}, align 8 -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef } -// CHECK: call void @main.dump -// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 80) -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[10]_llgo_int" -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"[]_llgo_int" -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"{{.*}}/cl/_testrt/eface.struct -// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.T -// CHECK: ret void +// Every source value is boxed with its own descriptor and that exact eface is dumped. +// CHECK: [[BOOL_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_bool, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[BOOL_BOX]]) +// CHECK: [[INT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[INT_BOX]]) +// CHECK: [[INT8_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int8, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[INT8_BOX]]) +// CHECK: [[INT16_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int16, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[INT16_BOX]]) +// CHECK: [[INT32_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int32, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[INT32_BOX]]) +// CHECK: [[INT64_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int64, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[INT64_BOX]]) +// CHECK: [[UINT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uint, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINT_BOX]]) +// CHECK: [[UINT8_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uint8, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINT8_BOX]]) +// CHECK: [[UINT16_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uint16, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINT16_BOX]]) +// CHECK: [[UINT32_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uint32, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINT32_BOX]]) +// CHECK: [[UINT64_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uint64, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINT64_BOX]]) +// CHECK: [[UINTPTR_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_uintptr, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[UINTPTR_BOX]]) +// CHECK: [[FLOAT32_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_float32, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[FLOAT32_BOX]]) +// CHECK: [[FLOAT64_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_float64, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[FLOAT64_BOX]]) +// CHECK: [[ARRAY_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"[10]_llgo_int", ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[ARRAY_BOX]]) +// CHECK: [[CLOSURE_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[CLOSURE_BOX]]) +// CHECK: call void @main.dump(%"{{.*}}eface" { ptr @"*_llgo_int", ptr null }) +// CHECK: [[SLICE_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"[]_llgo_int", ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[SLICE_BOX]]) +// CHECK: [[STRING_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[STRING_BOX]]) +// CHECK: [[STRUCT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"{{.*}}/cl/_testrt/eface.struct${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[STRUCT_BOX]]) +// CHECK: [[NAMED_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.T, ptr undef }, ptr %{{.*}}, 1 +// CHECK: call void @main.dump(%"{{.*}}eface" [[NAMED_BOX]]) func main() { dump(true) dump(0) @@ -184,10 +140,6 @@ func main() { dump(float64(0)) dump([10]int{}) dump(func() {}) - // CHECK-LABEL: define void @"main.main$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret void - // CHECK-NEXT: } dump((*int)(nil)) dump([]int{}) dump("hello") diff --git a/cl/_testrt/float2any/in.go b/cl/_testrt/float2any/in.go index ee0e1cf095..42820a669a 100644 --- a/cl/_testrt/float2any/in.go +++ b/cl/_testrt/float2any/in.go @@ -1,8 +1,15 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.check32\E|\Qmain.check64\E|\Qmain.f32\E|\Qmain.f64\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "unsafe" +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [14 x i8] c"error type f32", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [14 x i8] c"error bits f32", align 1{{$}} +// CHECK: {{^}}@[[GLOB5:[0-9]+]] = private unnamed_addr constant [14 x i8] c"error type f64", align 1{{$}} +// CHECK: {{^}}@[[GLOB6:[0-9]+]] = private unnamed_addr constant [14 x i8] c"error bits f64", align 1{{$}} + const pi = 3.14159265 const pi32bits = 0x40490fdb const pi64lo = 0x53c8d4f1 @@ -18,10 +25,8 @@ type u64parts struct { hi uint32 } -// CHECK-LABEL: define void @main.check32(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK: icmp eq ptr {{.*}}, @_llgo_float32 -// CHECK: load i32, ptr -// CHECK: icmp ne i32 {{.*}}, 1078530011 +// check32 must test the dynamic type and then inspect the data pointer from the +// same interface value; the decimal constant is pi32bits. func check32(v any) { switch v.(type) { case float32: @@ -34,12 +39,6 @@ func check32(v any) { } } -// CHECK-LABEL: define void @main.check64(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK: icmp eq ptr {{.*}}, @_llgo_float64 -// CHECK: load i32, ptr -// CHECK: icmp ne i32 {{.*}}, 1405670641 -// CHECK: load i32, ptr -// CHECK: icmp ne i32 {{.*}}, 1074340347 func check64(v any) { switch v.(type) { case float64: @@ -53,37 +52,292 @@ func check64(v any) { } } -// CHECK-LABEL: define float @main.f32(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret float 0x400921FB60000000 -// CHECK-NEXT: } func f32() float32 { return pi } -// CHECK-LABEL: define double @main.f64(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret double 0x400921FB53C8D4F1 -// CHECK-NEXT: } func f64() float64 { return pi } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call float @main.f32() -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) -// CHECK-NEXT: store float %0, ptr %1, align 4 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %1, 1 -// CHECK-NEXT: call void @main.check32(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: %3 = call double @main.f64() -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store double %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @main.check64(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { check32(f32()) check64(f64()) } + +// CHECK-LABEL: define float @main.f32(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: ret float 0x400921FB60000000 +// CHECK-NEXT: } + +// CHECK-LABEL: define double @main.f64(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: ret double 0x400921FB53C8D4F1 +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call float @main.f32() +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) +// DARWIN-ARM64-NEXT: store float %[[TMP0]], ptr %[[TMP1]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: call void @main.check32(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]]) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call double @main.f64() +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: store double %[[TMP3]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: call void @main.check64(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]]) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = call float @main.f32() +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 4) +// LINUX-AMD64-NEXT: store float %[[TMP2]], ptr %[[TMP3]], align 4 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float32, ptr undef }, ptr %[[TMP3]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: call void @main.check32(ptr %[[TMP6]], ptr %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call double @main.f64() +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: store double %[[TMP9]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_float64, ptr undef }, ptr %[[TMP10]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: call void @main.check64(ptr %[[TMP13]], ptr %[[TMP15]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.check32( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = icmp eq ptr %[[TMP3]], @_llgo_float32 +// DARWIN-ARM64-NEXT: br i1 %[[TMP4]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]], 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = icmp eq ptr %[[TMP10]], @_llgo_float32 +// LINUX-AMD64-NEXT: br i1 %[[TMP11]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = alloca %main.eface, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP5]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = load %main.eface, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: store %main.eface %[[TMP6]], ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.eface, ptr %[[TMP5]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = load i32, ptr %[[TMP8]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = icmp ne i32 %[[TMP9]], 1078530011 +// DARWIN-ARM64-NEXT: br i1 %[[TMP10]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %main.eface, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP12]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %main.eface, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store %main.eface %[[TMP13]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %main.eface, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load i32, ptr %[[TMP15]], align 4 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = icmp ne i32 %[[TMP16]], 1078530011 +// LINUX-AMD64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 14 }, ptr %[[TMP11]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP11]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 14 }, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP18]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP19]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP21]], ptr %[[TMP23]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 14 }, ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP13]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP14]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB3]], i64 14 }, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP25]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load ptr, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP27]], ptr %[[TMP29]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = load float, ptr %[[TMP15]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = insertvalue { float, i1 } undef, float %[[TMP16]], 0 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = insertvalue { float, i1 } %[[TMP17]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]], 1 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load float, ptr %[[TMP30]], align 4 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = insertvalue { float, i1 } undef, float %[[TMP31]], 0 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = insertvalue { float, i1 } %[[TMP32]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB7:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB6]]: +// CHECK-NEXT: br label %_llgo_[[BB7]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB7]]: +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = phi { float, i1 } [ %[[TMP18]], %_llgo_[[BB5]] ], [ zeroinitializer, %_llgo_[[BB6]] ] +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = extractvalue { float, i1 } %[[TMP19]], 0 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = extractvalue { float, i1 } %[[TMP19]], 1 +// DARWIN-ARM64-NEXT: br i1 %[[TMP21]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = phi { float, i1 } [ %[[TMP33]], %_llgo_[[BB5]] ], [ zeroinitializer, %_llgo_[[BB6]] ] +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = extractvalue { float, i1 } %[[TMP34]], 0 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = extractvalue { float, i1 } %[[TMP34]], 1 +// LINUX-AMD64-NEXT: br i1 %[[TMP36]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.check64( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = icmp eq ptr %[[TMP3]], @_llgo_float64 +// DARWIN-ARM64-NEXT: br i1 %[[TMP4]], label %_llgo_[[BB6:[0-9]+]], label %_llgo_[[BB7:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.eface", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]], 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = icmp eq ptr %[[TMP10]], @_llgo_float64 +// LINUX-AMD64-NEXT: br i1 %[[TMP11]], label %_llgo_[[BB6:[0-9]+]], label %_llgo_[[BB7:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = alloca %main.eface, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP5]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = load %main.eface, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: store %main.eface %[[TMP6]], ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = alloca %main.u64parts, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP7]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main.eface, ptr %[[TMP5]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = load %main.u64parts, ptr %[[TMP9]], align 4 +// DARWIN-ARM64-NEXT: store %main.u64parts %[[TMP10]], ptr %[[TMP7]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds %main.u64parts, ptr %[[TMP7]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = load i32, ptr %[[TMP11]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = icmp ne i32 %[[TMP12]], 1405670641 +// DARWIN-ARM64-NEXT: br i1 %[[TMP13]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB5:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %main.eface, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP12]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %main.eface, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store %main.eface %[[TMP13]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca %main.u64parts, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP14]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %main.eface, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load %main.u64parts, ptr %[[TMP16]], align 4 +// LINUX-AMD64-NEXT: store %main.u64parts %[[TMP17]], ptr %[[TMP14]], align 4 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.u64parts, ptr %[[TMP14]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load i32, ptr %[[TMP18]], align 4 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = icmp ne i32 %[[TMP19]], 1405670641 +// LINUX-AMD64-NEXT: br i1 %[[TMP20]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB5:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 14 }, ptr %[[TMP14]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP14]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP15]]) +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 14 }, ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP21]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP22]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = load ptr, ptr %[[TMP23]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = load ptr, ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP24]], ptr %[[TMP26]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB6]], i64 14 }, ptr %[[TMP16]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP16]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP17]]) +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB6]], i64 14 }, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP27]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP28]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP29]], align 8 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = load ptr, ptr %[[TMP31]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP30]], ptr %[[TMP32]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4:[0-9]+]]: +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.u64parts, ptr %[[TMP7]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = load i32, ptr %[[TMP18]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = icmp ne i32 %[[TMP19]], 1074340347 +// DARWIN-ARM64-NEXT: br i1 %[[TMP20]], label %_llgo_[[BB3]], label %_llgo_[[BB4]] +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = getelementptr inbounds %main.u64parts, ptr %[[TMP14]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = load i32, ptr %[[TMP33]], align 4 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = icmp ne i32 %[[TMP34]], 1074340347 +// LINUX-AMD64-NEXT: br i1 %[[TMP35]], label %_llgo_[[BB3]], label %_llgo_[[BB4]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB6]]: +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = load double, ptr %[[TMP21]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = insertvalue { double, i1 } undef, double %[[TMP22]], 0 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = insertvalue { double, i1 } %[[TMP23]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]], 1 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = load double, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = insertvalue { double, i1 } undef, double %[[TMP37]], 0 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = insertvalue { double, i1 } %[[TMP38]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB8:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB7]]: +// CHECK-NEXT: br label %_llgo_[[BB8]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB8]]: +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = phi { double, i1 } [ %[[TMP24]], %_llgo_[[BB6]] ], [ zeroinitializer, %_llgo_[[BB7]] ] +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = extractvalue { double, i1 } %[[TMP25]], 0 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = extractvalue { double, i1 } %[[TMP25]], 1 +// DARWIN-ARM64-NEXT: br i1 %[[TMP27]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = phi { double, i1 } [ %[[TMP39]], %_llgo_[[BB6]] ], [ zeroinitializer, %_llgo_[[BB7]] ] +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = extractvalue { double, i1 } %[[TMP40]], 0 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { double, i1 } %[[TMP40]], 1 +// LINUX-AMD64-NEXT: br i1 %[[TMP42]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] +// CHECK-NEXT: } diff --git a/cl/_testrt/fprintf/in.go b/cl/_testrt/fprintf/in.go index 9d6745c616..677e9ca66c 100644 --- a/cl/_testrt/fprintf/in.go +++ b/cl/_testrt/fprintf/in.go @@ -3,7 +3,6 @@ package main import "unsafe" -// CHECK: {{^}}@0 = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", align 1{{$}} // //go:linkname cstr llgo.cstr func cstr(string) *int8 @@ -14,12 +13,10 @@ var stderr unsafe.Pointer //go:linkname fprintf C.fprintf func fprintf(fp unsafe.Pointer, format *int8, __llgo_va_list ...any) +// CHECK: [[FPRINTF_FORMAT:@[0-9]+]] = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00" // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load ptr, ptr @__stderrp, align 8 -// CHECK-NEXT: call void (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[STDERR:%[0-9]+]] = load ptr, ptr @__stderrp +// CHECK-NEXT: call void (ptr, ptr, ...) @fprintf(ptr [[STDERR]], ptr [[FPRINTF_FORMAT]], i64 100) func main() { fprintf(stderr, cstr("Hello %d\n"), 100) } diff --git a/cl/_testrt/freevars/in.go b/cl/_testrt/freevars/in.go index e5fd293f12..038b934fc0 100644 --- a/cl/_testrt/freevars/in.go +++ b/cl/_testrt/freevars/in.go @@ -1,65 +1,11 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E|\Qmain.main$1$1\E|\Qmain.main$2\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"main.main$1"({ ptr, ptr } { ptr @"main.main$2", ptr null }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { - // CHECK-LABEL: define void @"main.main$1"({ ptr, ptr } %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) - // CHECK-NEXT: store { ptr, ptr } %0, ptr %1, align 8 - // CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) - // CHECK-NEXT: %3 = getelementptr inbounds { ptr }, ptr %2, i32 0, i32 0 - // CHECK-NEXT: store ptr %1, ptr %3, align 8 - // CHECK-NEXT: %4 = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr %2, 1 - // CHECK-NEXT: %5 = extractvalue { ptr, ptr } %4, 1 - // CHECK-NEXT: %6 = extractvalue { ptr, ptr } %4, 0 - // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %6) - // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %5, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) - // CHECK-NEXT: ret void - // CHECK-NEXT: } func(resolve func(error)) { - // CHECK-LABEL: define void @"main.main$1$1"(ptr {{(nest|swiftself)}} %0, %"{{.*}}/runtime/internal/runtime.iface" %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %1) - // CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %1, 1 - // CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %3, 0 - // CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %5, ptr %4, 1 - // CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) - // CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %7, 0 - // CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %8, ptr null, 1 - // CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %6, %"{{.*}}/runtime/internal/runtime.eface" %9) - // CHECK-NEXT: %11 = xor i1 %10, true - // CHECK-NEXT: br i1 %11, label %_llgo_1, label %_llgo_2 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 - // CHECK-NEXT: %12 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %13 = load { ptr, ptr }, ptr %12, align 8 - // CHECK-NEXT: %14 = extractvalue { ptr, ptr } %13, 1 - // CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 - // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %15) - // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %14, %"{{.*}}/runtime/internal/runtime.iface" %1) - // CHECK-NEXT: ret void - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 - // CHECK-NEXT: %16 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %17 = load { ptr, ptr }, ptr %16, align 8 - // CHECK-NEXT: %18 = extractvalue { ptr, ptr } %17, 1 - // CHECK-NEXT: %19 = extractvalue { ptr, ptr } %17, 0 - // CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %19) - // CHECK-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %18, %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - - // CHECK-LABEL: define void @"main.main$2"(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret void - // CHECK-NEXT: } func(err error) { if err != nil { resolve(err) @@ -70,3 +16,168 @@ func main() { }(func(err error) { }) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: call void @"main.main$1"({ ptr, ptr } { ptr @"main.main$2", ptr null }) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.main$2", ptr null }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = load ptr, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: call void @"main.main$1"(ptr %[[TMP2]], ptr %[[TMP4]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$1"( +// DARWIN-ARM64-SAME: { ptr, ptr } %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: store { ptr, ptr } %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP2]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store ptr %[[TMP1]], ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP4]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP6]]) +// DARWIN-ARM64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP5]], %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP5]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP7]], ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1$1", ptr undef }, ptr %[[TMP8]], 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP10]], 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP10]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP12]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load ptr, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP11]], ptr %[[TMP14]], ptr %[[TMP16]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$1$1"( +// DARWIN-ARM64-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]], %"{{.*}}/runtime/internal/runtime.iface" %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP1]]) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %[[TMP3]], 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], ptr %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %[[TMP7]], 0 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]], ptr null, 1 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP6]], %"{{.*}}/runtime/internal/runtime.eface" %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = xor i1 %[[TMP10]], true +// DARWIN-ARM64-NEXT: br i1 %[[TMP11]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(ptr %[[TMP15]], ptr %[[TMP17]]) +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %[[TMP18]], 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP20]], ptr %[[TMP19]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP11]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP11]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load ptr, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(ptr %[[TMP23]], ptr %[[TMP25]]) +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %[[TMP26]], 0 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP27]], ptr null, 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP21]], ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP9]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP29]], align 8 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP9]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = load ptr, ptr %[[TMP31]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP28]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = load ptr, ptr %[[TMP33]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = load ptr, ptr %[[TMP35]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(ptr %[[TMP30]], ptr %[[TMP32]], ptr %[[TMP34]], ptr %[[TMP36]]) +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = xor i1 %[[TMP37]], true +// LINUX-AMD64-NEXT: br i1 %[[TMP38]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { ptr } %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP13]], 1 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP13]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP15]]) +// DARWIN-ARM64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP14]], %"{{.*}}/runtime/internal/runtime.iface" %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = extractvalue { ptr } %[[TMP13]], 0 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP39]], align 8 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP40]], 1 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP40]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP42]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = load ptr, ptr %[[TMP43]], align 8 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = load ptr, ptr %[[TMP45]], align 8 +// LINUX-AMD64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP41]], ptr %[[TMP44]], ptr %[[TMP46]]) +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = extractvalue { ptr } %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP16]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP17]], 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP17]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %[[TMP19]]) +// DARWIN-ARM64-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %[[TMP18]], %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = extractvalue { ptr } %[[TMP13]], 0 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP47]], align 8 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP48]], 1 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP48]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %[[TMP50]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = load ptr, ptr %[[TMP51]], align 8 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = load ptr, ptr %[[TMP53]], align 8 +// LINUX-AMD64-NEXT: call void %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %[[TMP49]], ptr %[[TMP52]], ptr %[[TMP54]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$2"( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.iface" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP2]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testrt/funcaddr/in.go b/cl/_testrt/funcaddr/in.go index 6457b31b93..1b15d95f73 100644 --- a/cl/_testrt/funcaddr/in.go +++ b/cl/_testrt/funcaddr/in.go @@ -11,43 +11,22 @@ import ( type Add func(int, int) int // CHECK-LABEL: define i64 @main.add(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: [[ADD_RESULT:%[0-9]+]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[ADD_RESULT]] func add(a, b int) int { return a + b } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store ptr @main.add, ptr %0, align 8 -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: store ptr @"main.main$1", ptr %1, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %3 = icmp eq ptr @main.add, %2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %4 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %5 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %6 = icmp eq ptr %4, %5 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %7 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %8 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %9 = icmp eq ptr %7, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store ptr @main.add, ptr [[DECLARED_SLOT:%[0-9]+]] +// CHECK: store ptr @"main.main$1", ptr [[LITERAL_SLOT:%[0-9]+]] +// CHECK: [[DECLARED_CODE:%[0-9]+]] = load ptr, ptr [[DECLARED_SLOT]] +// CHECK-NEXT: [[DECLARED_MATCH:%[0-9]+]] = icmp eq ptr @main.add, [[DECLARED_CODE]] +// CHECK: [[LITERAL_CODE1:%[0-9]+]] = load ptr, ptr [[LITERAL_SLOT]] +// CHECK-NEXT: [[LITERAL_CODE2:%[0-9]+]] = load ptr, ptr [[LITERAL_SLOT]] +// CHECK-NEXT: [[LITERAL_MATCH:%[0-9]+]] = icmp eq ptr [[LITERAL_CODE1]], [[LITERAL_CODE2]] func main() { var fn Add = add - // CHECK-LABEL: define i64 @"main.main$1"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = add i64 %0, %1 - // CHECK-NEXT: ret i64 %2 - // CHECK-NEXT: } var myfn Add = func(a, b int) int { return a + b } @@ -55,3 +34,7 @@ func main() { println(c.Func(fn) == *(*unsafe.Pointer)(unsafe.Pointer(&fn))) println(c.Func(myfn) == *(*unsafe.Pointer)(unsafe.Pointer(&myfn))) } + +// CHECK-LABEL: define i64 @"main.main$1"(i64 %0, i64 %1){{.*}} { +// CHECK: [[LITERAL_SUM:%[0-9]+]] = add i64 %0, %1 +// CHECK-NEXT: ret i64 [[LITERAL_SUM]] diff --git a/cl/_testrt/funcdecl/in.go b/cl/_testrt/funcdecl/in.go index 5423e7c192..ab14d10ac4 100644 --- a/cl/_testrt/funcdecl/in.go +++ b/cl/_testrt/funcdecl/in.go @@ -5,8 +5,36 @@ import ( "unsafe" ) -// CHECK: {{^}}@4 = private unnamed_addr constant [4 x i8] c"demo", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} +// A declared function is represented as a closure pair with a nil environment, +// and interface assertions use the closure type descriptor. +// CHECK-LABEL: define void @main.check({ ptr, ptr } %0){{.*}} { +// CHECK: %[[DECL_BOX:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %[[DECL_BOX]] +// CHECK: %[[DECL_EFACE:[0-9]+]] = insertvalue %"{{.*}}runtime.eface" { ptr @[[CLOSURE_TYPE:"_llgo_closure\$[^"]+"]], ptr undef }, ptr %[[DECL_BOX]], 1 +// CHECK: %[[ARG_BOX:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// CHECK-NEXT: store { ptr, ptr } %0, ptr %[[ARG_BOX]] +// CHECK: %[[ARG_EFACE:[0-9]+]] = insertvalue %"{{.*}}runtime.eface" { ptr @[[CLOSURE_TYPE]], ptr undef }, ptr %[[ARG_BOX]], 1 +// CHECK: %[[DECL_TYPE:[0-9]+]] = extractvalue %"{{.*}}runtime.eface" %[[DECL_EFACE]], 0 +// CHECK-NEXT: %[[DECL_MATCH:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @[[CLOSURE_TYPE]], ptr %[[DECL_TYPE]]) +// CHECK: %[[ARG_TYPE:[0-9]+]] = extractvalue %"{{.*}}runtime.eface" %[[ARG_EFACE]], 0 +// CHECK-NEXT: %[[ARG_MATCH:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @[[CLOSURE_TYPE]], ptr %[[ARG_TYPE]]) +// CHECK: %[[DECL_PTR:[0-9]+]] = call ptr @main.closurePtr(%"{{.*}}runtime.eface" %[[DECL_EFACE]]) +// CHECK-NEXT: %[[ARG_PTR:[0-9]+]] = call ptr @main.closurePtr(%"{{.*}}runtime.eface" %[[ARG_EFACE]]) +// CHECK-NEXT: %[[SAME_PTR:[0-9]+]] = icmp eq ptr %[[DECL_PTR]], %[[ARG_PTR]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[SAME_PTR]]) +// CHECK-LABEL: define ptr @main.closurePtr(%"{{.*}}runtime.eface" %0){{.*}} { +// CHECK: %[[EFACE_BOX:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: store %"{{.*}}runtime.eface" %0, ptr %[[EFACE_BOX]] +// CHECK: %[[CLOSURE_SLOT:[0-9]+]] = getelementptr inbounds %main.rtype, ptr %[[EFACE_BOX]], i32 0, i32 1 +// CHECK-NEXT: %[[CLOSURE:[0-9]+]] = load ptr, ptr %[[CLOSURE_SLOT]] +// CHECK-NEXT: %[[CODE_SLOT:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[CLOSURE]], i32 0, i32 0 +// CHECK-NEXT: %[[CODE:[0-9]+]] = load ptr, ptr %[[CODE_SLOT]] +// CHECK-NEXT: ret ptr %[[CODE]] +// CHECK-LABEL: define void @main.demo(){{.*}} { +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}runtime.String" { ptr @{{[0-9]+}}, i64 4 }) +// CHECK: ret void +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.check({ ptr, ptr } { ptr @main.demo, ptr null }) func check(fn func()) { var a any = demo @@ -37,95 +65,3 @@ func main() { println("hello") check(demo) } - -// CHECK-LABEL: define void @main.check({ ptr, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr %1, align 8 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %1, 1 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } %0, ptr %3, align 8 -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr undef }, ptr %3, 1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %2, 0 -// CHECK-NEXT: %6 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr %5) -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %2, 1 -// CHECK-NEXT: %8 = load { ptr, ptr }, ptr %7, align 8 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %4, 0 -// CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8", ptr %9) -// CHECK-NEXT: br i1 %10, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %5, ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8") -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %4, 1 -// CHECK-NEXT: %12 = load { ptr, ptr }, ptr %11, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintEface"(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintEface"(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %13 = extractvalue { ptr, ptr } %0, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %8, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %12, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr @main.demo) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = call ptr @main.closurePtr(%"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: %17 = call ptr @main.closurePtr(%"{{.*}}/runtime/internal/runtime.eface" %4) -// CHECK-NEXT: %18 = icmp eq ptr %16, %17 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %9, ptr @"_llgo_closure$b7Su1hWaFih-M0M9hMk6nO_RD1K_GQu5WjIXQp6Q2e8") -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define ptr @main.closurePtr(%"{{.*}}/runtime/internal/runtime.eface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.rtype, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds { ptr, ptr }, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: ret ptr %5 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.demo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 5 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @main.check({ ptr, ptr } { ptr @main.demo, ptr null }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } diff --git a/cl/_testrt/gblarray/in.go b/cl/_testrt/gblarray/in.go index 4d743a6713..a97717e133 100644 --- a/cl/_testrt/gblarray/in.go +++ b/cl/_testrt/gblarray/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.Basic\E|\Qmain.basicType\E|\Qmain.init\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -6,37 +8,12 @@ import ( "github.com/goplus/llgo/runtime/abi" ) -// CHECK: @main.sizeBasicTypes = global [25 x i64] [i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 16], align 8 +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [20 x i8] c"Kind: %d, Size: %d\0A\00", align 1{{$}} -// CHECK-LABEL: define ptr @main.Basic(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp uge i64 %0, 25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %1, {{.*}}) -// CHECK-NEXT: %2 = getelementptr inbounds ptr, ptr @main.basicTypes, i64 %0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: ret ptr %3 -// CHECK-NEXT: } func Basic(kind abi.Kind) *abi.Type { return basicTypes[kind] } -// CHECK-LABEL: define ptr @main.basicType(i64 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 72) -// CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = icmp uge i64 %0, 25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %3, {{.*}}) -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr @main.sizeBasicTypes, i64 %0 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %1, i32 0, i32 2 -// CHECK-NEXT: %7 = trunc i64 %0 to i32 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %1, i32 0, i32 6 -// CHECK-NEXT: %9 = trunc i64 %0 to i8 -// CHECK-NEXT: store i64 %5, ptr %2, align 8 -// CHECK-NEXT: store i32 %7, ptr %6, align 4 -// CHECK-NEXT: store i8 %9, ptr %8, align 1 -// CHECK-NEXT: ret ptr %1 -// CHECK-NEXT: } func basicType(kind abi.Kind) *abi.Type { return &abi.Type{ Size_: sizeBasicTypes[kind], @@ -45,21 +22,6 @@ func basicType(kind abi.Kind) *abi.Type { } } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/abi.init"() -// CHECK-NEXT: %1 = call ptr @main.basicType(i64 24) -// CHECK-NEXT: store ptr %1, ptr getelementptr inbounds (ptr, ptr @main.basicTypes, i64 24), align 8 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } var ( basicTypes = [...]*abi.Type{ abi.String: basicType(abi.String), @@ -69,18 +31,64 @@ var ( } ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @main.Basic(i64 24) -// CHECK-NEXT: %1 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 6 -// CHECK-NEXT: %2 = load i8, ptr %1, align 1 -// CHECK-NEXT: %3 = zext i8 %2 to i64 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: %6 = call i32 (ptr, ...) @printf(ptr @0, i64 %3, i64 %5) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { t := Basic(abi.String) c.Printf(c.Str("Kind: %d, Size: %d\n"), int(t.Kind_), t.Size_) } + +// CHECK-LABEL: define ptr @main.Basic( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = icmp uge i64 %[[TMP0]], 25 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP1]], i64 %[[TMP0]], i1 false, i64 25) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds ptr, ptr @main.basicTypes, i64 %[[TMP0]] +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load ptr, ptr %[[TMP2]], align 8 +// CHECK-NEXT: ret ptr %[[TMP3]] +// CHECK-NEXT: } + +// CHECK-LABEL: define ptr @main.basicType( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 72) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %[[TMP1]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = icmp uge i64 %[[TMP0]], 25 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP3]], i64 %[[TMP0]], i1 false, i64 25) +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i64, ptr @main.sizeBasicTypes, i64 %[[TMP0]] +// CHECK-NEXT: %[[TMP5:[0-9]+]] = load i64, ptr %[[TMP4]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %[[TMP1]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = trunc i64 %[[TMP0]] to i32 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %[[TMP1]], i32 0, i32 6 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = trunc i64 %[[TMP0]] to i8 +// CHECK-NEXT: store i64 %[[TMP5]], ptr %[[TMP2]], align 8 +// CHECK-NEXT: store i32 %[[TMP7]], ptr %[[TMP6]], align 4 +// CHECK-NEXT: store i8 %[[TMP9]], ptr %[[TMP8]], align 1 +// CHECK-NEXT: ret ptr %[[TMP1]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.init(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = load i1, ptr @"main.init$guard", align 1 +// CHECK-NEXT: br i1 %[[TMP0]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 +// CHECK-NEXT: call void @"{{.*}}/runtime/abi.init"() +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @main.basicType(i64 24) +// CHECK-NEXT: store ptr %[[TMP1]], ptr getelementptr inbounds (ptr, ptr @main.basicTypes, i64 24), align 8 +// CHECK-NEXT: br label %_llgo_[[BB2]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @main.Basic(i64 24) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %[[TMP0]], i32 0, i32 6 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load i8, ptr %[[TMP1]], align 1 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = zext i8 %[[TMP2]] to i64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = load i64, ptr %[[TMP4]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP3]], i64 %[[TMP5]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testrt/gotypes/in.go b/cl/_testrt/gotypes/in.go index 84f5b8e718..d59f721786 100644 --- a/cl/_testrt/gotypes/in.go +++ b/cl/_testrt/gotypes/in.go @@ -1,26 +1,11 @@ // LITTEST package main -// CHECK-LABEL: define void @main.foo(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK-LABEL: define void @main.foo(%"{{.*}}iface" %0){{.*}} { +// CHECK: ret void func foo(bar) { } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - type base interface { f(m map[string]func()) } @@ -31,10 +16,7 @@ type bar interface { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.foo(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.foo(%"{{.*}}/runtime/internal/runtime.iface" zeroinitializer) func main() { foo(nil) } diff --git a/cl/_testrt/hello/in.go b/cl/_testrt/hello/in.go index 6a5fd4ba65..4318de676d 100644 --- a/cl/_testrt/hello/in.go +++ b/cl/_testrt/hello/in.go @@ -3,28 +3,13 @@ package main import "github.com/goplus/llgo/cl/_testrt/hello/libc" -// CHECK: {{^}}@main.format = global [10 x i8] c"Hello %d\0A\00", align 1{{$}} +// CHECK: {{^}}@main.format = global [10 x i8] c"Hello %d\0A\00" -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 @strlen(ptr @main.format) -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[LEN:%[0-9]+]] = call i32 @strlen(ptr @main.format) +// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 [[LEN]]) func main() { sfmt := &format[0] libc.Printf(sfmt, libc.Strlen(sfmt)) diff --git a/cl/_testrt/index/in.go b/cl/_testrt/index/in.go index 8f19ac4768..c8504ef486 100644 --- a/cl/_testrt/index/in.go +++ b/cl/_testrt/index/in.go @@ -1,21 +1,6 @@ // LITTEST package main -// CHECK: @0 = private unnamed_addr constant [6 x i8] c"123456", align 1 - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - type point struct { x int y int @@ -26,132 +11,76 @@ type T *N type S []int // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.point, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 16, i1 false) -// CHECK-NEXT: %1 = alloca [3 x %main.point], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 48, i1 false) -// CHECK-NEXT: %2 = getelementptr inbounds %main.point, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds %main.point, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = getelementptr inbounds %main.point, ptr %2, i32 0, i32 1 -// CHECK-NEXT: %5 = getelementptr inbounds %main.point, ptr %1, i64 1 -// CHECK-NEXT: %6 = getelementptr inbounds %main.point, ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = getelementptr inbounds %main.point, ptr %5, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %main.point, ptr %1, i64 2 -// CHECK-NEXT: %9 = getelementptr inbounds %main.point, ptr %8, i32 0, i32 0 -// CHECK-NEXT: %10 = getelementptr inbounds %main.point, ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i64 1, ptr %3, align 8 -// CHECK-NEXT: store i64 2, ptr %4, align 8 -// CHECK-NEXT: store i64 3, ptr %6, align 8 -// CHECK-NEXT: store i64 4, ptr %7, align 8 -// CHECK-NEXT: store i64 5, ptr %9, align 8 -// CHECK-NEXT: store i64 6, ptr %10, align 8 -// CHECK-NEXT: %11 = load [3 x %main.point], ptr %1, align 8 -// CHECK-NEXT: %12 = getelementptr inbounds %main.point, ptr %1, i64 2 -// CHECK-NEXT: %13 = load %main.point, ptr %12, align 8 -// CHECK-NEXT: store %main.point %13, ptr %0, align 8 -// CHECK-NEXT: %14 = getelementptr inbounds %main.point, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %15 = load i64, ptr %14, align 8 -// CHECK-NEXT: %16 = getelementptr inbounds %main.point, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %17 = load i64, ptr %16, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 16, i1 false) -// CHECK-NEXT: %19 = alloca [2 x [2 x i64]], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %19, i8 0, i64 32, i1 false) -// CHECK-NEXT: %20 = getelementptr inbounds [2 x i64], ptr %19, i64 0 -// CHECK-NEXT: %21 = icmp eq ptr %20, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %21) -// CHECK-NEXT: %22 = getelementptr inbounds i64, ptr %20, i64 0 -// CHECK-NEXT: %23 = icmp eq ptr %20, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %23) -// CHECK-NEXT: %24 = getelementptr inbounds i64, ptr %20, i64 1 -// CHECK-NEXT: %25 = getelementptr inbounds [2 x i64], ptr %19, i64 1 -// CHECK-NEXT: %26 = icmp eq ptr %25, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %26) -// CHECK-NEXT: %27 = getelementptr inbounds i64, ptr %25, i64 0 -// CHECK-NEXT: %28 = icmp eq ptr %25, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %28) -// CHECK-NEXT: %29 = getelementptr inbounds i64, ptr %25, i64 1 -// CHECK-NEXT: store i64 1, ptr %22, align 8 -// CHECK-NEXT: store i64 2, ptr %24, align 8 -// CHECK-NEXT: store i64 3, ptr %27, align 8 -// CHECK-NEXT: store i64 4, ptr %29, align 8 -// CHECK-NEXT: %30 = load [2 x [2 x i64]], ptr %19, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds [2 x i64], ptr %19, i64 1 -// CHECK-NEXT: %32 = load [2 x i64], ptr %31, align 8 -// CHECK-NEXT: store [2 x i64] %32, ptr %18, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds i64, ptr %18, i64 0 -// CHECK-NEXT: %34 = load i64, ptr %33, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds i64, ptr %18, i64 1 -// CHECK-NEXT: %36 = load i64, ptr %35, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %37 = alloca [5 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %37, i8 0, i64 40, i1 false) -// CHECK-NEXT: %38 = getelementptr inbounds i64, ptr %37, i64 0 -// CHECK-NEXT: %39 = getelementptr inbounds i64, ptr %37, i64 1 -// CHECK-NEXT: %40 = getelementptr inbounds i64, ptr %37, i64 2 -// CHECK-NEXT: %41 = getelementptr inbounds i64, ptr %37, i64 3 -// CHECK-NEXT: %42 = getelementptr inbounds i64, ptr %37, i64 4 -// CHECK-NEXT: store i64 1, ptr %38, align 8 -// CHECK-NEXT: store i64 2, ptr %39, align 8 -// CHECK-NEXT: store i64 3, ptr %40, align 8 -// CHECK-NEXT: store i64 4, ptr %41, align 8 -// CHECK-NEXT: store i64 5, ptr %42, align 8 -// CHECK-NEXT: %43 = load [5 x i64], ptr %37, align 8 -// CHECK-NEXT: %44 = getelementptr inbounds i64, ptr %37, i64 2 -// CHECK-NEXT: %45 = load i64, ptr %44, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %46 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 2), align 1 -// CHECK-NEXT: %47 = zext i8 %46 to i64 -// CHECK-NEXT: %48 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 %47) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %48) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %49 = load i8, ptr getelementptr inbounds (i8, ptr @0, i64 1), align 1 -// CHECK-NEXT: %50 = zext i8 %49 to i64 -// CHECK-NEXT: %51 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 %50) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %51) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %52 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %53 = getelementptr inbounds i64, ptr %52, i64 0 -// CHECK-NEXT: %54 = getelementptr inbounds i64, ptr %52, i64 1 -// CHECK-NEXT: store i64 1, ptr %53, align 8 -// CHECK-NEXT: store i64 2, ptr %54, align 8 -// CHECK-NEXT: %55 = getelementptr inbounds i64, ptr %52, i64 1 -// CHECK-NEXT: %56 = load i64, ptr %55, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %56) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %57 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %58 = getelementptr inbounds i64, ptr %57, i64 0 -// CHECK-NEXT: store i64 1, ptr %58, align 8 -// CHECK-NEXT: %59 = getelementptr inbounds i64, ptr %57, i64 1 -// CHECK-NEXT: store i64 2, ptr %59, align 8 -// CHECK-NEXT: %60 = getelementptr inbounds i64, ptr %57, i64 2 -// CHECK-NEXT: store i64 3, ptr %60, align 8 -// CHECK-NEXT: %61 = getelementptr inbounds i64, ptr %57, i64 3 -// CHECK-NEXT: store i64 4, ptr %61, align 8 -// CHECK-NEXT: %62 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %57, 0 -// CHECK-NEXT: %63 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %62, i64 4, 1 -// CHECK-NEXT: %64 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %63, i64 4, 2 -// CHECK-NEXT: %65 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %64, 0 -// CHECK-NEXT: %66 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %64, 1 -// CHECK-NEXT: %67 = icmp uge i64 1, %66 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %67, i64 1, i1 true, i64 %66) -// CHECK-NEXT: %68 = getelementptr inbounds i64, ptr %65, i64 1 -// CHECK-NEXT: %69 = load i64, ptr %68, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %69) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Array-of-struct selection: index 2 is loaded as a point, then both fields of +// that selected value are consumed. +// CHECK: %[[POINT:[0-9]+]] = alloca %main.point +// CHECK: %[[POINTS:[0-9]+]] = alloca [3 x %main.point] +// CHECK: %[[POINT2_INIT:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINTS]], i64 2 +// CHECK: %[[POINT2_X:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_INIT]], i32 0, i32 0 +// CHECK: %[[POINT2_Y:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_INIT]], i32 0, i32 1 +// CHECK: store i64 5, ptr %[[POINT2_X]] +// CHECK: store i64 6, ptr %[[POINT2_Y]] +// CHECK: %[[POINT2:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINTS]], i64 2 +// CHECK: %[[SELECTED_POINT:[0-9]+]] = load %main.point, ptr %[[POINT2]] +// CHECK: store %main.point %[[SELECTED_POINT]], ptr %[[POINT]] +// CHECK: %[[POINT_X:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT]], i32 0, i32 0 +// CHECK: load i64, ptr %[[POINT_X]] +// CHECK: %[[POINT_Y:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT]], i32 0, i32 1 +// CHECK: load i64, ptr %[[POINT_Y]] + +// Nested arrays select row 1 before indexing its two elements. +// CHECK: %[[ROW:[0-9]+]] = alloca [2 x i64] +// CHECK: %[[MATRIX:[0-9]+]] = alloca [2 x [2 x i64]] +// CHECK: %[[ROW1_INIT:[0-9]+]] = getelementptr inbounds [2 x i64], ptr %[[MATRIX]], i64 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref" +// CHECK: %[[ROW1_ELEM0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_INIT]], i64 0 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref" +// CHECK: %[[ROW1_ELEM1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_INIT]], i64 1 +// CHECK: store i64 3, ptr %[[ROW1_ELEM0]] +// CHECK: store i64 4, ptr %[[ROW1_ELEM1]] +// CHECK: %[[ROW1:[0-9]+]] = getelementptr inbounds [2 x i64], ptr %[[MATRIX]], i64 1 +// CHECK: %[[SELECTED_ROW:[0-9]+]] = load [2 x i64], ptr %[[ROW1]] +// CHECK: store [2 x i64] %[[SELECTED_ROW]], ptr %[[ROW]] +// CHECK: getelementptr inbounds i64, ptr %[[ROW]], i64 0 +// CHECK: getelementptr inbounds i64, ptr %[[ROW]], i64 1 + +// The SSA-known array index is folded to element 2 without losing the selected +// element load. +// CHECK: %[[INTS:[0-9]+]] = alloca [5 x i64] +// CHECK: %[[INT2_INIT:[0-9]+]] = getelementptr inbounds i64, ptr %[[INTS]], i64 2 +// CHECK: store i64 3, ptr %[[INT2_INIT]] +// CHECK: %[[INT2:[0-9]+]] = getelementptr inbounds i64, ptr %[[INTS]], i64 2 +// CHECK: load i64, ptr %[[INT2]] + +// String indexes are byte loads converted through StringFromUint64. Capture +// each byte so an unrelated conversion cannot satisfy the check. +// CHECK: %[[BYTE2:[0-9]+]] = load i8, ptr getelementptr inbounds (i8, ptr @[[TEXT:[0-9]+]], i64 2) +// CHECK: %[[RUNE2:[0-9]+]] = zext i8 %[[BYTE2]] to i64 +// CHECK: call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 %[[RUNE2]]) +// CHECK: %[[BYTE1:[0-9]+]] = load i8, ptr getelementptr inbounds (i8, ptr @[[TEXT]], i64 1) +// CHECK: %[[RUNE1:[0-9]+]] = zext i8 %[[BYTE1]] to i64 +// CHECK: call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringFromUint64"(i64 %[[RUNE1]]) + +// Named pointer-to-array indexing and named-slice indexing use different +// lowering. The slice predicate, length and data pointer must stay associated. +// CHECK: %[[NAMED_ARRAY:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: %[[NAMED_ELEM_INIT:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_ARRAY]], i64 1 +// CHECK: store i64 2, ptr %[[NAMED_ELEM_INIT]] +// CHECK: %[[NAMED_ELEM:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_ARRAY]], i64 1 +// CHECK: load i64, ptr %[[NAMED_ELEM]] +// CHECK: %[[SLICE_DATA_RAW:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK: %[[SLICE0:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[SLICE_DATA_RAW]], 0 +// CHECK: %[[SLICE1:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE0]], i64 4, 1 +// CHECK: %[[SLICE:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE1]], i64 4, 2 +// CHECK: %[[SLICE_DATA:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 0 +// CHECK: %[[SLICE_LEN:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 1 +// CHECK: %[[SLICE_OOB:[0-9]+]] = icmp uge i64 1, %[[SLICE_LEN]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[SLICE_OOB]], i64 1, i1 true, i64 %[[SLICE_LEN]]) +// CHECK: %[[SLICE_ELEM:[0-9]+]] = getelementptr inbounds i64, ptr %[[SLICE_DATA]], i64 1 +// CHECK: load i64, ptr %[[SLICE_ELEM]] + +// A zero array indexed at constant zero folds to its zero value. +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) func main() { a := [...]point{{1, 2}, {3, 4}, {5, 6}}[2] diff --git a/cl/_testrt/intgen/in.go b/cl/_testrt/intgen/in.go index 40ee12c681..1b32aa0645 100644 --- a/cl/_testrt/intgen/in.go +++ b/cl/_testrt/intgen/in.go @@ -1,40 +1,19 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.genInts\E|\Qmain.(*generator).next\E|\Qmain.main\E|\Qmain.main$1\E|\Qmain.(*generator).next$bound\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.Slice" @main.genInts(i64 %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.MakeSlice"(i64 %0, i64 %0, i64 4) -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %2, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %4 = phi i64 [ -1, %_llgo_0 ], [ %5, %_llgo_2 ] -// CHECK-NEXT: %5 = add i64 %4, 1 -// CHECK-NEXT: %6 = icmp slt i64 %5, %3 -// CHECK-NEXT: br i1 %6, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %1, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %1, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %8) -// CHECK-NEXT: %9 = call i32 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %7) -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %2, 0 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %2, 1 -// CHECK-NEXT: %12 = icmp slt i64 %5, 0 -// CHECK-NEXT: %13 = icmp uge i64 %5, %11 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i32, ptr %10, i64 %5 -// CHECK-NEXT: store i32 %9, ptr %15, align 4 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.Slice" %2 -// CHECK-NEXT: } +// genInts invokes the supplied code/environment pair once per output slot and +// stores that result into the slice at the checked loop index. + +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} + func genInts(n int, gen func() c.Int) []c.Int { a := make([]c.Int, n) for i := range a { @@ -43,17 +22,6 @@ func genInts(n int, gen func() c.Int) []c.Int { return a } -// CHECK-LABEL: define i32 @"main.(*generator).next"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.generator, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i32, ptr %1, align 4 -// CHECK-NEXT: %3 = add i32 %2, 1 -// CHECK-NEXT: %4 = getelementptr inbounds %main.generator, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store i32 %3, ptr %4, align 4 -// CHECK-NEXT: %5 = getelementptr inbounds %main.generator, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %6 = load i32, ptr %5, align 4 -// CHECK-NEXT: ret i32 %6 -// CHECK-NEXT: } func (g *generator) next() c.Int { g.val++ return g.val @@ -63,92 +31,6 @@ type generator struct { val c.Int } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } { ptr @rand, ptr null }) -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %2 = phi i64 [ -1, %_llgo_0 ], [ %3, %_llgo_2 ] -// CHECK-NEXT: %3 = add i64 %2, 1 -// CHECK-NEXT: %4 = icmp slt i64 %3, %1 -// CHECK-NEXT: br i1 %4, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %7 = icmp slt i64 %3, 0 -// CHECK-NEXT: %8 = icmp uge i64 %3, %6 -// CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, {{.*}}) -// CHECK-NEXT: %10 = getelementptr inbounds i32, ptr %5, i64 %3 -// CHECK-NEXT: %11 = load i32, ptr %10, align 4 -// CHECK-NEXT: %12 = call i32 (ptr, ...) @printf(ptr @0, i32 %11) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: store i32 1, ptr %13, align 4 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %15 = getelementptr inbounds { ptr }, ptr %14, i32 0, i32 0 -// CHECK-NEXT: store ptr %13, ptr %15, align 8 -// CHECK-NEXT: %16 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %14, 1 -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %16) -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 1 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_3 -// CHECK-NEXT: %19 = phi i64 [ -1, %_llgo_3 ], [ %20, %_llgo_5 ] -// CHECK-NEXT: %20 = add i64 %19, 1 -// CHECK-NEXT: %21 = icmp slt i64 %20, %18 -// CHECK-NEXT: br i1 %21, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 0 -// CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 1 -// CHECK-NEXT: %24 = icmp slt i64 %20, 0 -// CHECK-NEXT: %25 = icmp uge i64 %20, %23 -// CHECK-NEXT: %26 = or i1 %25, %24 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, {{.*}}) -// CHECK-NEXT: %27 = getelementptr inbounds i32, ptr %22, i64 %20 -// CHECK-NEXT: %28 = load i32, ptr %27, align 4 -// CHECK-NEXT: %29 = call i32 (ptr, ...) @printf(ptr @1, i32 %28) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %31 = getelementptr inbounds %main.generator, ptr %30, i32 0, i32 0 -// CHECK-NEXT: store i32 1, ptr %31, align 4 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %33 = getelementptr inbounds { ptr }, ptr %32, i32 0, i32 0 -// CHECK-NEXT: store ptr %30, ptr %33, align 8 -// CHECK-NEXT: %34 = insertvalue { ptr, ptr } { ptr @"main.(*generator).next$bound", ptr undef }, ptr %32, 1 -// CHECK-NEXT: %35 = call %"{{.*}}/runtime/internal/runtime.Slice" @main.genInts(i64 5, { ptr, ptr } %34) -// CHECK-NEXT: %36 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 1 -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_8, %_llgo_6 -// CHECK-NEXT: %37 = phi i64 [ -1, %_llgo_6 ], [ %38, %_llgo_8 ] -// CHECK-NEXT: %38 = add i64 %37, 1 -// CHECK-NEXT: %39 = icmp slt i64 %38, %36 -// CHECK-NEXT: br i1 %39, label %_llgo_8, label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7 -// CHECK-NEXT: %40 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 0 -// CHECK-NEXT: %41 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %35, 1 -// CHECK-NEXT: %42 = icmp slt i64 %38, 0 -// CHECK-NEXT: %43 = icmp uge i64 %38, %41 -// CHECK-NEXT: %44 = or i1 %43, %42 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %44, {{.*}}) -// CHECK-NEXT: %45 = getelementptr inbounds i32, ptr %40, i64 %38 -// CHECK-NEXT: %46 = load i32, ptr %45, align 4 -// CHECK-NEXT: %47 = call i32 (ptr, ...) @printf(ptr @2, i32 %46) -// CHECK-NEXT: br label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_7 -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { for _, v := range genInts(5, c.Rand) { @@ -157,18 +39,6 @@ func main() { initVal := c.Int(1) ints := genInts(5, func() c.Int { - // CHECK-LABEL: define i32 @"main.main$1"(ptr {{(nest|swiftself)}} %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: %3 = load i32, ptr %2, align 4 - // CHECK-NEXT: %4 = mul i32 %3, 2 - // CHECK-NEXT: %5 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: store i32 %4, ptr %5, align 4 - // CHECK-NEXT: %6 = extractvalue { ptr } %1, 0 - // CHECK-NEXT: %7 = load i32, ptr %6, align 4 - // CHECK-NEXT: ret i32 %7 - // CHECK-NEXT: } initVal *= 2 return initVal }) @@ -182,10 +52,275 @@ func main() { } } -// CHECK-LABEL: define i32 @"main.(*generator).next$bound"(ptr {{(nest|swiftself)}} %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = load { ptr }, ptr %0, align 8 -// CHECK-NEXT: %2 = extractvalue { ptr } %1, 0 -// CHECK-NEXT: %3 = call i32 @"main.(*generator).next"(ptr %2) -// CHECK-NEXT: ret i32 %3 +// CHECK-LABEL: define i32 @"main.(*generator).next"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %main.generator, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load i32, ptr %[[TMP1]], align 4 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = add i32 %[[TMP2]], 1 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.generator, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store i32 %[[TMP3]], ptr %[[TMP4]], align 4 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.generator, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load i32, ptr %[[TMP5]], align 4 +// CHECK-NEXT: ret i32 %[[TMP6]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP2]], i64 5, { ptr, ptr } { ptr @rand, ptr null }) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 1 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @rand, ptr null }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP9]], i64 5, ptr %[[TMP6]], ptr %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP6:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP6]] = add i64 %[[TMP5]], 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = icmp slt i64 %[[TMP6]], %[[TMP4]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP7]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP13:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP13]] = add i64 %[[TMP12]], 1 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = icmp slt i64 %[[TMP13]], %[[TMP11]] +// LINUX-AMD64-NEXT: br i1 %[[TMP14]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 0 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP3]], 1 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = icmp slt i64 %[[TMP6]], 0 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = icmp uge i64 %[[TMP6]], %[[TMP9]] +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = or i1 %[[TMP11]], %[[TMP10]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP12]], i64 %[[TMP6]], i1 true, i64 %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP8]], i64 %[[TMP6]] +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = load i32, ptr %[[TMP13]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i32 %[[TMP14]]) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP10]], 1 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = icmp slt i64 %[[TMP13]], 0 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = icmp uge i64 %[[TMP13]], %[[TMP16]] +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = or i1 %[[TMP18]], %[[TMP17]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP19]], i64 %[[TMP13]], i1 true, i64 %[[TMP16]]) +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP15]], i64 %[[TMP13]] +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load i32, ptr %[[TMP20]], align 4 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i32 %[[TMP21]]) +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP16]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP17]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store ptr %[[TMP16]], ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[TMP17]], 1 +// DARWIN-ARM64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]], i64 5, { ptr, ptr } %[[TMP19]]) +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP20]], 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP23]], align 4 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP24]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP23]], ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP26]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP29]], align 8 +// LINUX-AMD64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP3]], i64 5, ptr %[[TMP28]], ptr %[[TMP30]]) +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP31]], 1 +// CHECK-NEXT: br label %_llgo_[[BB4:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4]]: +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB3]] ], [ %[[TMP23:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP23]] = add i64 %[[TMP22]], 1 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = icmp slt i64 %[[TMP23]], %[[TMP21]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP24]], label %_llgo_[[BB5]], label %_llgo_[[BB6:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB3]] ], [ %[[TMP34:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP34]] = add i64 %[[TMP33]], 1 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = icmp slt i64 %[[TMP34]], %[[TMP32]] +// LINUX-AMD64-NEXT: br i1 %[[TMP35]], label %_llgo_[[BB5]], label %_llgo_[[BB6:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP20]], 0 +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP20]], 1 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = icmp slt i64 %[[TMP23]], 0 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = icmp uge i64 %[[TMP23]], %[[TMP26]] +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = or i1 %[[TMP28]], %[[TMP27]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP29]], i64 %[[TMP23]], i1 true, i64 %[[TMP26]]) +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP25]], i64 %[[TMP23]] +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = load i32, ptr %[[TMP30]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i32 %[[TMP31]]) +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP31]], 0 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP31]], 1 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = icmp slt i64 %[[TMP34]], 0 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = icmp uge i64 %[[TMP34]], %[[TMP37]] +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = or i1 %[[TMP39]], %[[TMP38]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP40]], i64 %[[TMP34]], i1 true, i64 %[[TMP37]]) +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP36]], i64 %[[TMP34]] +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = load i32, ptr %[[TMP41]], align 4 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i32 %[[TMP42]]) +// CHECK-NEXT: br label %_llgo_[[BB4]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB6]]: +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// DARWIN-ARM64-NEXT: %[[TMP34:[0-9]+]] = getelementptr inbounds %main.generator, ptr %[[TMP33]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store i32 1, ptr %[[TMP34]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP35:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP35]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store ptr %[[TMP33]], ptr %[[TMP36]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP37:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.(*generator).next$bound", ptr undef }, ptr %[[TMP35]], 1 +// DARWIN-ARM64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0]], i64 5, { ptr, ptr } %[[TMP37]]) +// DARWIN-ARM64-NEXT: %[[TMP38:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP39:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP38]], 1 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds %main.generator, ptr %[[TMP44]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store i32 1, ptr %[[TMP45]], align 4 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP46]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP44]], ptr %[[TMP47]], align 8 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.(*generator).next$bound", ptr undef }, ptr %[[TMP46]], 1 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP48]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = load ptr, ptr %[[TMP49]], align 8 +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = load ptr, ptr %[[TMP51]], align 8 +// LINUX-AMD64-NEXT: call void @main.genInts(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP1]], i64 5, ptr %[[TMP50]], ptr %[[TMP52]]) +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP53]], 1 +// CHECK-NEXT: br label %_llgo_[[BB7:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB7]]: +// DARWIN-ARM64-NEXT: %[[TMP40:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB6]] ], [ %[[TMP41:[0-9]+]], %_llgo_[[BB8:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP41]] = add i64 %[[TMP40]], 1 +// DARWIN-ARM64-NEXT: %[[TMP42:[0-9]+]] = icmp slt i64 %[[TMP41]], %[[TMP39]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP42]], label %_llgo_[[BB8]], label %_llgo_[[BB9:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB6]] ], [ %[[TMP56:[0-9]+]], %_llgo_[[BB8:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP56]] = add i64 %[[TMP55]], 1 +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = icmp slt i64 %[[TMP56]], %[[TMP54]] +// LINUX-AMD64-NEXT: br i1 %[[TMP57]], label %_llgo_[[BB8]], label %_llgo_[[BB9:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB8]]: +// DARWIN-ARM64-NEXT: %[[TMP43:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP38]], 0 +// DARWIN-ARM64-NEXT: %[[TMP44:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP38]], 1 +// DARWIN-ARM64-NEXT: %[[TMP45:[0-9]+]] = icmp slt i64 %[[TMP41]], 0 +// DARWIN-ARM64-NEXT: %[[TMP46:[0-9]+]] = icmp uge i64 %[[TMP41]], %[[TMP44]] +// DARWIN-ARM64-NEXT: %[[TMP47:[0-9]+]] = or i1 %[[TMP46]], %[[TMP45]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP47]], i64 %[[TMP41]], i1 true, i64 %[[TMP44]]) +// DARWIN-ARM64-NEXT: %[[TMP48:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP43]], i64 %[[TMP41]] +// DARWIN-ARM64-NEXT: %[[TMP49:[0-9]+]] = load i32, ptr %[[TMP48]], align 4 +// DARWIN-ARM64-NEXT: %[[TMP50:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], i32 %[[TMP49]]) +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP53]], 0 +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP53]], 1 +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = icmp slt i64 %[[TMP56]], 0 +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = icmp uge i64 %[[TMP56]], %[[TMP59]] +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = or i1 %[[TMP61]], %[[TMP60]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP62]], i64 %[[TMP56]], i1 true, i64 %[[TMP59]]) +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP58]], i64 %[[TMP56]] +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = load i32, ptr %[[TMP63]], align 4 +// LINUX-AMD64-NEXT: %[[TMP65:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], i32 %[[TMP64]]) +// CHECK-NEXT: br label %_llgo_[[BB7]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB9]]: +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define i32 @"main.main$1"( +// CHECK-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = extractvalue { ptr } %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load i32, ptr %[[TMP2]], align 4 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = mul i32 %[[TMP3]], 2 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr } %[[TMP1]], 0 +// CHECK-NEXT: store i32 %[[TMP4]], ptr %[[TMP5]], align 4 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = extractvalue { ptr } %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load i32, ptr %[[TMP6]], align 4 +// CHECK-NEXT: ret i32 %[[TMP7]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i32 @"main.(*generator).next$bound"( +// CHECK-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = extractvalue { ptr } %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call i32 @"main.(*generator).next"(ptr %[[TMP2]]) +// CHECK-NEXT: ret i32 %[[TMP3]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.genInts( +// DARWIN-ARM64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]], { ptr, ptr } %[[TMP2:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]], ptr %[[TMP3:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.MakeSlice"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP3]], i64 %[[TMP1]], i64 %[[TMP1]], i64 4) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP4]], 1 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP3]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.MakeSlice"(ptr sret(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP8]], i64 %[[TMP1]], i64 %[[TMP1]], i64 4) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP7:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// DARWIN-ARM64-NEXT: %[[TMP7]] = add i64 %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = icmp slt i64 %[[TMP7]], %[[TMP5]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP8]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP12:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// LINUX-AMD64-NEXT: %[[TMP12]] = add i64 %[[TMP11]], 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = icmp slt i64 %[[TMP12]], %[[TMP10]] +// LINUX-AMD64-NEXT: br i1 %[[TMP13]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP2]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP10]]) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call i32 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP4]], 0 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = icmp slt i64 %[[TMP7]], 0 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = icmp uge i64 %[[TMP7]], %[[TMP13]] +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = or i1 %[[TMP15]], %[[TMP14]] +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP16]], i64 %[[TMP7]], i1 true, i64 %[[TMP13]]) +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP12]], i64 %[[TMP7]] +// DARWIN-ARM64-NEXT: store i32 %[[TMP11]], ptr %[[TMP17]], align 4 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP7]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP15]]) +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = call i32 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP14]]) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], 0 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = icmp slt i64 %[[TMP12]], 0 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = icmp uge i64 %[[TMP12]], %[[TMP18]] +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = or i1 %[[TMP20]], %[[TMP19]] +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP21]], i64 %[[TMP12]], i1 true, i64 %[[TMP18]]) +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds i32, ptr %[[TMP17]], i64 %[[TMP12]] +// LINUX-AMD64-NEXT: store i32 %[[TMP16]], ptr %[[TMP22]], align 4 +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP4]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP9]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testrt/len/in.go b/cl/_testrt/len/in.go index 3bd00461b1..8fb04c76db 100644 --- a/cl/_testrt/len/in.go +++ b/cl/_testrt/len/in.go @@ -9,95 +9,54 @@ type data struct { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 56) -// CHECK-NEXT: %1 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.String", ptr %1, align 8 -// CHECK-NEXT: %3 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %2, 1 -// CHECK-NEXT: %4 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = call i64 @"{{.*}}/runtime/internal/runtime.ChanLen"(ptr %5) -// CHECK-NEXT: %7 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 2 -// CHECK-NEXT: %8 = load ptr, ptr %7, align 8 -// CHECK-NEXT: %9 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %8) -// CHECK-NEXT: %10 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 3 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %10, align 8 -// CHECK-NEXT: %12 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %11, 1 -// CHECK-NEXT: %13 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %14 = load ptr, ptr %13, align 8 -// CHECK-NEXT: %15 = call i64 @"{{.*}}/runtime/internal/runtime.ChanCap"(ptr %14) -// CHECK-NEXT: %16 = getelementptr inbounds %main.data, ptr %0, i32 0, i32 3 -// CHECK-NEXT: %17 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %16, align 8 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %17, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 56) -// CHECK-NEXT: %20 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 0 -// CHECK-NEXT: %21 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 1 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 2) -// CHECK-NEXT: %23 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 2 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 1) -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %25, align 8 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %24, ptr %25) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %26, align 8 -// CHECK-NEXT: %27 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 3 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %29 = getelementptr inbounds i64, ptr %28, i64 0 -// CHECK-NEXT: store i64 1, ptr %29, align 8 -// CHECK-NEXT: %30 = getelementptr inbounds i64, ptr %28, i64 1 -// CHECK-NEXT: store i64 2, ptr %30, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds i64, ptr %28, i64 2 -// CHECK-NEXT: store i64 3, ptr %31, align 8 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %28, 0 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %32, i64 3, 1 -// CHECK-NEXT: %34 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %33, i64 3, 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %20, align 8 -// CHECK-NEXT: store ptr %22, ptr %21, align 8 -// CHECK-NEXT: store ptr %24, ptr %23, align 8 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %34, ptr %27, align 8 -// CHECK-NEXT: %35 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 0 -// CHECK-NEXT: %36 = load %"{{.*}}/runtime/internal/runtime.String", ptr %35, align 8 -// CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %36, 1 -// CHECK-NEXT: %38 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 1 -// CHECK-NEXT: %39 = load ptr, ptr %38, align 8 -// CHECK-NEXT: %40 = call i64 @"{{.*}}/runtime/internal/runtime.ChanLen"(ptr %39) -// CHECK-NEXT: %41 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 2 -// CHECK-NEXT: %42 = load ptr, ptr %41, align 8 -// CHECK-NEXT: %43 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %42) -// CHECK-NEXT: %44 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 3 -// CHECK-NEXT: %45 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %44, align 8 -// CHECK-NEXT: %46 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %45, 1 -// CHECK-NEXT: %47 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 1 -// CHECK-NEXT: %48 = load ptr, ptr %47, align 8 -// CHECK-NEXT: %49 = call i64 @"{{.*}}/runtime/internal/runtime.ChanCap"(ptr %48) -// CHECK-NEXT: %50 = getelementptr inbounds %main.data, ptr %19, i32 0, i32 3 -// CHECK-NEXT: %51 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %50, align 8 -// CHECK-NEXT: %52 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %51, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %37) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %40) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %43) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %46) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %52) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// First read every len/cap operation from the same zero-valued struct. +// CHECK: [[ZERO_DATA:%.*]] = call ptr @"{{.*}}AllocZ"(i64 56) +// CHECK: [[ZERO_STRING:%.*]] = load %"{{.*}}String", ptr {{%.*}} +// CHECK-NEXT: [[ZERO_STRING_LEN:%.*]] = extractvalue %"{{.*}}String" [[ZERO_STRING]], 1 +// CHECK: [[ZERO_CHAN:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[ZERO_CHAN_LEN:%.*]] = call i64 @"{{.*}}ChanLen"(ptr [[ZERO_CHAN]]) +// CHECK: [[ZERO_MAP:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[ZERO_MAP_LEN:%.*]] = call i64 @"{{.*}}MapLen"(ptr [[ZERO_MAP]]) +// CHECK: [[ZERO_SLICE:%.*]] = load %"{{.*}}Slice", ptr {{%.*}} +// CHECK-NEXT: [[ZERO_SLICE_LEN:%.*]] = extractvalue %"{{.*}}Slice" [[ZERO_SLICE]], 1 +// CHECK: [[ZERO_CHAN_FOR_CAP:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[ZERO_CHAN_CAP:%.*]] = call i64 @"{{.*}}ChanCap"(ptr [[ZERO_CHAN_FOR_CAP]]) +// CHECK: [[ZERO_SLICE_FOR_CAP:%.*]] = load %"{{.*}}Slice", ptr {{%.*}} +// CHECK-NEXT: [[ZERO_SLICE_CAP:%.*]] = extractvalue %"{{.*}}Slice" [[ZERO_SLICE_FOR_CAP]], 2 +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_STRING_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_CHAN_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_MAP_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_SLICE_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_CHAN_CAP]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[ZERO_SLICE_CAP]]) +// Then construct and query the populated value, preserving channel/map/slice identities. +// CHECK: [[VALUE_DATA:%.*]] = call ptr @"{{.*}}AllocZ"(i64 56) +// CHECK: [[VALUE_CHAN:%.*]] = call ptr @"{{.*}}NewChan"(i64 8, i64 2) +// CHECK: [[VALUE_MAP:%.*]] = call ptr @"{{.*}}MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 1) +// CHECK: [[VALUE_SLICE0:%.*]] = insertvalue %"{{.*}}Slice" undef, ptr {{%.*}}, 0 +// CHECK-NEXT: [[VALUE_SLICE1:%.*]] = insertvalue %"{{.*}}Slice" [[VALUE_SLICE0]], i64 3, 1 +// CHECK-NEXT: [[VALUE_SLICE:%.*]] = insertvalue %"{{.*}}Slice" [[VALUE_SLICE1]], i64 3, 2 +// CHECK: store ptr [[VALUE_CHAN]], ptr {{%.*}} +// CHECK: store ptr [[VALUE_MAP]], ptr {{%.*}} +// CHECK: store %"{{.*}}Slice" [[VALUE_SLICE]], ptr {{%.*}} +// CHECK: [[VALUE_STRING:%.*]] = load %"{{.*}}String", ptr {{%.*}} +// CHECK-NEXT: [[VALUE_STRING_LEN:%.*]] = extractvalue %"{{.*}}String" [[VALUE_STRING]], 1 +// CHECK: [[VALUE_CHAN_LOAD:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[VALUE_CHAN_LEN:%.*]] = call i64 @"{{.*}}ChanLen"(ptr [[VALUE_CHAN_LOAD]]) +// CHECK: [[VALUE_MAP_LOAD:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[VALUE_MAP_LEN:%.*]] = call i64 @"{{.*}}MapLen"(ptr [[VALUE_MAP_LOAD]]) +// CHECK: [[VALUE_SLICE_LOAD:%.*]] = load %"{{.*}}Slice", ptr {{%.*}} +// CHECK-NEXT: [[VALUE_SLICE_LEN:%.*]] = extractvalue %"{{.*}}Slice" [[VALUE_SLICE_LOAD]], 1 +// CHECK: [[VALUE_CHAN_CAP_LOAD:%.*]] = load ptr, ptr {{%.*}} +// CHECK-NEXT: [[VALUE_CHAN_CAP:%.*]] = call i64 @"{{.*}}ChanCap"(ptr [[VALUE_CHAN_CAP_LOAD]]) +// CHECK: [[VALUE_SLICE_CAP_LOAD:%.*]] = load %"{{.*}}Slice", ptr {{%.*}} +// CHECK-NEXT: [[VALUE_SLICE_CAP:%.*]] = extractvalue %"{{.*}}Slice" [[VALUE_SLICE_CAP_LOAD]], 2 +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_STRING_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_CHAN_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_MAP_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_SLICE_LEN]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_CHAN_CAP]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[VALUE_SLICE_CAP]]) func main() { d := &data{} println(len(d.s), len(d.c), len(d.m), len(d.a), cap(d.c), cap(d.a)) diff --git a/cl/_testrt/linkname/in.go b/cl/_testrt/linkname/in.go index f57a006c02..a2abc9439c 100644 --- a/cl/_testrt/linkname/in.go +++ b/cl/_testrt/linkname/in.go @@ -21,18 +21,23 @@ func setInfo(*m, string) //go:linkname info github.com/goplus/llgo/cl/_testrt/linkname/linktarget.m.info func info(m) string +// CHECK: @[[A:[0-9]+]] = private unnamed_addr constant [2 x i8] c"a\00" +// CHECK: @[[B:[0-9]+]] = private unnamed_addr constant [2 x i8] c"b\00" +// CHECK: @[[C:[0-9]+]] = private unnamed_addr constant [2 x i8] c"c\00" +// CHECK: @[[D:[0-9]+]] = private unnamed_addr constant [2 x i8] c"d\00" +// CHECK: @[[ONE:[0-9]+]] = private unnamed_addr constant [2 x i8] c"1\00" +// CHECK: @[[TWO:[0-9]+]] = private unnamed_addr constant [2 x i8] c"2\00" +// CHECK: @[[THREE:[0-9]+]] = private unnamed_addr constant [2 x i8] c"3\00" +// CHECK: @[[FOUR:[0-9]+]] = private unnamed_addr constant [2 x i8] c"4\00" +// CHECK: @[[HELLO:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello" // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/cl/_testrt/linkname/linktarget.F"(ptr @0, ptr @1, ptr @2, ptr @3) -// CHECK-NEXT: call void @"{{.*}}/cl/_testrt/linkname/linktarget.F"(ptr @4, ptr @5, ptr @6, ptr @7) -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: call void @"{{.*}}/cl/_testrt/linkname/linktarget.(*m).setInfo"(ptr %0, %"{{.*}}/runtime/internal/runtime.String" { ptr @8, i64 5 }) -// CHECK-NEXT: %1 = load %main.m, ptr %0, align 8 -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testrt/linkname/linktarget.m.info"(%main.m %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/cl/_testrt/linkname/linktarget.F"(ptr @[[A]], ptr @[[B]], ptr @[[C]], ptr @[[D]]) +// CHECK-NEXT: call void @"{{.*}}/cl/_testrt/linkname/linktarget.F"(ptr @[[ONE]], ptr @[[TWO]], ptr @[[THREE]], ptr @[[FOUR]]) +// CHECK: [[INFO_STORAGE:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: call void @"{{.*}}/cl/_testrt/linkname/linktarget.(*m).setInfo"(ptr [[INFO_STORAGE]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[HELLO]], i64 5 }) +// CHECK-NEXT: [[INFO_RECEIVER:%[0-9]+]] = load %main.m, ptr [[INFO_STORAGE]] +// CHECK-NEXT: [[INFO:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/cl/_testrt/linkname/linktarget.m.info"(%main.m [[INFO_RECEIVER]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" [[INFO]]) func main() { print(c.Str("a"), c.Str("b"), c.Str("c"), c.Str("d")) print(c.Str("1"), c.Str("2"), c.Str("3"), c.Str("4")) diff --git a/cl/_testrt/litdemo/in.go b/cl/_testrt/litdemo/in.go index 25764ae26d..0c82f6f902 100644 --- a/cl/_testrt/litdemo/in.go +++ b/cl/_testrt/litdemo/in.go @@ -1,52 +1,54 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --all-functions --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main var seed = 40 -// CHECK: @main.seed = global i64 40, align 8 +func add(x, y int) int { + return x + y +} + +func main() { + + plusTwo := func(v int) int { + return add(v, 2) + } + println(plusTwo(seed)) +} -// CHECK-LABEL: define i64 @main.add(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 +// CHECK-LABEL: define i64 @main.add( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = add i64 %[[TMP0]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP2]] // CHECK-NEXT: } // CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = load i1, ptr @"main.init$guard", align 1 +// CHECK-NEXT: br i1 %[[TMP0]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB1:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 +// CHECK-NEXT: _llgo_[[BB1]]: // CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 +// CHECK-NEXT: br label %_llgo_[[BB2]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 +// CHECK-NEXT: _llgo_[[BB2]]: // CHECK-NEXT: ret void // CHECK-NEXT: } -func add(x, y int) int { - return x + y -} - // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i64, ptr @main.seed, align 8 -// CHECK-NEXT: %1 = call i64 @"main.main$1"(i64 %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = load i64, ptr @main.seed, align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call i64 @"main.main$1"(i64 %[[TMP0]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP1]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: ret void // CHECK-NEXT: } -func main() { - - // CHECK-LABEL: define i64 @"main.main$1"(i64 %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = call i64 @main.add(i64 %0, i64 2) - // CHECK-NEXT: ret i64 %1 - // CHECK-NEXT: } - - plusTwo := func(v int) int { - return add(v, 2) - } - println(plusTwo(seed)) -} +// CHECK-LABEL: define i64 @"main.main$1"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call i64 @main.add(i64 %[[TMP0]], i64 2) +// CHECK-NEXT: ret i64 %[[TMP1]] +// CHECK-NEXT: } diff --git a/cl/_testrt/makemap/in.go b/cl/_testrt/makemap/in.go index 818ca16950..0f762b7013 100644 --- a/cl/_testrt/makemap/in.go +++ b/cl/_testrt/makemap/in.go @@ -1,13 +1,86 @@ // LITTEST package main -// CHECK: {{^}}@16 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@17 = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} -// CHECK: {{^}}@18 = private unnamed_addr constant [4 x i8] c"llgo", align 1{{$}} -// CHECK: {{^}}@19 = private unnamed_addr constant [1 x i8] c":", align 1{{$}} -// CHECK: {{^}}@22 = private unnamed_addr constant [2 x i8] c"go", align 1{{$}} -// CHECK: {{^}}@23 = private unnamed_addr constant [7 x i8] c"bad key", align 1{{$}} -// CHECK: {{^}}@24 = private unnamed_addr constant [7 x i8] c"bad len", align 1{{$}} +// main must retain every scenario; each helper below then checks the map +// descriptor and dataflow specific to its key/value contract. +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: call void @main.make1() +// CHECK: call void @main.make2() +// CHECK: call void @main.make3() +// CHECK: call void @main.make4() +// CHECK: call void @main.make5() +// CHECK: call void @main.make6() +// CHECK: call void @main.make7() + +// make1 covers the full lifecycle. Tie every operation to the map returned by +// MakeMap and carry iterator/access results forward instead of matching helper +// names in isolation. +// CHECK-LABEL: define void @main.make1(){{.*}} { +// CHECK: %[[MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) +// CHECK: %[[ASSIGN:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %[[MAP]], ptr %{{[0-9]+}}) +// CHECK: store %"{{.*}}/runtime/internal/runtime.String" {{.*}}, ptr %[[ASSIGN]] +// CHECK: %[[VALUE:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_string", ptr %[[MAP]], ptr %{{[0-9]+}}) +// CHECK: load %"{{.*}}/runtime/internal/runtime.String", ptr %[[VALUE]] +// CHECK: %[[ITER:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_int]_llgo_string", ptr %[[MAP]]) +// CHECK: %[[NEXT:[0-9]+]] = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %[[ITER]]) +// CHECK: extractvalue { i1, ptr, ptr } %[[NEXT]], 0 +// CHECK: %[[MAP_LEN:[0-9]+]] = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %[[MAP]]) +// CHECK: %[[REVERSE:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 %[[MAP_LEN]]) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_int", ptr %[[REVERSE]], ptr %{{[0-9]+}}) +// CHECK: %[[FOUND:[0-9]+]] = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_string]_llgo_int", ptr %[[REVERSE]], ptr %{{[0-9]+}}) +// CHECK: extractvalue { ptr, i1 } %[[FOUND]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.MapDelete"(ptr @"map[_llgo_string]_llgo_int", ptr %[[REVERSE]], ptr %{{[0-9]+}}) +// CHECK: %[[DELETED:[0-9]+]] = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_string]_llgo_int", ptr %[[REVERSE]], ptr %{{[0-9]+}}) +// CHECK: %[[STILL_PRESENT:[0-9]+]] = extractvalue { ptr, i1 } %[[DELETED]], 1 +// CHECK: %[[PAIR_OK:[0-9]+]] = insertvalue { i64, i1 } %{{[0-9]+}}, i1 %[[STILL_PRESENT]], 1 +// CHECK: %[[BRANCH_OK:[0-9]+]] = extractvalue { i64, i1 } %[[PAIR_OK]], 1 +// CHECK: br i1 %[[BRANCH_OK]] + +// Interface keys retain their dynamic type while assignment and iteration use +// the same any-key map. +// CHECK-LABEL: define void @main.make2(){{.*}} { +// CHECK: %[[ANY_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) +// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.N1, ptr undef }, ptr %{{[0-9]+}}, 1 +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %[[ANY_MAP]], ptr %{{[0-9]+}}) +// CHECK: %[[ANY_ITER:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %[[ANY_MAP]]) +// CHECK: call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %[[ANY_ITER]]) + +// Array-of-value and array-of-pointer interface keys both go through dynamic +// equality, but remain separate source scenarios. +// CHECK-LABEL: define void @main.make3(){{.*}} { +// CHECK: %[[VALUE_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[VALUE_EQ]]) +// CHECK: %[[VALUE_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %[[VALUE_MAP]], ptr %{{[0-9]+}}) + +// CHECK-LABEL: define void @main.make4(){{.*}} { +// CHECK: %[[POINTER_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[POINTER_EQ]]) +// CHECK: %[[POINTER_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %[[POINTER_MAP]], ptr %{{[0-9]+}}) + +// Channel identity is used both through interface equality and as a direct map +// key; both operations must consume the channel created here. +// CHECK-LABEL: define void @main.make5(){{.*}} { +// CHECK: %[[CHAN:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) +// CHECK: insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr undef }, ptr %[[CHAN]], 1 +// CHECK: call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual" +// CHECK: %[[CHAN_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[chan _llgo_int]_llgo_int", i64 0) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[chan _llgo_int]_llgo_int", ptr %[[CHAN_MAP]], ptr %{{[0-9]+}}) + +// A named map uses its named descriptor for operations even though allocation +// uses the identical underlying map layout. +// CHECK-LABEL: define void @main.make6(){{.*}} { +// CHECK: %[[NAMED_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @_llgo_main.M, ptr %[[NAMED_MAP]], ptr %{{[0-9]+}}) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @_llgo_main.M, ptr %[[NAMED_MAP]]) + +// A local named key has its own descriptor and the literal's two entries are +// reflected in the allocation hint. +// CHECK-LABEL: define void @main.make7(){{.*}} { +// CHECK: %[[LOCAL_MAP:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_main.N.7.0]_llgo_string", i64 2) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %[[LOCAL_MAP]], ptr %{{[0-9]+}}) +// CHECK: call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %[[LOCAL_MAP]], ptr %{{[0-9]+}}) func main() { make1() @@ -135,718 +208,3 @@ func make7() { } println(m[1]) } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.make1() -// CHECK-NEXT: call void @main.make2() -// CHECK-NEXT: call void @main.make3() -// CHECK-NEXT: call void @main.make4() -// CHECK-NEXT: call void @main.make5() -// CHECK-NEXT: call void @main.make6() -// CHECK-NEXT: call void @main.make7() -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make1(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %1) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %3) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 3, ptr %5, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %5) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %7, align 8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %7) -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.String", ptr %8, align 8 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %10, align 8 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_string", ptr %0, ptr %10) -// CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 -// CHECK-NEXT: %13 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_int]_llgo_string", ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %15 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %14) -// CHECK-NEXT: %16 = extractvalue { i1, ptr, ptr } %15, 0 -// CHECK-NEXT: br i1 %16, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_13 -// CHECK-NEXT: %17 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %68, 1 -// CHECK-NEXT: %18 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %68, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @19, i64 1 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %18) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_13 -// CHECK-NEXT: %19 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %0) -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_int", i64 %19) -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_int]_llgo_string", ptr %0) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_5, %_llgo_3 -// CHECK-NEXT: %22 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %21) -// CHECK-NEXT: %23 = extractvalue { i1, ptr, ptr } %22, 0 -// CHECK-NEXT: br i1 %23, label %_llgo_14, label %_llgo_15 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_16 -// CHECK-NEXT: %24 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %76, 1 -// CHECK-NEXT: %25 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %76, 2 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %25, ptr %26, align 8 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_int", ptr %20, ptr %26) -// CHECK-NEXT: store i64 %24, ptr %27, align 8 -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_16 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }, ptr %28, align 8 -// CHECK-NEXT: %29 = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_string]_llgo_int", ptr %20, ptr %28) -// CHECK-NEXT: %30 = extractvalue { ptr, i1 } %29, 0 -// CHECK-NEXT: %31 = load i64, ptr %30, align 8 -// CHECK-NEXT: %32 = extractvalue { ptr, i1 } %29, 1 -// CHECK-NEXT: %33 = insertvalue { i64, i1 } undef, i64 %31, 0 -// CHECK-NEXT: %34 = insertvalue { i64, i1 } %33, i1 %32, 1 -// CHECK-NEXT: %35 = extractvalue { i64, i1 } %34, 0 -// CHECK-NEXT: %36 = extractvalue { i64, i1 } %34, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %36) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 2 }, ptr %37, align 8 -// CHECK-NEXT: %38 = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_string]_llgo_int", ptr %20, ptr %37) -// CHECK-NEXT: %39 = extractvalue { ptr, i1 } %38, 0 -// CHECK-NEXT: %40 = load i64, ptr %39, align 8 -// CHECK-NEXT: %41 = extractvalue { ptr, i1 } %38, 1 -// CHECK-NEXT: %42 = insertvalue { i64, i1 } undef, i64 %40, 0 -// CHECK-NEXT: %43 = insertvalue { i64, i1 } %42, i1 %41, 1 -// CHECK-NEXT: %44 = extractvalue { i64, i1 } %43, 0 -// CHECK-NEXT: %45 = extractvalue { i64, i1 } %43, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @22, i64 2 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %44) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %45) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %46 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }, ptr %46, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.MapDelete"(ptr @"map[_llgo_string]_llgo_int", ptr %20, ptr %46) -// CHECK-NEXT: %47 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @18, i64 4 }, ptr %47, align 8 -// CHECK-NEXT: %48 = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_string]_llgo_int", ptr %20, ptr %47) -// CHECK-NEXT: %49 = extractvalue { ptr, i1 } %48, 0 -// CHECK-NEXT: %50 = load i64, ptr %49, align 8 -// CHECK-NEXT: %51 = extractvalue { ptr, i1 } %48, 1 -// CHECK-NEXT: %52 = insertvalue { i64, i1 } undef, i64 %50, 0 -// CHECK-NEXT: %53 = insertvalue { i64, i1 } %52, i1 %51, 1 -// CHECK-NEXT: %54 = extractvalue { i64, i1 } %53, 0 -// CHECK-NEXT: %55 = extractvalue { i64, i1 } %53, 1 -// CHECK-NEXT: br i1 %55, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %56 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @23, i64 7 }, ptr %56, align 8 -// CHECK-NEXT: %57 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %56, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %57) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: %58 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %20) -// CHECK-NEXT: %59 = icmp ne i64 %58, 2 -// CHECK-NEXT: br i1 %59, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8 -// CHECK-NEXT: %60 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @24, i64 7 }, ptr %60, align 8 -// CHECK-NEXT: %61 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %60, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %61) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_8 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_1 -// CHECK-NEXT: %62 = extractvalue { i1, ptr, ptr } %15, 1 -// CHECK-NEXT: %63 = extractvalue { i1, ptr, ptr } %15, 2 -// CHECK-NEXT: %64 = load i64, ptr %62, align 8 -// CHECK-NEXT: %65 = load %"{{.*}}/runtime/internal/runtime.String", ptr %63, align 8 -// CHECK-NEXT: %66 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } { i1 true, i64 undef, %"{{.*}}/runtime/internal/runtime.String" undef }, i64 %64, 1 -// CHECK-NEXT: %67 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %66, %"{{.*}}/runtime/internal/runtime.String" %65, 2 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_13 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_12, %_llgo_11 -// CHECK-NEXT: %68 = phi { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } [ %67, %_llgo_11 ], [ zeroinitializer, %_llgo_12 ] -// CHECK-NEXT: %69 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %68, 0 -// CHECK-NEXT: br i1 %69, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_4 -// CHECK-NEXT: %70 = extractvalue { i1, ptr, ptr } %22, 1 -// CHECK-NEXT: %71 = extractvalue { i1, ptr, ptr } %22, 2 -// CHECK-NEXT: %72 = load i64, ptr %70, align 8 -// CHECK-NEXT: %73 = load %"{{.*}}/runtime/internal/runtime.String", ptr %71, align 8 -// CHECK-NEXT: %74 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } { i1 true, i64 undef, %"{{.*}}/runtime/internal/runtime.String" undef }, i64 %72, 1 -// CHECK-NEXT: %75 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %74, %"{{.*}}/runtime/internal/runtime.String" %73, 2 -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_4 -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_15, %_llgo_14 -// CHECK-NEXT: %76 = phi { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } [ %75, %_llgo_14 ], [ zeroinitializer, %_llgo_15 ] -// CHECK-NEXT: %77 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %76, 0 -// CHECK-NEXT: br i1 %77, label %_llgo_5, label %_llgo_6 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) -// CHECK-NEXT: %1 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr %0) -// CHECK-NEXT: %2 = icmp eq ptr %0, null -// CHECK-NEXT: %3 = icmp ne ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %4 = call i64 @"{{.*}}/runtime/internal/runtime.MapLen"(ptr null) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr null) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 true) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 false) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) -// CHECK-NEXT: %6 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %6, i8 0, i64 8, i1 false) -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %6, i64 0 -// CHECK-NEXT: store i64 1, ptr %7, align 8 -// CHECK-NEXT: %8 = load [1 x i64], ptr %6, align 8 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store [1 x i64] %8, ptr %9, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.N1, ptr undef }, ptr %9, 1 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %10, ptr %11, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %11) -// CHECK-NEXT: store i64 100, ptr %12, align 8 -// CHECK-NEXT: %13 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %13, i8 0, i64 8, i1 false) -// CHECK-NEXT: %14 = getelementptr inbounds i64, ptr %13, i64 0 -// CHECK-NEXT: store i64 2, ptr %14, align 8 -// CHECK-NEXT: %15 = load [1 x i64], ptr %13, align 8 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store [1 x i64] %15, ptr %16, align 8 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.N1, ptr undef }, ptr %16, 1 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %17, ptr %18, align 8 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %18) -// CHECK-NEXT: store i64 200, ptr %19, align 8 -// CHECK-NEXT: %20 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %20, i8 0, i64 8, i1 false) -// CHECK-NEXT: %21 = getelementptr inbounds i64, ptr %20, i64 0 -// CHECK-NEXT: store i64 3, ptr %21, align 8 -// CHECK-NEXT: %22 = load [1 x i64], ptr %20, align 8 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store [1 x i64] %22, ptr %23, align 8 -// CHECK-NEXT: %24 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.N1, ptr undef }, ptr %23, 1 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %24, ptr %25, align 8 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %25) -// CHECK-NEXT: store i64 300, ptr %26, align 8 -// CHECK-NEXT: %27 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %27, i8 0, i64 8, i1 false) -// CHECK-NEXT: %28 = getelementptr inbounds i64, ptr %27, i64 0 -// CHECK-NEXT: store i64 2, ptr %28, align 8 -// CHECK-NEXT: %29 = load [1 x i64], ptr %27, align 8 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store [1 x i64] %29, ptr %30, align 8 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.N1, ptr undef }, ptr %30, 1 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %31, ptr %32, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %5, ptr %32) -// CHECK-NEXT: store i64 -200, ptr %33, align 8 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %5) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_7, %_llgo_0 -// CHECK-NEXT: %35 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %34) -// CHECK-NEXT: %36 = extractvalue { i1, ptr, ptr } %35, 0 -// CHECK-NEXT: br i1 %36, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %37 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 1 -// CHECK-NEXT: %38 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 2 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %37, 0 -// CHECK-NEXT: %40 = icmp eq ptr %39, @_llgo_main.N1 -// CHECK-NEXT: br i1 %40, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %41 = extractvalue { i1, ptr, ptr } %35, 1 -// CHECK-NEXT: %42 = extractvalue { i1, ptr, ptr } %35, 2 -// CHECK-NEXT: %43 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %41, align 8 -// CHECK-NEXT: %44 = load i64, ptr %42, align 8 -// CHECK-NEXT: %45 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } { i1 true, %"{{.*}}/runtime/internal/runtime.eface" undef, i64 undef }, %"{{.*}}/runtime/internal/runtime.eface" %43, 1 -// CHECK-NEXT: %46 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %45, i64 %44, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %47 = phi { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } [ %46, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %48 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 0 -// CHECK-NEXT: br i1 %48, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %49 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %37, 1 -// CHECK-NEXT: %50 = load [1 x i64], ptr %49, align 8 -// CHECK-NEXT: %51 = alloca [1 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %51, i8 0, i64 8, i1 false) -// CHECK-NEXT: store [1 x i64] %50, ptr %51, align 8 -// CHECK-NEXT: %52 = getelementptr inbounds i64, ptr %51, i64 0 -// CHECK-NEXT: %53 = load i64, ptr %52, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %53) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %39, ptr @_llgo_main.N1) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make3(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca [1 x %main.N], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 2, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %main.N, ptr %0, i64 0 -// CHECK-NEXT: %2 = getelementptr inbounds %main.N, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = getelementptr inbounds %main.N, ptr %1, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %2, align 1 -// CHECK-NEXT: store i8 2, ptr %3, align 1 -// CHECK-NEXT: %4 = load [1 x %main.N], ptr %0, align 1 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [1 x %main.N] %4, ptr %5, align 1 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K, ptr undef }, ptr %5, 1 -// CHECK-NEXT: %7 = alloca [1 x %main.N], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %7, i8 0, i64 2, i1 false) -// CHECK-NEXT: %8 = getelementptr inbounds %main.N, ptr %7, i64 0 -// CHECK-NEXT: %9 = getelementptr inbounds %main.N, ptr %8, i32 0, i32 0 -// CHECK-NEXT: %10 = getelementptr inbounds %main.N, ptr %8, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %9, align 1 -// CHECK-NEXT: store i8 2, ptr %10, align 1 -// CHECK-NEXT: %11 = load [1 x %main.N], ptr %7, align 1 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [1 x %main.N] %11, ptr %12, align 1 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K, ptr undef }, ptr %12, 1 -// CHECK-NEXT: %14 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %6, %"{{.*}}/runtime/internal/runtime.eface" %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %15 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) -// CHECK-NEXT: %16 = alloca [1 x %main.N], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %16, i8 0, i64 2, i1 false) -// CHECK-NEXT: %17 = getelementptr inbounds %main.N, ptr %16, i64 0 -// CHECK-NEXT: %18 = getelementptr inbounds %main.N, ptr %17, i32 0, i32 0 -// CHECK-NEXT: %19 = getelementptr inbounds %main.N, ptr %17, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %18, align 1 -// CHECK-NEXT: store i8 2, ptr %19, align 1 -// CHECK-NEXT: %20 = load [1 x %main.N], ptr %16, align 1 -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [1 x %main.N] %20, ptr %21, align 1 -// CHECK-NEXT: %22 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K, ptr undef }, ptr %21, 1 -// CHECK-NEXT: %23 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %22, ptr %23, align 8 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %15, ptr %23) -// CHECK-NEXT: store i64 100, ptr %24, align 8 -// CHECK-NEXT: %25 = alloca [1 x %main.N], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %25, i8 0, i64 2, i1 false) -// CHECK-NEXT: %26 = getelementptr inbounds %main.N, ptr %25, i64 0 -// CHECK-NEXT: %27 = getelementptr inbounds %main.N, ptr %26, i32 0, i32 0 -// CHECK-NEXT: %28 = getelementptr inbounds %main.N, ptr %26, i32 0, i32 1 -// CHECK-NEXT: store i8 3, ptr %27, align 1 -// CHECK-NEXT: store i8 4, ptr %28, align 1 -// CHECK-NEXT: %29 = load [1 x %main.N], ptr %25, align 1 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 2) -// CHECK-NEXT: store [1 x %main.N] %29, ptr %30, align 1 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K, ptr undef }, ptr %30, 1 -// CHECK-NEXT: %32 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %31, ptr %32, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %15, ptr %32) -// CHECK-NEXT: store i64 200, ptr %33, align 8 -// CHECK-NEXT: %34 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %15) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_7, %_llgo_0 -// CHECK-NEXT: %35 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %34) -// CHECK-NEXT: %36 = extractvalue { i1, ptr, ptr } %35, 0 -// CHECK-NEXT: br i1 %36, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %37 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 1 -// CHECK-NEXT: %38 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 2 -// CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %37, 0 -// CHECK-NEXT: %40 = icmp eq ptr %39, @_llgo_main.K -// CHECK-NEXT: br i1 %40, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %41 = extractvalue { i1, ptr, ptr } %35, 1 -// CHECK-NEXT: %42 = extractvalue { i1, ptr, ptr } %35, 2 -// CHECK-NEXT: %43 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %41, align 8 -// CHECK-NEXT: %44 = load i64, ptr %42, align 8 -// CHECK-NEXT: %45 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } { i1 true, %"{{.*}}/runtime/internal/runtime.eface" undef, i64 undef }, %"{{.*}}/runtime/internal/runtime.eface" %43, 1 -// CHECK-NEXT: %46 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %45, i64 %44, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %47 = phi { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } [ %46, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %48 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %47, 0 -// CHECK-NEXT: br i1 %48, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %49 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %37, 1 -// CHECK-NEXT: %50 = load [1 x %main.N], ptr %49, align 1 -// CHECK-NEXT: %51 = alloca [1 x %main.N], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %51, i8 0, i64 2, i1 false) -// CHECK-NEXT: store [1 x %main.N] %50, ptr %51, align 1 -// CHECK-NEXT: %52 = getelementptr inbounds %main.N, ptr %51, i64 0 -// CHECK-NEXT: %53 = load %main.N, ptr %52, align 1 -// CHECK-NEXT: %54 = extractvalue %main.N %53, 0 -// CHECK-NEXT: %55 = sext i8 %54 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %55) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %39, ptr @_llgo_main.K) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make4(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca [1 x ptr], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds ptr, ptr %0, i64 0 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %3 = getelementptr inbounds %main.N, ptr %2, i32 0, i32 0 -// CHECK-NEXT: %4 = getelementptr inbounds %main.N, ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %3, align 1 -// CHECK-NEXT: store i8 2, ptr %4, align 1 -// CHECK-NEXT: store ptr %2, ptr %1, align 8 -// CHECK-NEXT: %5 = load [1 x ptr], ptr %0, align 8 -// CHECK-NEXT: %6 = extractvalue [1 x ptr] %5, 0 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K2, ptr undef }, ptr %6, 1 -// CHECK-NEXT: %8 = alloca [1 x ptr], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %8, i8 0, i64 8, i1 false) -// CHECK-NEXT: %9 = getelementptr inbounds ptr, ptr %8, i64 0 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %11 = getelementptr inbounds %main.N, ptr %10, i32 0, i32 0 -// CHECK-NEXT: %12 = getelementptr inbounds %main.N, ptr %10, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %11, align 1 -// CHECK-NEXT: store i8 2, ptr %12, align 1 -// CHECK-NEXT: store ptr %10, ptr %9, align 8 -// CHECK-NEXT: %13 = load [1 x ptr], ptr %8, align 8 -// CHECK-NEXT: %14 = extractvalue [1 x ptr] %13, 0 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K2, ptr undef }, ptr %14, 1 -// CHECK-NEXT: %16 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %7, %"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_any]_llgo_int", i64 0) -// CHECK-NEXT: %18 = alloca [1 x ptr], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 8, i1 false) -// CHECK-NEXT: %19 = getelementptr inbounds ptr, ptr %18, i64 0 -// CHECK-NEXT: %20 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %21 = getelementptr inbounds %main.N, ptr %20, i32 0, i32 0 -// CHECK-NEXT: %22 = getelementptr inbounds %main.N, ptr %20, i32 0, i32 1 -// CHECK-NEXT: store i8 1, ptr %21, align 1 -// CHECK-NEXT: store i8 2, ptr %22, align 1 -// CHECK-NEXT: store ptr %20, ptr %19, align 8 -// CHECK-NEXT: %23 = load [1 x ptr], ptr %18, align 8 -// CHECK-NEXT: %24 = extractvalue [1 x ptr] %23, 0 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K2, ptr undef }, ptr %24, 1 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %25, ptr %26, align 8 -// CHECK-NEXT: %27 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %17, ptr %26) -// CHECK-NEXT: store i64 100, ptr %27, align 8 -// CHECK-NEXT: %28 = alloca [1 x ptr], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %28, i8 0, i64 8, i1 false) -// CHECK-NEXT: %29 = getelementptr inbounds ptr, ptr %28, i64 0 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 2) -// CHECK-NEXT: %31 = getelementptr inbounds %main.N, ptr %30, i32 0, i32 0 -// CHECK-NEXT: %32 = getelementptr inbounds %main.N, ptr %30, i32 0, i32 1 -// CHECK-NEXT: store i8 3, ptr %31, align 1 -// CHECK-NEXT: store i8 4, ptr %32, align 1 -// CHECK-NEXT: store ptr %30, ptr %29, align 8 -// CHECK-NEXT: %33 = load [1 x ptr], ptr %28, align 8 -// CHECK-NEXT: %34 = extractvalue [1 x ptr] %33, 0 -// CHECK-NEXT: %35 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.K2, ptr undef }, ptr %34, 1 -// CHECK-NEXT: %36 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %35, ptr %36, align 8 -// CHECK-NEXT: %37 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_any]_llgo_int", ptr %17, ptr %36) -// CHECK-NEXT: store i64 200, ptr %37, align 8 -// CHECK-NEXT: %38 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_any]_llgo_int", ptr %17) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_7, %_llgo_0 -// CHECK-NEXT: %39 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %38) -// CHECK-NEXT: %40 = extractvalue { i1, ptr, ptr } %39, 0 -// CHECK-NEXT: br i1 %40, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %41 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %51, 1 -// CHECK-NEXT: %42 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %51, 2 -// CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %41, 0 -// CHECK-NEXT: %44 = icmp eq ptr %43, @_llgo_main.K2 -// CHECK-NEXT: br i1 %44, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %45 = extractvalue { i1, ptr, ptr } %39, 1 -// CHECK-NEXT: %46 = extractvalue { i1, ptr, ptr } %39, 2 -// CHECK-NEXT: %47 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %45, align 8 -// CHECK-NEXT: %48 = load i64, ptr %46, align 8 -// CHECK-NEXT: %49 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } { i1 true, %"{{.*}}/runtime/internal/runtime.eface" undef, i64 undef }, %"{{.*}}/runtime/internal/runtime.eface" %47, 1 -// CHECK-NEXT: %50 = insertvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %49, i64 %48, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %51 = phi { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } [ %50, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %52 = extractvalue { i1, %"{{.*}}/runtime/internal/runtime.eface", i64 } %51, 0 -// CHECK-NEXT: br i1 %52, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_2 -// CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %41, 1 -// CHECK-NEXT: %54 = insertvalue [1 x ptr] undef, ptr %53, 0 -// CHECK-NEXT: %55 = alloca [1 x ptr], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %55, i8 0, i64 8, i1 false) -// CHECK-NEXT: store [1 x ptr] %54, ptr %55, align 8 -// CHECK-NEXT: %56 = getelementptr inbounds ptr, ptr %55, i64 0 -// CHECK-NEXT: %57 = load ptr, ptr %56, align 8 -// CHECK-NEXT: %58 = getelementptr inbounds %main.N, ptr %57, i32 0, i32 0 -// CHECK-NEXT: %59 = load i8, ptr %58, align 1 -// CHECK-NEXT: %60 = sext i8 %59 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %60) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %42) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %43, ptr @_llgo_main.K2) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make5(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.NewChan"(i64 8, i64 0) -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"chan _llgo_int", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %3 = call i1 @"{{.*}}/runtime/internal/runtime.EfaceEqual"(%"{{.*}}/runtime/internal/runtime.eface" %1, %"{{.*}}/runtime/internal/runtime.eface" %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %3) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[chan _llgo_int]_llgo_int", i64 0) -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[chan _llgo_int]_llgo_int", ptr %4, ptr %5) -// CHECK-NEXT: store i64 100, ptr %6, align 8 -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store ptr %0, ptr %7, align 8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[chan _llgo_int]_llgo_int", ptr %4, ptr %7) -// CHECK-NEXT: store i64 200, ptr %8, align 8 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[chan _llgo_int]_llgo_int", ptr %4) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %10 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %9) -// CHECK-NEXT: %11 = extractvalue { i1, ptr, ptr } %10, 0 -// CHECK-NEXT: br i1 %11, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %12 = extractvalue { i1, ptr, i64 } %20, 1 -// CHECK-NEXT: %13 = extractvalue { i1, ptr, i64 } %20, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %14 = extractvalue { i1, ptr, ptr } %10, 1 -// CHECK-NEXT: %15 = extractvalue { i1, ptr, ptr } %10, 2 -// CHECK-NEXT: %16 = load ptr, ptr %14, align 8 -// CHECK-NEXT: %17 = load i64, ptr %15, align 8 -// CHECK-NEXT: %18 = insertvalue { i1, ptr, i64 } { i1 true, ptr undef, i64 undef }, ptr %16, 1 -// CHECK-NEXT: %19 = insertvalue { i1, ptr, i64 } %18, i64 %17, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %20 = phi { i1, ptr, i64 } [ %19, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %21 = extractvalue { i1, ptr, i64 } %20, 0 -// CHECK-NEXT: br i1 %21, label %_llgo_2, label %_llgo_3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make6(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_string", i64 0) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @_llgo_main.M, ptr %0, ptr %1) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @_llgo_main.M, ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %4 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %3) -// CHECK-NEXT: %5 = extractvalue { i1, ptr, ptr } %4, 0 -// CHECK-NEXT: br i1 %5, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %6 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %14, 1 -// CHECK-NEXT: %7 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %14, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %7) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %8 = extractvalue { i1, ptr, ptr } %4, 1 -// CHECK-NEXT: %9 = extractvalue { i1, ptr, ptr } %4, 2 -// CHECK-NEXT: %10 = load i64, ptr %8, align 8 -// CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.String", ptr %9, align 8 -// CHECK-NEXT: %12 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } { i1 true, i64 undef, %"{{.*}}/runtime/internal/runtime.String" undef }, i64 %10, 1 -// CHECK-NEXT: %13 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %12, %"{{.*}}/runtime/internal/runtime.String" %11, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %14 = phi { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } [ %13, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %15 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %14, 0 -// CHECK-NEXT: br i1 %15, label %_llgo_2, label %_llgo_3 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.make7(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_main.N.7.0]_llgo_string", i64 2) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %0, ptr %1) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 2, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %0, ptr %3) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.NewMapIter"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %0) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %6 = call { i1, ptr, ptr } @"{{.*}}/runtime/internal/runtime.MapIterNext"(ptr %5) -// CHECK-NEXT: %7 = extractvalue { i1, ptr, ptr } %6, 0 -// CHECK-NEXT: br i1 %7, label %_llgo_4, label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_6 -// CHECK-NEXT: %8 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %19, 1 -// CHECK-NEXT: %9 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %19, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %9) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_6 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 1, ptr %10, align 8 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_main.N.7.0]_llgo_string", ptr %0, ptr %10) -// CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %12) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: %13 = extractvalue { i1, ptr, ptr } %6, 1 -// CHECK-NEXT: %14 = extractvalue { i1, ptr, ptr } %6, 2 -// CHECK-NEXT: %15 = load i64, ptr %13, align 8 -// CHECK-NEXT: %16 = load %"{{.*}}/runtime/internal/runtime.String", ptr %14, align 8 -// CHECK-NEXT: %17 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } { i1 true, i64 undef, %"{{.*}}/runtime/internal/runtime.String" undef }, i64 %15, 1 -// CHECK-NEXT: %18 = insertvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %17, %"{{.*}}/runtime/internal/runtime.String" %16, 2 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5, %_llgo_4 -// CHECK-NEXT: %19 = phi { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } [ %18, %_llgo_4 ], [ zeroinitializer, %_llgo_5 ] -// CHECK-NEXT: %20 = extractvalue { i1, i64, %"{{.*}}/runtime/internal/runtime.String" } %19, 0 -// CHECK-NEXT: br i1 %20, label %_llgo_2, label %_llgo_3 -// CHECK-NEXT: } diff --git a/cl/_testrt/map/in.go b/cl/_testrt/map/in.go index 89454a665f..e67bf0109c 100644 --- a/cl/_testrt/map/in.go +++ b/cl/_testrt/map/in.go @@ -6,23 +6,20 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 2) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 23, ptr %1, align 8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %0, ptr %1) -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 7, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr %0, ptr %3) -// CHECK-NEXT: store i64 29, ptr %4, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 23, ptr %5, align 8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_int]_llgo_int", ptr %0, ptr %5) -// CHECK-NEXT: %7 = load i64, ptr %6, align 8 -// CHECK-NEXT: %8 = call i32 (ptr, ...) @printf(ptr @13, i64 %7) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MAP:%[0-9]+]] = call ptr @"{{.*}}MakeMap"(ptr @"map[_llgo_int]_llgo_int", i64 2) +// CHECK-NEXT: [[KEY23:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK-NEXT: store i64 23, ptr [[KEY23]] +// CHECK-NEXT: [[VALUE100:%[0-9]+]] = call ptr @"{{.*}}MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr [[MAP]], ptr [[KEY23]]) +// CHECK-NEXT: store i64 100, ptr [[VALUE100]] +// CHECK-NEXT: [[KEY7:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK-NEXT: store i64 7, ptr [[KEY7]] +// CHECK-NEXT: [[VALUE29:%[0-9]+]] = call ptr @"{{.*}}MapAssign"(ptr @"map[_llgo_int]_llgo_int", ptr [[MAP]], ptr [[KEY7]]) +// CHECK-NEXT: store i64 29, ptr [[VALUE29]] +// CHECK-NEXT: [[LOOKUP_KEY:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 8) +// CHECK-NEXT: store i64 23, ptr [[LOOKUP_KEY]] +// CHECK-NEXT: [[LOOKUP_ADDR:%[0-9]+]] = call ptr @"{{.*}}MapAccess1"(ptr @"map[_llgo_int]_llgo_int", ptr [[MAP]], ptr [[LOOKUP_KEY]]) +// CHECK-NEXT: [[LOOKUP:%[0-9]+]] = load i64, ptr [[LOOKUP_ADDR]] +// CHECK-NEXT: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 [[LOOKUP]]) func main() { a := map[int]int{23: 100, 7: 29} c.Printf(c.Str("Hello %d\n"), a[23]) diff --git a/cl/_testrt/mapclosure/in.go b/cl/_testrt/mapclosure/in.go index 1347fded25..2eec8ae739 100644 --- a/cl/_testrt/mapclosure/in.go +++ b/cl/_testrt/mapclosure/in.go @@ -6,18 +6,12 @@ type Type interface { } // CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @main.demo(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 3 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %6, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %6, 0 -// CHECK-NEXT: %9 = call %"{{.*}}/runtime/internal/runtime.String" %8(ptr %7) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %9 -// CHECK-NEXT: } +// CHECK: [[DEMO_DATA:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) +// CHECK: [[DEMO_METHOD:%[0-9]+]] = load ptr, ptr %{{[0-9]+}} +// CHECK: [[DEMO_PAIR0:%[0-9]+]] = insertvalue { ptr, ptr } undef, ptr [[DEMO_METHOD]], 0 +// CHECK-NEXT: [[DEMO_PAIR:%[0-9]+]] = insertvalue { ptr, ptr } [[DEMO_PAIR0]], ptr [[DEMO_DATA]], 1 +// CHECK: [[DEMO_RESULT:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" %{{[0-9]+}}(ptr %{{[0-9]+}}) +// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" [[DEMO_RESULT]] func demo(t Type) string { return t.String() } @@ -33,51 +27,38 @@ var ( list = []func(Type) string{demo} ) +// CHECK-LABEL: define void @main.init(){{.*}} { +// CHECK: [[OP_MAP:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_string]_llgo_closure${{[-A-Za-z0-9_]+}}", i64 1) +// CHECK: [[OP_SLOT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_string]_llgo_closure${{[-A-Za-z0-9_]+}}", ptr [[OP_MAP]], ptr %{{[0-9]+}}) +// CHECK-NEXT: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr [[OP_SLOT]] +// CHECK-NEXT: store ptr [[OP_MAP]], ptr @main.op +// CHECK: store { ptr, ptr } { ptr @main.demo, ptr null }, ptr [[LIST_ELEM:%[0-9]+]] +// CHECK: store %"{{.*}}/runtime/internal/runtime.Slice" [[LIST:%[0-9]+]], ptr @main.list // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %1 = getelementptr inbounds %main.typ, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @21, i64 5 }, ptr %1, align 8 -// CHECK-NEXT: %2 = load ptr, ptr @main.op, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 4 }, ptr %3, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_string]_llgo_closure${{[-A-Za-z0-9_]+}}", ptr %2, ptr %3) -// CHECK-NEXT: %5 = load { ptr, ptr }, ptr %4, align 8 -// CHECK-NEXT: %6 = load %"{{.*}}/runtime/internal/runtime.Slice", ptr @main.list, align 8 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 -// CHECK-NEXT: %9 = icmp uge i64 0, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, {{.*}}) -// CHECK-NEXT: %10 = getelementptr inbounds { ptr, ptr }, ptr %7, i64 0 -// CHECK-NEXT: %11 = load { ptr, ptr }, ptr %10, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_main.typ") -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %12, 0 -// CHECK-NEXT: %14 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %13, ptr %0, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %5, 1 -// CHECK-NEXT: %16 = extractvalue { ptr, ptr } %5, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %16) -// CHECK-NEXT: %17 = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code(ptr {{(nest|swiftself)}} %15, %"{{.*}}/runtime/internal/runtime.iface" %14) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_main.typ") -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %18, 0 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %19, ptr %0, 1 -// CHECK-NEXT: %21 = extractvalue { ptr, ptr } %11, 1 -// CHECK-NEXT: %22 = extractvalue { ptr, ptr } %11, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %22) -// CHECK-NEXT: %23 = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %21, %"{{.*}}/runtime/internal/runtime.iface" %20) -// CHECK-NEXT: %24 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" %17, %"{{.*}}/runtime/internal/runtime.String" %23) -// CHECK-NEXT: %25 = xor i1 %24, true -// CHECK-NEXT: br i1 %25, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %26 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @25, i64 5 }, ptr %26, align 8 -// CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %26, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %27) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[TYP:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: [[LOADED_MAP:%[0-9]+]] = load ptr, ptr @main.op +// CHECK: [[MAP_SLOT:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAccess1"(ptr @"map[_llgo_string]_llgo_closure${{[-A-Za-z0-9_]+}}", ptr [[LOADED_MAP]], ptr %{{[0-9]+}}) +// CHECK-NEXT: [[MAP_FN:%[0-9]+]] = load { ptr, ptr }, ptr [[MAP_SLOT]] +// CHECK-NEXT: [[LOADED_LIST:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr @main.list +// CHECK-NEXT: [[LIST_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[LOADED_LIST]], 0 +// CHECK-NEXT: [[LIST_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[LOADED_LIST]], 1 +// CHECK: [[LIST_SLOT:%[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr [[LIST_DATA]], i64 0 +// CHECK-NEXT: [[LIST_FN:%[0-9]+]] = load { ptr, ptr }, ptr [[LIST_SLOT]] +// CHECK-NEXT: [[ITAB1:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.typ") +// CHECK: [[MAP_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[MAP_FN]], 1 +// CHECK-NEXT: [[MAP_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[MAP_FN]], 0 +// CHECK: [[MAP_RESULT:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code(ptr {{(nest|swiftself)}} [[MAP_ENV]], %"{{.*}}/runtime/internal/runtime.iface" [[MAP_ARG:%[0-9]+]]) +// CHECK: [[ITAB2:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.typ") +// CHECK: [[LIST_ENV:%[0-9]+]] = extractvalue { ptr, ptr } [[LIST_FN]], 1 +// CHECK-NEXT: [[LIST_CODE:%[0-9]+]] = extractvalue { ptr, ptr } [[LIST_FN]], 0 +// CHECK: [[LIST_RESULT:%[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.String" %__llgo_funcval_code1(ptr {{(nest|swiftself)}} [[LIST_ENV]], %"{{.*}}/runtime/internal/runtime.iface" [[LIST_ARG:%[0-9]+]]) +// CHECK-NEXT: [[SAME_RESULT:%[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" [[MAP_RESULT]], %"{{.*}}/runtime/internal/runtime.String" [[LIST_RESULT]]) +// CHECK-NEXT: [[RESULT_MISMATCH:%[0-9]+]] = xor i1 [[SAME_RESULT]], true +// CHECK-NEXT: br i1 [[RESULT_MISMATCH]], label %{{.*}}, label %{{.*}} +// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*typ).String"(ptr %0){{.*}} { +// CHECK: [[STRING_FIELD:%[0-9]+]] = getelementptr inbounds %main.typ, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[STRING_VALUE:%[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr [[STRING_FIELD]] +// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" [[STRING_VALUE]] func main() { t := &typ{"hello"} fn1 := op["demo"] @@ -87,13 +68,6 @@ func main() { } } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.String" @"main.(*typ).String"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.typ, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.String", ptr %1, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.String" %2 -// CHECK-NEXT: } - func (t *typ) String() string { return t.s } diff --git a/cl/_testrt/mask/in.go b/cl/_testrt/mask/in.go index 1f49038c29..e2a8752f0b 100644 --- a/cl/_testrt/mask/in.go +++ b/cl/_testrt/mask/in.go @@ -1,48 +1,8 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.mask\E|\Qmain.mask_shl\E|\Qmain.mask_shl8\E|\Qmain.mask_shl8u\E|\Qmain.mask_shr\E|\Qmain.mask_shr8\E|\Qmain.mask_shr8u\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 @main.mask(i8 1) -// CHECK-NEXT: %1 = sext i32 %0 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %1) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %2 = call i64 @main.mask_shl(i64 127, i64 5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %3 = call i8 @main.mask_shl8(i8 127, i64 5) -// CHECK-NEXT: %4 = sext i8 %3 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %5 = call i8 @main.mask_shl8u(i8 127, i64 5) -// CHECK-NEXT: %6 = zext i8 %5 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %6) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %7 = call i8 @main.mask_shl8(i8 127, i64 16) -// CHECK-NEXT: %8 = sext i8 %7 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %9 = call i8 @main.mask_shl8u(i8 127, i64 16) -// CHECK-NEXT: %10 = zext i8 %9 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %10) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %11 = call i64 @main.mask_shr(i64 127, i64 5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %11) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = call i8 @main.mask_shr8(i8 127, i64 5) -// CHECK-NEXT: %13 = sext i8 %12 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %14 = call i8 @main.mask_shr8u(i8 127, i64 5) -// CHECK-NEXT: %15 = zext i8 %14 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %15) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = call i8 @main.mask_shr8(i8 127, i64 16) -// CHECK-NEXT: %17 = sext i8 %16 to i64 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %17) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { println(mask(1)) println(mask_shl(127, 5)) @@ -56,96 +16,114 @@ func main() { println(mask_shr8(127, 16)) } -// CHECK-LABEL: define i32 @main.mask(i8 %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = sext i8 %0 to i32 -// CHECK-NEXT: %2 = shl i32 %1, 31 -// CHECK-NEXT: %3 = select i1 false, i32 0, i32 %2 -// CHECK-NEXT: %4 = ashr i32 %3, 31 -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } +// The sign bit must survive the two constant shifts, including the explicit +// overshift select inserted by the lowering. func mask(x int8) int32 { return int32(x) << 31 >> 31 } -// CHECK-LABEL: define i64 @main.mask_shl(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = icmp uge i64 %1, 64 -// CHECK-NEXT: %4 = shl i64 %0, %1 -// CHECK-NEXT: %5 = select i1 %3, i64 0, i64 %4 -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } func mask_shl(x int, y int) int { return x << y } -// CHECK-LABEL: define i8 @main.mask_shl8(i8 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = trunc i64 %1 to i8 -// CHECK-NEXT: %4 = icmp uge i8 %3, 8 -// CHECK-NEXT: %5 = shl i8 %0, %3 -// CHECK-NEXT: %6 = select i1 %4, i8 0, i8 %5 -// CHECK-NEXT: ret i8 %6 -// CHECK-NEXT: } func mask_shl8(x int8, y int) int8 { return x << y } -// CHECK-LABEL: define i8 @main.mask_shl8u(i8 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = trunc i64 %1 to i8 -// CHECK-NEXT: %4 = icmp uge i8 %3, 8 -// CHECK-NEXT: %5 = shl i8 %0, %3 -// CHECK-NEXT: %6 = select i1 %4, i8 0, i8 %5 -// CHECK-NEXT: ret i8 %6 -// CHECK-NEXT: } func mask_shl8u(x uint8, y int) uint8 { return x << y } -// CHECK-LABEL: define i64 @main.mask_shr(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = icmp uge i64 %1, 64 -// CHECK-NEXT: %4 = select i1 %3, i64 63, i64 %1 -// CHECK-NEXT: %5 = ashr i64 %0, %4 -// CHECK-NEXT: ret i64 %5 -// CHECK-NEXT: } +// Signed right shifts clamp an oversized count to width-1, preserving sign. func mask_shr(x int, y int) int { return x >> y } -// CHECK-LABEL: define i8 @main.mask_shr8(i8 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = trunc i64 %1 to i8 -// CHECK-NEXT: %4 = icmp uge i8 %3, 8 -// CHECK-NEXT: %5 = select i1 %4, i8 7, i8 %3 -// CHECK-NEXT: %6 = ashr i8 %0, %5 -// CHECK-NEXT: ret i8 %6 -// CHECK-NEXT: } func mask_shr8(x int8, y int) int8 { return x >> y } -// CHECK-LABEL: define i8 @main.mask_shr8u(i8 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = icmp slt i64 %1, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %2) -// CHECK-NEXT: %3 = trunc i64 %1 to i8 -// CHECK-NEXT: %4 = icmp uge i8 %3, 8 -// CHECK-NEXT: %5 = lshr i8 %0, %3 -// CHECK-NEXT: %6 = select i1 %4, i8 0, i8 %5 -// CHECK-NEXT: ret i8 %6 -// CHECK-NEXT: } +// Unsigned right shifts instead select zero for an oversized count. func mask_shr8u(x uint8, y int) uint8 { return x >> y } + +// CHECK-LABEL: define i32 @main.mask( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = sext i8 %[[TMP0]] to i32 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = shl i32 %[[TMP1]], 31 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = select i1 false, i32 0, i32 %[[TMP2]] +// CHECK-NEXT: %[[TMP4:[0-9]+]] = ashr i32 %[[TMP3]], 31 +// CHECK-NEXT: ret i32 %[[TMP4]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @main.mask_shl( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = icmp uge i64 %[[TMP1]], 64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = shl i64 %[[TMP0]], %[[TMP1]] +// CHECK-NEXT: %[[TMP5:[0-9]+]] = select i1 %[[TMP3]], i64 0, i64 %[[TMP4]] +// CHECK-NEXT: ret i64 %[[TMP5]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i8 @main.mask_shl8( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = trunc i64 %[[TMP1]] to i8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = icmp uge i8 %[[TMP3]], 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = shl i8 %[[TMP0]], %[[TMP3]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = select i1 %[[TMP4]], i8 0, i8 %[[TMP5]] +// CHECK-NEXT: ret i8 %[[TMP6]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i8 @main.mask_shl8u( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = trunc i64 %[[TMP1]] to i8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = icmp uge i8 %[[TMP3]], 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = shl i8 %[[TMP0]], %[[TMP3]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = select i1 %[[TMP4]], i8 0, i8 %[[TMP5]] +// CHECK-NEXT: ret i8 %[[TMP6]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @main.mask_shr( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = icmp uge i64 %[[TMP1]], 64 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = select i1 %[[TMP3]], i64 63, i64 %[[TMP1]] +// CHECK-NEXT: %[[TMP5:[0-9]+]] = ashr i64 %[[TMP0]], %[[TMP4]] +// CHECK-NEXT: ret i64 %[[TMP5]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i8 @main.mask_shr8( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = trunc i64 %[[TMP1]] to i8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = icmp uge i8 %[[TMP3]], 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = select i1 %[[TMP4]], i8 7, i8 %[[TMP3]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = ashr i8 %[[TMP0]], %[[TMP5]] +// CHECK-NEXT: ret i8 %[[TMP6]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i8 @main.mask_shr8u( +// CHECK-SAME: i8 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = icmp slt i64 %[[TMP1]], 0 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNegativeShift"(i1 %[[TMP2]]) +// CHECK-NEXT: %[[TMP3:[0-9]+]] = trunc i64 %[[TMP1]] to i8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = icmp uge i8 %[[TMP3]], 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = lshr i8 %[[TMP0]], %[[TMP3]] +// CHECK-NEXT: %[[TMP6:[0-9]+]] = select i1 %[[TMP4]], i8 0, i8 %[[TMP5]] +// CHECK-NEXT: ret i8 %[[TMP6]] +// CHECK-NEXT: } diff --git a/cl/_testrt/methodthunk/in.go b/cl/_testrt/methodthunk/in.go index 95e01b60f8..e79745db1a 100644 --- a/cl/_testrt/methodthunk/in.go +++ b/cl/_testrt/methodthunk/in.go @@ -1,6 +1,13 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.(*outer).M$thunk\E|\Qmain.(*InnerInt).M$thunk\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main +// Method expressions use signature-specific thunks. In particular, the two +// M methods below must not become interchangeable closure types. + +// CHECK: {{^}}@[[GLOB17:[0-9]+]] = private unnamed_addr constant [47 x i8] c"type assertion should have failed but succeeded", align 1{{$}} + type inner struct { x int } @@ -10,24 +17,12 @@ type outer struct { inner } -// CHECK-LABEL: define i64 @"main.(*InnerInt).M"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.InnerInt, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load i64, ptr %1, align 8 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } func (*inner) M() {} type InnerInt struct { X int } -// CHECK-LABEL: define i64 @"main.(*OuterInt).M"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.OuterInt, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = call i64 @"main.(*InnerInt).M"(ptr %1) -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } type OuterInt struct { Y int InnerInt @@ -37,98 +32,140 @@ func (i *InnerInt) M() int { return i.X } +func main() { + var v1 any = (*outer).M + var v2 any = (*InnerInt).M + f1, ok := v1.(func(*outer)) + println(f1, ok) + f2, ok := v2.(func(*outer)) + println(f2, ok) + if ok { + panic("type assertion should have failed but succeeded") + } +} + +func (m *outer) M() {} + // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.(*outer).M$thunk", ptr null }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store { ptr, ptr } { ptr @"main.(*InnerInt).M$thunk", ptr null }, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr %2, 1 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 0 -// CHECK-NEXT: %5 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr %4) -// CHECK-NEXT: br i1 %5, label %_llgo_3, label %_llgo_4 +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store { ptr, ptr } { ptr @"main.(*outer).M$thunk", ptr null }, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr undef }, ptr %[[TMP0]], 1 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store { ptr, ptr } { ptr @"main.(*InnerInt).M$thunk", ptr null }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$WmZDdXg-2mo-o0lqY2QOZoNsd6Ks2TbzdX4upfVJ3j8", ptr undef }, ptr %[[TMP2]], 1 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr %[[TMP4]]) +// DARWIN-ARM64-NEXT: br i1 %[[TMP5]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.(*outer).M$thunk", ptr null }, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr undef }, ptr %[[TMP1]], 1 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.(*InnerInt).M$thunk", ptr null }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_closure$WmZDdXg-2mo-o0lqY2QOZoNsd6Ks2TbzdX4upfVJ3j8", ptr undef }, ptr %[[TMP3]], 1 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr %[[TMP5]]) +// LINUX-AMD64-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_8 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @17, i64 47 }, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %7) +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB17]], i64 47 }, ptr %[[TMP6]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]]) +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB17]], i64 47 }, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP7]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load ptr, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP10]], ptr %[[TMP12]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_8 +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: // CHECK-NEXT: ret void // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 1 -// CHECK-NEXT: %9 = load { ptr, ptr }, ptr %8, align 8 -// CHECK-NEXT: %10 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %9, 0 -// CHECK-NEXT: %11 = insertvalue { { ptr, ptr }, i1 } %10, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP9]], 0 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP10]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP2]], 1 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP14]], 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP15]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB5:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: br label %_llgo_[[BB5]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %12 = phi { { ptr, ptr }, i1 } [ %11, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %13 = extractvalue { { ptr, ptr }, i1 } %12, 0 -// CHECK-NEXT: %14 = extractvalue { { ptr, ptr }, i1 } %12, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %15) +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP11]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP12]], 0 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP12]], 1 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP13]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP15]]) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP16]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP17]], 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP17]], 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP18]], 0 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP20]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %14) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP14]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP19]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 0 -// CHECK-NEXT: %17 = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr %16) -// CHECK-NEXT: br i1 %17, label %_llgo_6, label %_llgo_7 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP3]], 0 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr %[[TMP16]]) +// DARWIN-ARM64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB6:[0-9]+]], label %_llgo_[[BB7:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure$p06T23YeLPAu3v8p2hFtiY7Rlq6V9sr5dXePfqXtx6M", ptr %[[TMP21]]) +// LINUX-AMD64-NEXT: br i1 %[[TMP22]], label %_llgo_[[BB6:[0-9]+]], label %_llgo_[[BB7:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %3, 1 -// CHECK-NEXT: %19 = load { ptr, ptr }, ptr %18, align 8 -// CHECK-NEXT: %20 = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %19, 0 -// CHECK-NEXT: %21 = insertvalue { { ptr, ptr }, i1 } %20, i1 true, 1 -// CHECK-NEXT: br label %_llgo_8 +// CHECK-NEXT: _llgo_[[BB6]]: +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP3]], 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP19]], 0 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP20]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP4]], 1 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP23]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } undef, { ptr, ptr } %[[TMP24]], 0 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = insertvalue { { ptr, ptr }, i1 } %[[TMP25]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB8:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: br label %_llgo_8 +// CHECK-NEXT: _llgo_[[BB7]]: +// CHECK-NEXT: br label %_llgo_[[BB8]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_6 -// CHECK-NEXT: %22 = phi { { ptr, ptr }, i1 } [ %21, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] -// CHECK-NEXT: %23 = extractvalue { { ptr, ptr }, i1 } %22, 0 -// CHECK-NEXT: %24 = extractvalue { { ptr, ptr }, i1 } %22, 1 -// CHECK-NEXT: %25 = extractvalue { ptr, ptr } %23, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %25) +// CHECK-NEXT: _llgo_[[BB8]]: +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP21]], %_llgo_[[BB6]] ], [ zeroinitializer, %_llgo_[[BB7]] ] +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP22]], 0 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP22]], 1 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP23]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP25]]) +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = phi { { ptr, ptr }, i1 } [ %[[TMP26]], %_llgo_[[BB6]] ], [ zeroinitializer, %_llgo_[[BB7]] ] +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP27]], 0 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = extractvalue { { ptr, ptr }, i1 } %[[TMP27]], 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP28]], 0 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP30]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %24) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP24]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP29]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br i1 %24, label %_llgo_1, label %_llgo_2 -// CHECK-NEXT: } -func main() { - var v1 any = (*outer).M - var v2 any = (*InnerInt).M - f1, ok := v1.(func(*outer)) - println(f1, ok) - f2, ok := v2.(func(*outer)) - println(f2, ok) - if ok { - panic("type assertion should have failed but succeeded") - } -} - -// CHECK-LABEL: define void @"main.(*outer).M"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret void +// DARWIN-ARM64-NEXT: br i1 %[[TMP24]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] +// LINUX-AMD64-NEXT: br i1 %[[TMP29]], label %_llgo_[[BB1]], label %_llgo_[[BB2]] // CHECK-NEXT: } -func (m *outer) M() {} -// CHECK-LABEL: define void @"main.(*outer).M$thunk"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"main.(*outer).M"(ptr %0) +// CHECK-LABEL: define void @"main.(*outer).M$thunk"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: call void @"main.(*outer).M"(ptr %[[TMP0]]) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define i64 @"main.(*InnerInt).M$thunk"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call i64 @"main.(*InnerInt).M"(ptr %0) -// CHECK-NEXT: ret i64 %1 +// CHECK-LABEL: define i64 @"main.(*InnerInt).M$thunk"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call i64 @"main.(*InnerInt).M"(ptr %[[TMP0]]) +// CHECK-NEXT: ret i64 %[[TMP1]] // CHECK-NEXT: } diff --git a/cl/_testrt/named/in.go b/cl/_testrt/named/in.go index 540e414d5b..2122678fdd 100644 --- a/cl/_testrt/named/in.go +++ b/cl/_testrt/named/in.go @@ -1,8 +1,12 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/lib/c" +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [19 x i8] c"%d %d %d %d %d %d\0A\00", align 1{{$}} + type mSpanList struct { first *mspan last *mspan @@ -22,98 +26,9 @@ type mspan struct { check func(int) int } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: store ptr %1, ptr %0, align 8 -// CHECK-NEXT: %2 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %main.mspan, ptr %2, i32 0, i32 4 -// CHECK-NEXT: store i64 100, ptr %3, align 8 -// CHECK-NEXT: %4 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %5 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %6 = getelementptr inbounds %main.mspan, ptr %4, i32 0, i32 0 -// CHECK-NEXT: store ptr %5, ptr %6, align 8 -// CHECK-NEXT: %7 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %8 = getelementptr inbounds %main.mspan, ptr %7, i32 0, i32 0 -// CHECK-NEXT: %9 = load ptr, ptr %8, align 8 -// CHECK-NEXT: %10 = getelementptr inbounds %main.mspan, ptr %9, i32 0, i32 4 -// CHECK-NEXT: store i64 200, ptr %10, align 8 -// CHECK-NEXT: %11 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %13 = getelementptr inbounds %main.mspan, ptr %11, i32 0, i32 2 -// CHECK-NEXT: store ptr %12, ptr %13, align 8 -// CHECK-NEXT: %14 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %15 = getelementptr inbounds %main.mspan, ptr %14, i32 0, i32 2 -// CHECK-NEXT: %16 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) -// CHECK-NEXT: %18 = getelementptr inbounds %main.mSpanList, ptr %16, i32 0, i32 1 -// CHECK-NEXT: store ptr %17, ptr %18, align 8 -// CHECK-NEXT: %19 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %20 = getelementptr inbounds %main.mspan, ptr %19, i32 0, i32 2 -// CHECK-NEXT: %21 = load ptr, ptr %20, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds %main.mSpanList, ptr %21, i32 0, i32 1 -// CHECK-NEXT: %23 = load ptr, ptr %22, align 8 -// CHECK-NEXT: %24 = getelementptr inbounds %main.mspan, ptr %23, i32 0, i32 4 -// CHECK-NEXT: store i64 300, ptr %24, align 8 -// CHECK-NEXT: %25 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %26 = getelementptr inbounds %main.mspan, ptr %25, i32 0, i32 3 -// CHECK-NEXT: %27 = getelementptr inbounds %main.minfo, ptr %26, i32 0, i32 1 -// CHECK-NEXT: store i64 10, ptr %27, align 8 -// CHECK-NEXT: %28 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %29 = getelementptr inbounds %main.mspan, ptr %28, i32 0, i32 3 -// CHECK-NEXT: %30 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %31 = getelementptr inbounds %main.minfo, ptr %29, i32 0, i32 0 -// CHECK-NEXT: store ptr %30, ptr %31, align 8 -// CHECK-NEXT: %32 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %33 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: %34 = getelementptr inbounds { ptr }, ptr %33, i32 0, i32 0 -// CHECK-NEXT: store ptr %0, ptr %34, align 8 -// CHECK-NEXT: %35 = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %33, 1 -// CHECK-NEXT: %36 = getelementptr inbounds %main.mspan, ptr %32, i32 0, i32 5 -// CHECK-NEXT: store { ptr, ptr } %35, ptr %36, align 8 -// CHECK-NEXT: %37 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %38 = getelementptr inbounds %main.mspan, ptr %37, i32 0, i32 0 -// CHECK-NEXT: %39 = load ptr, ptr %38, align 8 -// CHECK-NEXT: %40 = getelementptr inbounds %main.mspan, ptr %39, i32 0, i32 4 -// CHECK-NEXT: %41 = load i64, ptr %40, align 8 -// CHECK-NEXT: %42 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %43 = getelementptr inbounds %main.mspan, ptr %42, i32 0, i32 2 -// CHECK-NEXT: %44 = load ptr, ptr %43, align 8 -// CHECK-NEXT: %45 = getelementptr inbounds %main.mSpanList, ptr %44, i32 0, i32 1 -// CHECK-NEXT: %46 = load ptr, ptr %45, align 8 -// CHECK-NEXT: %47 = getelementptr inbounds %main.mspan, ptr %46, i32 0, i32 4 -// CHECK-NEXT: %48 = load i64, ptr %47, align 8 -// CHECK-NEXT: %49 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %50 = getelementptr inbounds %main.mspan, ptr %49, i32 0, i32 3 -// CHECK-NEXT: %51 = getelementptr inbounds %main.minfo, ptr %50, i32 0, i32 1 -// CHECK-NEXT: %52 = load i64, ptr %51, align 8 -// CHECK-NEXT: %53 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %54 = getelementptr inbounds %main.mspan, ptr %53, i32 0, i32 3 -// CHECK-NEXT: %55 = getelementptr inbounds %main.minfo, ptr %54, i32 0, i32 0 -// CHECK-NEXT: %56 = load ptr, ptr %55, align 8 -// CHECK-NEXT: %57 = getelementptr inbounds %main.mspan, ptr %56, i32 0, i32 4 -// CHECK-NEXT: %58 = load i64, ptr %57, align 8 -// CHECK-NEXT: %59 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %60 = getelementptr inbounds %main.mspan, ptr %59, i32 0, i32 5 -// CHECK-NEXT: %61 = load { ptr, ptr }, ptr %60, align 8 -// CHECK-NEXT: %62 = extractvalue { ptr, ptr } %61, 1 -// CHECK-NEXT: %63 = extractvalue { ptr, ptr } %61, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %63) -// CHECK-NEXT: %64 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %62, i64 -2) -// CHECK-NEXT: %65 = load ptr, ptr %0, align 8 -// CHECK-NEXT: %66 = getelementptr inbounds %main.mspan, ptr %65, i32 0, i32 3 -// CHECK-NEXT: %67 = getelementptr inbounds %main.minfo, ptr %66, i32 0, i32 0 -// CHECK-NEXT: %68 = load ptr, ptr %67, align 8 -// CHECK-NEXT: %69 = getelementptr inbounds %main.mspan, ptr %68, i32 0, i32 5 -// CHECK-NEXT: %70 = load { ptr, ptr }, ptr %69, align 8 -// CHECK-NEXT: %71 = extractvalue { ptr, ptr } %70, 1 -// CHECK-NEXT: %72 = extractvalue { ptr, ptr } %70, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %72) -// CHECK-NEXT: %73 = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %71, i64 -3) -// CHECK-NEXT: %74 = call i32 (ptr, ...) @printf(ptr @0, i64 %41, i64 %48, i64 %52, i64 %58, i64 %64, i64 %73) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// The recursive named structure is rooted through a slot captured by check. +// The six printf values follow the source field paths, including two calls to +// the same stored closure reached directly and through info.span. func main() { m := &mspan{} m.value = 100 @@ -127,16 +42,111 @@ func main() { m.check = func(n int) int { return m.value * n } - // CHECK-LABEL: define i64 @"main.main$1"(ptr {{(nest|swiftself)}} %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load { ptr }, ptr %0, align 8 - // CHECK-NEXT: %3 = extractvalue { ptr } %2, 0 - // CHECK-NEXT: %4 = load ptr, ptr %3, align 8 - // CHECK-NEXT: %5 = getelementptr inbounds %main.mspan, ptr %4, i32 0, i32 4 - // CHECK-NEXT: %6 = load i64, ptr %5, align 8 - // CHECK-NEXT: %7 = mul i64 %6, %1 - // CHECK-NEXT: ret i64 %7 - // CHECK-NEXT: } c.Printf(c.Str("%d %d %d %d %d %d\n"), m.next.value, m.list.last.value, m.info.info, m.info.span.value, m.check(-2), m.info.span.check(-3)) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) +// CHECK-NEXT: store ptr %[[TMP1]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP2]], i32 0, i32 4 +// CHECK-NEXT: store i64 100, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP4]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[TMP5]], ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP7]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP9]], i32 0, i32 4 +// CHECK-NEXT: store i64 200, ptr %[[TMP10]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP11]], i32 0, i32 2 +// CHECK-NEXT: store ptr %[[TMP12]], ptr %[[TMP13]], align 8 +// CHECK-NEXT: %[[TMP14:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP14]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// CHECK-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 64) +// CHECK-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.mSpanList, ptr %[[TMP16]], i32 0, i32 1 +// CHECK-NEXT: store ptr %[[TMP17]], ptr %[[TMP18]], align 8 +// CHECK-NEXT: %[[TMP19:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP19]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// CHECK-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %main.mSpanList, ptr %[[TMP21]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// CHECK-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP23]], i32 0, i32 4 +// CHECK-NEXT: store i64 300, ptr %[[TMP24]], align 8 +// CHECK-NEXT: %[[TMP25:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP25]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds %main.minfo, ptr %[[TMP26]], i32 0, i32 1 +// CHECK-NEXT: store i64 10, ptr %[[TMP27]], align 8 +// CHECK-NEXT: %[[TMP28:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP28]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP31:[0-9]+]] = getelementptr inbounds %main.minfo, ptr %[[TMP29]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[TMP30]], ptr %[[TMP31]], align 8 +// CHECK-NEXT: %[[TMP32:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP33:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: %[[TMP34:[0-9]+]] = getelementptr inbounds { ptr }, ptr %[[TMP33]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[TMP0]], ptr %[[TMP34]], align 8 +// CHECK-NEXT: %[[TMP35:[0-9]+]] = insertvalue { ptr, ptr } { ptr @"main.main$1", ptr undef }, ptr %[[TMP33]], 1 +// CHECK-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP32]], i32 0, i32 5 +// CHECK-NEXT: store { ptr, ptr } %[[TMP35]], ptr %[[TMP36]], align 8 +// CHECK-NEXT: %[[TMP37:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP38:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP37]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP39:[0-9]+]] = load ptr, ptr %[[TMP38]], align 8 +// CHECK-NEXT: %[[TMP40:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP39]], i32 0, i32 4 +// CHECK-NEXT: %[[TMP41:[0-9]+]] = load i64, ptr %[[TMP40]], align 8 +// CHECK-NEXT: %[[TMP42:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP43:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP42]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP44:[0-9]+]] = load ptr, ptr %[[TMP43]], align 8 +// CHECK-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds %main.mSpanList, ptr %[[TMP44]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP46:[0-9]+]] = load ptr, ptr %[[TMP45]], align 8 +// CHECK-NEXT: %[[TMP47:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP46]], i32 0, i32 4 +// CHECK-NEXT: %[[TMP48:[0-9]+]] = load i64, ptr %[[TMP47]], align 8 +// CHECK-NEXT: %[[TMP49:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP50:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP49]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP51:[0-9]+]] = getelementptr inbounds %main.minfo, ptr %[[TMP50]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP52:[0-9]+]] = load i64, ptr %[[TMP51]], align 8 +// CHECK-NEXT: %[[TMP53:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP54:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP53]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP55:[0-9]+]] = getelementptr inbounds %main.minfo, ptr %[[TMP54]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP56:[0-9]+]] = load ptr, ptr %[[TMP55]], align 8 +// CHECK-NEXT: %[[TMP57:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP56]], i32 0, i32 4 +// CHECK-NEXT: %[[TMP58:[0-9]+]] = load i64, ptr %[[TMP57]], align 8 +// CHECK-NEXT: %[[TMP59:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP60:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP59]], i32 0, i32 5 +// CHECK-NEXT: %[[TMP61:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP60]], align 8 +// CHECK-NEXT: %[[TMP62:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP61]], 1 +// CHECK-NEXT: %[[TMP63:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP61]], 0 +// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP63]]) +// CHECK-NEXT: %[[TMP64:[0-9]+]] = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP62]], i64 -2) +// CHECK-NEXT: %[[TMP65:[0-9]+]] = load ptr, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP66:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP65]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP67:[0-9]+]] = getelementptr inbounds %main.minfo, ptr %[[TMP66]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP68:[0-9]+]] = load ptr, ptr %[[TMP67]], align 8 +// CHECK-NEXT: %[[TMP69:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP68]], i32 0, i32 5 +// CHECK-NEXT: %[[TMP70:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP69]], align 8 +// CHECK-NEXT: %[[TMP71:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP70]], 1 +// CHECK-NEXT: %[[TMP72:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP70]], 0 +// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %[[TMP72]]) +// CHECK-NEXT: %[[TMP73:[0-9]+]] = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %[[TMP71]], i64 -3) +// CHECK-NEXT: %[[TMP74:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP41]], i64 %[[TMP48]], i64 %[[TMP52]], i64 %[[TMP58]], i64 %[[TMP64]], i64 %[[TMP73]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @"main.main$1"( +// CHECK-SAME: ptr {{(nest|swiftself)}} %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load { ptr }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = extractvalue { ptr } %[[TMP2]], 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.mspan, ptr %[[TMP4]], i32 0, i32 4 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load i64, ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = mul i64 %[[TMP6]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP7]] +// CHECK-NEXT: } diff --git a/cl/_testrt/namedslice/in.go b/cl/_testrt/namedslice/in.go index 5a0368e06c..7319d7d36a 100644 --- a/cl/_testrt/namedslice/in.go +++ b/cl/_testrt/namedslice/in.go @@ -4,13 +4,18 @@ package main type MyBytes []byte // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %{{[0-9]+}} = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr %{{[0-9]+}}, align 8 -// CHECK-NEXT: %{{[0-9]+}} = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr %{{[0-9]+}}, 1 -// CHECK: icmp eq ptr %{{[0-9]+}}, @_llgo_main.MyBytes -// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %{{[0-9]+}}) -// CHECK: } +// CHECK: [[DATA:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 24) +// CHECK-NEXT: store %"{{.*}}Slice" { ptr @"__llgo.moduleZeroSizedAlloc$", i64 0, i64 0 }, ptr [[DATA]] +// CHECK-NEXT: [[BOXED:%[0-9]+]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.MyBytes, ptr undef }, ptr [[DATA]], 1 +// CHECK-NEXT: [[TYPE:%[0-9]+]] = extractvalue %"{{.*}}eface" [[BOXED]], 0 +// CHECK-NEXT: [[MATCH:%[0-9]+]] = icmp eq ptr [[TYPE]], @_llgo_main.MyBytes +// CHECK: call void @"{{.*}}Panic"(%"{{.*}}eface" {{.*}}) +// CHECK: [[ASSERT_DATA:%[0-9]+]] = extractvalue %"{{.*}}eface" [[BOXED]], 1 +// CHECK-NEXT: [[ASSERT_VALUE:%[0-9]+]] = load %"{{.*}}Slice", ptr [[ASSERT_DATA]] +// CHECK: [[ASSERT_PAIR:%[0-9]+]] = phi { %"{{.*}}Slice", i1 } [ {{.*}}, %{{.*}} ], [ zeroinitializer, %{{.*}} ] +// CHECK-NEXT: extractvalue { %"{{.*}}Slice", i1 } [[ASSERT_PAIR]], 0 +// CHECK-NEXT: [[OK:%[0-9]+]] = extractvalue { %"{{.*}}Slice", i1 } [[ASSERT_PAIR]], 1 +// CHECK-NEXT: br i1 [[OK]], label %{{[^,]+}}, label %{{[^ ]+}} func main() { var i any = MyBytes{} _, ok := i.(MyBytes) diff --git a/cl/_testrt/nextblock/in.go b/cl/_testrt/nextblock/in.go index 3c5046175a..4116b402cb 100644 --- a/cl/_testrt/nextblock/in.go +++ b/cl/_testrt/nextblock/in.go @@ -1,7 +1,48 @@ // LITTEST package main -// CHECK: {{^}}@{{[0-9]+}} = private unnamed_addr constant [3 x i8] c"bye", align 1{{$}} +// The defer must survive the loop/control-flow joins and be released on the +// shared exit path. +// CHECK: [[BYE:@[0-9]+]] = private unnamed_addr constant [3 x i8] c"bye" +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[PREV_DEFER:%.*]] = call ptr @"{{.*}}GetThreadDefer"() +// CHECK: [[FRAME:%.*]] = call ptr @"{{.*}}AllocU"(i64 48) +// CHECK: store ptr [[PREV_DEFER]], ptr {{%.*}} +// CHECK: call void @"{{.*}}SetThreadDefer"(ptr [[FRAME]]) +// CHECK: [[FLAGS:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 1 +// CHECK: [[HEAD:%.*]] = getelementptr inbounds %"{{.*}}Defer", ptr [[FRAME]], i32 0, i32 5 +// The first empty range still forms a valid loop and reaches defer registration. +// CHECK: [[FIRST_I:%.*]] = phi i64 [ -1, %{{.*}} ], [ [[FIRST_NEXT:%.*]], %{{.*}} ] +// CHECK-NEXT: [[FIRST_NEXT]] = add i64 [[FIRST_I]], 1 +// CHECK-NEXT: [[FIRST_MORE:%.*]] = icmp slt i64 [[FIRST_NEXT]], 0 +// CHECK-NEXT: br i1 [[FIRST_MORE]], label %{{.*}}, label %{{.*}} +// CHECK: [[OLD_FLAGS:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[DEFER_FLAGS:%.*]] = or i64 [[OLD_FLAGS]], 1 +// CHECK-NEXT: store i64 [[DEFER_FLAGS]], ptr [[FLAGS]] +// CHECK: [[OLD_HEAD:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[NODE:%.*]] = call ptr @"{{.*}}AllocU"(i64 32) +// CHECK: [[NODE_PREV:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String" }, ptr [[NODE]], i32 0, i32 0 +// CHECK-NEXT: store ptr [[OLD_HEAD]], ptr [[NODE_PREV]] +// CHECK: [[NODE_TEXT:%.*]] = getelementptr inbounds { ptr, i64, %"{{.*}}String" }, ptr [[NODE]], i32 0, i32 2 +// CHECK-NEXT: store %"{{.*}}String" { ptr [[BYE]], i64 3 }, ptr [[NODE_TEXT]] +// CHECK-NEXT: store ptr [[NODE]], ptr [[HEAD]] +// The second empty range exits through the shared cleanup instead of bypassing it. +// CHECK: [[SECOND_I:%.*]] = phi i64 [ -1, %{{.*}} ], [ [[SECOND_NEXT:%.*]], %{{.*}} ] +// CHECK-NEXT: [[SECOND_NEXT]] = add i64 [[SECOND_I]], 1 +// CHECK-NEXT: [[SECOND_MORE:%.*]] = icmp slt i64 [[SECOND_NEXT]], 0 +// CHECK-NEXT: br i1 [[SECOND_MORE]], label %{{.*}}, label %{{.*}} +// CHECK: [[EXIT_FLAGS:%.*]] = load i64, ptr [[FLAGS]] +// CHECK-NEXT: [[DEFER_BIT:%.*]] = and i64 [[EXIT_FLAGS]], 1 +// CHECK-NEXT: [[HAS_DEFER:%.*]] = icmp ne i64 [[DEFER_BIT]], 0 +// CHECK: [[NODE_CANDIDATE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK-NEXT: icmp ne ptr [[NODE_CANDIDATE]], null +// CHECK: [[ACTIVE_NODE:%.*]] = load ptr, ptr [[HEAD]] +// CHECK: [[NODE_VALUE:%.*]] = load { ptr, i64, %"{{.*}}String" }, ptr [[ACTIVE_NODE]] +// CHECK: [[NEXT_NODE:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[NODE_VALUE]], 0 +// CHECK-NEXT: store ptr [[NEXT_NODE]], ptr [[HEAD]] +// CHECK: [[DEFER_TEXT:%.*]] = extractvalue { ptr, i64, %"{{.*}}String" } [[NODE_VALUE]], 2 +// CHECK-NEXT: call void @"{{.*}}FreeDeferNode"(ptr [[ACTIVE_NODE]]) +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[DEFER_TEXT]]) func main() { syms := []int{} @@ -11,128 +52,3 @@ func main() { for range syms { } } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.GetThreadDefer"() -// CHECK-NEXT: %1 = alloca i8 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: %3 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %5 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 2 -// CHECK-NEXT: store ptr %0, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_9), ptr %6, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %2) -// CHECK-NEXT: %7 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 1 -// CHECK-NEXT: %8 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 3 -// CHECK-NEXT: %9 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 4 -// CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, i32 0, i32 5 -// CHECK-NEXT: store ptr null, ptr %10, align 8 -// CHECK-NEXT: %11 = call i32 @{{(__)?}}sigsetjmp(ptr %1, i32 0) -// CHECK-NEXT: %12 = icmp eq i32 %11, 0 -// CHECK-NEXT: br i1 %12, label %_llgo_8, label %_llgo_11 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_8 -// CHECK-NEXT: %13 = phi i64 [ -1, %_llgo_8 ], [ %14, %_llgo_2 ] -// CHECK-NEXT: %14 = add i64 %13, 1 -// CHECK-NEXT: %15 = icmp slt i64 %14, 0 -// CHECK-NEXT: br i1 %15, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %16 = load i64, ptr %7, align 8 -// CHECK-NEXT: %17 = or i64 %16, 1 -// CHECK-NEXT: store i64 %17, ptr %7, align 8 -// CHECK-NEXT: %18 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 32) -// CHECK-NEXT: %20 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %19, i32 0, i32 0 -// CHECK-NEXT: store ptr %18, ptr %20, align 8 -// CHECK-NEXT: %21 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %19, i32 0, i32 1 -// CHECK-NEXT: store i64 0, ptr %21, align 8 -// CHECK-NEXT: %22 = getelementptr inbounds { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %19, i32 0, i32 2 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }, ptr %22, align 8 -// CHECK-NEXT: store ptr %19, ptr %10, align 8 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_10 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_6, %_llgo_3 -// CHECK-NEXT: %23 = phi i64 [ -1, %_llgo_3 ], [ %24, %_llgo_6 ] -// CHECK-NEXT: %24 = add i64 %23, 1 -// CHECK-NEXT: %25 = icmp slt i64 %24, 0 -// CHECK-NEXT: br i1 %25, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_12), ptr %9, align 8 -// CHECK-NEXT: br label %_llgo_9 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_11, %_llgo_7 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %8, align 8 -// CHECK-NEXT: %26 = load i64, ptr %7, align 8 -// CHECK-NEXT: %27 = and i64 %26, 1 -// CHECK-NEXT: %28 = icmp ne i64 %27, 0 -// CHECK-NEXT: br i1 %28, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_11, %_llgo_14 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Rethrow"(ptr %0) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_0 -// CHECK-NEXT: store ptr blockaddress(@main.main, %_llgo_10), ptr %9, align 8 -// CHECK-NEXT: %29 = load ptr, ptr %8, align 8 -// CHECK-NEXT: indirectbr ptr %29, [label %_llgo_10, label %_llgo_9] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_14 -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_9 -// CHECK-NEXT: %30 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %31 = icmp ne ptr %30, null -// CHECK-NEXT: br i1 %31, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_16, %_llgo_9 -// CHECK-NEXT: %32 = load %"{{.*}}/runtime/internal/runtime.Defer", ptr %2, align 8 -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Defer" %32, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.SetThreadDefer"(ptr %33) -// CHECK-NEXT: %34 = load ptr, ptr %9, align 8 -// CHECK-NEXT: indirectbr ptr %34, [label %_llgo_10, label %_llgo_12] -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_13 -// CHECK-NEXT: %35 = load ptr, ptr %10, align 8 -// CHECK-NEXT: %36 = load { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" }, ptr %35, align 8 -// CHECK-NEXT: %37 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %36, 0 -// CHECK-NEXT: store ptr %37, ptr %10, align 8 -// CHECK-NEXT: %38 = extractvalue { ptr, i64, %"{{.*}}/runtime/internal/runtime.String" } %36, 2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.FreeDeferNode"(ptr %35) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %38) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_15, %_llgo_13 -// CHECK-NEXT: br label %_llgo_14 -// CHECK-NEXT: } diff --git a/cl/_testrt/panic/in.go b/cl/_testrt/panic/in.go index 168ca1cb2c..d39cfee88a 100644 --- a/cl/_testrt/panic/in.go +++ b/cl/_testrt/panic/in.go @@ -2,13 +2,12 @@ package main // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 13 }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %0, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: unreachable -// CHECK-NEXT: } +// CHECK: [[PANIC_DATA:%[0-9]+]] = call ptr @"{{.*}}AllocU"(i64 16) +// CHECK-NEXT: store %"{{.*}}String" { ptr @{{[0-9]+}}, i64 13 }, ptr [[PANIC_DATA]] +// CHECK-NEXT: [[PANIC_VALUE:%[0-9]+]] = insertvalue %"{{.*}}eface" { ptr @_llgo_string, ptr undef }, ptr [[PANIC_DATA]], 1 +// CHECK-NEXT: call void @"{{.*}}Panic"(%"{{.*}}eface" [[PANIC_VALUE]]) +// CHECK-NEXT: unreachable + func main() { panic("panic message") } diff --git a/cl/_testrt/qsort/in.go b/cl/_testrt/qsort/in.go index 6fffbcc75c..78ecf74b6b 100644 --- a/cl/_testrt/qsort/in.go +++ b/cl/_testrt/qsort/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.main$1\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -7,60 +9,65 @@ import ( "github.com/goplus/lib/c" ) +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} + //go:linkname qsort C.qsort func qsort(base c.Pointer, count, elem uintptr, compar func(a, b c.Pointer) c.Int) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %0, i64 3 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %0, i64 4 -// CHECK-NEXT: store i64 100, ptr %1, align 8 -// CHECK-NEXT: store i64 8, ptr %2, align 8 -// CHECK-NEXT: store i64 23, ptr %3, align 8 -// CHECK-NEXT: store i64 2, ptr %4, align 8 -// CHECK-NEXT: store i64 7, ptr %5, align 8 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: call void @qsort(ptr %6, i64 5, i64 8, ptr @"main.main$1") -// CHECK-NEXT: %7 = load [5 x i64], ptr %0, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %8 = phi i64 [ -1, %_llgo_0 ], [ %9, %_llgo_2 ] -// CHECK-NEXT: %9 = add i64 %8, 1 -// CHECK-NEXT: %10 = icmp slt i64 %9, 5 -// CHECK-NEXT: br i1 %10, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %11 = icmp slt i64 %9, 0 -// CHECK-NEXT: %12 = icmp uge i64 %9, 5 -// CHECK-NEXT: %13 = or i1 %12, %11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %13, {{.*}}) -// CHECK-NEXT: %14 = getelementptr inbounds i64, ptr %0, i64 %9 -// CHECK-NEXT: %15 = load i64, ptr %14, align 8 -// CHECK-NEXT: %16 = call i32 (ptr, ...) @printf(ptr @0, i64 %15) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { a := [...]int{100, 8, 23, 2, 7} qsort(c.Pointer(&a[0]), 5, unsafe.Sizeof(0), func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) }) - // CHECK-LABEL: define i32 @"main.main$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } for _, v := range a { c.Printf(c.Str("%d\n"), v) } } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 1 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 2 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 3 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 4 +// CHECK-NEXT: store i64 100, ptr %[[TMP1]], align 8 +// CHECK-NEXT: store i64 8, ptr %[[TMP2]], align 8 +// CHECK-NEXT: store i64 23, ptr %[[TMP3]], align 8 +// CHECK-NEXT: store i64 2, ptr %[[TMP4]], align 8 +// CHECK-NEXT: store i64 7, ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 0 +// CHECK-NEXT: call void @qsort(ptr %[[TMP6]], i64 5, i64 8, ptr @"main.main$1") +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load [5 x i64], ptr %[[TMP0]], align 8 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: %[[TMP8:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP9:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// CHECK-NEXT: %[[TMP9]] = add i64 %[[TMP8]], 1 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = icmp slt i64 %[[TMP9]], 5 +// CHECK-NEXT: br i1 %[[TMP10]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: %[[TMP11:[0-9]+]] = icmp slt i64 %[[TMP9]], 0 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = icmp uge i64 %[[TMP9]], 5 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = or i1 %[[TMP12]], %[[TMP11]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP13]], i64 %[[TMP9]], i1 true, i64 5) +// CHECK-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 %[[TMP9]] +// CHECK-NEXT: %[[TMP15:[0-9]+]] = load i64, ptr %[[TMP14]], align 8 +// CHECK-NEXT: %[[TMP16:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP15]]) +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define i32 @"main.main$1"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load i64, ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = load i64, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = sub i64 %[[TMP2]], %[[TMP3]] +// CHECK-NEXT: %[[TMP5:[0-9]+]] = trunc i64 %[[TMP4]] to i32 +// CHECK-NEXT: ret i32 %[[TMP5]] +// CHECK-NEXT: } diff --git a/cl/_testrt/qsortfn/in.go b/cl/_testrt/qsortfn/in.go index 98d630c1da..a6fb9f8e15 100644 --- a/cl/_testrt/qsortfn/in.go +++ b/cl/_testrt/qsortfn/in.go @@ -9,19 +9,16 @@ import ( ) // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.sort1a() -// CHECK-NEXT: call void @main.sort1b() -// CHECK-NEXT: call void @main.sort2a() -// CHECK-NEXT: call void @main.sort2b() -// CHECK-NEXT: call void @main.sort3a() -// CHECK-NEXT: call void @main.sort3b() -// CHECK-NEXT: call void @main.sort4a() -// CHECK-NEXT: call void @main.sort4b() -// CHECK-NEXT: call void @main.sort5a() -// CHECK-NEXT: call void @main.sort5b() -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @main.sort1a() +// CHECK: call void @main.sort1b() +// CHECK: call void @main.sort2a() +// CHECK: call void @main.sort2b() +// CHECK: call void @main.sort3a() +// CHECK: call void @main.sort3b() +// CHECK: call void @main.sort4a() +// CHECK: call void @main.sort4b() +// CHECK: call void @main.sort5a() +// CHECK: call void @main.sort5b() func main() { sort1a() sort1b() @@ -36,54 +33,16 @@ func main() { } // CHECK-LABEL: define void @main.sort1a(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @0) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort1a$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @1, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort1a$1") func sort1a() { c.Printf(c.Str("Comp => Comp\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort1a$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S1A_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S1A_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S1A_DIFF:%[0-9]+]] = sub i64 [[S1A_A]], [[S1A_B]] + // CHECK-NEXT: [[S1A_RESULT:%[0-9]+]] = trunc i64 [[S1A_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S1A_RESULT]] var fn Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -94,54 +53,16 @@ func sort1a() { } // CHECK-LABEL: define void @main.sort1b(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @2) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort1b$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @3, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort1b$1") func sort1b() { c.Printf(c.Str("fn => Comp\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort1b$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S1B_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S1B_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S1B_DIFF:%[0-9]+]] = sub i64 [[S1B_A]], [[S1B_B]] + // CHECK-NEXT: [[S1B_RESULT:%[0-9]+]] = trunc i64 [[S1B_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S1B_RESULT]] var fn = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -152,54 +73,16 @@ func sort1b() { } // CHECK-LABEL: define void @main.sort2a(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @4) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort2a$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @5, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort2a$1") func sort2a() { c.Printf(c.Str("Comp => fn\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort2a$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S2A_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S2A_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S2A_DIFF:%[0-9]+]] = sub i64 [[S2A_A]], [[S2A_B]] + // CHECK-NEXT: [[S2A_RESULT:%[0-9]+]] = trunc i64 [[S2A_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S2A_RESULT]] var fn Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -210,54 +93,16 @@ func sort2a() { } // CHECK-LABEL: define void @main.sort2b(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @6) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort2b$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @7, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort2b$1") func sort2b() { c.Printf(c.Str("fn => fn\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort2b$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S2B_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S2B_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S2B_DIFF:%[0-9]+]] = sub i64 [[S2B_A]], [[S2B_B]] + // CHECK-NEXT: [[S2B_RESULT:%[0-9]+]] = trunc i64 [[S2B_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S2B_RESULT]] var fn = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -268,54 +113,16 @@ func sort2b() { } // CHECK-LABEL: define void @main.sort3a(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @8) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort3a$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @9, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort3a$1") func sort3a() { c.Printf(c.Str("qsort.Comp => qsort.Comp\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort3a$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S3A_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S3A_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S3A_DIFF:%[0-9]+]] = sub i64 [[S3A_A]], [[S3A_B]] + // CHECK-NEXT: [[S3A_RESULT:%[0-9]+]] = trunc i64 [[S3A_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S3A_RESULT]] var fn q.Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -326,54 +133,16 @@ func sort3a() { } // CHECK-LABEL: define void @main.sort3b(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @10) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort3b$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @11, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort3b$1") func sort3b() { c.Printf(c.Str("fn => qsort.Comp\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort3b$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S3B_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S3B_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S3B_DIFF:%[0-9]+]] = sub i64 [[S3B_A]], [[S3B_B]] + // CHECK-NEXT: [[S3B_RESULT:%[0-9]+]] = trunc i64 [[S3B_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S3B_RESULT]] var fn = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -384,54 +153,16 @@ func sort3b() { } // CHECK-LABEL: define void @main.sort4a(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @12) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort4a$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @13, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort4a$1") func sort4a() { c.Printf(c.Str("qsort.Comp => fn\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort4a$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S4A_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S4A_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S4A_DIFF:%[0-9]+]] = sub i64 [[S4A_A]], [[S4A_B]] + // CHECK-NEXT: [[S4A_RESULT:%[0-9]+]] = trunc i64 [[S4A_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S4A_RESULT]] var fn q.Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -442,54 +173,16 @@ func sort4a() { } // CHECK-LABEL: define void @main.sort4b(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @14) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort4b$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @15, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort4b$1") func sort4b() { c.Printf(c.Str("Comp => qsort.fn\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort4b$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S4B_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S4B_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S4B_DIFF:%[0-9]+]] = sub i64 [[S4B_A]], [[S4B_B]] + // CHECK-NEXT: [[S4B_RESULT:%[0-9]+]] = trunc i64 [[S4B_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S4B_RESULT]] var fn Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -500,54 +193,16 @@ func sort4b() { } // CHECK-LABEL: define void @main.sort5a(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @16) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort5a$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @17, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort5a$1") func sort5a() { c.Printf(c.Str("qsort.Comp => Comp()\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort5a$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S5A_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S5A_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S5A_DIFF:%[0-9]+]] = sub i64 [[S5A_A]], [[S5A_B]] + // CHECK-NEXT: [[S5A_RESULT:%[0-9]+]] = trunc i64 [[S5A_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S5A_RESULT]] var fn q.Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) } @@ -558,54 +213,16 @@ func sort5a() { } // CHECK-LABEL: define void @main.sort5b(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @18) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %1, i64 1 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %1, i64 2 -// CHECK-NEXT: %5 = getelementptr inbounds i64, ptr %1, i64 3 -// CHECK-NEXT: %6 = getelementptr inbounds i64, ptr %1, i64 4 -// CHECK-NEXT: store i64 100, ptr %2, align 8 -// CHECK-NEXT: store i64 8, ptr %3, align 8 -// CHECK-NEXT: store i64 23, ptr %4, align 8 -// CHECK-NEXT: store i64 2, ptr %5, align 8 -// CHECK-NEXT: store i64 7, ptr %6, align 8 -// CHECK-NEXT: %7 = getelementptr inbounds i64, ptr %1, i64 0 -// CHECK-NEXT: call void @qsort(ptr %7, i64 5, i64 8, ptr @"main.sort5b$1") -// CHECK-NEXT: %8 = load [5 x i64], ptr %1, align 8 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %9 = phi i64 [ -1, %_llgo_0 ], [ %10, %_llgo_2 ] -// CHECK-NEXT: %10 = add i64 %9, 1 -// CHECK-NEXT: %11 = icmp slt i64 %10, 5 -// CHECK-NEXT: br i1 %11, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %12 = icmp slt i64 %10, 0 -// CHECK-NEXT: %13 = icmp uge i64 %10, 5 -// CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) -// CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @19, i64 %16) -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @qsort(ptr %{{[0-9]+}}, i64 5, i64 8, ptr @"main.sort5b$1") func sort5b() { c.Printf(c.Str("Comp => qsort.Comp()\n")) a := [...]int{100, 8, 23, 2, 7} // CHECK-LABEL: define i32 @"main.sort5b$1"(ptr %0, ptr %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: %3 = load i64, ptr %1, align 8 - // CHECK-NEXT: %4 = sub i64 %2, %3 - // CHECK-NEXT: %5 = trunc i64 %4 to i32 - // CHECK-NEXT: ret i32 %5 - // CHECK-NEXT: } + // CHECK: [[S5B_A:%[0-9]+]] = load i64, ptr %0 + // CHECK-NEXT: [[S5B_B:%[0-9]+]] = load i64, ptr %1 + // CHECK-NEXT: [[S5B_DIFF:%[0-9]+]] = sub i64 [[S5B_A]], [[S5B_B]] + // CHECK-NEXT: [[S5B_RESULT:%[0-9]+]] = trunc i64 [[S5B_DIFF]] to i32 + // CHECK-NEXT: ret i32 [[S5B_RESULT]] // var fn Comp = func(a, b c.Pointer) c.Int { return c.Int(*(*int)(a) - *(*int)(b)) diff --git a/cl/_testrt/reflectclosureenv/in.go b/cl/_testrt/reflectclosureenv/in.go index 690a5b03d7..4d9038ea72 100644 --- a/cl/_testrt/reflectclosureenv/in.go +++ b/cl/_testrt/reflectclosureenv/in.go @@ -7,13 +7,205 @@ type receiver struct { base int } -func (r receiver) Sum(a, b, c, d, e, f, g, h, i int) int { - return r.base + a + b + c + d + e + f + g + h + i -} +// CHECK-LABEL: define void @main.checkInt(%reflect.Value %0, %"{{.*}}Slice" %1){{.*}} { +// CHECK: [[CHECK_RESULTS:%.*]] = call %"{{.*}}Slice" @reflect.Value.Call(%reflect.Value %0, %"{{.*}}Slice" %1) +// CHECK: [[CHECK_RESULTS_PTR:%.*]] = extractvalue %"{{.*}}Slice" [[CHECK_RESULTS]], 0 +// CHECK: [[CHECK_RESULTS_LEN:%.*]] = extractvalue %"{{.*}}Slice" [[CHECK_RESULTS]], 1 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %{{.*}}, i64 0, i1 true, i64 [[CHECK_RESULTS_LEN]]) +// CHECK: [[CHECK_FIRST_PTR:%.*]] = getelementptr inbounds %reflect.Value, ptr [[CHECK_RESULTS_PTR]], i64 0 +// CHECK: [[CHECK_FIRST_SAFE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AssertNilDerefPtr"(ptr [[CHECK_FIRST_PTR]]) +// CHECK: [[CHECK_FIRST:%.*]] = load %reflect.Value, ptr [[CHECK_FIRST_SAFE]] +// CHECK: [[CHECK_GOT:%.*]] = call i64 @reflect.Value.Int(%reflect.Value [[CHECK_FIRST]]) +// CHECK: [[CHECK_BAD:%.*]] = icmp ne i64 [[CHECK_GOT]], 55 +// CHECK: br i1 [[CHECK_BAD]], label %{{.*}}, label %{{.*}} +// CHECK: store i64 [[CHECK_GOT]], ptr %{{.*}} +// CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic" + +// CHECK-LABEL: define %"{{.*}}Slice" @main.floatArgs(){{.*}} { +// CHECK: [[FLOAT_ARG_STORAGE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 216) +// CHECK: [[FLOAT_ARGS:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr [[FLOAT_ARG_STORAGE]], i64 24, i64 9, i64 0, i64 9, i1 true, i1 true, i1 true) +// CHECK: [[FLOAT_INDEX:%.*]] = add i64 %{{.*}}, 1 +// CHECK: [[FLOAT_ORDINAL:%.*]] = add i64 [[FLOAT_INDEX]], 1 +// CHECK: [[FLOAT_NUMBER:%.*]] = sitofp i64 [[FLOAT_ORDINAL]] to double +// CHECK: store double [[FLOAT_NUMBER]], ptr [[FLOAT_BOX_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[FLOAT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_float64, ptr undef }, ptr [[FLOAT_BOX_ADDR]], 1 +// CHECK: [[FLOAT_REFLECT:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[FLOAT_BOX]]) +// CHECK: [[FLOAT_ARGS_PTR:%.*]] = extractvalue %"{{.*}}Slice" [[FLOAT_ARGS]], 0 +// CHECK: [[FLOAT_DEST:%.*]] = getelementptr inbounds %reflect.Value, ptr [[FLOAT_ARGS_PTR]], i64 [[FLOAT_INDEX]] +// CHECK: store %reflect.Value [[FLOAT_REFLECT]], ptr [[FLOAT_DEST]] +// CHECK: ret %"{{.*}}Slice" [[FLOAT_ARGS]] + +// CHECK-LABEL: define %"{{.*}}Slice" @main.intArgs(){{.*}} { +// CHECK: [[INT_ARG_STORAGE:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 216) +// CHECK: [[INT_ARGS:%.*]] = call %"{{.*}}Slice" @"{{.*}}/runtime/internal/runtime.NewSlice2"(ptr [[INT_ARG_STORAGE]], i64 24, i64 9, i64 0, i64 9, i1 true, i1 true, i1 true) +// CHECK: [[INT_INDEX:%.*]] = add i64 %{{.*}}, 1 +// CHECK: [[INT_ORDINAL:%.*]] = add i64 [[INT_INDEX]], 1 +// CHECK: store i64 [[INT_ORDINAL]], ptr [[INT_BOX_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[INT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[INT_BOX_ADDR]], 1 +// CHECK: [[INT_REFLECT:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[INT_BOX]]) +// CHECK: [[INT_ARGS_PTR:%.*]] = extractvalue %"{{.*}}Slice" [[INT_ARGS]], 0 +// CHECK: [[INT_DEST:%.*]] = getelementptr inbounds %reflect.Value, ptr [[INT_ARGS_PTR]], i64 [[INT_INDEX]] +// CHECK: store %reflect.Value [[INT_REFLECT]], ptr [[INT_DEST]] +// CHECK: ret %"{{.*}}Slice" [[INT_ARGS]] + +// CHECK-LABEL: define void @main.main(){{.*}} { +// The direct and nested integer closures are boxed and called with the same nine arguments. +// CHECK: [[MAIN_INTS:%.*]] = call %"{{.*}}Slice" @main.intArgs() +// CHECK: [[MAIN_SUM_FN:%.*]] = call { ptr, ptr } @main.makeSum(i64 10) +// CHECK: store { ptr, ptr } [[MAIN_SUM_FN]], ptr [[MAIN_SUM_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[MAIN_SUM_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr [[MAIN_SUM_ADDR]], 1 +// CHECK: [[MAIN_SUM_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[MAIN_SUM_BOX]]) +// CHECK: call void @main.checkInt(%reflect.Value [[MAIN_SUM_VALUE]], %"{{.*}}Slice" [[MAIN_INTS]]) +// CHECK: [[MAIN_NESTED_FN:%.*]] = call { ptr, ptr } @main.makeNestedSum(i64 10) +// CHECK: store { ptr, ptr } [[MAIN_NESTED_FN]], ptr [[MAIN_NESTED_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[MAIN_NESTED_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr [[MAIN_NESTED_ADDR]], 1 +// CHECK: [[MAIN_NESTED_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[MAIN_NESTED_BOX]]) +// CHECK: call void @main.checkInt(%reflect.Value [[MAIN_NESTED_VALUE]], %"{{.*}}Slice" [[MAIN_INTS]]) +// MakeFunc receives the type of the nine-argument literal and the slice callback main$2. +// CHECK: [[FUNC_TYPE:%.*]] = call %"{{.*}}iface" @reflect.TypeOf(%"{{.*}}eface" %{{.*}}) +// CHECK: [[MADE:%.*]] = call %reflect.Value @reflect.MakeFunc(%"{{.*}}iface" [[FUNC_TYPE]], { ptr, ptr } { ptr @"main.main$2", ptr null }) +// CHECK: call void @main.checkInt(%reflect.Value [[MADE]], %"{{.*}}Slice" [[MAIN_INTS]]) +// MethodByName is performed on receiver{base: 10} and checked with the same arguments. +// CHECK: store i64 10, ptr %{{.*}} +// CHECK: [[RECEIVER_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.receiver, ptr undef }, ptr %{{.*}}, 1 +// CHECK: [[RECEIVER_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[RECEIVER_BOX]]) +// CHECK: [[METHOD:%.*]] = call %reflect.Value @reflect.Value.MethodByName(%reflect.Value [[RECEIVER_VALUE]], %"{{.*}}String" { ptr @{{.*}}, i64 3 }) +// CHECK: call void @main.checkInt(%reflect.Value [[METHOD]], %"{{.*}}Slice" [[MAIN_INTS]]) +// CHECK: [[METHOD_IFACE:%.*]] = call %"{{.*}}eface" @reflect.Value.Interface(%reflect.Value [[METHOD]]) +// CHECK: [[METHOD_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[METHOD_IFACE]], 0 +// CHECK: [[METHOD_MATCH:%.*]] = call i1 @"{{.*}}/runtime/internal/runtime.MatchesClosure"(ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr [[METHOD_TYPE]]) +// CHECK: br i1 [[METHOD_MATCH]], label %{{.*}}, label %{{.*}} +// The floating closure is reflect-called with floatArgs and compared with 55. +// CHECK: [[MAIN_FLOAT_FN:%.*]] = call { ptr, ptr } @main.makeFloatSum(double 1.000000e+01) +// CHECK: store { ptr, ptr } [[MAIN_FLOAT_FN]], ptr [[MAIN_FLOAT_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[MAIN_FLOAT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr [[MAIN_FLOAT_ADDR]], 1 +// CHECK: [[MAIN_FLOAT_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[MAIN_FLOAT_BOX]]) +// CHECK: [[MAIN_FLOAT_ARGS:%.*]] = call %"{{.*}}Slice" @main.floatArgs() +// CHECK: [[MAIN_FLOAT_RESULTS:%.*]] = call %"{{.*}}Slice" @reflect.Value.Call(%reflect.Value [[MAIN_FLOAT_VALUE]], %"{{.*}}Slice" [[MAIN_FLOAT_ARGS]]) +// CHECK: [[MAIN_FLOAT_GOT:%.*]] = call double @reflect.Value.Float(%reflect.Value %{{.*}}) +// CHECK: [[MAIN_FLOAT_BAD:%.*]] = fcmp une double [[MAIN_FLOAT_GOT]], 5.500000e+01 +// CHECK: br i1 [[MAIN_FLOAT_BAD]], label %{{.*}}, label %{{.*}} +// The asserted method closure keeps code and environment through the direct nine-argument call. +// CHECK: [[METHOD_DATA:%.*]] = extractvalue %"{{.*}}eface" [[METHOD_IFACE]], 1 +// CHECK: [[METHOD_FN:%.*]] = load { ptr, ptr }, ptr [[METHOD_DATA]] +// CHECK: [[METHOD_ENV:%.*]] = extractvalue { ptr, ptr } [[METHOD_FN]], 1 +// CHECK: [[METHOD_CODE_RAW:%.*]] = extractvalue { ptr, ptr } [[METHOD_FN]], 0 +// CHECK: [[METHOD_CODE:%.*]] = call ptr asm "", "=r,0"(ptr [[METHOD_CODE_RAW]]) +// CHECK: [[METHOD_GOT:%.*]] = call i64 [[METHOD_CODE]](ptr {{(nest|swiftself)}} [[METHOD_ENV]], i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9) +// CHECK: [[METHOD_BAD:%.*]] = icmp ne i64 [[METHOD_GOT]], 55 + +// CHECK-LABEL: define i64 @"main.main$1"(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8){{.*}} { +// CHECK: ret i64 0 + +// CHECK-LABEL: define %"{{.*}}Slice" @"main.main$2"(%"{{.*}}Slice" %0){{.*}} { +// CHECK: [[MAKEFUNC_ARGS_LEN:%.*]] = extractvalue %"{{.*}}Slice" %0, 1 +// CHECK: [[MAKEFUNC_SUM:%.*]] = phi i64 [ 10, %{{.*}} ], [ [[MAKEFUNC_NEXT:%.*]], %{{.*}} ] +// CHECK: [[MAKEFUNC_ARG:%.*]] = call i64 @reflect.Value.Int(%reflect.Value %{{.*}}) +// CHECK: [[MAKEFUNC_NEXT]] = add i64 [[MAKEFUNC_SUM]], [[MAKEFUNC_ARG]] +// CHECK: store i64 [[MAKEFUNC_SUM]], ptr [[MAKEFUNC_RESULT_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[MAKEFUNC_RESULT_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[MAKEFUNC_RESULT_ADDR]], 1 +// CHECK: [[MAKEFUNC_RESULT:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[MAKEFUNC_RESULT_BOX]]) +// CHECK: store %reflect.Value [[MAKEFUNC_RESULT]], ptr %{{.*}} +// CHECK: ret %"{{.*}}Slice" %{{.*}} + +// CHECK-LABEL: define { ptr, ptr } @main.makeFloatSum(double %0){{.*}} { +// CHECK: store double %0, ptr [[FLOAT_BASE_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: store ptr [[FLOAT_BASE_ADDR]], ptr %{{.*}} +// CHECK: [[FLOAT_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.makeFloatSum$1", ptr undef }, ptr %{{.*}}, 1 +// CHECK: ret { ptr, ptr } [[FLOAT_CLOSURE]] // CHECK-LABEL: define double @"main.makeFloatSum$1"(ptr {{(nest|swiftself)}} %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9){{.*}} { +// CHECK: [[FLOAT_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[FLOAT_BASE_PTR:%.*]] = extractvalue { ptr } [[FLOAT_ENV]], 0 +// CHECK: [[FLOAT_BASE_VALUE:%.*]] = load double, ptr [[FLOAT_BASE_PTR]] +// CHECK: [[FLOAT_S1:%.*]] = fadd double [[FLOAT_BASE_VALUE]], %1 +// CHECK: [[FLOAT_S2:%.*]] = fadd double [[FLOAT_S1]], %2 +// CHECK: [[FLOAT_S3:%.*]] = fadd double [[FLOAT_S2]], %3 +// CHECK: [[FLOAT_S4:%.*]] = fadd double [[FLOAT_S3]], %4 +// CHECK: [[FLOAT_S5:%.*]] = fadd double [[FLOAT_S4]], %5 +// CHECK: [[FLOAT_S6:%.*]] = fadd double [[FLOAT_S5]], %6 +// CHECK: [[FLOAT_S7:%.*]] = fadd double [[FLOAT_S6]], %7 +// CHECK: [[FLOAT_S8:%.*]] = fadd double [[FLOAT_S7]], %8 +// CHECK: [[FLOAT_S9:%.*]] = fadd double [[FLOAT_S8]], %9 +// CHECK: ret double [[FLOAT_S9]] + +// CHECK-LABEL: define { ptr, ptr } @main.makeNestedSum(i64 %0){{.*}} { +// CHECK: store i64 %0, ptr [[NESTED_BASE_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: store ptr [[NESTED_BASE_ADDR]], ptr %{{.*}} +// CHECK: [[NESTED_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.makeNestedSum$1", ptr undef }, ptr %{{.*}}, 1 +// CHECK: ret { ptr, ptr } [[NESTED_CLOSURE]] + +// CHECK-LABEL: define i64 @"main.makeNestedSum$1"(ptr {{(nest|swiftself)}} %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, i64 %9){{.*}} { +// CHECK: [[NESTED_VALUES:%.*]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 216) +// CHECK: [[NESTED_FIRST_PTR:%.*]] = getelementptr inbounds %reflect.Value, ptr [[NESTED_VALUES]], i64 0 +// CHECK: store i64 %1, ptr [[NESTED_FIRST_BOX_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[NESTED_FIRST_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[NESTED_FIRST_BOX_ADDR]], 1 +// CHECK: [[NESTED_FIRST_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[NESTED_FIRST_BOX]]) +// CHECK: store %reflect.Value [[NESTED_FIRST_VALUE]], ptr [[NESTED_FIRST_PTR]] +// CHECK: [[NESTED_NINTH_PTR:%.*]] = getelementptr inbounds %reflect.Value, ptr [[NESTED_VALUES]], i64 8 +// CHECK: store i64 %9, ptr [[NESTED_NINTH_BOX_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[NESTED_NINTH_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_int, ptr undef }, ptr [[NESTED_NINTH_BOX_ADDR]], 1 +// CHECK: [[NESTED_NINTH_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[NESTED_NINTH_BOX]]) +// CHECK: store %reflect.Value [[NESTED_NINTH_VALUE]], ptr [[NESTED_NINTH_PTR]] +// CHECK: [[NESTED_ARGS_0:%.*]] = insertvalue %"{{.*}}Slice" undef, ptr [[NESTED_VALUES]], 0 +// CHECK: [[NESTED_ARGS_1:%.*]] = insertvalue %"{{.*}}Slice" [[NESTED_ARGS_0]], i64 9, 1 +// CHECK: [[NESTED_ARGS:%.*]] = insertvalue %"{{.*}}Slice" [[NESTED_ARGS_1]], i64 9, 2 +// CHECK: [[NESTED_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[NESTED_CAPTURE_ADDR:%.*]] = extractvalue { ptr } [[NESTED_ENV]], 0 +// CHECK: [[NESTED_CAPTURE:%.*]] = load i64, ptr [[NESTED_CAPTURE_ADDR]] +// CHECK: [[NESTED_SUM_FN:%.*]] = call { ptr, ptr } @main.makeSum(i64 [[NESTED_CAPTURE]]) +// CHECK: store { ptr, ptr } [[NESTED_SUM_FN]], ptr [[NESTED_SUM_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: [[NESTED_SUM_BOX:%.*]] = insertvalue %"{{.*}}eface" { ptr @"_llgo_closure${{[-A-Za-z0-9_]+}}", ptr undef }, ptr [[NESTED_SUM_ADDR]], 1 +// CHECK: [[NESTED_SUM_VALUE:%.*]] = call %reflect.Value @reflect.ValueOf(%"{{.*}}eface" [[NESTED_SUM_BOX]]) +// CHECK: [[NESTED_RESULTS:%.*]] = call %"{{.*}}Slice" @reflect.Value.Call(%reflect.Value [[NESTED_SUM_VALUE]], %"{{.*}}Slice" [[NESTED_ARGS]]) +// CHECK: [[NESTED_RESULT:%.*]] = call i64 @reflect.Value.Int(%reflect.Value %{{.*}}) +// CHECK: ret i64 [[NESTED_RESULT]] + +// CHECK-LABEL: define { ptr, ptr } @main.makeSum(i64 %0){{.*}} { +// CHECK: store i64 %0, ptr [[SUM_BASE_ADDR:%[-A-Za-z0-9_.]+]] +// CHECK: store ptr [[SUM_BASE_ADDR]], ptr %{{.*}} +// CHECK: [[SUM_CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr @"main.makeSum$1", ptr undef }, ptr %{{.*}}, 1 +// CHECK: ret { ptr, ptr } [[SUM_CLOSURE]] // CHECK-LABEL: define i64 @"main.makeSum$1"(ptr {{(nest|swiftself)}} %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, i64 %9){{.*}} { +// CHECK: [[SUM_ENV:%.*]] = load { ptr }, ptr %0 +// CHECK: [[SUM_BASE_PTR:%.*]] = extractvalue { ptr } [[SUM_ENV]], 0 +// CHECK: [[SUM_BASE_VALUE:%.*]] = load i64, ptr [[SUM_BASE_PTR]] +// CHECK: [[SUM_S1:%.*]] = add i64 [[SUM_BASE_VALUE]], %1 +// CHECK: [[SUM_S2:%.*]] = add i64 [[SUM_S1]], %2 +// CHECK: [[SUM_S3:%.*]] = add i64 [[SUM_S2]], %3 +// CHECK: [[SUM_S4:%.*]] = add i64 [[SUM_S3]], %4 +// CHECK: [[SUM_S5:%.*]] = add i64 [[SUM_S4]], %5 +// CHECK: [[SUM_S6:%.*]] = add i64 [[SUM_S5]], %6 +// CHECK: [[SUM_S7:%.*]] = add i64 [[SUM_S6]], %7 +// CHECK: [[SUM_S8:%.*]] = add i64 [[SUM_S7]], %8 +// CHECK: [[SUM_S9:%.*]] = add i64 [[SUM_S8]], %9 +// CHECK: ret i64 [[SUM_S9]] + +// CHECK-LABEL: define i64 @main.receiver.Sum(%main.receiver %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, i64 %9){{.*}} { +// CHECK: store %main.receiver %0, ptr [[RECEIVER_ADDR:%.*]] +// CHECK: [[RECEIVER_BASE:%.*]] = load i64, ptr %{{.*}} +// CHECK: [[RECEIVER_S1:%.*]] = add i64 [[RECEIVER_BASE]], %1 +// CHECK: [[RECEIVER_S2:%.*]] = add i64 [[RECEIVER_S1]], %2 +// CHECK: [[RECEIVER_S3:%.*]] = add i64 [[RECEIVER_S2]], %3 +// CHECK: [[RECEIVER_S4:%.*]] = add i64 [[RECEIVER_S3]], %4 +// CHECK: [[RECEIVER_S5:%.*]] = add i64 [[RECEIVER_S4]], %5 +// CHECK: [[RECEIVER_S6:%.*]] = add i64 [[RECEIVER_S5]], %6 +// CHECK: [[RECEIVER_S7:%.*]] = add i64 [[RECEIVER_S6]], %7 +// CHECK: [[RECEIVER_S8:%.*]] = add i64 [[RECEIVER_S7]], %8 +// CHECK: [[RECEIVER_S9:%.*]] = add i64 [[RECEIVER_S8]], %9 +// CHECK: ret i64 [[RECEIVER_S9]] + +// CHECK-LABEL: define i64 @"main.(*receiver).Sum"(ptr %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, i64 %9){{.*}} { +// CHECK: [[RECEIVER_NIL:%.*]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[RECEIVER_NIL]], %"{{.*}}String" {{.*}}, %"{{.*}}String" {{.*}}) +// CHECK: [[RECEIVER_VALUE_LOAD:%.*]] = load %main.receiver, ptr %0 +// CHECK: [[RECEIVER_WRAPPER_RESULT:%.*]] = call i64 @main.receiver.Sum(%main.receiver [[RECEIVER_VALUE_LOAD]], i64 %1, i64 %2, i64 %3, i64 %4, i64 %5, i64 %6, i64 %7, i64 %8, i64 %9) +// CHECK: ret i64 [[RECEIVER_WRAPPER_RESULT]] + +func (r receiver) Sum(a, b, c, d, e, f, g, h, i int) int { + return r.base + a + b + c + d + e + f + g + h + i +} func makeSum(base int) func(int, int, int, int, int, int, int, int, int) int { return func(a, b, c, d, e, f, g, h, i int) int { diff --git a/cl/_testrt/result/in.go b/cl/_testrt/result/in.go index 9caa844bf0..5eec4159d6 100644 --- a/cl/_testrt/result/in.go +++ b/cl/_testrt/result/in.go @@ -1,72 +1,30 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.add\E|\Qmain.add$1\E|\Qmain.add2\E|\Qmain.add2$1\E|\Qmain.main\E|\Qmain.main$1\E|\Qmain.main$1$1\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define i64 @"main.add$1"(i64 %0, i64 %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = add i64 %0, %1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1{{$}} + func add() func(int, int) int { return func(x, y int) int { return x + y } } -// CHECK-LABEL: define { { ptr, ptr }, i64 } @main.add2(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret { { ptr, ptr }, i64 } { { ptr, ptr } { ptr @"main.add2$1", ptr null }, i64 1 } -// CHECK-NEXT: } func add2() (func(int, int) int, int) { - // CHECK-LABEL: define i64 @"main.add2$1"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = add i64 %0, %1 - // CHECK-NEXT: ret i64 %2 - // CHECK-NEXT: } return func(x, y int) int { return x + y }, 1 } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call { ptr, ptr } @"main.main$1"() -// CHECK-NEXT: %1 = extractvalue { ptr, ptr } %0, 1 -// CHECK-NEXT: %2 = extractvalue { ptr, ptr } %0, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %2) -// CHECK-NEXT: %3 = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %1, i64 100, i64 200) -// CHECK-NEXT: %4 = call i32 (ptr, ...) @printf(ptr @0, i64 %3) -// CHECK-NEXT: %5 = call { ptr, ptr } @main.add() -// CHECK-NEXT: %6 = extractvalue { ptr, ptr } %5, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %5, 0 -// CHECK-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %7) -// CHECK-NEXT: %8 = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %6, i64 100, i64 200) -// CHECK-NEXT: %9 = call i32 (ptr, ...) @printf(ptr @1, i64 %8) -// CHECK-NEXT: %10 = call { { ptr, ptr }, i64 } @main.add2() -// CHECK-NEXT: %11 = extractvalue { { ptr, ptr }, i64 } %10, 0 -// CHECK-NEXT: %12 = extractvalue { { ptr, ptr }, i64 } %10, 1 -// CHECK-NEXT: %13 = call { ptr, ptr } @main.add() -// CHECK-NEXT: %14 = extractvalue { ptr, ptr } %13, 1 -// CHECK-NEXT: %15 = extractvalue { ptr, ptr } %13, 0 -// CHECK-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %15) -// CHECK-NEXT: %16 = call i64 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %14, i64 100, i64 200) -// CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @2, i64 %16, i64 %12) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { - // CHECK-LABEL: define { ptr, ptr } @"main.main$1"(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: ret { ptr, ptr } { ptr @"main.main$1$1", ptr null } - // CHECK-NEXT: } fn := func() func(int, int) int { - // CHECK-LABEL: define i64 @"main.main$1$1"(i64 %0, i64 %1){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %2 = add i64 %0, %1 - // CHECK-NEXT: ret i64 %2 - // CHECK-NEXT: } return func(x, y int) int { return x + y } @@ -76,3 +34,109 @@ func main() { fn, n := add2() c.Printf(c.Str("%d %d\n"), add()(100, 200), n) } + +// CHECK-LABEL: define i64 @"main.add$1"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = add i64 %[[TMP0]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP2]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @"main.add2$1"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = add i64 %[[TMP0]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP2]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca { { ptr, ptr }, i64 }, align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call { ptr, ptr } @"main.main$1"() +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP1]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP3]]) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP2]], i64 100, i64 200) +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP4]]) +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call { ptr, ptr } @main.add() +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP6]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %[[TMP8]]) +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %[[TMP7]], i64 100, i64 200) +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i64 %[[TMP9]]) +// DARWIN-ARM64-NEXT: call void @main.add2(ptr sret({ { ptr, ptr }, i64 }) %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = load { { ptr, ptr }, i64 }, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { { ptr, ptr }, i64 } %[[TMP11]], 0 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = extractvalue { { ptr, ptr }, i64 } %[[TMP11]], 1 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call { ptr, ptr } @main.add() +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP14]], 1 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP14]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %[[TMP16]]) +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call i64 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %[[TMP15]], i64 100, i64 200) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], i64 %[[TMP17]], i64 %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { { ptr, ptr }, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call { ptr, ptr } @"main.main$1"() +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP3]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP5]], 1 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP5]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP7]]) +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call i64 %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP6]], i64 100, i64 200) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = call { ptr, ptr } @main.add() +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP10]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP11]], 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP11]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code1 = call ptr asm "", "=r,0"(ptr %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call i64 %__llgo_funcval_code1(ptr {{(nest|swiftself)}} %[[TMP12]], i64 100, i64 200) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB1]], i64 %[[TMP14]]) +// LINUX-AMD64-NEXT: call void @main.add2(ptr sret({ { ptr, ptr }, i64 }) %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load { { ptr, ptr }, i64 }, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = extractvalue { { ptr, ptr }, i64 } %[[TMP16]], 0 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = extractvalue { { ptr, ptr }, i64 } %[[TMP16]], 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = call { ptr, ptr } @main.add() +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP19]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP20]], 1 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP20]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code2 = call ptr asm "", "=r,0"(ptr %[[TMP22]]) +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = call i64 %__llgo_funcval_code2(ptr {{(nest|swiftself)}} %[[TMP21]], i64 100, i64 200) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB2]], i64 %[[TMP23]], i64 %[[TMP18]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @"main.main$1$1"( +// CHECK-SAME: i64 %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = add i64 %[[TMP0]], %[[TMP1]] +// CHECK-NEXT: ret i64 %[[TMP2]] +// CHECK-NEXT: } + +// CHECK-LABEL: define { ptr, ptr } @main.add(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: ret { ptr, ptr } { ptr @"main.add$1", ptr null } +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.add$1", ptr null }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP1]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.add2( +// CHECK-SAME: ptr sret({ { ptr, ptr }, i64 }) %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: store { { ptr, ptr }, i64 } { { ptr, ptr } { ptr @"main.add2$1", ptr null }, i64 1 }, ptr %[[TMP0]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define { ptr, ptr } @"main.main$1"(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: ret { ptr, ptr } { ptr @"main.main$1$1", ptr null } +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.main$1$1", ptr null }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP1]] +// CHECK-NEXT: } diff --git a/cl/_testrt/slice2array/in.go b/cl/_testrt/slice2array/in.go index 690aa33ae3..701ec54961 100644 --- a/cl/_testrt/slice2array/in.go +++ b/cl/_testrt/slice2array/in.go @@ -2,84 +2,28 @@ package main // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 4) -// CHECK-NEXT: %1 = getelementptr inbounds i8, ptr %0, i64 0 -// CHECK-NEXT: %2 = getelementptr inbounds i8, ptr %0, i64 1 -// CHECK-NEXT: %3 = getelementptr inbounds i8, ptr %0, i64 2 -// CHECK-NEXT: %4 = getelementptr inbounds i8, ptr %0, i64 3 -// CHECK-NEXT: store i8 1, ptr %1, align 1 -// CHECK-NEXT: store i8 2, ptr %2, align 1 -// CHECK-NEXT: store i8 3, ptr %3, align 1 -// CHECK-NEXT: store i8 4, ptr %4, align 1 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 4, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, i64 4, 2 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: %9 = icmp slt i64 %8, 4 -// CHECK-NEXT: br i1 %9, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicSliceConvert"(i64 4, i64 %10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %12 = load [4 x i8], ptr %0, align 1 -// CHECK-NEXT: %13 = load [4 x i8], ptr %11, align 1 -// CHECK-NEXT: %14 = extractvalue [4 x i8] %12, 0 -// CHECK-NEXT: %15 = extractvalue [4 x i8] %13, 0 -// CHECK-NEXT: %16 = icmp eq i8 %14, %15 -// CHECK-NEXT: %17 = and i1 true, %16 -// CHECK-NEXT: %18 = extractvalue [4 x i8] %12, 1 -// CHECK-NEXT: %19 = extractvalue [4 x i8] %13, 1 -// CHECK-NEXT: %20 = icmp eq i8 %18, %19 -// CHECK-NEXT: %21 = and i1 %17, %20 -// CHECK-NEXT: %22 = extractvalue [4 x i8] %12, 2 -// CHECK-NEXT: %23 = extractvalue [4 x i8] %13, 2 -// CHECK-NEXT: %24 = icmp eq i8 %22, %23 -// CHECK-NEXT: %25 = and i1 %21, %24 -// CHECK-NEXT: %26 = extractvalue [4 x i8] %12, 3 -// CHECK-NEXT: %27 = extractvalue [4 x i8] %13, 3 -// CHECK-NEXT: %28 = icmp eq i8 %26, %27 -// CHECK-NEXT: %29 = and i1 %25, %28 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %29) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %30 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %31 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, i64 4, 1 -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, i64 4, 2 -// CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %32, 1 -// CHECK-NEXT: %34 = icmp slt i64 %33, 2 -// CHECK-NEXT: br i1 %34, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %32, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicSliceConvert"(i64 2, i64 %35) -// CHECK-NEXT: br label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_3, %_llgo_2 -// CHECK-NEXT: %36 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %32, 0 -// CHECK-NEXT: %37 = load [2 x i8], ptr %36, align 1 -// CHECK-NEXT: %38 = alloca [2 x i8], align 1 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %38, i8 0, i64 2, i1 false) -// CHECK-NEXT: %39 = getelementptr inbounds i8, ptr %38, i64 0 -// CHECK-NEXT: %40 = getelementptr inbounds i8, ptr %38, i64 1 -// CHECK-NEXT: store i8 1, ptr %39, align 1 -// CHECK-NEXT: store i8 2, ptr %40, align 1 -// CHECK-NEXT: %41 = load [2 x i8], ptr %38, align 1 -// CHECK-NEXT: %42 = extractvalue [2 x i8] %37, 0 -// CHECK-NEXT: %43 = extractvalue [2 x i8] %41, 0 -// CHECK-NEXT: %44 = icmp eq i8 %42, %43 -// CHECK-NEXT: %45 = and i1 true, %44 -// CHECK-NEXT: %46 = extractvalue [2 x i8] %37, 1 -// CHECK-NEXT: %47 = extractvalue [2 x i8] %41, 1 -// CHECK-NEXT: %48 = icmp eq i8 %46, %47 -// CHECK-NEXT: %49 = and i1 %45, %48 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %49) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[SLICE4_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE4:%[0-9]+]], 1 +// CHECK-NEXT: [[SHORT4:%[0-9]+]] = icmp slt i64 [[SLICE4_LEN]], 4 +// CHECK-NEXT: br i1 [[SHORT4]], label %{{.*}}, label %{{.*}} +// CHECK: [[PANIC4_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE4]], 1 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicSliceConvert"(i64 4, i64 [[PANIC4_LEN]]) +// CHECK: [[SLICE4_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE4]], 0 +// CHECK: [[ARRAY4:%[0-9]+]] = load [4 x i8], ptr [[SLICE4_DATA]] +// CHECK: [[ARRAY4_LAST:%[0-9]+]] = extractvalue [4 x i8] [[ARRAY4]], 3 +// CHECK: [[EQUAL4_LAST:%[0-9]+]] = icmp eq i8 %{{[0-9]+}}, [[ARRAY4_LAST]] +// CHECK-NEXT: [[EQUAL4:%[0-9]+]] = and i1 %{{[0-9]+}}, [[EQUAL4_LAST]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 [[EQUAL4]]) +// CHECK: [[SLICE2_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE2:%[0-9]+]], 1 +// CHECK-NEXT: [[SHORT2:%[0-9]+]] = icmp slt i64 [[SLICE2_LEN]], 2 +// CHECK-NEXT: br i1 [[SHORT2]], label %{{.*}}, label %{{.*}} +// CHECK: [[PANIC2_LEN:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE2]], 1 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicSliceConvert"(i64 2, i64 [[PANIC2_LEN]]) +// CHECK: [[SLICE2_DATA:%[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" [[SLICE2]], 0 +// CHECK-NEXT: [[ARRAY2:%[0-9]+]] = load [2 x i8], ptr [[SLICE2_DATA]] +// CHECK: [[ARRAY2_LAST:%[0-9]+]] = extractvalue [2 x i8] [[ARRAY2]], 1 +// CHECK: [[EQUAL2_LAST:%[0-9]+]] = icmp eq i8 [[ARRAY2_LAST]], %{{[0-9]+}} +// CHECK-NEXT: [[EQUAL2:%[0-9]+]] = and i1 %{{[0-9]+}}, [[EQUAL2_LAST]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 [[EQUAL2]]) func main() { array := [4]byte{1, 2, 3, 4} ptr := (*[4]byte)(array[:]) diff --git a/cl/_testrt/slicelen/in.go b/cl/_testrt/slicelen/in.go index 624461caa3..8b37f320ad 100644 --- a/cl/_testrt/slicelen/in.go +++ b/cl/_testrt/slicelen/in.go @@ -5,10 +5,6 @@ import ( "unsafe" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [30 x i8] c"unsafe.Slice: len out of range", align 1{{$}} -// CHECK: {{^}}@1 = private unnamed_addr constant [46 x i8] c"unsafe.Slice: nil pointer with non-zero length", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [7 x i8] c"len > 0", align 1{{$}} - func main() { var s *int var lens uint32 @@ -20,34 +16,12 @@ func main() { } } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - +// A nil pointer is valid for unsafe.Slice only because the length is zero; the +// compiler must fold all guards and the resulting length/branch consistently. +// CHECK: [[LEN_RANGE:@[0-9]+]] = private unnamed_addr constant [30 x i8] c"unsafe.Slice: len out of range" +// CHECK: [[NIL_NONZERO:@[0-9]+]] = private unnamed_addr constant [46 x i8] c"unsafe.Slice: nil pointer with non-zero length" // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 30 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 46 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 30 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 30 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br i1 false, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 7 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}AssertRuntimeError"(i1 false, %"{{.*}}String" { ptr [[LEN_RANGE]], i64 30 }) +// CHECK-NEXT: call void @"{{.*}}AssertRuntimeError"(i1 false, %"{{.*}}String" { ptr [[NIL_NONZERO]], i64 46 }) +// CHECK: call void @"{{.*}}PrintInt"(i64 0) +// CHECK: br i1 false, label %{{.*}}, label %{{.*}} diff --git a/cl/_testrt/stacksave/in.go b/cl/_testrt/stacksave/in.go index f98994558b..9bcc4e140c 100644 --- a/cl/_testrt/stacksave/in.go +++ b/cl/_testrt/stacksave/in.go @@ -6,16 +6,13 @@ import ( _ "unsafe" ) +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK: [[STACK_POINTER:%[0-9]+]] = call ptr @llvm.stacksave.p0() +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr [[STACK_POINTER]]) + //go:linkname getsp llgo.stackSave func getsp() unsafe.Pointer -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @llvm.stacksave.p0() -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %0) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { sp := getsp() println(sp) diff --git a/cl/_testrt/strlen/in.go b/cl/_testrt/strlen/in.go index 22428b2fd5..e56bddd03c 100644 --- a/cl/_testrt/strlen/in.go +++ b/cl/_testrt/strlen/in.go @@ -13,11 +13,8 @@ func strlen(str *int8) C.int var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0} // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 @strlen(ptr @main.format) -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[STRLEN:%[0-9]+]] = call i32 @strlen(ptr @main.format) +// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 [[STRLEN]]) func main() { sfmt := &format[0] printf(sfmt, strlen(sfmt)) diff --git a/cl/_testrt/struct/in.go b/cl/_testrt/struct/in.go index 93b21d5f57..6fcd3cadd1 100644 --- a/cl/_testrt/struct/in.go +++ b/cl/_testrt/struct/in.go @@ -4,28 +4,14 @@ package main import "C" import _ "unsafe" -// CHECK-DAG: {{^}}@0 = private unnamed_addr constant [44 x i8] c"{{.*}}/cl/_testrt/struct.Foo", align 1{{$}} -// CHECK-DAG: {{^}}@1 = private unnamed_addr constant [5 x i8] c"Print", align 1{{$}} -// CHECK-DAG: @main.format = global [10 x i8] c"Hello %d\0A\00", align 1 - // CHECK-LABEL: define void @main.Foo.Print(%main.Foo %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.Foo, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.Foo %0, ptr %1, align 4 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Foo, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %3 = load i1, ptr %2, align 1 -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = getelementptr inbounds %main.Foo, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %5 = load i32, ptr %4, align 4 -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 %5) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store %main.Foo %0, ptr [[PRINT_RECEIVER:%[0-9]+]] +// CHECK: [[PRINT_OK_FIELD:%[0-9]+]] = getelementptr inbounds %main.Foo, ptr [[PRINT_RECEIVER]], i32 0, i32 1 +// CHECK-NEXT: [[PRINT_OK:%[0-9]+]] = load i1, ptr [[PRINT_OK_FIELD]] +// CHECK-NEXT: br i1 [[PRINT_OK]], label %{{.*}}, label %{{.*}} +// CHECK: [[PRINT_VALUE_FIELD:%[0-9]+]] = getelementptr inbounds %main.Foo, ptr [[PRINT_RECEIVER]], i32 0, i32 0 +// CHECK-NEXT: [[PRINT_VALUE:%[0-9]+]] = load i32, ptr [[PRINT_VALUE_FIELD]] +// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 [[PRINT_VALUE]]) func (p Foo) Print() { if p.ok { @@ -49,42 +35,16 @@ func main() { } // CHECK-LABEL: define void @"main.(*Foo).Print"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 44 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 5 }) -// CHECK-NEXT: %2 = load %main.Foo, ptr %0, align 4 -// CHECK-NEXT: call void @main.Foo.Print(%main.Foo %2) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[WRAPPER_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 [[WRAPPER_NIL]], %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 44 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 5 }) +// CHECK-NEXT: [[WRAPPER_VALUE:%[0-9]+]] = load %main.Foo, ptr %0 +// CHECK-NEXT: call void @main.Foo.Print(%main.Foo [[WRAPPER_VALUE]]) // CHECK-LABEL: define ptr @main._Cgo_ptr(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: ret ptr %0 -// CHECK-NEXT: } - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: call void @syscall.init() -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: ret ptr %0 // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %main.Foo, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 8, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %main.Foo, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds %main.Foo, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i32 100, ptr %1, align 4 -// CHECK-NEXT: store i1 true, ptr %2, align 1 -// CHECK-NEXT: %3 = load %main.Foo, ptr %0, align 4 -// CHECK-NEXT: call void @main.Foo.Print(%main.Foo %3) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: store i32 100, ptr [[MAIN_A:%[0-9]+]] +// CHECK-NEXT: store i1 true, ptr [[MAIN_OK:%[0-9]+]] +// CHECK-NEXT: [[MAIN_FOO:%[0-9]+]] = load %main.Foo, ptr %{{[0-9]+}} +// CHECK-NEXT: call void @main.Foo.Print(%main.Foo [[MAIN_FOO]]) diff --git a/cl/_testrt/structsize/in.go b/cl/_testrt/structsize/in.go index 571707395f..60cc7299c4 100644 --- a/cl/_testrt/structsize/in.go +++ b/cl/_testrt/structsize/in.go @@ -16,10 +16,7 @@ type Foo struct { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @0, i64 14) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call i32 (ptr, ...) @printf(ptr @{{[0-9]+}}, i64 14) func main() { c.Printf(c.Str("%d"), unsafe.Sizeof(Foo{})) } diff --git a/cl/_testrt/sum/in.go b/cl/_testrt/sum/in.go index c565f13845..15aec85a11 100644 --- a/cl/_testrt/sum/in.go +++ b/cl/_testrt/sum/in.go @@ -1,62 +1,74 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.sum\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %1 = getelementptr inbounds i64, ptr %0, i64 0 -// CHECK-NEXT: store i64 1, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds i64, ptr %0, i64 1 -// CHECK-NEXT: store i64 2, ptr %2, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds i64, ptr %0, i64 2 -// CHECK-NEXT: store i64 3, ptr %3, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds i64, ptr %0, i64 3 -// CHECK-NEXT: store i64 4, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %0, 0 -// CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 4, 1 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, i64 4, 2 -// CHECK-NEXT: %8 = call i64 @main.sum(%"{{.*}}/runtime/internal/runtime.Slice" %7) -// CHECK-NEXT: %9 = call i32 (ptr, ...) @printf(ptr @0, i64 %8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", align 1{{$}} + func main() { c.Printf(c.Str("Hello %d\n"), sum(1, 2, 3, 4)) } -// CHECK-LABEL: define i64 @main.sum(%"{{.*}}/runtime/internal/runtime.Slice" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_2, %_llgo_0 -// CHECK-NEXT: %2 = phi i64 [ 0, %_llgo_0 ], [ %13, %_llgo_2 ] -// CHECK-NEXT: %3 = phi i64 [ -1, %_llgo_0 ], [ %4, %_llgo_2 ] -// CHECK-NEXT: %4 = add i64 %3, 1 -// CHECK-NEXT: %5 = icmp slt i64 %4, %1 -// CHECK-NEXT: br i1 %5, label %_llgo_2, label %_llgo_3 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 0 -// CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %0, 1 -// CHECK-NEXT: %8 = icmp slt i64 %4, 0 -// CHECK-NEXT: %9 = icmp uge i64 %4, %7 -// CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) -// CHECK-NEXT: %11 = getelementptr inbounds i64, ptr %6, i64 %4 -// CHECK-NEXT: %12 = load i64, ptr %11, align 8 -// CHECK-NEXT: %13 = add i64 %2, %12 -// CHECK-NEXT: br label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: ret i64 %2 -// CHECK-NEXT: } func sum(args ...int) (ret int) { for _, v := range args { ret += v } return } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.Slice", align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 0 +// CHECK-NEXT: store i64 1, ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 1 +// CHECK-NEXT: store i64 2, ptr %[[TMP3]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 2 +// CHECK-NEXT: store i64 3, ptr %[[TMP4]], align 8 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 3 +// CHECK-NEXT: store i64 4, ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP6]], i64 4, 1 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP7]], i64 4, 2 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP8]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = call i64 @main.sum(ptr %[[TMP0]]) +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call i64 @main.sum(ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0]]) +// CHECK-NEXT: %[[TMP10:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP9]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define i64 @main.sum( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr byval(%"{{.*}}/runtime/internal/runtime.Slice") %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.Slice", ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1]]: +// CHECK-NEXT: %[[TMP3:[0-9]+]] = phi i64 [ 0, %_llgo_[[BB0]] ], [ %[[TMP14:[0-9]+]], %_llgo_[[BB2:[0-9]+]] ] +// CHECK-NEXT: %[[TMP4:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP5:[0-9]+]], %_llgo_[[BB2]] ] +// CHECK-NEXT: %[[TMP5]] = add i64 %[[TMP4]], 1 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = icmp slt i64 %[[TMP5]], %[[TMP2]] +// CHECK-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB2]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2]]: +// CHECK-NEXT: %[[TMP7:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 0 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP1]], 1 +// CHECK-NEXT: %[[TMP9:[0-9]+]] = icmp slt i64 %[[TMP5]], 0 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = icmp uge i64 %[[TMP5]], %[[TMP8]] +// CHECK-NEXT: %[[TMP11:[0-9]+]] = or i1 %[[TMP10]], %[[TMP9]] +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[TMP11]], i64 %[[TMP5]], i1 true, i64 %[[TMP8]]) +// CHECK-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP7]], i64 %[[TMP5]] +// CHECK-NEXT: %[[TMP13:[0-9]+]] = load i64, ptr %[[TMP12]], align 8 +// CHECK-NEXT: %[[TMP14]] = add i64 %[[TMP3]], %[[TMP13]] +// CHECK-NEXT: br label %_llgo_[[BB1]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// CHECK-NEXT: ret i64 %[[TMP3]] +// CHECK-NEXT: } diff --git a/cl/_testrt/tpabi/in.go b/cl/_testrt/tpabi/in.go index e73ff3f116..b682ce2fdf 100644 --- a/cl/_testrt/tpabi/in.go +++ b/cl/_testrt/tpabi/in.go @@ -1,12 +1,18 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.T[string,int].Info\E|\Qmain.(*T[string,int]).Demo\E|\Qmain.(*T[string,int]).Info\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import "github.com/goplus/lib/c" -// CHECK: {{^}}@0 = private unnamed_addr constant [1 x i8] c"a", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [4 x i8] c"Info", align 1{{$}} -// CHECK: {{^}}@10 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} -// CHECK: {{^}}@12 = private unnamed_addr constant [54 x i8] c"{{.*}}/cl/_testrt/tpabi.T[string, int]", align 1{{$}} +// Generic instantiation keeps the concrete type in interface metadata and +// preserves both value and pointer method ABIs. llgo.advance must lower to the +// same array GEP for its C helper and linked method spellings. + +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [1 x i8] c"a", align 1{{$}} +// CHECK: {{^}}@[[GLOB5:[0-9]+]] = private unnamed_addr constant [4 x i8] c"Info", align 1{{$}} +// CHECK: {{^}}@[[GLOB10:[0-9]+]] = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} +// CHECK: {{^}}@[[GLOB12:[0-9]+]] = private unnamed_addr constant [54 x i8] c"{{.*}}/cl/_testrt/tpabi.T[string, int]", align 1{{$}} type T[M, N any] struct { m M @@ -43,114 +49,211 @@ func main() { println(k.Advance(1)) } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = alloca %"main.T[string,int]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 24, i1 false) -// CHECK-NEXT: %1 = getelementptr inbounds %"main.T[string,int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds %"main.T[string,int]", ptr %0, i32 0, i32 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 1 }, ptr %1, align 8 -// CHECK-NEXT: store i64 1, ptr %2, align 8 -// CHECK-NEXT: %3 = load %"main.T[string,int]", ptr %0, align 8 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) -// CHECK-NEXT: store %"main.T[string,int]" %3, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_main.T[string,int]", ptr undef }, ptr %4, 1 -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %5, 0 -// CHECK-NEXT: %7 = icmp eq ptr %6, @"_llgo_main.T[string,int]" -// CHECK-NEXT: br i1 %7, label %_llgo_1, label %_llgo_2 +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca %"main.T[string,int]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP0]], i8 0, i64 24, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 1 }, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) +// DARWIN-ARM64-NEXT: store %"main.T[string,int]" %[[TMP3]], ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_main.T[string,int]", ptr undef }, ptr %[[TMP4]], 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 0 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = icmp eq ptr %[[TMP6]], @"_llgo_main.T[string,int]" +// DARWIN-ARM64-NEXT: br i1 %[[TMP7]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"main.T[string,int]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP2]], i8 0, i64 24, i1 false) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 1 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 24) +// LINUX-AMD64-NEXT: store %"main.T[string,int]" %[[TMP5]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"_llgo_main.T[string,int]", ptr undef }, ptr %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]], 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = icmp eq ptr %[[TMP8]], @"_llgo_main.T[string,int]" +// LINUX-AMD64-NEXT: br i1 %[[TMP9]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %5, 1 -// CHECK-NEXT: %9 = load %"main.T[string,int]", ptr %8, align 8 -// CHECK-NEXT: %10 = extractvalue %"main.T[string,int]" %9, 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %10) +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP5]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"main.T[string,int]" %[[TMP9]], 0 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP10]]) +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP7]], 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = extractvalue %"main.T[string,int]" %[[TMP11]], 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP12]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load ptr, ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load i64, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP14]], i64 %[[TMP16]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) -// CHECK-NEXT: %12 = getelementptr inbounds %"main.T[string,int]", ptr %11, i32 0, i32 0 -// CHECK-NEXT: %13 = getelementptr inbounds %"main.T[string,int]", ptr %11, i32 0, i32 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @10, i64 5 }, ptr %12, align 8 -// CHECK-NEXT: store i64 100, ptr %13, align 8 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.T[string,int]") -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %14, 0 -// CHECK-NEXT: %16 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %15, ptr %11, 1 -// CHECK-NEXT: %17 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %16) -// CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %16, 0 -// CHECK-NEXT: %19 = getelementptr ptr, ptr %18, i64 3 -// CHECK-NEXT: %20 = load ptr, ptr %19, align 8 -// CHECK-NEXT: %21 = insertvalue { ptr, ptr } undef, ptr %20, 0 -// CHECK-NEXT: %22 = insertvalue { ptr, ptr } %21, ptr %17, 1 -// CHECK-NEXT: %23 = extractvalue { ptr, ptr } %22, 1 -// CHECK-NEXT: %24 = extractvalue { ptr, ptr } %22, 0 -// CHECK-NEXT: call void %24(ptr %23) -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: %26 = getelementptr inbounds i64, ptr %25, i64 0 -// CHECK-NEXT: %27 = getelementptr inbounds i64, ptr %25, i64 1 -// CHECK-NEXT: %28 = getelementptr inbounds i64, ptr %25, i64 2 -// CHECK-NEXT: %29 = getelementptr inbounds i64, ptr %25, i64 3 -// CHECK-NEXT: store i64 1, ptr %26, align 8 -// CHECK-NEXT: store i64 2, ptr %27, align 8 -// CHECK-NEXT: store i64 3, ptr %28, align 8 -// CHECK-NEXT: store i64 4, ptr %29, align 8 -// CHECK-NEXT: %30 = getelementptr [4 x i64], ptr %25, i64 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %30) +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP11]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP11]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB10]], i64 5 }, ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: store i64 100, ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs", ptr @"*_llgo_main.T[string,int]") +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP14]], 0 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP15]], ptr %[[TMP11]], 1 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP16]]) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP16]], 0 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = getelementptr ptr, ptr %[[TMP18]], i64 3 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = load ptr, ptr %[[TMP19]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP20]], 0 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP21]], ptr %[[TMP17]], 1 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP22]], 1 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP22]], 0 +// DARWIN-ARM64-NEXT: call void %[[TMP24]](ptr %[[TMP23]]) +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP25]], i64 0 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP25]], i64 1 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP25]], i64 2 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP25]], i64 3 +// DARWIN-ARM64-NEXT: store i64 1, ptr %[[TMP26]], align 8 +// DARWIN-ARM64-NEXT: store i64 2, ptr %[[TMP27]], align 8 +// DARWIN-ARM64-NEXT: store i64 3, ptr %[[TMP28]], align 8 +// DARWIN-ARM64-NEXT: store i64 4, ptr %[[TMP29]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = getelementptr [4 x i64], ptr %[[TMP25]], i64 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP30]]) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP17]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP17]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB10]], i64 5 }, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: store i64 100, ptr %[[TMP19]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$BP0p_lUsEd-IbbtJVukGmgrdQkqzcoYzSiwgUvgFvUs", ptr @"*_llgo_main.T[string,int]") +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP20]], 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP21]], ptr %[[TMP17]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP22]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = load ptr, ptr %[[TMP23]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = load ptr, ptr %[[TMP25]], align 8 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(ptr %[[TMP24]], ptr %[[TMP26]]) +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP22]], 0 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = getelementptr ptr, ptr %[[TMP28]], i64 3 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = load ptr, ptr %[[TMP29]], align 8 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP30]], 0 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP31]], ptr %[[TMP27]], 1 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP32]], 1 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP32]], 0 +// LINUX-AMD64-NEXT: call void %[[TMP34]](ptr %[[TMP33]]) +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP35]], i64 0 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP35]], i64 1 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP35]], i64 2 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP35]], i64 3 +// LINUX-AMD64-NEXT: store i64 1, ptr %[[TMP36]], align 8 +// LINUX-AMD64-NEXT: store i64 2, ptr %[[TMP37]], align 8 +// LINUX-AMD64-NEXT: store i64 3, ptr %[[TMP38]], align 8 +// LINUX-AMD64-NEXT: store i64 4, ptr %[[TMP39]], align 8 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = getelementptr [4 x i64], ptr %[[TMP35]], i64 1 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP40]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %31 = getelementptr [4 x i64], ptr %25, i64 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %31) +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = getelementptr [4 x i64], ptr %[[TMP25]], i64 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP31]]) +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = getelementptr [4 x i64], ptr %[[TMP35]], i64 1 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintPointer"(ptr %[[TMP41]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: ret void // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %6, ptr @"_llgo_main.T[string,int]") +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP6]], ptr @"_llgo_main.T[string,int]") +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %[[TMP8]], ptr @"_llgo_main.T[string,int]") // CHECK-NEXT: unreachable // CHECK-NEXT: } -// CHECK-LABEL: define linkonce void @"main.T[string,int].Info"(%"main.T[string,int]" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"main.T[string,int]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 24, i1 false) -// CHECK-NEXT: store %"main.T[string,int]" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %"main.T[string,int]", ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.String", ptr %2, align 8 -// CHECK-NEXT: %4 = getelementptr inbounds %"main.T[string,int]", ptr %1, i32 0, i32 1 -// CHECK-NEXT: %5 = load i64, ptr %4, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %3) +// CHECK-LABEL: define linkonce void @"main.(*T[string,int]).Demo"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load i64, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP2]]) +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load i64, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP3]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load ptr, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load i64, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP7]], i64 %[[TMP9]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %5) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP4]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP5]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define linkonce void @"main.(*T[string,int]).Demo"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %"main.T[string,int]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load %"{{.*}}/runtime/internal/runtime.String", ptr %1, align 8 -// CHECK-NEXT: %3 = getelementptr inbounds %"main.T[string,int]", ptr %0, i32 0, i32 1 -// CHECK-NEXT: %4 = load i64, ptr %3, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %2) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %4) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-LABEL: define linkonce void @"main.(*T[string,int]).Info"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca %"main.T[string,int]", align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP2]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB12]], i64 54 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 4 }) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: store %"main.T[string,int]" %[[TMP3]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: call void @"main.T[string,int].Info"(ptr %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB12]], i64 54 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load ptr, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load i64, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB5]], i64 4 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load i64, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP4]], ptr %[[TMP6]], i64 %[[TMP8]], ptr %[[TMP10]], i64 %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: store %"main.T[string,int]" %[[TMP13]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: call void @"main.T[string,int].Info"(ptr byval(%"main.T[string,int]") %[[TMP1]]) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define linkonce void @"main.(*T[string,int]).Info"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @12, i64 54 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 4 }) -// CHECK-NEXT: %2 = load %"main.T[string,int]", ptr %0, align 8 -// CHECK-NEXT: call void @"main.T[string,int].Info"(%"main.T[string,int]" %2) +// CHECK-LABEL: define linkonce void @"main.T[string,int].Info"( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr byval(%"main.T[string,int]") %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = load %"main.T[string,int]", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca %"main.T[string,int]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP2]], i8 0, i64 24, i1 false) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"main.T[string,int]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 24, i1 false) +// CHECK-NEXT: store %"main.T[string,int]" %[[TMP1]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = load i64, ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP4]]) +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"main.T[string,int]", ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load i64, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP5]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load i64, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP9]], i64 %[[TMP11]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP6]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %[[TMP7]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testrt/tpfunc/in.go b/cl/_testrt/tpfunc/in.go index cb39d77b28..3a28ff659f 100644 --- a/cl/_testrt/tpfunc/in.go +++ b/cl/_testrt/tpfunc/in.go @@ -5,19 +5,6 @@ import ( "unsafe" ) -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - type Func func(*int) //llgo:type C @@ -26,56 +13,40 @@ type CFunc func(*int) //llgo:type C type Callback[T any] func(*T) +// The Go function value is two words, while both llgo:type C forms are one word. // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 16) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 8) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 16) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 8) +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 8) + +// All three source literals still dereference and print the same *int argument. +// CHECK-LABEL: define void @"main.main$1"(ptr %0){{.*}} { +// CHECK: [[GO_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[GO_NIL]]) +// CHECK: [[GO_VALUE:%[0-9]+]] = load i64, ptr %0 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[GO_VALUE]]) + +// CHECK-LABEL: define void @"main.main$2"(ptr %0){{.*}} { +// CHECK: [[C_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[C_NIL]]) +// CHECK: [[C_VALUE:%[0-9]+]] = load i64, ptr %0 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[C_VALUE]]) + +// CHECK-LABEL: define void @"main.main$3"(ptr %0){{.*}} { +// CHECK: [[GENERIC_C_NIL:%[0-9]+]] = icmp eq ptr %0, null +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 [[GENERIC_C_NIL]]) +// CHECK: [[GENERIC_C_VALUE:%[0-9]+]] = load i64, ptr %0 +// CHECK: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 [[GENERIC_C_VALUE]]) func main() { - // CHECK-LABEL: define void @"main.main$1"(ptr %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = icmp eq ptr %0, null - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - var fn1 Func = func(v *int) { println(*v) } - // CHECK-LABEL: define void @"main.main$2"(ptr %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = icmp eq ptr %0, null - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - var fn2 CFunc = func(v *int) { println(*v) } - // CHECK-LABEL: define void @"main.main$3"(ptr %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = icmp eq ptr %0, null - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref"(i1 %1) - // CHECK-NEXT: %2 = load i64, ptr %0, align 8 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %2) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - var fn3 Callback[int] = func(v *int) { println(*v) } diff --git a/cl/_testrt/tpmap/in.go b/cl/_testrt/tpmap/in.go index d7e123a771..da412e4e60 100644 --- a/cl/_testrt/tpmap/in.go +++ b/cl/_testrt/tpmap/in.go @@ -1,6 +1,10 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main +// CHECK: {{^}}@[[GLOB29:[0-9]+]] = private unnamed_addr constant [5 x i8] c"world", align 1{{$}} + type T1 int type T2 struct { @@ -19,68 +23,132 @@ type cacheKey struct { t5 uintptr } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_main.cacheKey]_llgo_string", i64 0) -// CHECK-NEXT: %1 = alloca %main.cacheKey, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 48, i1 false) -// CHECK-NEXT: %2 = getelementptr inbounds %main.cacheKey, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = getelementptr inbounds %main.cacheKey, ptr %1, i32 0, i32 1 -// CHECK-NEXT: %4 = getelementptr inbounds %main.T2, ptr %3, i32 0, i32 0 -// CHECK-NEXT: %5 = getelementptr inbounds %main.cacheKey, ptr %1, i32 0, i32 2 -// CHECK-NEXT: %6 = getelementptr inbounds %"main.T3[any]", ptr %5, i32 0, i32 0 -// CHECK-NEXT: %7 = getelementptr inbounds %main.cacheKey, ptr %1, i32 0, i32 3 -// CHECK-NEXT: %8 = getelementptr inbounds %main.cacheKey, ptr %1, i32 0, i32 4 -// CHECK-NEXT: store i64 0, ptr %2, align 8 -// CHECK-NEXT: store i64 0, ptr %4, align 8 -// CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %9, align 8 -// CHECK-NEXT: %10 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %9, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %10, ptr %6, align 8 -// CHECK-NEXT: store ptr null, ptr %7, align 8 -// CHECK-NEXT: store i64 0, ptr %8, align 8 -// CHECK-NEXT: %11 = load %main.cacheKey, ptr %1, align 8 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: store %main.cacheKey %11, ptr %12, align 8 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %0, ptr %12) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @29, i64 5 }, ptr %13, align 8 -// CHECK-NEXT: %14 = alloca %main.cacheKey, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %14, i8 0, i64 48, i1 false) -// CHECK-NEXT: %15 = getelementptr inbounds %main.cacheKey, ptr %14, i32 0, i32 0 -// CHECK-NEXT: %16 = getelementptr inbounds %main.cacheKey, ptr %14, i32 0, i32 1 -// CHECK-NEXT: %17 = getelementptr inbounds %main.T2, ptr %16, i32 0, i32 0 -// CHECK-NEXT: %18 = getelementptr inbounds %main.cacheKey, ptr %14, i32 0, i32 2 -// CHECK-NEXT: %19 = getelementptr inbounds %"main.T3[any]", ptr %18, i32 0, i32 0 -// CHECK-NEXT: %20 = getelementptr inbounds %main.cacheKey, ptr %14, i32 0, i32 3 -// CHECK-NEXT: %21 = getelementptr inbounds %main.cacheKey, ptr %14, i32 0, i32 4 -// CHECK-NEXT: store i64 0, ptr %15, align 8 -// CHECK-NEXT: store i64 0, ptr %17, align 8 -// CHECK-NEXT: %22 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %22, align 8 -// CHECK-NEXT: %23 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %22, 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %23, ptr %19, align 8 -// CHECK-NEXT: store ptr null, ptr %20, align 8 -// CHECK-NEXT: store i64 0, ptr %21, align 8 -// CHECK-NEXT: %24 = load %main.cacheKey, ptr %14, align 8 -// CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: store %main.cacheKey %24, ptr %25, align 8 -// CHECK-NEXT: %26 = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %0, ptr %25) -// CHECK-NEXT: %27 = extractvalue { ptr, i1 } %26, 0 -// CHECK-NEXT: %28 = load %"{{.*}}/runtime/internal/runtime.String", ptr %27, align 8 -// CHECK-NEXT: %29 = extractvalue { ptr, i1 } %26, 1 -// CHECK-NEXT: %30 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %28, 0 -// CHECK-NEXT: %31 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %30, i1 %29, 1 -// CHECK-NEXT: %32 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %31, 0 -// CHECK-NEXT: %33 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %31, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %33) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { m := map[cacheKey]string{} m[cacheKey{0, T2{0}, T3[any]{0}, nil, 0}] = "world" v, ok := m[cacheKey{0, T2{0}, T3[any]{0}, nil, 0}] println(v, ok) } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = alloca [2 x i64], align 8 +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_main.cacheKey]_llgo_string", i64 0) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = alloca %main.cacheKey, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP2]], i8 0, i64 48, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP2]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP2]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP4]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP2]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP6]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP2]], i32 0, i32 3 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP2]], i32 0, i32 4 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP5]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca { ptr, i1 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MakeMap"(ptr @"map[_llgo_main.cacheKey]_llgo_string", i64 0) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %main.cacheKey, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 48, i1 false) +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP3]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP3]], i32 0, i32 3 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP3]], i32 0, i32 4 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP11]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP12]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store ptr null, ptr %[[TMP9]], align 8 +// CHECK-NEXT: store i64 0, ptr %[[TMP10]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP10]], 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: store ptr null, ptr %[[TMP8]], align 8 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP9]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = load %main.cacheKey, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// DARWIN-ARM64-NEXT: store %main.cacheKey %[[TMP12]], ptr %[[TMP13]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP1]], ptr %[[TMP13]]) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB29]], i64 5 }, ptr %[[TMP14]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = alloca %main.cacheKey, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP15]], i8 0, i64 48, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP15]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP15]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP17]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP15]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP19]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP15]], i32 0, i32 3 +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP15]], i32 0, i32 4 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP16]], align 8 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %main.cacheKey, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// LINUX-AMD64-NEXT: store %main.cacheKey %[[TMP13]], ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP2]], ptr %[[TMP14]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB29]], i64 5 }, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = alloca %main.cacheKey, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP16]], i8 0, i64 48, i1 false) +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP16]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP16]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP18]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP16]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP20]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP16]], i32 0, i32 3 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP16]], i32 0, i32 4 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP19]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// LINUX-AMD64-NEXT: store i64 0, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP25]], ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: store ptr null, ptr %[[TMP22]], align 8 +// CHECK-NEXT: store i64 0, ptr %[[TMP23]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP23]], 1 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP24]], ptr %[[TMP20]], align 8 +// DARWIN-ARM64-NEXT: store ptr null, ptr %[[TMP21]], align 8 +// DARWIN-ARM64-NEXT: store i64 0, ptr %[[TMP22]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = load %main.cacheKey, ptr %[[TMP15]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// DARWIN-ARM64-NEXT: store %main.cacheKey %[[TMP25]], ptr %[[TMP26]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = call [2 x i64] @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP1]], ptr %[[TMP26]]) +// DARWIN-ARM64-NEXT: store [2 x i64] %[[TMP27]], ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = load { ptr, i1 }, ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP28]], 0 +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP29]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP28]], 1 +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %[[TMP30]], 0 +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP32]], i1 %[[TMP31]], 1 +// DARWIN-ARM64-NEXT: %[[TMP34:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP33]], 0 +// DARWIN-ARM64-NEXT: %[[TMP35:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP33]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP34]]) +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = load %main.cacheKey, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// LINUX-AMD64-NEXT: store %main.cacheKey %[[TMP26]], ptr %[[TMP27]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP2]], ptr %[[TMP27]]) +// LINUX-AMD64-NEXT: store { ptr, i1 } %[[TMP28]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load { ptr, i1 }, ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP29]], 0 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP29]], 1 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %[[TMP31]], 0 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP33]], i1 %[[TMP32]], 1 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP34]], 0 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP34]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" %[[TMP35]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = load ptr, ptr %[[TMP37]], align 8 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load i64, ptr %[[TMP39]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP38]], i64 %[[TMP40]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP35]]) +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP36]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } diff --git a/cl/_testrt/tpmethod/in.go b/cl/_testrt/tpmethod/in.go index 3e379e2198..c50ad9b557 100644 --- a/cl/_testrt/tpmethod/in.go +++ b/cl/_testrt/tpmethod/in.go @@ -1,9 +1,11 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.ReadFile\E|\Qmain.ReadFile$1\E|\Qmain.main\E|\Qmain.main$1\E|\Qmain.Async[main.Tuple[error]]\E|\Qmain.Tuple[error].Get\E|\Qmain.(*future[main.Tuple[error]]).Then\E|\Qmain.(*Tuple[error]).Get\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main -// CHECK: {{^}}@0 = private unnamed_addr constant [7 x i8] c"foo.txt", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [17 x i8] c"main.Tuple[error]", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [3 x i8] c"Get", align 1{{$}} +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [7 x i8] c"foo.txt", align 1{{$}} +// CHECK: {{^}}@[[GLOB7:[0-9]+]] = private unnamed_addr constant [3 x i8] c"Get", align 1{{$}} +// CHECK: {{^}}@[[GLOB16:[0-9]+]] = private unnamed_addr constant [55 x i8] c"{{.*}}/cl/_testrt/tpmethod.Tuple[error]", align 1{{$}} type Tuple[T any] struct { v T @@ -29,111 +31,289 @@ func Async[T any](fn func(func(T))) Future[T] { return &future[T]{fn: fn} } -// CHECK-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.ReadFile(%"{{.*}}/runtime/internal/runtime.String" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Async[main.Tuple[error]]"({ ptr, ptr } { ptr @"main.ReadFile$1", ptr null }) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %1 -// CHECK-NEXT: } - func ReadFile(fileName string) Future[Tuple[error]] { - // CHECK-LABEL: define void @"main.ReadFile$1"({ ptr, ptr } %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = alloca %"main.Tuple[error]", align 8 - // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) - // CHECK-NEXT: %2 = getelementptr inbounds %"main.Tuple[error]", ptr %1, i32 0, i32 0 - // CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %2, align 8 - // CHECK-NEXT: %3 = load %"main.Tuple[error]", ptr %1, align 8 - // CHECK-NEXT: %4 = extractvalue { ptr, ptr } %0, 1 - // CHECK-NEXT: %5 = extractvalue { ptr, ptr } %0, 0 - // CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) - // CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, %"main.Tuple[error]" %3) - // CHECK-NEXT: ret void - // CHECK-NEXT: } - - // CHECK-LABEL: define void @main.init(){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 - // CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 - // CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 - // CHECK-NEXT: br label %_llgo_2 - // CHECK-EMPTY: - // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 - // CHECK-NEXT: ret void - // CHECK-NEXT: } return Async[Tuple[error]](func(resolve func(Tuple[error])) { resolve(Tuple[error]{v: nil}) }) } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call %"{{.*}}/runtime/internal/runtime.iface" @main.ReadFile(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 7 }) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 -// CHECK-NEXT: %3 = getelementptr ptr, ptr %2, i64 3 -// CHECK-NEXT: %4 = load ptr, ptr %3, align 8 -// CHECK-NEXT: %5 = insertvalue { ptr, ptr } undef, ptr %4, 0 -// CHECK-NEXT: %6 = insertvalue { ptr, ptr } %5, ptr %1, 1 -// CHECK-NEXT: %7 = extractvalue { ptr, ptr } %6, 1 -// CHECK-NEXT: %8 = extractvalue { ptr, ptr } %6, 0 -// CHECK-NEXT: call void %8(ptr %7, { ptr, ptr } { ptr @"main.main$1", ptr null }) -// CHECK-NEXT: ret void -// CHECK-NEXT: } - func main() { - // CHECK-LABEL: define void @"main.main$1"(%"main.Tuple[error]" %0){{.*}} { - // CHECK-NEXT: _llgo_0: - // CHECK-NEXT: %1 = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"(%"main.Tuple[error]" %0) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %1) - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) - // CHECK-NEXT: ret void - // CHECK-NEXT: } ReadFile("foo.txt").Then(func(v Tuple[error]) { println(v.Get()) }) } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.Async[main.Tuple[error]]"({ ptr, ptr } %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %2 = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %1, i32 0, i32 0 -// CHECK-NEXT: store { ptr, ptr } %0, ptr %2, align 8 -// CHECK-NEXT: %3 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface${{[-A-Za-z0-9_]+}}", ptr @"*_llgo_main.future[main.Tuple[error]]") -// CHECK-NEXT: %4 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %3, 0 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %4, ptr %1, 1 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %5 +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @main.ReadFile(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 7 }) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP0]]) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = getelementptr ptr, ptr %[[TMP2]], i64 3 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 7 }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load ptr, ptr %[[TMP3]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP4]], 0 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP5]], ptr %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP6]], 1 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP6]], 0 +// DARWIN-ARM64-NEXT: call void %[[TMP8]](ptr %[[TMP7]], { ptr, ptr } { ptr @"main.main$1", ptr null }) +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load i64, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = call { ptr, ptr } @main.ReadFile(ptr %[[TMP4]], i64 %[[TMP6]]) +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP7]], ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP9]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(ptr %[[TMP11]], ptr %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP9]], 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr ptr, ptr %[[TMP15]], i64 3 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP17]], 0 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP18]], ptr %[[TMP14]], 1 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP19]], 1 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP19]], 0 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.main$1", ptr null }, ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = load ptr, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: call void %[[TMP21]](ptr %[[TMP20]], ptr %[[TMP23]], ptr %[[TMP25]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// DARWIN-ARM64-LABEL: define %"{{.*}}/runtime/internal/runtime.iface" @main.ReadFile( +// DARWIN-ARM64-SAME: %"{{.*}}/runtime/internal/runtime.String" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define { ptr, ptr } @main.ReadFile( +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Async[main.Tuple[error]]"({ ptr, ptr } { ptr @"main.ReadFile$1", ptr null }) +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %[[TMP1]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, i64 }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store i64 %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } { ptr @"main.ReadFile$1", ptr null }, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load ptr, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = call { ptr, ptr } @"main.Async[main.Tuple[error]]"(ptr %[[TMP8]], ptr %[[TMP10]]) +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP11]], ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP13]], ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP15]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.ReadFile$1"( +// DARWIN-ARM64-SAME: { ptr, ptr } %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.Tuple[error]", ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP0]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP0]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP5]]) +// DARWIN-ARM64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP4]], %"main.Tuple[error]" %[[TMP3]]) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP7]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"main.Tuple[error]", ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" zeroinitializer, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP5]], 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP5]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP11]]) +// LINUX-AMD64-NEXT: store %"main.Tuple[error]" %[[TMP9]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP10]], ptr %[[TMP13]], ptr %[[TMP15]]) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.main$1"( +// DARWIN-ARM64-SAME: %"main.Tuple[error]" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"(%"main.Tuple[error]" %[[TMP0]]) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// LINUX-AMD64-NEXT: store %"main.Tuple[error]" %[[TMP5]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load ptr, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = call { ptr, ptr } @"main.Tuple[error].Get"(ptr %[[TMP9]], ptr %[[TMP11]]) +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP12]], ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP14]], ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintIface"(ptr %[[TMP16]], ptr %[[TMP18]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// DARWIN-ARM64-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.Async[main.Tuple[error]]"( +// DARWIN-ARM64-SAME: { ptr, ptr } %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define linkonce { ptr, ptr } @"main.Async[main.Tuple[error]]"( +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: store { ptr, ptr } %[[TMP0]], ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$DoRJPuBst8Lp1uEP2e7OnwiP-bLraZwFmeGcjrik3Mw", ptr @"*_llgo_main.future[main.Tuple[error]]") +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP3]], 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP4]], ptr %[[TMP1]], 1 +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %[[TMP5]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP5]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$DoRJPuBst8Lp1uEP2e7OnwiP-bLraZwFmeGcjrik3Mw", ptr @"*_llgo_main.future[main.Tuple[error]]") +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP8]], 0 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP9]], ptr %[[TMP6]], 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP10]], ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP12]] // CHECK-NEXT: } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"(%"main.Tuple[error]" %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %"main.Tuple[error]", align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 16, i1 false) -// CHECK-NEXT: store %"main.Tuple[error]" %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %"main.Tuple[error]", ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %2, align 8 -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 +// DARWIN-ARM64-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"( +// DARWIN-ARM64-SAME: %"main.Tuple[error]" %[[TMP0:[0-9]+]]){{.*}} { +// LINUX-AMD64-LABEL: define linkonce { ptr, ptr } @"main.Tuple[error].Get"( +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 16, i1 false) +// DARWIN-ARM64-NEXT: store %"main.Tuple[error]" %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.Tuple[error]", ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %[[TMP3]] +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP0]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP6]], i8 0, i64 16, i1 false) +// LINUX-AMD64-NEXT: store %"main.Tuple[error]" %[[TMP5]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %"main.Tuple[error]", ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP8]], ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP10]] // CHECK-NEXT: } -// CHECK-LABEL: define linkonce void @"main.(*future[main.Tuple[error]]).Then"(ptr %0, { ptr, ptr } %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %0, i32 0, i32 0 -// CHECK-NEXT: %3 = load { ptr, ptr }, ptr %2, align 8 -// CHECK-NEXT: %4 = extractvalue { ptr, ptr } %3, 1 -// CHECK-NEXT: %5 = extractvalue { ptr, ptr } %3, 0 -// CHECK-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %5) -// CHECK-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %4, { ptr, ptr } %1) +// CHECK-LABEL: define linkonce void @"main.(*future[main.Tuple[error]]).Then"( +// DARWIN-ARM64-SAME: ptr %[[TMP0:[0-9]+]], { ptr, ptr } %[[TMP1:[0-9]+]]){{.*}} { +// LINUX-AMD64-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]], ptr %[[TMP2:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP2]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 1 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP3]], 0 +// DARWIN-ARM64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP5]]) +// DARWIN-ARM64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP4]], { ptr, ptr } %[[TMP1]]) +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: store ptr %[[TMP1]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: store ptr %[[TMP2]], ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %"main.future[main.Tuple[error]]", ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP9]], 1 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP9]], 0 +// LINUX-AMD64-NEXT: %__llgo_funcval_code = call ptr asm "", "=r,0"(ptr %[[TMP11]]) +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP6]], ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load ptr, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = load ptr, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: call void %__llgo_funcval_code(ptr {{(nest|swiftself)}} %[[TMP10]], ptr %[[TMP13]], ptr %[[TMP15]]) // CHECK-NEXT: ret void // CHECK-NEXT: } -// CHECK-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.(*Tuple[error]).Get"(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = icmp eq ptr %0, null -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %1, %"{{.*}}/runtime/internal/runtime.String" { ptr @16, i64 55 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 3 }) -// CHECK-NEXT: %2 = load %"main.Tuple[error]", ptr %0, align 8 -// CHECK-NEXT: %3 = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"(%"main.Tuple[error]" %2) -// CHECK-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %3 +// DARWIN-ARM64-LABEL: define linkonce %"{{.*}}/runtime/internal/runtime.iface" @"main.(*Tuple[error]).Get"( +// LINUX-AMD64-LABEL: define linkonce { ptr, ptr } @"main.(*Tuple[error]).Get"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP1]], %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB16]], i64 55 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB7]], i64 3 }) +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP0]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.iface" @"main.Tuple[error].Get"(%"main.Tuple[error]" %[[TMP2]]) +// DARWIN-ARM64-NEXT: ret %"{{.*}}/runtime/internal/runtime.iface" %[[TMP3]] +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"main.Tuple[error]", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca { ptr, ptr }, align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = icmp eq ptr %[[TMP0]], null +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB16]], i64 55 }, ptr %[[TMP3]], align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = load ptr, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP3]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = load i64, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB7]], i64 3 }, ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = load ptr, ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = load i64, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicWrapNilPointer"(i1 %[[TMP5]], ptr %[[TMP7]], i64 %[[TMP9]], ptr %[[TMP11]], i64 %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load %"main.Tuple[error]", ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: store %"main.Tuple[error]" %[[TMP14]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = load ptr, ptr %[[TMP17]], align 8 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = call { ptr, ptr } @"main.Tuple[error].Get"(ptr %[[TMP16]], ptr %[[TMP18]]) +// LINUX-AMD64-NEXT: store { ptr, ptr } %[[TMP19]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.iface", ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP20]], ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = load { ptr, ptr }, ptr %[[TMP21]], align 8 +// LINUX-AMD64-NEXT: ret { ptr, ptr } %[[TMP22]] // CHECK-NEXT: } diff --git a/cl/_testrt/tpunsafe/in.go b/cl/_testrt/tpunsafe/in.go index a19bd33d6e..d07ac53f4e 100644 --- a/cl/_testrt/tpunsafe/in.go +++ b/cl/_testrt/tpunsafe/in.go @@ -1,10 +1,17 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.main\E|\Qmain.(*M[bool]).check\E|\Qmain.(*M[int64]).check\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( "unsafe" ) +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [4 x i8] c"have", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [4 x i8] c"want", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [20 x i8] c"unsafe.Alignof error", align 1{{$}} +// CHECK: {{^}}@[[GLOB4:[0-9]+]] = private unnamed_addr constant [21 x i8] c"unsafe.Offsetof error", align 1{{$}} + type N[T any] struct { n1 T n2 T @@ -16,14 +23,6 @@ type M[T any] struct { m2 N[T] } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) -// CHECK-NEXT: call void @"main.(*M[bool]).check"(ptr %0, i64 1, i64 8, i64 1) -// CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) -// CHECK-NEXT: call void @"main.(*M[int64]).check"(ptr %1, i64 8, i64 16, i64 8) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { m1 := M[bool]{} m1.check(1, 8, 1) @@ -31,154 +30,338 @@ func main() { m2.check(8, 16, 8) } -// CHECK-LABEL: define linkonce void @"main.(*M[bool]).check"(ptr %0, i64 %1, i64 %2, i64 %3){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %4 = getelementptr inbounds %"main.M[bool]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %5 = load %"main.N[bool]", ptr %4, align 1 -// CHECK-NEXT: %6 = icmp ne i64 1, %1 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 +// Each instantiation folds Alignof/Offsetof to its concrete layout while still +// addressing the instantiated fields used by the expressions. +func (m *M[T]) check(align, offset1, offset2 uintptr) { + if v := unsafe.Alignof(m.m2); v != align { + println("have", v, "want", align) + panic("unsafe.Alignof error") + } + if v := unsafe.Offsetof(m.m2); v != offset1 { + println("have", v, "want", offset1) + panic("unsafe.Offsetof error") + } + if v := unsafe.Offsetof(m.m2.n2); v != offset2 { + println("have", v, "want", offset2) + panic("unsafe.Offsetof error") + } +} + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) +// CHECK-NEXT: call void @"main.(*M[bool]).check"(ptr %[[TMP0]], i64 1, i64 8, i64 1) +// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK-NEXT: call void @"main.(*M[int64]).check"(ptr %[[TMP1]], i64 8, i64 16, i64 8) +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define linkonce void @"main.(*M[bool]).check"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]], i64 %[[TMP2:[0-9]+]], i64 %[[TMP3:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load %"main.N[bool]", ptr %[[TMP4]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = icmp ne i64 1, %[[TMP1]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load %"main.N[bool]", ptr %[[TMP13]], align 1 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = icmp ne i64 1, %[[TMP1]] +// LINUX-AMD64-NEXT: br i1 %[[TMP15]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load i64, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP17]], i64 %[[TMP19]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP11]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP11]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load i64, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP21]], i64 %[[TMP23]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %1) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP1]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %8) +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 20 }, ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 20 }, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP25]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load ptr, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP27]], ptr %[[TMP29]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %9 = getelementptr inbounds %"main.M[bool]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %10 = load %"main.N[bool]", ptr %9, align 1 -// CHECK-NEXT: %11 = icmp ne i64 8, %2 -// CHECK-NEXT: br i1 %11, label %_llgo_3, label %_llgo_4 +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = load %"main.N[bool]", ptr %[[TMP9]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = icmp ne i64 8, %[[TMP2]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP11]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load %"main.N[bool]", ptr %[[TMP30]], align 1 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = icmp ne i64 8, %[[TMP2]] +// LINUX-AMD64-NEXT: br i1 %[[TMP32]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = load ptr, ptr %[[TMP33]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = load i64, ptr %[[TMP35]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP34]], i64 %[[TMP36]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 8) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = load ptr, ptr %[[TMP37]], align 8 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load i64, ptr %[[TMP39]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP38]], i64 %[[TMP40]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %2) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP2]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %12, align 8 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %13) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP12]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP41]], align 8 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP41]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP42]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = load ptr, ptr %[[TMP43]], align 8 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = load ptr, ptr %[[TMP45]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP44]], ptr %[[TMP46]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %14 = getelementptr inbounds %"main.M[bool]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %15 = getelementptr inbounds %"main.N[bool]", ptr %14, i32 0, i32 1 -// CHECK-NEXT: %16 = load i1, ptr %15, align 1 -// CHECK-NEXT: %17 = icmp ne i64 1, %3 -// CHECK-NEXT: br i1 %17, label %_llgo_5, label %_llgo_6 +// CHECK-NEXT: _llgo_[[BB4]]: +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %"main.N[bool]", ptr %[[TMP14]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = load i1, ptr %[[TMP15]], align 1 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = icmp ne i64 1, %[[TMP3]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = getelementptr inbounds %"main.M[bool]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = getelementptr inbounds %"main.N[bool]", ptr %[[TMP47]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = load i1, ptr %[[TMP48]], align 1 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = icmp ne i64 1, %[[TMP3]] +// LINUX-AMD64-NEXT: br i1 %[[TMP50]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = load ptr, ptr %[[TMP51]], align 8 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = load i64, ptr %[[TMP53]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP52]], i64 %[[TMP54]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 1) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP56:[0-9]+]] = load ptr, ptr %[[TMP55]], align 8 +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP5]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = load i64, ptr %[[TMP57]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP56]], i64 %[[TMP58]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %3) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP3]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP18]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP19]]) +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP59]], align 8 +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP59]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP60]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = load ptr, ptr %[[TMP61]], align 8 +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = load ptr, ptr %[[TMP63]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP62]], ptr %[[TMP64]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 +// CHECK-NEXT: _llgo_[[BB6]]: // CHECK-NEXT: ret void // CHECK-NEXT: } -func (m *M[T]) check(align, offset1, offset2 uintptr) { - if v := unsafe.Alignof(m.m2); v != align { - println("have", v, "want", align) - panic("unsafe.Alignof error") - } - if v := unsafe.Offsetof(m.m2); v != offset1 { - println("have", v, "want", offset1) - panic("unsafe.Offsetof error") - } - if v := unsafe.Offsetof(m.m2.n2); v != offset2 { - println("have", v, "want", offset2) - panic("unsafe.Offsetof error") - } -} -// CHECK-LABEL: define linkonce void @"main.(*M[int64]).check"(ptr %0, i64 %1, i64 %2, i64 %3){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %4 = getelementptr inbounds %"main.M[int64]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %5 = load %"main.N[int64]", ptr %4, align 8 -// CHECK-NEXT: %6 = icmp ne i64 8, %1 -// CHECK-NEXT: br i1 %6, label %_llgo_1, label %_llgo_2 +// CHECK-LABEL: define linkonce void @"main.(*M[int64]).check"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], i64 %[[TMP1:[0-9]+]], i64 %[[TMP2:[0-9]+]], i64 %[[TMP3:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load %"main.N[int64]", ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = icmp ne i64 8, %[[TMP1]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP6]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP5:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.String", align 8 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = load %"main.N[int64]", ptr %[[TMP13]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = icmp ne i64 8, %[[TMP1]] +// LINUX-AMD64-NEXT: br i1 %[[TMP15]], label %_llgo_[[BB1:[0-9]+]], label %_llgo_[[BB2:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB1]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP12]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP12]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load i64, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP17]], i64 %[[TMP19]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 8) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP11]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP11]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP11]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load i64, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP21]], i64 %[[TMP23]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %1) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP1]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 20 }, ptr %7, align 8 -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %7, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %8) +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 20 }, ptr %[[TMP7]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]]) +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB2]], i64 20 }, ptr %[[TMP24]], align 8 +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP25]], ptr %[[TMP10]], align 8 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP10]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = load ptr, ptr %[[TMP28]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP27]], ptr %[[TMP29]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: %9 = getelementptr inbounds %"main.M[int64]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %10 = load %"main.N[int64]", ptr %9, align 8 -// CHECK-NEXT: %11 = icmp ne i64 16, %2 -// CHECK-NEXT: br i1 %11, label %_llgo_3, label %_llgo_4 +// CHECK-NEXT: _llgo_[[BB2]]: +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = load %"main.N[int64]", ptr %[[TMP9]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = icmp ne i64 16, %[[TMP2]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP11]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = load %"main.N[int64]", ptr %[[TMP30]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = icmp ne i64 16, %[[TMP2]] +// LINUX-AMD64-NEXT: br i1 %[[TMP32]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP9]], align 8 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = load ptr, ptr %[[TMP33]], align 8 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP9]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = load i64, ptr %[[TMP35]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP34]], i64 %[[TMP36]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 16) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP8]], align 8 +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP8]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = load ptr, ptr %[[TMP37]], align 8 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP8]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = load i64, ptr %[[TMP39]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP38]], i64 %[[TMP40]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %2) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP2]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %12, align 8 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %13) +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP12]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP12]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP13]]) +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP41]], align 8 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP41]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP42]], ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = load ptr, ptr %[[TMP43]], align 8 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP7]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = load ptr, ptr %[[TMP45]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP44]], ptr %[[TMP46]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: %14 = getelementptr inbounds %"main.M[int64]", ptr %0, i32 0, i32 2 -// CHECK-NEXT: %15 = getelementptr inbounds %"main.N[int64]", ptr %14, i32 0, i32 1 -// CHECK-NEXT: %16 = load i64, ptr %15, align 8 -// CHECK-NEXT: %17 = icmp ne i64 8, %3 -// CHECK-NEXT: br i1 %17, label %_llgo_5, label %_llgo_6 +// CHECK-NEXT: _llgo_[[BB4]]: +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %"main.N[int64]", ptr %[[TMP14]], i32 0, i32 1 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = load i64, ptr %[[TMP15]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = icmp ne i64 8, %[[TMP3]] +// DARWIN-ARM64-NEXT: br i1 %[[TMP17]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = getelementptr inbounds %"main.M[int64]", ptr %[[TMP0]], i32 0, i32 2 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = getelementptr inbounds %"main.N[int64]", ptr %[[TMP47]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = load i64, ptr %[[TMP48]], align 8 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = icmp ne i64 8, %[[TMP3]] +// LINUX-AMD64-NEXT: br i1 %[[TMP50]], label %_llgo_[[BB5:[0-9]+]], label %_llgo_[[BB6:[0-9]+]] // CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 4 }) +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 4 }, ptr %[[TMP6]], align 8 +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP52:[0-9]+]] = load ptr, ptr %[[TMP51]], align 8 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP6]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP54:[0-9]+]] = load i64, ptr %[[TMP53]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP52]], i64 %[[TMP54]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 8) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @1, i64 4 }) +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB1]], i64 4 }, ptr %[[TMP5]], align 8 +// LINUX-AMD64-NEXT: %[[TMP55:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP5]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP56:[0-9]+]] = load ptr, ptr %[[TMP55]], align 8 +// LINUX-AMD64-NEXT: %[[TMP57:[0-9]+]] = getelementptr inbounds { ptr, i64 }, ptr %[[TMP5]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP58:[0-9]+]] = load i64, ptr %[[TMP57]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(ptr %[[TMP56]], i64 %[[TMP58]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %3) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %[[TMP3]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 21 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP18]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP18]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP19]]) +// LINUX-AMD64-NEXT: %[[TMP59:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB4]], i64 21 }, ptr %[[TMP59]], align 8 +// LINUX-AMD64-NEXT: %[[TMP60:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP59]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP60]], ptr %[[TMP4]], align 8 +// LINUX-AMD64-NEXT: %[[TMP61:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP62:[0-9]+]] = load ptr, ptr %[[TMP61]], align 8 +// LINUX-AMD64-NEXT: %[[TMP63:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP4]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP64:[0-9]+]] = load ptr, ptr %[[TMP63]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP62]], ptr %[[TMP64]]) // CHECK-NEXT: unreachable // CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 +// CHECK-NEXT: _llgo_[[BB6]]: // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testrt/typalias/in.go b/cl/_testrt/typalias/in.go index f35416ed36..0f20379f5d 100644 --- a/cl/_testrt/typalias/in.go +++ b/cl/_testrt/typalias/in.go @@ -15,20 +15,12 @@ type Foo = struct { var format = [...]int8{'H', 'e', 'l', 'l', 'o', ' ', '%', 'd', '\n', 0} // CHECK-LABEL: define void @main.Print(ptr %0){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: %2 = load i1, ptr %1, align 1 -// CHECK-NEXT: br i1 %2, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %3 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %4 = load i32, ptr %3, align 4 -// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 %4) -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[PRINT_OK_FIELD:%[0-9]+]] = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 +// CHECK-NEXT: [[PRINT_OK:%[0-9]+]] = load i1, ptr [[PRINT_OK_FIELD]] +// CHECK-NEXT: br i1 [[PRINT_OK]], label %{{[^,]+}}, label %{{[^ ]+}} +// CHECK: [[PRINT_A_FIELD:%[0-9]+]] = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 +// CHECK-NEXT: [[PRINT_A:%[0-9]+]] = load i32, ptr [[PRINT_A_FIELD]] +// CHECK-NEXT: call void (ptr, ...) @printf(ptr @main.format, i32 [[PRINT_A]]) func Print(p *Foo) { if p.ok { @@ -37,15 +29,12 @@ func Print(p *Foo) { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %1 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = getelementptr inbounds { i32, i1 }, ptr %0, i32 0, i32 1 -// CHECK-NEXT: store i32 100, ptr %1, align 4 -// CHECK-NEXT: store i1 true, ptr %2, align 1 -// CHECK-NEXT: call void @main.Print(ptr %0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: [[MAIN_FOO:%[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// CHECK-NEXT: [[MAIN_A:%[0-9]+]] = getelementptr inbounds { i32, i1 }, ptr [[MAIN_FOO]], i32 0, i32 0 +// CHECK-NEXT: [[MAIN_OK:%[0-9]+]] = getelementptr inbounds { i32, i1 }, ptr [[MAIN_FOO]], i32 0, i32 1 +// CHECK-NEXT: store i32 100, ptr [[MAIN_A]] +// CHECK-NEXT: store i1 true, ptr [[MAIN_OK]] +// CHECK-NEXT: call void @main.Print(ptr [[MAIN_FOO]]) func main() { foo := &Foo{100, true} Print(foo) diff --git a/cl/_testrt/typed/in.go b/cl/_testrt/typed/in.go index 8be3288183..71a03d53a8 100644 --- a/cl/_testrt/typed/in.go +++ b/cl/_testrt/typed/in.go @@ -1,8 +1,6 @@ // LITTEST package main -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"hello", align 1{{$}} - type T string type A [2]int @@ -17,99 +15,39 @@ func main() { println(ar[0], ar[1], ok) } -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.T, ptr undef }, ptr %0, 1 -// CHECK-NEXT: %2 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 0 -// CHECK-NEXT: %3 = icmp eq ptr %2, @_llgo_main.T -// CHECK-NEXT: br i1 %3, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %4 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 1 -// CHECK-NEXT: %5 = load %"{{.*}}/runtime/internal/runtime.String", ptr %4, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %5) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 0 -// CHECK-NEXT: %7 = icmp eq ptr %6, @_llgo_string -// CHECK-NEXT: br i1 %7, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicTypeAssert"(ptr null, ptr %2, ptr @_llgo_main.T) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_1 -// CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %1, 1 -// CHECK-NEXT: %9 = load %"{{.*}}/runtime/internal/runtime.String", ptr %8, align 8 -// CHECK-NEXT: %10 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %9, 0 -// CHECK-NEXT: %11 = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %10, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %12 = phi { %"{{.*}}/runtime/internal/runtime.String", i1 } [ %11, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %13 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %12, 0 -// CHECK-NEXT: %14 = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %12, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %13) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %14) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %15 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %15, i8 0, i64 16, i1 false) -// CHECK-NEXT: %16 = getelementptr inbounds i64, ptr %15, i64 0 -// CHECK-NEXT: %17 = getelementptr inbounds i64, ptr %15, i64 1 -// CHECK-NEXT: store i64 1, ptr %16, align 8 -// CHECK-NEXT: store i64 2, ptr %17, align 8 -// CHECK-NEXT: %18 = load [2 x i64], ptr %15, align 8 -// CHECK-NEXT: %19 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store [2 x i64] %18, ptr %19, align 8 -// CHECK-NEXT: %20 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_main.A, ptr undef }, ptr %19, 1 -// CHECK-NEXT: %21 = alloca [2 x i64], align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %21, i8 0, i64 16, i1 false) -// CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %20, 0 -// CHECK-NEXT: %23 = icmp eq ptr %22, @_llgo_main.A -// CHECK-NEXT: br i1 %23, label %_llgo_6, label %_llgo_7 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_5 -// CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %20, 1 -// CHECK-NEXT: %25 = load [2 x i64], ptr %24, align 8 -// CHECK-NEXT: %26 = insertvalue { [2 x i64], i1 } undef, [2 x i64] %25, 0 -// CHECK-NEXT: %27 = insertvalue { [2 x i64], i1 } %26, i1 true, 1 -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_5 -// CHECK-NEXT: br label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_7, %_llgo_6 -// CHECK-NEXT: %28 = phi { [2 x i64], i1 } [ %27, %_llgo_6 ], [ zeroinitializer, %_llgo_7 ] -// CHECK-NEXT: %29 = extractvalue { [2 x i64], i1 } %28, 0 -// CHECK-NEXT: store [2 x i64] %29, ptr %21, align 8 -// CHECK-NEXT: %30 = extractvalue { [2 x i64], i1 } %28, 1 -// CHECK-NEXT: %31 = getelementptr inbounds i64, ptr %21, i64 0 -// CHECK-NEXT: %32 = load i64, ptr %31, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds i64, ptr %21, i64 1 -// CHECK-NEXT: %34 = load i64, ptr %33, align 8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %34) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %30) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// The named string uses an exact (panicking) assertion, then deliberately fails +// a comma-ok assertion to the underlying unnamed string type. +// CHECK: [[T_DATA:%.*]] = call ptr @"{{.*}}AllocU"(i64 16) +// CHECK: [[T_EFACE:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.T, ptr undef }, ptr [[T_DATA]], 1 +// CHECK: [[T_DYN_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[T_EFACE]], 0 +// CHECK-NEXT: [[IS_T:%.*]] = icmp eq ptr [[T_DYN_TYPE]], @_llgo_main.T +// CHECK: br i1 [[IS_T]], label %{{.*}}, label %{{.*}} +// CHECK: [[T_DYN_DATA:%.*]] = extractvalue %"{{.*}}eface" [[T_EFACE]], 1 +// CHECK-NEXT: [[T_VALUE:%.*]] = load %"{{.*}}String", ptr [[T_DYN_DATA]] +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[T_VALUE]]) +// CHECK: [[STRING_DYN_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[T_EFACE]], 0 +// CHECK-NEXT: [[IS_STRING:%.*]] = icmp eq ptr [[STRING_DYN_TYPE]], @_llgo_string +// CHECK: call void @"{{.*}}PanicTypeAssert"(ptr null, ptr [[T_DYN_TYPE]], ptr @_llgo_main.T) +// CHECK-NEXT: unreachable +// CHECK: [[STRING_OK_RESULT:%.*]] = phi { %"{{.*}}String", i1 } [ {{%.*}}, %{{.*}} ], [ zeroinitializer, %{{.*}} ] +// CHECK: [[STRING_VALUE:%.*]] = extractvalue { %"{{.*}}String", i1 } [[STRING_OK_RESULT]], 0 +// CHECK-NEXT: [[STRING_OK:%.*]] = extractvalue { %"{{.*}}String", i1 } [[STRING_OK_RESULT]], 1 +// CHECK-NEXT: call void @"{{.*}}PrintString"(%"{{.*}}String" [[STRING_VALUE]]) +// CHECK: call void @"{{.*}}PrintBool"(i1 [[STRING_OK]]) +// The named array is boxed, matched by its named type, copied out, and returned +// together with the comma-ok bit used by the print. +// CHECK: [[A_DATA:%.*]] = call ptr @"{{.*}}AllocU"(i64 16) +// CHECK: [[A_EFACE:%.*]] = insertvalue %"{{.*}}eface" { ptr @_llgo_main.A, ptr undef }, ptr [[A_DATA]], 1 +// CHECK: [[A_DYN_TYPE:%.*]] = extractvalue %"{{.*}}eface" [[A_EFACE]], 0 +// CHECK-NEXT: [[IS_A:%.*]] = icmp eq ptr [[A_DYN_TYPE]], @_llgo_main.A +// CHECK: [[A_DYN_DATA:%.*]] = extractvalue %"{{.*}}eface" [[A_EFACE]], 1 +// CHECK-NEXT: [[A_VALUE:%.*]] = load [2 x i64], ptr [[A_DYN_DATA]] +// CHECK: [[A_OK_RESULT:%.*]] = phi { [2 x i64], i1 } [ {{%.*}}, %{{.*}} ], [ zeroinitializer, %{{.*}} ] +// CHECK: [[A_RESULT:%.*]] = extractvalue { [2 x i64], i1 } [[A_OK_RESULT]], 0 +// CHECK: [[A_OK:%.*]] = extractvalue { [2 x i64], i1 } [[A_OK_RESULT]], 1 +// CHECK: [[A0:%.*]] = load i64, ptr {{%.*}} +// CHECK: [[A1:%.*]] = load i64, ptr {{%.*}} +// CHECK: call void @"{{.*}}PrintInt"(i64 [[A0]]) +// CHECK: call void @"{{.*}}PrintInt"(i64 [[A1]]) +// CHECK: call void @"{{.*}}PrintBool"(i1 [[A_OK]]) diff --git a/cl/_testrt/unreachable/in.go b/cl/_testrt/unreachable/in.go index b030959df4..452aac4bf9 100644 --- a/cl/_testrt/unreachable/in.go +++ b/cl/_testrt/unreachable/in.go @@ -1,25 +1,17 @@ // LITTEST package main +// CHECK-LABEL: define void @main.foo(){{.*}} { +// CHECK: unreachable + import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define void @main.foo(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: unreachable -// CHECK-NEXT: ret void -// CHECK-NEXT: } func foo() { c.Unreachable() } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: call void @main.foo() -// CHECK-NEXT: %0 = call i32 (ptr, ...) @printf(ptr @0) -// CHECK-NEXT: ret void -// CHECK-NEXT: } func main() { foo() c.Printf(c.Str("Hello\n")) diff --git a/cl/_testrt/unsafe/in.go b/cl/_testrt/unsafe/in.go index 4a27b801be..d00d350437 100644 --- a/cl/_testrt/unsafe/in.go +++ b/cl/_testrt/unsafe/in.go @@ -7,27 +7,6 @@ import ( "github.com/goplus/lib/c" ) -// CHECK: {{^}}@0 = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} -// CHECK: {{^}}@2 = private unnamed_addr constant [4 x i8] c"abc\00", align 1{{$}} -// CHECK: {{^}}@3 = private unnamed_addr constant [31 x i8] c"unsafe.String: len out of range", align 1{{$}} -// CHECK: {{^}}@4 = private unnamed_addr constant [47 x i8] c"unsafe.String: nil pointer with non-zero length", align 1{{$}} -// CHECK: {{^}}@5 = private unnamed_addr constant [3 x i8] c"abc", align 1{{$}} -// CHECK: {{^}}@6 = private unnamed_addr constant [30 x i8] c"unsafe.Slice: len out of range", align 1{{$}} -// CHECK: {{^}}@7 = private unnamed_addr constant [46 x i8] c"unsafe.Slice: nil pointer with non-zero length", align 1{{$}} - -// CHECK-LABEL: define void @main.init(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = load i1, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br i1 %0, label %_llgo_2, label %_llgo_1 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 -// CHECK-NEXT: br label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_0 -// CHECK-NEXT: ret void -// CHECK-NEXT: } - //llgo:type C type T func() @@ -42,219 +21,60 @@ type N struct { } // CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: br i1 false, label %_llgo_1, label %_llgo_2 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_0 -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %0, align 8 -// CHECK-NEXT: %1 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %0, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %1) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_0 -// CHECK-NEXT: br i1 false, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_2 -// CHECK-NEXT: %2 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %2, align 8 -// CHECK-NEXT: %3 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %2, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %3) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_2 -// CHECK-NEXT: br i1 false, label %_llgo_5, label %_llgo_6 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4 -// CHECK-NEXT: %4 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %4, align 8 -// CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %4, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %5) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_6: ; preds = %_llgo_4 -// CHECK-NEXT: br i1 false, label %_llgo_7, label %_llgo_8 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_7: ; preds = %_llgo_6 -// CHECK-NEXT: %6 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %6, align 8 -// CHECK-NEXT: %7 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %6, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %7) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_8: ; preds = %_llgo_6 -// CHECK-NEXT: br i1 false, label %_llgo_9, label %_llgo_10 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_9: ; preds = %_llgo_8 -// CHECK-NEXT: %8 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %8, align 8 -// CHECK-NEXT: %9 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %8, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %9) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_10: ; preds = %_llgo_8 -// CHECK-NEXT: br i1 false, label %_llgo_11, label %_llgo_12 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_11: ; preds = %_llgo_10 -// CHECK-NEXT: %10 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %10, align 8 -// CHECK-NEXT: %11 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %10, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %11) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_12: ; preds = %_llgo_10 -// CHECK-NEXT: br i1 false, label %_llgo_13, label %_llgo_14 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_13: ; preds = %_llgo_12 -// CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %12, align 8 -// CHECK-NEXT: %13 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %12, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %13) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_14: ; preds = %_llgo_12 -// CHECK-NEXT: br i1 false, label %_llgo_15, label %_llgo_16 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_15: ; preds = %_llgo_14 -// CHECK-NEXT: %14 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %14, align 8 -// CHECK-NEXT: %15 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %14, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %15) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_16: ; preds = %_llgo_14 -// CHECK-NEXT: br i1 false, label %_llgo_17, label %_llgo_18 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_17: ; preds = %_llgo_16 -// CHECK-NEXT: %16 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %16, align 8 -// CHECK-NEXT: %17 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %16, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %17) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_18: ; preds = %_llgo_16 -// CHECK-NEXT: br i1 false, label %_llgo_19, label %_llgo_20 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_19: ; preds = %_llgo_18 -// CHECK-NEXT: %18 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %18, align 8 -// CHECK-NEXT: %19 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %18, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %19) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_20: ; preds = %_llgo_18 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 31 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @4, i64 47 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 31 }) -// CHECK-NEXT: %20 = icmp ult i64 add (i64 ptrtoint (ptr @2 to i64), i64 2), ptrtoint (ptr @2 to i64) -// CHECK-NEXT: %21 = and i1 true, %20 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 %21, %"{{.*}}/runtime/internal/runtime.String" { ptr @3, i64 31 }) -// CHECK-NEXT: %22 = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" { ptr @2, i64 3 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @5, i64 3 }) -// CHECK-NEXT: %23 = xor i1 %22, true -// CHECK-NEXT: br i1 %23, label %_llgo_21, label %_llgo_22 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_21: ; preds = %_llgo_20 -// CHECK-NEXT: %24 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %24, align 8 -// CHECK-NEXT: %25 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %24, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %25) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_22: ; preds = %_llgo_20 -// CHECK-NEXT: %26 = load i8, ptr @2, align 1 -// CHECK-NEXT: %27 = icmp ne i8 %26, 97 -// CHECK-NEXT: br i1 %27, label %_llgo_23, label %_llgo_26 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_23: ; preds = %_llgo_25, %_llgo_26, %_llgo_22 -// CHECK-NEXT: %28 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %28, align 8 -// CHECK-NEXT: %29 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %28, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %29) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_24: ; preds = %_llgo_25 -// CHECK-NEXT: %30 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %31 = getelementptr inbounds i64, ptr %30, i64 0 -// CHECK-NEXT: %32 = getelementptr inbounds i64, ptr %30, i64 1 -// CHECK-NEXT: store i64 1, ptr %31, align 8 -// CHECK-NEXT: store i64 2, ptr %32, align 8 -// CHECK-NEXT: %33 = getelementptr inbounds i64, ptr %30, i64 0 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 30 }) -// CHECK-NEXT: %34 = icmp eq ptr %33, null -// CHECK-NEXT: %35 = and i1 %34, true -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 %35, %"{{.*}}/runtime/internal/runtime.String" { ptr @7, i64 46 }) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 false, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 30 }) -// CHECK-NEXT: %36 = ptrtoint ptr %33 to i64 -// CHECK-NEXT: %37 = add i64 %36, 15 -// CHECK-NEXT: %38 = icmp ult i64 %37, %36 -// CHECK-NEXT: %39 = and i1 true, %38 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 %39, %"{{.*}}/runtime/internal/runtime.String" { ptr @6, i64 30 }) -// CHECK-NEXT: %40 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %33, 0 -// CHECK-NEXT: %41 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %40, i64 2, 1 -// CHECK-NEXT: %42 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %41, i64 2, 2 -// CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %42, 0 -// CHECK-NEXT: %44 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %42, 1 -// CHECK-NEXT: %45 = icmp uge i64 0, %44 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %45, i64 0, i1 true, i64 %44) -// CHECK-NEXT: %46 = getelementptr inbounds i64, ptr %43, i64 0 -// CHECK-NEXT: %47 = load i64, ptr %46, align 8 -// CHECK-NEXT: %48 = icmp ne i64 %47, 1 -// CHECK-NEXT: br i1 %48, label %_llgo_27, label %_llgo_29 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_25: ; preds = %_llgo_26 -// CHECK-NEXT: %49 = load i8, ptr getelementptr inbounds (i8, ptr @2, i64 2), align 1 -// CHECK-NEXT: %50 = icmp ne i8 %49, 99 -// CHECK-NEXT: br i1 %50, label %_llgo_23, label %_llgo_24 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_26: ; preds = %_llgo_22 -// CHECK-NEXT: %51 = load i8, ptr getelementptr inbounds (i8, ptr @2, i64 1), align 1 -// CHECK-NEXT: %52 = icmp ne i8 %51, 98 -// CHECK-NEXT: br i1 %52, label %_llgo_23, label %_llgo_25 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_27: ; preds = %_llgo_29, %_llgo_24 -// CHECK-NEXT: %53 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %53, align 8 -// CHECK-NEXT: %54 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %53, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %54) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_28: ; preds = %_llgo_29 -// CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %42, 0 -// CHECK-NEXT: %56 = load i64, ptr %55, align 8 -// CHECK-NEXT: %57 = icmp ne i64 %56, 1 -// CHECK-NEXT: br i1 %57, label %_llgo_30, label %_llgo_31 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_29: ; preds = %_llgo_24 -// CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %42, 0 -// CHECK-NEXT: %59 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %42, 1 -// CHECK-NEXT: %60 = icmp uge i64 1, %59 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %60, i64 1, i1 true, i64 %59) -// CHECK-NEXT: %61 = getelementptr inbounds i64, ptr %58, i64 1 -// CHECK-NEXT: %62 = load i64, ptr %61, align 8 -// CHECK-NEXT: %63 = icmp ne i64 %62, 2 -// CHECK-NEXT: br i1 %63, label %_llgo_27, label %_llgo_28 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_30: ; preds = %_llgo_28 -// CHECK-NEXT: %64 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %64, align 8 -// CHECK-NEXT: %65 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %64, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %65) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_31: ; preds = %_llgo_28 -// CHECK-NEXT: %66 = icmp ne i64 ptrtoint (ptr getelementptr (i8, ptr null, i64 1) to i64), 1 -// CHECK-NEXT: br i1 %66, label %_llgo_32, label %_llgo_33 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_32: ; preds = %_llgo_31 -// CHECK-NEXT: %67 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, ptr %67, align 8 -// CHECK-NEXT: %68 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %67, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %68) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_33: ; preds = %_llgo_31 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// Sizeof, Alignof, and Offsetof are compile-time constants. Each of the ten +// source comparisons must fold to the non-panic edge. +// CHECK-COUNT-10: br i1 false + +// unsafe.String checks pointer arithmetic overflow and uses the resulting +// pointer/length pair as the string value. +// CHECK: %[[STRING_OVERFLOW:[0-9]+]] = icmp ult i64 add (i64 ptrtoint (ptr @[[CSTR:[0-9]+]] to i64), i64 2), ptrtoint (ptr @[[CSTR]] to i64) +// CHECK: %[[STRING_INVALID:[0-9]+]] = and i1 true, %[[STRING_OVERFLOW]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 %[[STRING_INVALID]], %"{{.*}}/runtime/internal/runtime.String" {{.*}}) +// CHECK: %[[STRING_EQ:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.StringEqual"(%"{{.*}}/runtime/internal/runtime.String" { ptr @[[CSTR]], i64 3 }, %"{{.*}}/runtime/internal/runtime.String" { ptr @{{[0-9]+}}, i64 3 }) +// CHECK: %[[STRING_NE:[0-9]+]] = xor i1 %[[STRING_EQ]], true +// CHECK: br i1 %[[STRING_NE]] + +// unsafe.StringData starts from the same backing pointer. +// CHECK: load i8, ptr @[[CSTR]] + +// unsafe.Slice validates pointer/length overflow, then constructs a slice whose +// data and length are the values consumed by ordinary bounds checks. +// CHECK: %[[ARRAY:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) +// CHECK: %[[ELEM0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 0 +// CHECK: %[[ELEM1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 1 +// CHECK: store i64 1, ptr %[[ELEM0]] +// CHECK: store i64 2, ptr %[[ELEM1]] +// CHECK: %[[BASE:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 0 +// CHECK: %[[BASE_INT:[0-9]+]] = ptrtoint ptr %[[BASE]] to i64 +// CHECK: %[[SLICE_END:[0-9]+]] = add i64 %[[BASE_INT]], 15 +// CHECK: %[[SLICE_OVERFLOW:[0-9]+]] = icmp ult i64 %[[SLICE_END]], %[[BASE_INT]] +// CHECK: %[[SLICE_INVALID:[0-9]+]] = and i1 true, %[[SLICE_OVERFLOW]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertRuntimeError"(i1 %[[SLICE_INVALID]], %"{{.*}}/runtime/internal/runtime.String" {{.*}}) +// CHECK: %[[SLICE_PTR:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" undef, ptr %[[BASE]], 0 +// CHECK: %[[SLICE_LEN:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE_PTR]], i64 2, 1 +// CHECK: %[[SLICE:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE_LEN]], i64 2, 2 +// CHECK: %[[DATA0:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 0 +// CHECK: %[[LEN0:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 1 +// CHECK: %[[OOB0:[0-9]+]] = icmp uge i64 0, %[[LEN0]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[OOB0]], i64 0, i1 true, i64 %[[LEN0]]) +// CHECK: getelementptr inbounds i64, ptr %[[DATA0]], i64 0 +// The remaining StringData loads may be printed in predecessor block order, +// but must still use the captured string backing pointer. +// CHECK: load i8, ptr getelementptr inbounds (i8, ptr @[[CSTR]], i64 2) +// CHECK: load i8, ptr getelementptr inbounds (i8, ptr @[[CSTR]], i64 1) + +// unsafe.SliceData reads from the constructed slice data pointer. +// CHECK: %[[SLICE_DATA:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 0 +// CHECK: load i64, ptr %[[SLICE_DATA]] + +// CHECK: %[[DATA1:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 0 +// CHECK: %[[LEN1:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[SLICE]], 1 +// CHECK: %[[OOB1:[0-9]+]] = icmp uge i64 1, %[[LEN1]] +// CHECK: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %[[OOB1]], i64 1, i1 true, i64 %[[LEN1]]) +// CHECK: getelementptr inbounds i64, ptr %[[DATA1]], i64 1 + +// unsafe.Add(nil, 1) remains a byte-wise pointer addition. +// CHECK: icmp ne i64 ptrtoint (ptr getelementptr (i8, ptr null, i64 1) to i64), 1 func main() { if unsafe.Sizeof(*(*T)(nil)) != unsafe.Sizeof(0) { diff --git a/cl/_testrt/vamethod/in.go b/cl/_testrt/vamethod/in.go index a7ef707b26..eb8659e615 100644 --- a/cl/_testrt/vamethod/in.go +++ b/cl/_testrt/vamethod/in.go @@ -1,4 +1,6 @@ // LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=(?:\Qmain.CFmt.Printf\E|\Qmain.(*CFmt).Printf\E|\Qmain.(*CFmt).SetFormat\E|\Qmain.main\E) --check-globals=smart +// NOTE: Autogenerated snapshot targets: DARWIN-ARM64 LINUX-AMD64 package main import ( @@ -7,31 +9,16 @@ import ( "github.com/goplus/lib/c" ) -// CHECK-LABEL: define i32 @main.CFmt.Printf(%main.CFmt %0, ...){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = alloca %main.CFmt, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %1, i8 0, i64 8, i1 false) -// CHECK-NEXT: store %main.CFmt %0, ptr %1, align 8 -// CHECK-NEXT: %2 = getelementptr inbounds %main.CFmt, ptr %1, i32 0, i32 0 -// CHECK-NEXT: %3 = load ptr, ptr %2, align 8 -// CHECK-NEXT: %4 = call i32 (ptr, ...) @printf(ptr %3) -// CHECK-NEXT: ret i32 %4 -// CHECK-NEXT: } - -// CHECK-LABEL: define i32 @"main.(*CFmt).Printf"(ptr %0, ...){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %1 = getelementptr inbounds %main.CFmt, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i32 (ptr, ...) @printf(ptr %2) -// CHECK-NEXT: ret i32 %3 -// CHECK-NEXT: } +// Variadic C-linked methods must forward their receiver-derived format pointer +// and preserve the variadic arguments for direct and interface calls. -// CHECK-LABEL: define void @"main.(*CFmt).SetFormat"(ptr %0, ptr %1){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %2 = getelementptr inbounds %main.CFmt, ptr %0, i32 0, i32 0 -// CHECK-NEXT: store ptr %1, ptr %2, align 8 -// CHECK-NEXT: ret void -// CHECK-NEXT: } +// CHECK: {{^}}@[[GLOB0:[0-9]+]] = private unnamed_addr constant [9 x i8] c"%s (%d)\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB1:[0-9]+]] = private unnamed_addr constant [6 x i8] c"hello\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB2:[0-9]+]] = private unnamed_addr constant [9 x i8] c"(%d) %s\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB3:[0-9]+]] = private unnamed_addr constant [6 x i8] c"world\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB18:[0-9]+]] = private unnamed_addr constant [12 x i8] c"%s (%d,%d)\0A\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB19:[0-9]+]] = private unnamed_addr constant [5 x i8] c"ifmt\00", align 1{{$}} +// CHECK: {{^}}@[[GLOB20:[0-9]+]] = private unnamed_addr constant [5 x i8] c"error", align 1{{$}} //llgo:link (*T).Printf C.printf func (*T) Printf(__llgo_va_list ...any) c.Int { return 0 } @@ -54,69 +41,6 @@ type IFmt interface { Printf(__llgo_va_list ...any) c.Int } -// CHECK-LABEL: define void @main.main(){{.*}} { -// CHECK-NEXT: _llgo_0: -// CHECK-NEXT: %0 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %0, ptr @0) -// CHECK-NEXT: %1 = getelementptr inbounds %main.CFmt, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %2 = load ptr, ptr %1, align 8 -// CHECK-NEXT: %3 = call i32 (ptr, ...) @printf(ptr %2, ptr @1, i64 100) -// CHECK-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %0, ptr @2) -// CHECK-NEXT: %4 = getelementptr inbounds %main.CFmt, ptr %0, i32 0, i32 0 -// CHECK-NEXT: %5 = load ptr, ptr %4, align 8 -// CHECK-NEXT: %6 = call i32 (ptr, ...) @printf(ptr %5, i64 200, ptr @3) -// CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) -// CHECK-NEXT: %8 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.CFmt", ptr undef }, ptr %7, 1 -// CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %8, 0 -// CHECK-NEXT: %10 = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.IFmt, ptr %9) -// CHECK-NEXT: br i1 %10, label %_llgo_3, label %_llgo_4 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_1: ; preds = %_llgo_5 -// CHECK-NEXT: %11 = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @20, i64 5 }, ptr %11, align 8 -// CHECK-NEXT: %12 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %11, 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %12) -// CHECK-NEXT: unreachable -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_2: ; preds = %_llgo_5 -// CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %37) -// CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %37, 0 -// CHECK-NEXT: %15 = getelementptr ptr, ptr %14, i64 4 -// CHECK-NEXT: %16 = load ptr, ptr %15, align 8 -// CHECK-NEXT: %17 = insertvalue { ptr, ptr } undef, ptr %16, 0 -// CHECK-NEXT: %18 = insertvalue { ptr, ptr } %17, ptr %13, 1 -// CHECK-NEXT: %19 = extractvalue { ptr, ptr } %18, 1 -// CHECK-NEXT: %20 = extractvalue { ptr, ptr } %18, 0 -// CHECK-NEXT: call void %20(ptr %19, ptr @18) -// CHECK-NEXT: %21 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %37) -// CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %37, 0 -// CHECK-NEXT: %23 = getelementptr ptr, ptr %22, i64 3 -// CHECK-NEXT: %24 = load ptr, ptr %23, align 8 -// CHECK-NEXT: %25 = insertvalue { ptr, ptr } undef, ptr %24, 0 -// CHECK-NEXT: %26 = insertvalue { ptr, ptr } %25, ptr %21, 1 -// CHECK-NEXT: %27 = extractvalue { ptr, ptr } %26, 1 -// CHECK-NEXT: %28 = extractvalue { ptr, ptr } %26, 0 -// CHECK-NEXT: %29 = call i32 (ptr, ...) %28(ptr %27, ptr @19, i64 100, i64 200) -// CHECK-NEXT: ret void -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_3: ; preds = %_llgo_0 -// CHECK-NEXT: %30 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %8, 1 -// CHECK-NEXT: %31 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0", ptr %9) -// CHECK-NEXT: %32 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %31, 0 -// CHECK-NEXT: %33 = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %32, ptr %30, 1 -// CHECK-NEXT: %34 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %33, 0 -// CHECK-NEXT: %35 = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %34, i1 true, 1 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_4: ; preds = %_llgo_0 -// CHECK-NEXT: br label %_llgo_5 -// CHECK-EMPTY: -// CHECK-NEXT: _llgo_5: ; preds = %_llgo_4, %_llgo_3 -// CHECK-NEXT: %36 = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %35, %_llgo_3 ], [ zeroinitializer, %_llgo_4 ] -// CHECK-NEXT: %37 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %36, 0 -// CHECK-NEXT: %38 = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %36, 1 -// CHECK-NEXT: br i1 %38, label %_llgo_2, label %_llgo_1 -// CHECK-NEXT: } func main() { cfmt := &CFmt{} cfmt.SetFormat(c.Str("%s (%d)\n")) @@ -132,3 +56,170 @@ func main() { ifmt.SetFormat(c.Str("%s (%d,%d)\n")) ifmt.Printf(c.Str("ifmt"), 100, 200) } + +// CHECK-LABEL: define i32 @main.CFmt.Printf( +// DARWIN-ARM64-SAME: i64 %[[TMP0:[0-9]+]], ...){{.*}} { +// LINUX-AMD64-SAME: %main.CFmt %[[TMP0:[0-9]+]], ...){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = alloca i64, align 8 +// DARWIN-ARM64-NEXT: store i64 %[[TMP0]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load %main.CFmt, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = alloca %main.CFmt, align 8 +// DARWIN-ARM64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP3]], i8 0, i64 8, i1 false) +// DARWIN-ARM64-NEXT: store %main.CFmt %[[TMP2]], ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP1]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP5]]) +// DARWIN-ARM64-NEXT: ret i32 %[[TMP6]] +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %main.CFmt, align 8 +// LINUX-AMD64-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 8, i1 false) +// LINUX-AMD64-NEXT: store %main.CFmt %[[TMP0]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = load ptr, ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP3]]) +// LINUX-AMD64-NEXT: ret i32 %[[TMP4]] +// CHECK-NEXT: } + +// CHECK-LABEL: define i32 @"main.(*CFmt).Printf"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], ...){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP2:[0-9]+]] = load ptr, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP2]]) +// CHECK-NEXT: ret i32 %[[TMP3]] +// CHECK-NEXT: } + +// CHECK-LABEL: define void @"main.(*CFmt).SetFormat"( +// CHECK-SAME: ptr %[[TMP0:[0-9]+]], ptr %[[TMP1:[0-9]+]]){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP0]], i32 0, i32 0 +// CHECK-NEXT: store ptr %[[TMP1]], ptr %[[TMP2]], align 8 +// CHECK-NEXT: ret void +// CHECK-NEXT: } + +// CHECK-LABEL: define void @main.main(){{.*}} { +// CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %[[TMP0]], ptr @[[GLOB0]]) +// DARWIN-ARM64-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP0]], i32 0, i32 0 +// DARWIN-ARM64-NEXT: %[[TMP2:[0-9]+]] = load ptr, ptr %[[TMP1]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP3:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP2]], ptr @[[GLOB1]], i64 100) +// DARWIN-ARM64-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %[[TMP0]], ptr @[[GLOB2]]) +// DARWIN-ARM64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP0:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP1:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.iface", align 8 +// LINUX-AMD64-NEXT: %[[TMP2:[0-9]+]] = alloca %"{{.*}}/runtime/internal/runtime.eface", align 8 +// LINUX-AMD64-NEXT: %[[TMP3:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %[[TMP3]], ptr @[[GLOB0]]) +// LINUX-AMD64-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP3]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = load ptr, ptr %[[TMP4]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP6:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP5]], i64 200, ptr @[[GLOB3]]) +// DARWIN-ARM64-NEXT: %[[TMP7:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// DARWIN-ARM64-NEXT: %[[TMP8:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.CFmt", ptr undef }, ptr %[[TMP7]], 1 +// DARWIN-ARM64-NEXT: %[[TMP9:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]], 0 +// DARWIN-ARM64-NEXT: %[[TMP10:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.IFmt, ptr %[[TMP9]]) +// DARWIN-ARM64-NEXT: br i1 %[[TMP10]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// LINUX-AMD64-NEXT: %[[TMP6:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP5]], ptr @[[GLOB1]], i64 100) +// LINUX-AMD64-NEXT: call void @"main.(*CFmt).SetFormat"(ptr %[[TMP3]], ptr @[[GLOB2]]) +// LINUX-AMD64-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.CFmt, ptr %[[TMP3]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP8:[0-9]+]] = load ptr, ptr %[[TMP7]], align 8 +// LINUX-AMD64-NEXT: %[[TMP9:[0-9]+]] = call i32 (ptr, ...) @printf(ptr %[[TMP8]], i64 200, ptr @[[GLOB3]]) +// LINUX-AMD64-NEXT: %[[TMP10:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) +// LINUX-AMD64-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @"*_llgo_main.CFmt", ptr undef }, ptr %[[TMP10]], 1 +// LINUX-AMD64-NEXT: %[[TMP12:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], 0 +// LINUX-AMD64-NEXT: %[[TMP13:[0-9]+]] = call i1 @"{{.*}}/runtime/internal/runtime.Implements"(ptr @_llgo_main.IFmt, ptr %[[TMP12]]) +// LINUX-AMD64-NEXT: br i1 %[[TMP13]], label %_llgo_[[BB3:[0-9]+]], label %_llgo_[[BB4:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB1:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP11:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// DARWIN-ARM64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB20]], i64 5 }, ptr %[[TMP11]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP12:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP11]], 1 +// DARWIN-ARM64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(%"{{.*}}/runtime/internal/runtime.eface" %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP14:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 16) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB20]], i64 5 }, ptr %[[TMP14]], align 8 +// LINUX-AMD64-NEXT: %[[TMP15:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_string, ptr undef }, ptr %[[TMP14]], 1 +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP15]], ptr %[[TMP2]], align 8 +// LINUX-AMD64-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP17:[0-9]+]] = load ptr, ptr %[[TMP16]], align 8 +// LINUX-AMD64-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP2]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP19:[0-9]+]] = load ptr, ptr %[[TMP18]], align 8 +// LINUX-AMD64-NEXT: call void @"{{.*}}/runtime/internal/runtime.Panic"(ptr %[[TMP17]], ptr %[[TMP19]]) +// CHECK-NEXT: unreachable +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB2:[0-9]+]]: +// DARWIN-ARM64-NEXT: %[[TMP13:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP37:[0-9]+]]) +// DARWIN-ARM64-NEXT: %[[TMP14:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP37]], 0 +// DARWIN-ARM64-NEXT: %[[TMP15:[0-9]+]] = getelementptr ptr, ptr %[[TMP14]], i64 4 +// DARWIN-ARM64-NEXT: %[[TMP16:[0-9]+]] = load ptr, ptr %[[TMP15]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP17:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP16]], 0 +// DARWIN-ARM64-NEXT: %[[TMP18:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP17]], ptr %[[TMP13]], 1 +// DARWIN-ARM64-NEXT: %[[TMP19:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP18]], 1 +// DARWIN-ARM64-NEXT: %[[TMP20:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP18]], 0 +// DARWIN-ARM64-NEXT: call void %[[TMP20]](ptr %[[TMP19]], ptr @[[GLOB18]]) +// DARWIN-ARM64-NEXT: %[[TMP21:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %[[TMP37]]) +// DARWIN-ARM64-NEXT: %[[TMP22:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP37]], 0 +// DARWIN-ARM64-NEXT: %[[TMP23:[0-9]+]] = getelementptr ptr, ptr %[[TMP22]], i64 3 +// DARWIN-ARM64-NEXT: %[[TMP24:[0-9]+]] = load ptr, ptr %[[TMP23]], align 8 +// DARWIN-ARM64-NEXT: %[[TMP25:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP24]], 0 +// DARWIN-ARM64-NEXT: %[[TMP26:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP25]], ptr %[[TMP21]], 1 +// DARWIN-ARM64-NEXT: %[[TMP27:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP26]], 1 +// DARWIN-ARM64-NEXT: %[[TMP28:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP26]], 0 +// DARWIN-ARM64-NEXT: %[[TMP29:[0-9]+]] = call i32 (ptr, ...) %[[TMP28]](ptr %[[TMP27]], ptr @[[GLOB19]], i64 100, i64 200) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP52:[0-9]+]], ptr %[[TMP1]], align 8 +// LINUX-AMD64-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP21:[0-9]+]] = load ptr, ptr %[[TMP20]], align 8 +// LINUX-AMD64-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP1]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP23:[0-9]+]] = load ptr, ptr %[[TMP22]], align 8 +// LINUX-AMD64-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(ptr %[[TMP21]], ptr %[[TMP23]]) +// LINUX-AMD64-NEXT: %[[TMP25:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP52]], 0 +// LINUX-AMD64-NEXT: %[[TMP26:[0-9]+]] = getelementptr ptr, ptr %[[TMP25]], i64 4 +// LINUX-AMD64-NEXT: %[[TMP27:[0-9]+]] = load ptr, ptr %[[TMP26]], align 8 +// LINUX-AMD64-NEXT: %[[TMP28:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP27]], 0 +// LINUX-AMD64-NEXT: %[[TMP29:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP28]], ptr %[[TMP24]], 1 +// LINUX-AMD64-NEXT: %[[TMP30:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP29]], 1 +// LINUX-AMD64-NEXT: %[[TMP31:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP29]], 0 +// LINUX-AMD64-NEXT: call void %[[TMP31]](ptr %[[TMP30]], ptr @[[GLOB18]]) +// LINUX-AMD64-NEXT: store %"{{.*}}/runtime/internal/runtime.iface" %[[TMP52]], ptr %[[TMP0]], align 8 +// LINUX-AMD64-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 0 +// LINUX-AMD64-NEXT: %[[TMP33:[0-9]+]] = load ptr, ptr %[[TMP32]], align 8 +// LINUX-AMD64-NEXT: %[[TMP34:[0-9]+]] = getelementptr inbounds { ptr, ptr }, ptr %[[TMP0]], i32 0, i32 1 +// LINUX-AMD64-NEXT: %[[TMP35:[0-9]+]] = load ptr, ptr %[[TMP34]], align 8 +// LINUX-AMD64-NEXT: %[[TMP36:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(ptr %[[TMP33]], ptr %[[TMP35]]) +// LINUX-AMD64-NEXT: %[[TMP37:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP52]], 0 +// LINUX-AMD64-NEXT: %[[TMP38:[0-9]+]] = getelementptr ptr, ptr %[[TMP37]], i64 3 +// LINUX-AMD64-NEXT: %[[TMP39:[0-9]+]] = load ptr, ptr %[[TMP38]], align 8 +// LINUX-AMD64-NEXT: %[[TMP40:[0-9]+]] = insertvalue { ptr, ptr } undef, ptr %[[TMP39]], 0 +// LINUX-AMD64-NEXT: %[[TMP41:[0-9]+]] = insertvalue { ptr, ptr } %[[TMP40]], ptr %[[TMP36]], 1 +// LINUX-AMD64-NEXT: %[[TMP42:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP41]], 1 +// LINUX-AMD64-NEXT: %[[TMP43:[0-9]+]] = extractvalue { ptr, ptr } %[[TMP41]], 0 +// LINUX-AMD64-NEXT: %[[TMP44:[0-9]+]] = call i32 (ptr, ...) %[[TMP43]](ptr %[[TMP42]], ptr @[[GLOB19]], i64 100, i64 200) +// CHECK-NEXT: ret void +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB3]]: +// DARWIN-ARM64-NEXT: %[[TMP30:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP8]], 1 +// DARWIN-ARM64-NEXT: %[[TMP31:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0", ptr %[[TMP9]]) +// DARWIN-ARM64-NEXT: %[[TMP32:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP31]], 0 +// DARWIN-ARM64-NEXT: %[[TMP33:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP32]], ptr %[[TMP30]], 1 +// DARWIN-ARM64-NEXT: %[[TMP34:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %[[TMP33]], 0 +// DARWIN-ARM64-NEXT: %[[TMP35:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP34]], i1 true, 1 +// LINUX-AMD64-NEXT: %[[TMP45:[0-9]+]] = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], 1 +// LINUX-AMD64-NEXT: %[[TMP46:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$a85zs5wWQQoPIERm_en8plssh4spdIeeXZPC-E0TDh0", ptr %[[TMP12]]) +// LINUX-AMD64-NEXT: %[[TMP47:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" undef, ptr %[[TMP46]], 0 +// LINUX-AMD64-NEXT: %[[TMP48:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.iface" %[[TMP47]], ptr %[[TMP45]], 1 +// LINUX-AMD64-NEXT: %[[TMP49:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } undef, %"{{.*}}/runtime/internal/runtime.iface" %[[TMP48]], 0 +// LINUX-AMD64-NEXT: %[[TMP50:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP49]], i1 true, 1 +// CHECK-NEXT: br label %_llgo_[[BB5:[0-9]+]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB4]]: +// CHECK-NEXT: br label %_llgo_[[BB5]] +// CHECK-EMPTY: +// CHECK-NEXT: _llgo_[[BB5]]: +// DARWIN-ARM64-NEXT: %[[TMP36:[0-9]+]] = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %[[TMP35]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// DARWIN-ARM64-NEXT: %[[TMP37]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP36]], 0 +// DARWIN-ARM64-NEXT: %[[TMP38:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP36]], 1 +// DARWIN-ARM64-NEXT: br i1 %[[TMP38]], label %_llgo_[[BB2]], label %_llgo_[[BB1]] +// LINUX-AMD64-NEXT: %[[TMP51:[0-9]+]] = phi { %"{{.*}}/runtime/internal/runtime.iface", i1 } [ %[[TMP50]], %_llgo_[[BB3]] ], [ zeroinitializer, %_llgo_[[BB4]] ] +// LINUX-AMD64-NEXT: %[[TMP52]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP51]], 0 +// LINUX-AMD64-NEXT: %[[TMP53:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.iface", i1 } %[[TMP51]], 1 +// LINUX-AMD64-NEXT: br i1 %[[TMP53]], label %_llgo_[[BB2]], label %_llgo_[[BB1]] +// CHECK-NEXT: } diff --git a/cl/cltest/cltest.go b/cl/cltest/cltest.go index c6832ef121..bf4e6acbf2 100644 --- a/cl/cltest/cltest.go +++ b/cl/cltest/cltest.go @@ -129,8 +129,7 @@ func FilterEmulatorOutput(output string) string { } // RunAndTestFromDir executes tests under relDir and validates both runtime -// output and the pre-transform package IR snapshot when the corresponding -// golden files exist. +// output and the post-ABI, pre-optimization package IR checks when enabled. func RunAndTestFromDir(t *testing.T, sel, relDir string, ignore []string, opts ...RunOption) { rootDir, err := os.Getwd() if err != nil { @@ -240,7 +239,7 @@ func Pkg(t *testing.T, pkgPath, outFile string) { } } -func testFrom(t *testing.T, pkgDir, sel string) { +func testFrom(t *testing.T, pkgDir, sel string, conf *build.Config) { t.Helper() if sel != "" && !strings.Contains(pkgDir, sel) { return @@ -249,22 +248,14 @@ func testFrom(t *testing.T, pkgDir, sel string) { if err != nil { t.Fatal("LoadSpec failed:", err) } - if spec.Mode == littest.ModeSkip { - return - } - var v string + var generated llgen.GeneratedIR withFuncInfoDisabled(func() { - v = llgen.GenFrom(pkgDir) + generated = llgen.GenerateFromWithConf(pkgDir, conf) }) - if spec.Mode == littest.ModeFileCheck { - if err := littest.Check(spec, v); err != nil { - _ = os.WriteFile(pkgDir+"/result.txt", []byte(v), 0644) - t.Fatal(err) - } - return - } - if test.Diff(t, pkgDir+"/result.txt", []byte(v), []byte(spec.Text)) { - t.Fatal("llgen.GenFrom: unexpected result") + prefixes := filecheck.TargetPrefixes(generated.GOOS, generated.GOARCH, generated.Target) + if err := littest.Check(spec, generated.Text, prefixes...); err != nil { + _ = os.WriteFile(pkgDir+"/result.txt", []byte(generated.Text), 0644) + t.Fatal(err) } } @@ -285,10 +276,10 @@ func testRunAndTestFrom(t *testing.T, pkgDir, relPkg, sel string, opts runOption } } if !checkOutput { - // IR-only mode: when expect.txt is not checked, use llgen.GenFrom via - // testFrom to compare this package's generated IR against out.ll. + // IR-only mode compiles the package through the same pre-optimization IR + // path used by runtime fixtures. if opts.checkIR { - testFrom(t, pkgDir, sel) + testFrom(t, pkgDir, sel, opts.conf) } if opts.checkMeta { metaDirs, err := findMetaCheckDirs(pkgDir) @@ -306,32 +297,20 @@ func testRunAndTestFrom(t *testing.T, pkgDir, relPkg, sel string, opts runOption return } - var irSpec littest.Spec - conf := opts.conf - var capturedIR *string - var capturedMeta *string - var checkIR bool if opts.checkIR { - irSpec, checkIR, err = readIRSpec(pkgDir) - if err != nil { - t.Fatal("LoadSpec failed:", err) - } - if checkIR { - conf, capturedIR, capturedMeta = withModuleCapture(opts.conf, pkgDir) - } - } - if opts.checkMeta && capturedMeta == nil { - conf, capturedIR, capturedMeta = withModuleCapture(conf, pkgDir) + // Keep IR validation independent from linking and execution. Besides + // matching litgen's generation path, this avoids coupling assertions to + // package scheduling and module function order in ModeRun. + testFrom(t, pkgDir, sel, opts.conf) } - var output []byte - if checkIR { - withFuncInfoDisabled(func() { - output, err = runWithConf(relPkg, pkgDir, conf) - }) - } else { - output, err = runWithConf(relPkg, pkgDir, conf) + conf := opts.conf + var capturedMeta *string + if opts.checkMeta { + conf, capturedMeta = withMetaCapture(conf, pkgDir) } + + output, err := runWithConf(relPkg, pkgDir, conf) if err != nil { t.Logf("raw output:\n%s", string(output)) t.Fatalf("run failed: %v\noutput: %s", err, string(output)) @@ -341,16 +320,6 @@ func testRunAndTestFrom(t *testing.T, pkgDir, relPkg, sel string, opts runOption if opts.checkMeta { assertExpectedMeta(t, pkgDir, relPkg, capturedMeta) } - if !checkIR { - return - } - if capturedIR == nil || *capturedIR == "" { - t.Fatalf("module snapshot missing for file %s", irSpec.Path) - } - if err := littest.Check(irSpec, *capturedIR); err != nil { - _ = os.WriteFile(filepath.Join(pkgDir, "result.txt"), []byte(*capturedIR), 0644) - t.Fatal(err) - } } func assertExpectedMeta(t *testing.T, pkgDir, relPkg string, capturedMeta *string) { @@ -415,7 +384,7 @@ func RunAndCapture(relPkg, pkgDir string) ([]byte, error) { // CaptureMeta builds relPkg and returns the package metadata captured for pkgDir. func CaptureMeta(relPkg, pkgDir string) (string, error) { - conf, _, capturedMeta := withModuleCapture(build.NewDefaultConf(build.ModeRun), pkgDir) + conf, capturedMeta := withMetaCapture(build.NewDefaultConf(build.ModeRun), pkgDir) output, err := runWithConf(relPkg, pkgDir, conf) if err != nil { return "", fmt.Errorf("%w\noutput: %s", err, string(output)) @@ -428,12 +397,11 @@ func RunAndCaptureWithConf(relPkg, pkgDir string, conf *build.Config) ([]byte, e return runWithConf(relPkg, pkgDir, conf) } -func withModuleCapture(conf *build.Config, pkgDir string) (*build.Config, *string, *string) { +func withMetaCapture(conf *build.Config, pkgDir string) (*build.Config, *string) { if conf == nil { conf = build.NewDefaultConf(build.ModeRun) } localConf := *conf - var module string var meta string prevHook := localConf.ModuleHook localConf.ModuleHook = func(pkg build.Package) { @@ -443,11 +411,10 @@ func withModuleCapture(conf *build.Config, pkgDir string) (*build.Config, *strin if slices.ContainsFunc(pkg.Package.GoFiles, func(file string) bool { return filepath.Dir(file) == pkgDir }) { - module = pkg.LPkg.String() meta = pkg.Meta.String() } } - return &localConf, &module, &meta + return &localConf, &meta } func findMetaCheckDirs(pkgDir string) ([]string, error) { @@ -701,18 +668,6 @@ func symbolTable(bin string) (string, error) { return strings.ReplaceAll(string(output), "\r\n", "\n"), nil } -func readIRSpec(pkgDir string) (littest.Spec, bool, error) { - spec, err := littest.LoadSpec(pkgDir) - if err != nil { - var pathErr *os.PathError - if errors.Is(err, os.ErrNotExist) && errors.As(err, &pathErr) && filepath.Clean(pathErr.Path) == filepath.Join(pkgDir, "out.ll") { - return littest.Spec{}, false, nil - } - return littest.Spec{}, false, err - } - return spec, true, nil -} - func withFuncInfoDisabled(fn func()) { const key = "LLGO_FUNCINFO" old, ok := os.LookupEnv(key) @@ -798,7 +753,7 @@ func CompileIREx(t *testing.T, src any, fname string, dbg bool, configure func(l func TestCompileEx(t *testing.T, src any, fname, expected string, dbg bool) { t.Helper() v := CompileIREx(t, src, fname, dbg, nil) - if llssa.StripModuleTarget(v) != expected && expected != ";" { // expected == ";" means skipping out.ll + if llssa.StripModuleTarget(v) != expected { t.Fatalf("\n==> got:\n%s\n==> expected:\n%s\n", v, expected) } } diff --git a/dev/README.md b/dev/README.md index f831633577..045570b06a 100644 --- a/dev/README.md +++ b/dev/README.md @@ -74,10 +74,11 @@ You can control demo parallelism via `LLGO_DEMO_JOBS` (defaults to up to 4 jobs) ## 6) Refresh test goldens -LLGo currently has two different golden-test refresh flows: +LLGo currently has two different test-data refresh flows: -- `gentests` for directory-based golden files such as `out.ll` and `expect.txt` -- `litgen` for source-embedded `// LITTEST` FileCheck directives +- `gentests` for runtime output and package metadata golden files +- `litgen` for the curated set of 40 source-embedded, autogenerated + `// LITTEST` FileCheck snapshots ### `gentests` @@ -89,37 +90,77 @@ go run ./chore/gentests Behavior: -- Refreshes `out.ll` for the built-in test suites under `cl/_testlibc`, `cl/_testlibgo`, `cl/_testrt`, `cl/_testgo`, `cl/_testpy`, and `cl/_testdata`. -- Refreshes `expect.txt` for the same directories using the existing runtime execution flow. -- Preserves the existing skip convention where `out.ll` or `expect.txt` containing only `;` means "do not refresh". -- New behavior: if a test case directory contains a non-test Go source file whose first line is exactly `// LITTEST`, `gentests` skips `llgen` for that directory and does not regenerate `out.ll` there. - -Use `gentests` when the test still stores LLVM IR in `out.ll`. +- Refreshes `expect.txt` for the built-in test suites under `cl/_testlibc`, `cl/_testlibgo`, `cl/_testrt`, `cl/_testgo`, `cl/_testpy`, and `cl/_testdata`. +- Refreshes `meta-expect.txt` under `cl/_testmeta`. +- Preserves the existing skip convention where `expect.txt` containing only `;` means "do not refresh". +- Does not generate LLVM IR checks. All compiler fixtures keep FileCheck directives in their marked Go source. ### `litgen` -Run on a single marked file: +Autogenerated checks stay in the Go source file. A test opts in with an +autogenerated note immediately after `// LITTEST`; the note also records the +arguments required to reproduce the checks: + +```go +// LITTEST +// NOTE: Assertions have been autogenerated by chore/litgen UTC_ARGS: --function=run --check-globals=smart +``` + +Create or replace an autogenerated region explicitly: ```bash -go run ./chore/litgen path/to/in.go +go run ./chore/litgen --function=run --check-globals=smart path/to/in.go ``` -Run on a directory tree: +Refresh existing autogenerated tests recursively, using the arguments recorded +in each source file: ```bash -go run ./chore/litgen cl/_testrt/litdemo -go run ./chore/litgen cl/_testdata +go run ./chore/litgen -u cl +``` + +Check that committed autogenerated checks are current without modifying files: + +```bash +go run ./chore/litgen -u --check cl ``` Behavior: - Accepts one or more paths. - If the path is a `.go` file, it refreshes only that file. The file must start with `// LITTEST`. -- If the path is a directory, it walks that directory recursively, finds marked source files, and refreshes each marked test in place. -- Rewrites embedded `CHECK-LABEL`, `CHECK-NEXT`, `CHECK-EMPTY`, and referenced constant `CHECK-LINE` directives from the current generated IR. -- Does not update `expect.txt` and does not write `out.ll`. - -Use `litgen` when the test case stores its IR expectations directly in the Go source instead of `out.ll`. +- If the path is a directory, it walks that directory recursively and processes marked source files in a stable order. +- `-u`/`--update-only` updates only tests that already carry the autogenerated note. Handwritten checks are never silently replaced. +- `--check` reports stale autogenerated checks and does not write files. +- `--function` is repeatable and selects functions by regular expression. Use + `--all-functions` only when the entire generated module is genuinely the test + contract. +- `--check-globals=none|smart|all` controls global checks. `smart` keeps globals + referenced by selected functions. +- Generated checks abstract numeric LLVM SSA values, block suffixes, numeric + globals, and generated cgo symbol hashes to reduce irrelevant churn. +- Generates the same post-target-ABI, pre-LLVM-optimization IR observed by the + compiler tests. This includes ABI details such as `sret` and indirect + aggregate arguments. +- Does not update `expect.txt` and does not write separate LLVM golden files. + +Every FileCheck run enables `CHECK` plus target prefixes from general to +specific. For example, Darwin/arm64 enables `DARWIN`, `ARM64`, and +`DARWIN-ARM64`; Linux/amd64 enables `LINUX`, `AMD64`, and `LINUX-AMD64`. +Keep portable contracts under `CHECK` and add a target-prefixed directive only +for the line whose ABI or platform spelling genuinely differs. `litgen` +preserves inactive target-prefixed autogenerated regions when one platform is +refreshed. + +Use `litgen` only when a test intentionally checks a broad IR shape. Prefer +short, handwritten FileCheck assertions for a single lowering or ABI property. +Runtime output does not replace focused IR checks; it only removes the need for +a second full-output snapshot. + +Use 100 FileCheck directive lines as an audit threshold rather than a size cap. +For a larger handwritten fixture, every group should correspond to an explicit +semantic contract. Convert long contiguous IR-shape checks to an opted-in +`litgen` snapshot instead. ### Marker convention diff --git a/internal/build/build.go b/internal/build/build.go index 02f0abb610..0c20364518 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -124,11 +124,11 @@ type OutFmtDetails struct { Zip string // ZIP/DFU output file path (.zip) } -// ModuleHook observes a package module immediately after it is generated and -// before TransformModule mutates it. The callback runs synchronously and -// receives the live llvm.Module, so callers that need a stable snapshot should -// consume it immediately (for example, by calling mod.String() inside the -// hook). +// ModuleHook observes a package module after aggregate and target ABI lowering +// and before the LLVM optimization pipeline runs. The callback runs +// synchronously and receives the live llvm.Module, so callers that need a +// stable snapshot should consume it immediately (for example, by calling +// mod.String() inside the hook). type ModuleHook func(pkg Package) type Config struct { @@ -1982,10 +1982,6 @@ func preparePackageModule(ctx *context, aPkg *aPackage, verbose bool) ([]string, if !aPkg.CacheHit { aPkg.Meta = ret.Meta } - if hook := ctx.buildConf.ModuleHook; hook != nil { - hook(aPkg) - } - // If cache hit, we only needed to register types - skip compilation if aPkg.CacheHit { return nil, nil @@ -2004,16 +2000,22 @@ func compilePackageModule(ctx *context, aPkg *aPackage, externs []string, verbos ctx.cTransformer.TransformModule(ret.Path(), ret.Module()) ctx.cTransformer.SetSkipFuncs(nil) + mod := ret.Module() + mod.SetDataLayout(ctx.prog.DataLayout()) + mod.SetTarget(ctx.prog.Target().Spec().Triple) + if ctx.passOpt || ctx.buildConf.ModuleHook != nil { + if err := gllvm.VerifyModule(mod, gllvm.ReturnStatusAction); err != nil { + return fmt.Errorf("verify LLVM module for %v failed: %w", pkgPath, err) + } + } + if hook := ctx.buildConf.ModuleHook; hook != nil { + hook(aPkg) + } + // Run the default LLVM optimization pipeline selected by the requested -O level. if ctx.passOpt { - mod := ret.Module() - mod.SetDataLayout(ctx.prog.DataLayout()) - mod.SetTarget(ctx.prog.Target().Spec().Triple) pbo := gllvm.NewPassBuilderOptions() defer pbo.Dispose() - if err := gllvm.VerifyModule(mod, gllvm.ReturnStatusAction); err != nil { - return fmt.Errorf("verify LLVM module for %v failed: %w", pkgPath, err) - } if err := mod.RunPasses(llvmPassPipeline(ctx.buildConf.OptLevel, ctx.buildConf.ltoMode()), ctx.prog.TargetMachine(), pbo); err != nil { return fmt.Errorf("run LLVM passes failed for %v: %w", pkgPath, err) } diff --git a/internal/build/collect.go b/internal/build/collect.go index d8dcee7b1f..b9a450e08e 100644 --- a/internal/build/collect.go +++ b/internal/build/collect.go @@ -334,6 +334,14 @@ func (c *context) tryLoadFromCache(pkg *aPackage) bool { if c.packageCacheDisabled(pkg.ID) { return false } + // ModeGen and ModuleHook are observation points for the packages explicitly + // named by the build. Loading one of those packages from cache would either + // return the freshly registered pre-lowering shell module or silently + // suppress the hook. Keep dependency cache hits enabled: the caller asked to + // observe its initial package modules, not to rebuild the world. + if pkgExists(c.initial, pkg.Package) && (c.mode == ModeGen || c.buildConf.ModuleHook != nil) { + return false + } // Main packages are intentionally not written to the build cache because // each executable's entry module is linked against the current main archive. diff --git a/internal/build/collect_test.go b/internal/build/collect_test.go index cc9785518f..67ee435400 100644 --- a/internal/build/collect_test.go +++ b/internal/build/collect_test.go @@ -906,6 +906,30 @@ func TestTryLoadFromCache_ForceRebuild(t *testing.T) { if pkg.ArchiveFile != "" { t.Error("ArchiveFile should not be populated when ForceRebuild is enabled") } + + // A hook must observe explicitly requested non-main packages even when a + // valid cache entry exists. Dependencies remain eligible for cache reuse. + ctx.buildConf.ForceRebuild = false + ctx.buildConf.ModuleHook = func(Package) {} + ctx.initial = []*packages.Package{pkg.Package} + if ctx.tryLoadFromCache(pkg) { + t.Error("initial package with ModuleHook should bypass the cache") + } + ctx.initial = nil + if !ctx.tryLoadFromCache(pkg) { + t.Error("dependency package with ModuleHook should remain cacheable") + } + + ctx.buildConf.ModuleHook = nil + ctx.mode = ModeGen + ctx.initial = []*packages.Package{pkg.Package} + if ctx.tryLoadFromCache(pkg) { + t.Error("initial ModeGen package should bypass the cache") + } + ctx.initial = nil + if !ctx.tryLoadFromCache(pkg) { + t.Error("ModeGen dependency package should remain cacheable") + } } func TestSaveToCache_MainPackage(t *testing.T) { diff --git a/internal/build/module_hook_test.go b/internal/build/module_hook_test.go index 99d2bde828..451848492f 100644 --- a/internal/build/module_hook_test.go +++ b/internal/build/module_hook_test.go @@ -4,10 +4,11 @@ package build import ( + "strings" "testing" ) -func TestModuleHookReceivesMainPackageModule(t *testing.T) { +func TestModuleHookReceivesPostABIPreOptimizationModule(t *testing.T) { conf := NewDefaultConf(ModeGen) counts := make(map[string]int) @@ -19,7 +20,7 @@ func TestModuleHookReceivesMainPackageModule(t *testing.T) { } } - pkgs, err := Do([]string{"../../cl/_testgo/print"}, conf) + pkgs, err := Do([]string{"../../cl/_testgo/localitycodegen"}, conf) if err != nil { t.Fatalf("Do failed: %v", err) } @@ -34,4 +35,11 @@ func TestModuleHookReceivesMainPackageModule(t *testing.T) { if snapshots[mainPkg] == "" { t.Fatalf("expected non-empty module snapshot for %s", mainPkg) } + snapshot := snapshots[mainPkg] + if !strings.Contains(snapshot, "define void @main.values(ptr sret({ i64, ptr, ptr })") { + t.Fatalf("hook snapshot does not contain the lowered sret signature for main.values") + } + if strings.Contains(snapshot, "define { i64, ptr, ptr } @main.values()") { + t.Fatalf("hook snapshot still contains the pre-ABI main.values signature") + } } diff --git a/internal/filecheck/filecheck.go b/internal/filecheck/filecheck.go index 8c5db9a044..234593324a 100644 --- a/internal/filecheck/filecheck.go +++ b/internal/filecheck/filecheck.go @@ -19,17 +19,26 @@ package filecheck import ( "bytes" "fmt" + "os" + "regexp" "strings" "github.com/goplus/llgo/xtool/env/llvm" ) +var invalidPrefixChars = regexp.MustCompile(`[^A-Z0-9_-]+`) + func Match(filename, input string) error { return MatchWithPrefixes(filename, input) } func MatchWithPrefixes(filename, input string, prefixes ...string) error { - args := make([]string, 0, len(prefixes)+1) + args := make([]string, 0, len(prefixes)+2) + if len(prefixes) != 0 { + // A source usually contains either CHECK directives or a target-specific + // snapshot, not one directive for every enabled OS/architecture axis. + args = append(args, "--allow-unused-prefixes") + } for _, prefix := range prefixes { args = append(args, "--check-prefix="+prefix) } @@ -49,3 +58,91 @@ func MatchWithPrefixes(filename, input string, prefixes ...string) error { } return nil } + +// MatchTextWithPrefixes runs FileCheck with an in-memory check specification. +// It is primarily used when an autogenerated source fixture is checked one +// function at a time so function order in the LLVM module is not part of the +// contract. +func MatchTextWithPrefixes(checkText, input string, prefixes ...string) error { + f, err := os.CreateTemp("", "llgo-filecheck-*.txt") + if err != nil { + return err + } + name := f.Name() + defer os.Remove(name) + if _, err := f.WriteString(checkText); err != nil { + f.Close() + return err + } + if err := f.Close(); err != nil { + return err + } + return MatchWithPrefixes(name, input, prefixes...) +} + +// TargetPrefixes returns the FileCheck prefixes enabled for a compile target. +// CHECK remains available for target-independent assertions, while the other +// prefixes let one source file carry target-specific expectations. +func TargetPrefixes(goos, goarch, target string) []string { + prefixes := []string{"CHECK"} + osPrefix := normalizePrefix(goos) + archPrefix := normalizePrefix(goarch) + if osPrefix != "" { + prefixes = append(prefixes, osPrefix) + } + if archPrefix != "" { + if archPrefix[0] >= '0' && archPrefix[0] <= '9' { + archPrefix = "ARCH-" + archPrefix + } + prefixes = append(prefixes, archPrefix) + } + if osPrefix != "" && archPrefix != "" { + prefixes = append(prefixes, osPrefix+"-"+archPrefix) + } + if targetPrefix := normalizePrefix(target); targetPrefix != "" { + prefixes = append(prefixes, "TARGET-"+targetPrefix) + } + return dedupPrefixes(prefixes) +} + +// TargetSnapshotPrefix returns the most specific prefix used by autogenerated +// snapshots for a compile target. +func TargetSnapshotPrefix(goos, goarch, target string) string { + if targetPrefix := normalizePrefix(target); targetPrefix != "" { + return "TARGET-" + targetPrefix + } + osPrefix := normalizePrefix(goos) + archPrefix := normalizePrefix(goarch) + if archPrefix != "" && archPrefix[0] >= '0' && archPrefix[0] <= '9' { + archPrefix = "ARCH-" + archPrefix + } + switch { + case osPrefix != "" && archPrefix != "": + return osPrefix + "-" + archPrefix + case osPrefix != "": + return osPrefix + case archPrefix != "": + return archPrefix + default: + return "CHECK" + } +} + +func normalizePrefix(value string) string { + value = strings.ToUpper(strings.TrimSpace(value)) + value = invalidPrefixChars.ReplaceAllString(value, "-") + return strings.Trim(value, "-_") +} + +func dedupPrefixes(prefixes []string) []string { + seen := make(map[string]bool, len(prefixes)) + out := prefixes[:0] + for _, prefix := range prefixes { + if prefix == "" || seen[prefix] { + continue + } + seen[prefix] = true + out = append(out, prefix) + } + return out +} diff --git a/internal/filecheck/filecheck_test.go b/internal/filecheck/filecheck_test.go index f84a10fe70..83ec7832dc 100644 --- a/internal/filecheck/filecheck_test.go +++ b/internal/filecheck/filecheck_test.go @@ -132,6 +132,42 @@ func TestMatchSupportsCRLF(t *testing.T) { } } +func TestMatchWithTargetPrefixes(t *testing.T) { + spec := `// CHECK: common +// DARWIN: darwin +// ARM64: arm64 +// DARWIN-ARM64: combined +// LINUX: linux +` + input := "common\ndarwin\narm64\ncombined\n" + if err := MatchWithPrefixes(writeCheckFile(t, spec), input, TargetPrefixes("darwin", "arm64", "")...); err != nil { + t.Fatal(err) + } +} + +func TestMatchWithTargetPrefixesAllowsUnusedAxes(t *testing.T) { + prefixes := TargetPrefixes("darwin", "arm64", "") + if err := MatchWithPrefixes(writeCheckFile(t, "// CHECK: common\n"), "common\n", prefixes...); err != nil { + t.Fatal(err) + } + if err := MatchWithPrefixes(writeCheckFile(t, "// DARWIN-ARM64: specific\n"), "specific\n", prefixes...); err != nil { + t.Fatal(err) + } +} + +func TestTargetPrefixes(t *testing.T) { + got := strings.Join(TargetPrefixes("wasip1", "wasm", "wasm"), ",") + if want := "CHECK,WASIP1,WASM,WASIP1-WASM,TARGET-WASM"; got != want { + t.Fatalf("TargetPrefixes = %q, want %q", got, want) + } + if got := TargetSnapshotPrefix("darwin", "arm64", ""); got != "DARWIN-ARM64" { + t.Fatalf("TargetSnapshotPrefix = %q, want DARWIN-ARM64", got) + } + if got := TargetSnapshotPrefix("linux", "386", ""); got != "LINUX-ARCH-386" { + t.Fatalf("TargetSnapshotPrefix = %q, want LINUX-ARCH-386", got) + } +} + func writeCheckFile(t *testing.T, spec string) string { t.Helper() path := filepath.Join(t.TempDir(), "test.go") diff --git a/internal/littest/littest.go b/internal/littest/littest.go index 0147603631..c6ed0e6520 100644 --- a/internal/littest/littest.go +++ b/internal/littest/littest.go @@ -18,11 +18,12 @@ package littest import ( "bufio" - "bytes" "errors" "fmt" "os" "path/filepath" + "regexp" + "slices" "strings" "github.com/goplus/llgo/internal/filecheck" @@ -31,68 +32,179 @@ import ( type Mode int const ( - ModeSkip Mode = iota - ModeLiteral - ModeFileCheck + ModeFileCheck Mode = iota ) type Spec struct { Path string - Text string Mode Mode } const Marker = "LITTEST" func LoadSpec(pkgDir string) (Spec, error) { - if spec, ok, err := loadSourceSpec(pkgDir); err != nil { - return Spec{}, err - } else if ok { - return spec, nil - } - - path := filepath.Join(pkgDir, "out.ll") - data, err := os.ReadFile(path) + marked, ok, err := FindMarkedSourceFile(pkgDir) if err != nil { return Spec{}, err } - if bytes.Equal(data, []byte{';'}) { - return Spec{Path: path, Mode: ModeSkip}, nil + if !ok || marked == "" { + return Spec{}, fmt.Errorf("%s: missing // %s source lit spec", pkgDir, Marker) } - return Spec{Path: path, Text: string(data), Mode: ModeLiteral}, nil + return Spec{Path: marked, Mode: ModeFileCheck}, nil } -func Check(spec Spec, actual string) error { +func Check(spec Spec, actual string, prefixes ...string) error { switch spec.Mode { - case ModeSkip: - return nil case ModeFileCheck: - return filecheck.Match(spec.Path, actual) - case ModeLiteral: - if actual != spec.Text { - return fmt.Errorf("%s: literal LLVM IR mismatch", spec.Path) + if sections, split, err := functionCheckSections(spec.Path, prefixes); err != nil { + return err + } else if split { + for i, section := range sections { + if err := filecheck.MatchTextWithPrefixes(section, actual, prefixes...); err != nil { + return fmt.Errorf("%s: function check section %d: %w", spec.Path, i+1, err) + } + } + return nil } - return nil + return filecheck.MatchWithPrefixes(spec.Path, actual, prefixes...) default: return errors.New("unknown lit spec mode") } } -func loadSourceSpec(pkgDir string) (Spec, bool, error) { - marked, ok, err := FindMarkedSourceFile(pkgDir) +var fileCheckSuffixes = []string{ + "-LABEL:", "-NEXT:", "-SAME:", "-DAG:", "-NOT:", "-EMPTY:", ":", +} + +var ( + fileCheckVarDefRE = regexp.MustCompile(`\[\[([A-Za-z_][A-Za-z0-9_]*):`) + fileCheckVarUseRE = regexp.MustCompile(`\[\[([A-Za-z_][A-Za-z0-9_]*)\]\]`) +) + +// functionCheckSections splits a source fixture with multiple function LABELs +// into independent checks. Each section repeats the global directives and +// retains one complete LABEL/SAME/NEXT block, so local and global value +// relationships stay strict while LLVM function-list order remains irrelevant. +func functionCheckSections(path string, prefixes []string) ([]string, bool, error) { + data, err := os.ReadFile(path) if err != nil { - return Spec{}, false, err + return nil, false, err } - if !ok { - return Spec{}, false, nil + + active := append([]string(nil), prefixes...) + if len(active) == 0 { + active = []string{"CHECK"} } - if marked == "" { - return Spec{}, false, nil + // Prefer the most specific prefix when one is a prefix of another (for + // example DARWIN and DARWIN-ARM64). + slices.SortFunc(active, func(a, b string) int { + return len(b) - len(a) + }) + + var globals []string + var current []string + var sections []string + seenLabel := false + labels := 0 + for _, line := range strings.Split(string(data), "\n") { + kind, ok := activeDirectiveKind(line, active) + if !ok { + continue + } + line += "\n" + if kind == "LABEL" { + labels++ + if len(current) != 0 { + sections = append(sections, boundedFunctionSection(globals, current, active)) + } + current = []string{line} + seenLabel = true + continue + } + if seenLabel { + current = append(current, line) + } else { + globals = append(globals, line) + } + } + if len(current) != 0 { + sections = append(sections, boundedFunctionSection(globals, current, active)) + } + if labels < 2 { + return nil, false, nil + } + if sectionsShareVariables(globals, sections) { + // A few hand-written fixtures intentionally bind the same type symbol + // across two functions. Keep their single FileCheck invocation because + // that cross-function identity is part of the test's contract. + return nil, false, nil + } + return sections, true, nil +} + +func boundedFunctionSection(globals, current, active []string) string { + for _, line := range current { + body := strings.TrimSpace(line) + if strings.HasSuffix(body, ": }") || strings.HasSuffix(body, ": {{^}$}}") { + return strings.Join(append(append([]string(nil), globals...), current...), "") + } + } + prefix := active[0] + if slices.Contains(active, "CHECK") { + prefix = "CHECK" + } + lines := append(append([]string(nil), globals...), current...) + lines = append(lines, "// "+prefix+"-LABEL: {{^}$}}\n") + return strings.Join(lines, "") +} + +func sectionsShareVariables(globals []string, sections []string) bool { + globalDefs := fileCheckVarDefs(strings.Join(globals, "")) + sectionDefs := make([]map[string]bool, len(sections)) + allSectionDefs := make(map[string]bool) + for i, section := range sections { + sectionDefs[i] = fileCheckVarDefs(section) + for name := range sectionDefs[i] { + allSectionDefs[name] = true + } + } + for i, section := range sections { + for _, match := range fileCheckVarUseRE.FindAllStringSubmatch(section, -1) { + name := match[1] + if !globalDefs[name] && !sectionDefs[i][name] && allSectionDefs[name] { + return true + } + } + } + return false +} + +func fileCheckVarDefs(text string) map[string]bool { + defs := make(map[string]bool) + for _, match := range fileCheckVarDefRE.FindAllStringSubmatch(text, -1) { + defs[match[1]] = true + } + return defs +} + +func activeDirectiveKind(line string, prefixes []string) (string, bool) { + line = strings.TrimSpace(line) + if !strings.HasPrefix(line, "//") { + return "", false + } + body := strings.TrimSpace(strings.TrimPrefix(line, "//")) + for _, prefix := range prefixes { + if !strings.HasPrefix(body, prefix) { + continue + } + rest := strings.TrimPrefix(body, prefix) + for _, suffix := range fileCheckSuffixes { + if strings.HasPrefix(rest, suffix) { + return strings.TrimSuffix(strings.TrimPrefix(suffix, "-"), ":"), true + } + } } - return Spec{ - Path: marked, - Mode: ModeFileCheck, - }, true, nil + return "", false } func FindMarkedSourceFile(dir string) (string, bool, error) { diff --git a/internal/littest/littest_test.go b/internal/littest/littest_test.go index d02d899375..f1ddea4970 100644 --- a/internal/littest/littest_test.go +++ b/internal/littest/littest_test.go @@ -7,21 +7,13 @@ import ( "testing" ) -func TestLoadSpecPrefersMarkedSourceOverOutLL(t *testing.T) { +func TestLoadSpecLoadsMarkedSource(t *testing.T) { dir := t.TempDir() err := os.WriteFile(filepath.Join(dir, "in.go"), []byte(`// LITTEST // CHECK: ret void package main func main() {} -`), 0644) - if err != nil { - t.Fatal(err) - } - err = os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`; ModuleID = 'main' -define void @main() { - ret void -} `), 0644) if err != nil { t.Fatal(err) @@ -67,7 +59,7 @@ package main } } -func TestLoadSpecWorksWithoutOutLLWhenSourceChecksExist(t *testing.T) { +func TestLoadSpecWorksWithSourceChecks(t *testing.T) { dir := t.TempDir() err := os.WriteFile(filepath.Join(dir, "in.go"), []byte(`// LITTEST package main @@ -110,58 +102,116 @@ package main } } -func TestLoadSpecFallsBackToOutLLWithoutMarker(t *testing.T) { +func TestFunctionChecksIgnoreFunctionOrder(t *testing.T) { dir := t.TempDir() - err := os.WriteFile(filepath.Join(dir, "in.go"), []byte(`// CHECK: ret void + path := filepath.Join(dir, "in.go") + err := os.WriteFile(path, []byte(`// LITTEST package main + +// DARWIN-ARM64: [[G:@g]] = global i64 1 +// DARWIN-ARM64-LABEL: define void @a() { +// DARWIN-ARM64-NEXT: entry: +// DARWIN-ARM64-NEXT: store i64 1, ptr [[G]] +// DARWIN-ARM64-NEXT: } +func a() {} + +// DARWIN-ARM64-LABEL: define void @b() { +// DARWIN-ARM64-NEXT: entry: +// DARWIN-ARM64-NEXT: store i64 2, ptr [[G]] +// DARWIN-ARM64-NEXT: } +func b() {} `), 0644) if err != nil { t.Fatal(err) } - err = os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`; ModuleID = 'main' -define void @main() { - ret void + spec := Spec{Path: path, Mode: ModeFileCheck} + actual := `@g = global i64 1 + +define void @b() { +entry: + store i64 2, ptr @g } -`), 0644) - if err != nil { + +define void @a() { +entry: + store i64 1, ptr @g +} +` + if err := Check(spec, actual, "CHECK", "DARWIN", "ARM64", "DARWIN-ARM64"); err != nil { t.Fatal(err) } - spec, err := LoadSpec(dir) +} + +func TestFunctionCheckDoesNotCrossClosingBrace(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "in.go") + err := os.WriteFile(path, []byte(`// LITTEST +package main + +// CHECK-LABEL: define void @first() +// CHECK: call void @only.in.second() +func first() {} + +// CHECK-LABEL: define void @second() +// CHECK: call void @only.in.second() +func second() {} +`), 0644) if err != nil { t.Fatal(err) } - if spec.Path != filepath.Join(dir, "out.ll") { - t.Fatalf("spec.Path = %q", spec.Path) - } - if spec.Mode != ModeLiteral { - t.Fatalf("spec.Mode = %v", spec.Mode) + spec := Spec{Path: path, Mode: ModeFileCheck} + actual := `define void @first() { + ret void +} + +define void @second() { + call void @only.in.second() + ret void +} +` + if err := Check(spec, actual, "CHECK"); err == nil { + t.Fatal("a function check crossed the current function's closing brace") } } -func TestLoadSpecReportsMissingOutLL(t *testing.T) { +func TestFunctionChecksPreserveCrossFunctionBindings(t *testing.T) { dir := t.TempDir() - err := os.WriteFile(filepath.Join(dir, "in.go"), []byte("package main\n"), 0644) + path := filepath.Join(dir, "in.go") + err := os.WriteFile(path, []byte(`// LITTEST +package main + +// CHECK-LABEL: define ptr @producer() { +// CHECK: ret ptr [[TYPE:@type[0-9]+]] +func producer() {} + +// CHECK-LABEL: define i1 @consumer(ptr %0) { +// CHECK: [[MATCH:%[0-9]+]] = icmp eq ptr %0, [[TYPE]] +func consumer() {} +`), 0644) if err != nil { t.Fatal(err) } - _, err = LoadSpec(dir) - if err == nil { - t.Fatal("LoadSpec succeeded unexpectedly") + sections, split, err := functionCheckSections(path, []string{"CHECK"}) + if err != nil { + t.Fatal(err) + } + if split || sections != nil { + t.Fatalf("cross-function binding was split: %#v", sections) } } -func TestLoadSpecSupportsSkipOutLL(t *testing.T) { +func TestLoadSpecRequiresMarkedSource(t *testing.T) { dir := t.TempDir() - err := os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`;`), 0644) + err := os.WriteFile(filepath.Join(dir, "in.go"), []byte("package main\n"), 0644) if err != nil { t.Fatal(err) } - spec, err := LoadSpec(dir) - if err != nil { - t.Fatal(err) + _, err = LoadSpec(dir) + if err == nil { + t.Fatal("LoadSpec succeeded unexpectedly") } - if spec.Mode != ModeSkip { - t.Fatalf("spec.Mode = %v", spec.Mode) + if !strings.Contains(err.Error(), "missing // LITTEST source lit spec") { + t.Fatalf("unexpected error: %v", err) } } @@ -206,21 +256,6 @@ func TestCheck(t *testing.T) { text string want string }{ - { - name: "skip", - spec: Spec{Path: "skip", Mode: ModeSkip}, - }, - { - name: "literal match", - spec: Spec{Path: "literal", Text: "ok", Mode: ModeLiteral}, - text: "ok", - }, - { - name: "literal mismatch", - spec: Spec{Path: "literal", Text: "ok", Mode: ModeLiteral}, - text: "bad", - want: "literal LLVM IR mismatch", - }, { name: "filecheck match", spec: Spec{Path: checkPath, Mode: ModeFileCheck}, @@ -261,20 +296,9 @@ package main if err != nil { t.Fatal(err) } - err = os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`; ModuleID = 'main' -define void @main() { - ret void -} -`), 0644) - if err != nil { - t.Fatal(err) - } - spec, err := LoadSpec(dir) - if err != nil { - t.Fatal(err) - } - if spec.Path != filepath.Join(dir, "out.ll") { - t.Fatalf("spec.Path = %q", spec.Path) + _, err = LoadSpec(dir) + if err == nil { + t.Fatal("LoadSpec succeeded unexpectedly") } } @@ -287,20 +311,9 @@ package main if err != nil { t.Fatal(err) } - err = os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`; ModuleID = 'main' -define void @main() { - ret void -} -`), 0644) - if err != nil { - t.Fatal(err) - } - spec, err := LoadSpec(dir) - if err != nil { - t.Fatal(err) - } - if spec.Path != filepath.Join(dir, "out.ll") { - t.Fatalf("spec.Path = %q", spec.Path) + _, err = LoadSpec(dir) + if err == nil { + t.Fatal("LoadSpec succeeded unexpectedly") } } @@ -312,19 +325,8 @@ func TestLoadSpecIgnoresNonGoFiles(t *testing.T) { if err != nil { t.Fatal(err) } - err = os.WriteFile(filepath.Join(dir, "out.ll"), []byte(`; ModuleID = 'main' -define void @main() { - ret void -} -`), 0644) - if err != nil { - t.Fatal(err) - } - spec, err := LoadSpec(dir) - if err != nil { - t.Fatal(err) - } - if spec.Path != filepath.Join(dir, "out.ll") { - t.Fatalf("spec.Path = %q", spec.Path) + _, err = LoadSpec(dir) + if err == nil { + t.Fatal("LoadSpec succeeded unexpectedly") } } diff --git a/internal/llgen/llgenf.go b/internal/llgen/llgenf.go index 1e45eaf26d..fbeb9aaa2c 100644 --- a/internal/llgen/llgenf.go +++ b/internal/llgen/llgenf.go @@ -28,10 +28,35 @@ import ( "github.com/goplus/llgo/internal/targets" ) +type GeneratedIR struct { + Text string + GOOS string + GOARCH string + Target string +} + func GenFrom(fileOrPkg string) string { - pkg, err := genFrom(fileOrPkg, 0) + return GenerateFrom(fileOrPkg).Text +} + +func GenerateFrom(fileOrPkg string) GeneratedIR { + return GenerateFromWithConf(fileOrPkg, nil) +} + +// GenerateFromWithConf compiles fileOrPkg through the normal package pipeline +// and returns the module after target ABI lowering but before LLVM optimizer +// passes. When conf is non-nil, its target and frontend options are preserved; +// linked-build-only output settings are replaced with ModeGen behavior. +func GenerateFromWithConf(fileOrPkg string, conf *build.Config) GeneratedIR { + pkg, err := genFromConfigured(fileOrPkg, conf) check(err) - out := pkg.LPkg.String() + target := pkg.LPkg.Prog.Target() + out := GeneratedIR{ + Text: pkg.LPkg.String(), + GOOS: target.GOOS, + GOARCH: target.GOARCH, + Target: target.Target, + } // Release the compile's LLVM context: golden suites call GenFrom for // every test dir inside one process, and undisposed contexts // accumulate C++-side memory for the whole run. @@ -39,12 +64,29 @@ func GenFrom(fileOrPkg string) string { return out } -func genFrom(pkgPath string, abiMode build.AbiMode) (build.Package, error) { - conf := &build.Config{ - Mode: build.ModeGen, - AbiMode: abiMode, - GenLL: true, +func genFromDefault(pkgPath string) (build.Package, error) { + return genFromConfigured(pkgPath, nil) +} + +func genFromConfigured(pkgPath string, input *build.Config) (build.Package, error) { + conf := build.NewDefaultConf(build.ModeGen) + if input != nil { + *conf = *input + conf.Mode = build.ModeGen + conf.ModuleHook = nil } + conf.GenLL = true + return genFromConf(pkgPath, conf) +} + +func genFrom(pkgPath string, abiMode build.AbiMode) (build.Package, error) { + conf := build.NewDefaultConf(build.ModeGen) + conf.AbiMode = abiMode + conf.GenLL = true + return genFromConf(pkgPath, conf) +} + +func genFromConf(pkgPath string, conf *build.Config) (build.Package, error) { if err := applyFlagsFile(conf, filepath.Join(pkgPath, "flags.txt")); err != nil { return nil, err } @@ -131,11 +173,7 @@ func SmartDoFileEx(pkgPath string, abiMode build.AbiMode) { dir, _ := filepath.Split(pkg.GoFiles[0]) absDir, _ := filepath.Abs(dir) absDir = filepath.ToSlash(absDir) - fname := autgenFile - if inCompilerDir(absDir) { - fname = "out.ll" - } - outFile := dir + fname + outFile := dir + autgenFile b, err := os.ReadFile(outFile) if err == nil && len(b) == 1 && b[0] == ';' { @@ -145,7 +183,7 @@ func SmartDoFileEx(pkgPath string, abiMode build.AbiMode) { if err = os.WriteFile(outFile, []byte(pkg.LPkg.String()), 0644); err != nil { panic(err) } - if false && fname == autgenFile { + if false { genZip(absDir, "llgo_autogen.lla", autgenFile) } } @@ -157,7 +195,3 @@ func genZip(dir string, outFile, inFile string) { cmd.Stderr = os.Stderr cmd.Run() } - -func inCompilerDir(dir string) bool { - return strings.Contains(dir, "/cl/_test") -}