aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssagen/ssa.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/ssagen/ssa.go')
-rw-r--r--src/cmd/compile/internal/ssagen/ssa.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go
index 88fee51d33..4aedf9cd35 100644
--- a/src/cmd/compile/internal/ssagen/ssa.go
+++ b/src/cmd/compile/internal/ssagen/ssa.go
@@ -949,6 +949,7 @@ var (
typVar = ssaMarker("typ")
okVar = ssaMarker("ok")
deferBitsVar = ssaMarker("deferBits")
+ ternaryVar = ssaMarker("ternary")
)
// startBlock sets the current block we're generating code in to b.
@@ -3622,6 +3623,7 @@ func (s *state) minMax(n *ir.CallExpr) *ssa.Value {
func (s *state) ternary(cond, x, y *ssa.Value) *ssa.Value {
bThen := s.f.NewBlock(ssa.BlockPlain)
bElse := s.f.NewBlock(ssa.BlockPlain)
+ bEnd := s.f.NewBlock(ssa.BlockPlain)
b := s.endBlock()
b.Kind = ssa.BlockIf
@@ -3629,11 +3631,18 @@ func (s *state) ternary(cond, x, y *ssa.Value) *ssa.Value {
b.AddEdgeTo(bThen)
b.AddEdgeTo(bElse)
+ s.startBlock(bThen)
+ s.vars[ternaryVar] = x
+ s.endBlock().AddEdgeTo(bEnd)
+
s.startBlock(bElse)
- s.endBlock().AddEdgeTo(bThen)
+ s.vars[ternaryVar] = y
+ s.endBlock().AddEdgeTo(bEnd)
- s.startBlock(bThen)
- return s.newValue2(ssa.OpPhi, x.Type, x, y)
+ s.startBlock(bEnd)
+ r := s.variable(ternaryVar, x.Type)
+ delete(s.vars, ternaryVar)
+ return r
}
// condBranch evaluates the boolean expression cond and branches to yes