mirror of
https://github.com/golang/go.git
synced 2025-05-29 11:25:43 +00:00
I noted in CL 38327 that the SSA test API felt a bit clunky after the ssa.Func/ssa.Cache/ssa.Config refactoring, and promised to clean it up once the dust settled. The dust has settled. Along the way, this CL fixes a potential latent bug, in which the amd64 test context was used for all dummy Syslook calls. The lone SSA test using the s390x context did not depend on the Syslook context being correct, so the bug did not arise in practice. Change-Id: If964251d1807976073ad7f47da0b1f1f77c58413 Reviewed-on: https://go-review.googlesource.com/38346 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ssa
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestLoopConditionS390X(t *testing.T) {
|
|
// Test that a simple loop condition does not generate a conditional
|
|
// move (issue #19227).
|
|
//
|
|
// MOVDLT is generated when Less64 is lowered but should be
|
|
// optimized into an LT branch.
|
|
//
|
|
// For example, compiling the following loop:
|
|
//
|
|
// for i := 0; i < N; i++ {
|
|
// sum += 3
|
|
// }
|
|
//
|
|
// should generate assembly similar to:
|
|
// loop:
|
|
// CMP R0, R1
|
|
// BGE done
|
|
// ADD $3, R4
|
|
// ADD $1, R1
|
|
// BR loop
|
|
// done:
|
|
//
|
|
// rather than:
|
|
// loop:
|
|
// MOVD $0, R2
|
|
// MOVD $1, R3
|
|
// CMP R0, R1
|
|
// MOVDLT R2, R3
|
|
// CMPW R2, $0
|
|
// BNE done
|
|
// ADD $3, R4
|
|
// ADD $1, R1
|
|
// BR loop
|
|
// done:
|
|
//
|
|
c := testConfigS390X(t)
|
|
fun := c.Fun("entry",
|
|
Bloc("entry",
|
|
Valu("mem", OpInitMem, TypeMem, 0, nil),
|
|
Valu("SP", OpSP, TypeUInt64, 0, nil),
|
|
Valu("ret", OpAddr, TypeInt64Ptr, 0, nil, "SP"),
|
|
Valu("N", OpArg, TypeInt64, 0, c.Frontend().Auto(TypeInt64)),
|
|
Valu("starti", OpConst64, TypeInt64, 0, nil),
|
|
Valu("startsum", OpConst64, TypeInt64, 0, nil),
|
|
Goto("b1")),
|
|
Bloc("b1",
|
|
Valu("phii", OpPhi, TypeInt64, 0, nil, "starti", "i"),
|
|
Valu("phisum", OpPhi, TypeInt64, 0, nil, "startsum", "sum"),
|
|
Valu("cmp1", OpLess64, TypeBool, 0, nil, "phii", "N"),
|
|
If("cmp1", "b2", "b3")),
|
|
Bloc("b2",
|
|
Valu("c1", OpConst64, TypeInt64, 1, nil),
|
|
Valu("i", OpAdd64, TypeInt64, 0, nil, "phii", "c1"),
|
|
Valu("c3", OpConst64, TypeInt64, 3, nil),
|
|
Valu("sum", OpAdd64, TypeInt64, 0, nil, "phisum", "c3"),
|
|
Goto("b1")),
|
|
Bloc("b3",
|
|
Valu("retdef", OpVarDef, TypeMem, 0, nil, "mem"),
|
|
Valu("store", OpStore, TypeMem, 0, TypeInt64, "ret", "phisum", "retdef"),
|
|
Exit("store")))
|
|
CheckFunc(fun.f)
|
|
Compile(fun.f)
|
|
CheckFunc(fun.f)
|
|
|
|
checkOpcodeCounts(t, fun.f, map[Op]int{
|
|
OpS390XMOVDLT: 0,
|
|
OpS390XMOVDGT: 0,
|
|
OpS390XMOVDLE: 0,
|
|
OpS390XMOVDGE: 0,
|
|
OpS390XMOVDEQ: 0,
|
|
OpS390XMOVDNE: 0,
|
|
OpS390XCMP: 1,
|
|
OpS390XCMPWconst: 0,
|
|
})
|
|
}
|