mirror of
https://github.com/golang/go.git
synced 2025-05-25 17:31:22 +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 (SETBE cmp) yes no) -> (ULE cmp yes no)
|
||||||
(If (SETA cmp) yes no) -> (UGT cmp yes no)
|
(If (SETA cmp) yes no) -> (UGT cmp yes no)
|
||||||
(If (SETAE cmp) yes no) -> (UGE 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)
|
(StaticCall [argwid] {target} mem) -> (CALLstatic [argwid] {target} mem)
|
||||||
(ClosureCall [argwid] entry closure mem) -> (CALLclosure [argwid] entry closure mem)
|
(ClosureCall [argwid] entry closure mem) -> (CALLclosure [argwid] entry closure mem)
|
||||||
|
@ -8068,16 +8068,13 @@ func rewriteBlockAMD64(b *Block) bool {
|
|||||||
end9bea9963c3c5dfb97249a5feb8287f94:
|
end9bea9963c3c5dfb97249a5feb8287f94:
|
||||||
;
|
;
|
||||||
// match: (If cond yes no)
|
// match: (If cond yes no)
|
||||||
// cond: cond.Op == OpAMD64MOVBload
|
// cond:
|
||||||
// result: (NE (TESTB <TypeFlags> cond cond) yes no)
|
// result: (NE (TESTB <TypeFlags> cond cond) yes no)
|
||||||
{
|
{
|
||||||
v := b.Control
|
v := b.Control
|
||||||
cond := v
|
cond := v
|
||||||
yes := b.Succs[0]
|
yes := b.Succs[0]
|
||||||
no := b.Succs[1]
|
no := b.Succs[1]
|
||||||
if !(cond.Op == OpAMD64MOVBload) {
|
|
||||||
goto end7e22019fb0effc80f85c05ea30bdb5d9
|
|
||||||
}
|
|
||||||
b.Kind = BlockAMD64NE
|
b.Kind = BlockAMD64NE
|
||||||
v0 := b.NewValue0(v.Line, OpAMD64TESTB, TypeInvalid)
|
v0 := b.NewValue0(v.Line, OpAMD64TESTB, TypeInvalid)
|
||||||
v0.Type = TypeFlags
|
v0.Type = TypeFlags
|
||||||
@ -8088,8 +8085,8 @@ func rewriteBlockAMD64(b *Block) bool {
|
|||||||
b.Succs[1] = no
|
b.Succs[1] = no
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
goto end7e22019fb0effc80f85c05ea30bdb5d9
|
goto end012351592edfc708bd3181d7e53f3993
|
||||||
end7e22019fb0effc80f85c05ea30bdb5d9:
|
end012351592edfc708bd3181d7e53f3993:
|
||||||
;
|
;
|
||||||
case BlockAMD64LE:
|
case BlockAMD64LE:
|
||||||
// match: (LE (InvertFlags cmp) yes no)
|
// match: (LE (InvertFlags cmp) yes no)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user