// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package ssacompile

import (
	"testing"

	"cmd/compile/internal/ssa/ssaop"
	"cmd/compile/internal/types"
)

func TestLoopRotateNested(t *testing.T) {
	c := testConfig(t)
	fun := c.Fun("entry",
		Bloc("entry",
			Valu("mem", ssaop.OpInitMem, types.TypeMem, 0, nil),
			Valu("constTrue", ssaop.OpConstBool, types.Types[types.TBOOL], 1, nil),
			Goto("outerHeader")),
		Bloc("outerHeader",
			If("constTrue", "outerBody", "outerExit")),
		Bloc("outerBody",
			Goto("innerHeader")),
		Bloc("innerHeader",
			If("constTrue", "innerBody", "innerExit")),
		Bloc("innerBody",
			Goto("innerTop")),
		Bloc("innerTop",
			Goto("innerHeader")),
		Bloc("innerExit",
			Goto("outerTop")),
		Bloc("outerTop",
			Goto("outerHeader")),
		Bloc("outerExit",
			Exit("mem")))

	blockName := make([]string, len(fun.f.Blocks)+1)
	for name, block := range fun.blocks {
		blockName[block.ID] = name
	}

	CheckFunc(fun.f)
	loopRotate(fun.f)
	CheckFunc(fun.f)

	// Verify the resulting block order
	expected := []string{
		"entry",
		"outerTop",
		"outerHeader",
		"outerBody",
		"innerTop",
		"innerHeader",
		"innerBody",
		"innerExit",
		"outerExit",
	}
	if len(expected) != len(fun.f.Blocks) {
		t.Fatalf("expected %d blocks, found %d", len(expected), len(fun.f.Blocks))
	}
	for i, b := range fun.f.Blocks {
		if expected[i] != blockName[b.ID] {
			t.Errorf("position %d: expected %s, found %s", i, expected[i], blockName[b.ID])
		}
	}
}
