mirror of
https://github.com/golang/go.git
synced 2025-05-25 09:21:21 +00:00
[dev.ssa] cmd/compile: handle phi control values
Tests courtesy of Todd Neal. Change-Id: If657c7c7d3cd1ce01e9d9ad79eb6b2110230c0f9 Reviewed-on: https://go-review.googlesource.com/13267 Reviewed-by: Todd Neal <todd@tneal.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
cfd8dfaa10
commit
ca088cf4e5
53
src/cmd/compile/internal/gc/testdata/ctl_ssa.go
vendored
Normal file
53
src/cmd/compile/internal/gc/testdata/ctl_ssa.go
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
// run
|
||||
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Test control flow
|
||||
|
||||
package main
|
||||
|
||||
// nor_ssa calculates NOR(a, b).
|
||||
// It is implemented in a way that generates
|
||||
// phi control values.
|
||||
func nor_ssa(a, b bool) bool {
|
||||
var c bool
|
||||
if a {
|
||||
c = true
|
||||
}
|
||||
if b {
|
||||
c = true
|
||||
}
|
||||
if c {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func testPhiControl() {
|
||||
tests := [...][3]bool{ // a, b, want
|
||||
{false, false, true},
|
||||
{true, false, false},
|
||||
{false, true, false},
|
||||
{true, true, false},
|
||||
}
|
||||
for _, test := range tests {
|
||||
a, b := test[0], test[1]
|
||||
got := nor_ssa(a, b)
|
||||
want := test[2]
|
||||
if want != got {
|
||||
print("nor(", a, ", ", b, ")=", want, " got ", got, "\n")
|
||||
failed = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var failed = false
|
||||
|
||||
func main() {
|
||||
testPhiControl()
|
||||
if failed {
|
||||
panic("failed")
|
||||
}
|
||||
}
|
@ -241,7 +241,7 @@
|
||||
(If (SETBE cmp) yes no) -> (ULE cmp yes no)
|
||||
(If (SETA cmp) yes no) -> (UGT cmp yes no)
|
||||
(If (SETAE cmp) yes no) -> (UGE cmp yes no)
|
||||
(If cond yes no) && cond.Op == OpAMD64MOVBload -> (NE (TESTB <TypeFlags> cond cond) yes no)
|
||||
(If cond yes no) -> (NE (TESTB <TypeFlags> cond cond) yes no)
|
||||
|
||||
(StaticCall [argwid] {target} mem) -> (CALLstatic [argwid] {target} mem)
|
||||
(ClosureCall [argwid] entry closure mem) -> (CALLclosure [argwid] entry closure mem)
|
||||
|
@ -8068,16 +8068,13 @@ func rewriteBlockAMD64(b *Block) bool {
|
||||
end9bea9963c3c5dfb97249a5feb8287f94:
|
||||
;
|
||||
// match: (If cond yes no)
|
||||
// cond: cond.Op == OpAMD64MOVBload
|
||||
// cond:
|
||||
// result: (NE (TESTB <TypeFlags> cond cond) yes no)
|
||||
{
|
||||
v := b.Control
|
||||
cond := v
|
||||
yes := b.Succs[0]
|
||||
no := b.Succs[1]
|
||||
if !(cond.Op == OpAMD64MOVBload) {
|
||||
goto end7e22019fb0effc80f85c05ea30bdb5d9
|
||||
}
|
||||
b.Kind = BlockAMD64NE
|
||||
v0 := b.NewValue0(v.Line, OpAMD64TESTB, TypeInvalid)
|
||||
v0.Type = TypeFlags
|
||||
@ -8088,8 +8085,8 @@ func rewriteBlockAMD64(b *Block) bool {
|
||||
b.Succs[1] = no
|
||||
return true
|
||||
}
|
||||
goto end7e22019fb0effc80f85c05ea30bdb5d9
|
||||
end7e22019fb0effc80f85c05ea30bdb5d9:
|
||||
goto end012351592edfc708bd3181d7e53f3993
|
||||
end012351592edfc708bd3181d7e53f3993:
|
||||
;
|
||||
case BlockAMD64LE:
|
||||
// match: (LE (InvertFlags cmp) yes no)
|
||||
|
Loading…
x
Reference in New Issue
Block a user