]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/ssagen: fix min/max codegen, again
authorMatthew Dempsky <mdempsky@google.com>
Tue, 27 Jun 2023 23:51:24 +0000 (16:51 -0700)
committerCarlos Amedee <carlos@golang.org>
Wed, 28 Jun 2023 16:07:47 +0000 (16:07 +0000)
The large-function phi placement algorithm evidently doesn't like the
same pseudo-variable being used to represent expressions of varying
types.

Instead, use the same tactic as used for "valVar" (ssa.go:6585--6587),
which is to just generate a fresh marker node each time.

Maybe we could just use the OMIN/OMAX nodes themselves as the key
(like we do for OANDAND/OOROR), but that just seems needlessly risky
for negligible memory savings. Using fresh marker values each time
seems obviously safe by comparison.

Fixes #61041.

Change-Id: Ie2600c9c37b599c2e26ae01f5f8a433025d7fd08
Reviewed-on: https://go-review.googlesource.com/c/go/+/506679
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/ssagen/ssa.go
test/fixedbugs/issue60982.go

index 4aedf9cd3510831e2dc5ce541a4413428f43ac55..678e1ebc11e96ba7869d6acc6ed7a55e2c5674a3 100644 (file)
@@ -949,7 +949,6 @@ 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.
@@ -3621,6 +3620,10 @@ func (s *state) minMax(n *ir.CallExpr) *ssa.Value {
 
 // ternary emits code to evaluate cond ? x : y.
 func (s *state) ternary(cond, x, y *ssa.Value) *ssa.Value {
+       // Note that we need a new ternaryVar each time (unlike okVar where we can
+       // reuse the variable) because it might have a different type every time.
+       ternaryVar := ssaMarker("ternary")
+
        bThen := s.f.NewBlock(ssa.BlockPlain)
        bElse := s.f.NewBlock(ssa.BlockPlain)
        bEnd := s.f.NewBlock(ssa.BlockPlain)
index 11c3af214f201d30631c0199bfa5187e1a550f5f..4e5fc34646f756dc16aafba8e2409385a4761e61 100644 (file)
@@ -6,8 +6,13 @@
 
 package main
 
-func f(x int) int {
+func f(x int, b bool) int {
        if x >= 1000 {
+               if b { // from #61041
+                       var a struct{ f int64 }
+                       _ = max(0, a.f)
+               }
+
                return max(x, 2000)
        }
        // generate 1000 basic blocks to put this function