From 0e633c63ed549e65335503668b5f5491ad6c8433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Cajka?= Date: Fri, 2 Aug 2019 10:42:35 +0200 Subject: [PATCH] Fix ICE affecting aarch64 Resolves: BZ#1735290 --- aarch-ICE-fix.patch | 196 ++++++++++++++++++++++++++++++++++++++++++++ golang.spec | 9 +- 2 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 aarch-ICE-fix.patch diff --git a/aarch-ICE-fix.patch b/aarch-ICE-fix.patch new file mode 100644 index 0000000..d34c588 --- /dev/null +++ b/aarch-ICE-fix.patch @@ -0,0 +1,196 @@ +From 8a317ebc0f50339628c003bf06107cd865406dd4 Mon Sep 17 00:00:00 2001 +From: Keith Randall +Date: Tue, 30 Jul 2019 16:14:20 -0700 +Subject: [PATCH] cmd/compile: don't eliminate all registers when restricting + to desired ones + +We shouldn't mask to desired registers if we haven't masked out all the +forbidden registers yet. In this path we haven't masked out the nospill +registers yet. If the resulting mask contains only nospill registers, then +allocReg fails. + +This can only happen on resultNotInArgs-marked instructions, which exist +only on the ARM64, MIPS, MIPS64, and PPC64 ports. + +Maybe there's a better way to handle resultNotInArgs instructions. +But for 1.13, this is a low-risk fix. + +Fixes #33355 + +Change-Id: I1082f78f798d1371bde65c58cc265540480e4fa4 +Reviewed-on: https://go-review.googlesource.com/c/go/+/188178 +Run-TryBot: Keith Randall +TryBot-Result: Gobot Gobot +Reviewed-by: David Chase +--- + src/cmd/compile/internal/ssa/regalloc.go | 2 +- + test/fixedbugs/issue33355.go | 147 +++++++++++++++++++++++ + 2 files changed, 148 insertions(+), 1 deletion(-) + create mode 100644 test/fixedbugs/issue33355.go + +diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go +index b6fae5e0a3e..8abbf615076 100644 +--- a/src/cmd/compile/internal/ssa/regalloc.go ++++ b/src/cmd/compile/internal/ssa/regalloc.go +@@ -1455,7 +1455,7 @@ func (s *regAllocState) regalloc(f *Func) { + } + } + // Avoid registers we're saving for other values. +- if mask&^desired.avoid != 0 { ++ if mask&^desired.avoid&^s.nospill != 0 { + mask &^= desired.avoid + } + r := s.allocReg(mask, v) +diff --git a/test/fixedbugs/issue33355.go b/test/fixedbugs/issue33355.go +new file mode 100644 +index 00000000000..c4b1e2e1a23 +--- /dev/null ++++ b/test/fixedbugs/issue33355.go +@@ -0,0 +1,147 @@ ++// compile ++ ++// Copyright 2019 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. ++ ++// This code failed on arm64 in the register allocator. ++// See issue 33355. ++ ++package server ++ ++import ( ++ "bytes" ++ "sync" ++) ++ ++type client struct { ++ junk [4]int ++ mu sync.Mutex ++ srv *Server ++ gw *gateway ++ msgb [100]byte ++} ++ ++type gateway struct { ++ cfg *gatewayCfg ++ outsim *sync.Map ++} ++ ++type gatewayCfg struct { ++ replyPfx []byte ++} ++ ++type Account struct { ++ Name string ++} ++ ++type Server struct { ++ gateway *srvGateway ++} ++ ++type srvGateway struct { ++ outo []*client ++} ++ ++type subscription struct { ++ queue []byte ++ client *client ++} ++ ++type outsie struct { ++ ni map[string]struct{} ++ sl *Sublist ++ qsubs int ++} ++ ++type Sublist struct { ++} ++ ++type SublistResult struct { ++ psubs []*subscription ++ qsubs [][]*subscription ++} ++ ++var subPool = &sync.Pool{} ++ ++func (c *client) sendMsgToGateways(acc *Account, msg, subject, reply []byte, qgroups [][]byte) { ++ var gws []*client ++ gw := c.srv.gateway ++ for i := 0; i < len(gw.outo); i++ { ++ gws = append(gws, gw.outo[i]) ++ } ++ var ( ++ subj = string(subject) ++ queuesa = [512]byte{} ++ queues = queuesa[:0] ++ mreply []byte ++ dstPfx []byte ++ checkReply = len(reply) > 0 ++ ) ++ ++ sub := subPool.Get().(*subscription) ++ ++ if subjectStartsWithGatewayReplyPrefix(subject) { ++ dstPfx = subject[:8] ++ } ++ for i := 0; i < len(gws); i++ { ++ gwc := gws[i] ++ if dstPfx != nil { ++ gwc.mu.Lock() ++ ok := bytes.Equal(dstPfx, gwc.gw.cfg.replyPfx) ++ gwc.mu.Unlock() ++ if !ok { ++ continue ++ } ++ } else { ++ qr := gwc.gatewayInterest(acc.Name, subj) ++ queues = queuesa[:0] ++ for i := 0; i < len(qr.qsubs); i++ { ++ qsubs := qr.qsubs[i] ++ queue := qsubs[0].queue ++ add := true ++ for _, qn := range qgroups { ++ if bytes.Equal(queue, qn) { ++ add = false ++ break ++ } ++ } ++ if add { ++ qgroups = append(qgroups, queue) ++ } ++ } ++ if len(queues) == 0 { ++ continue ++ } ++ } ++ if checkReply { ++ checkReply = false ++ mreply = reply ++ } ++ mh := c.msgb[:10] ++ mh = append(mh, subject...) ++ if len(queues) > 0 { ++ mh = append(mh, mreply...) ++ mh = append(mh, queues...) ++ } ++ sub.client = gwc ++ } ++ subPool.Put(sub) ++} ++ ++func subjectStartsWithGatewayReplyPrefix(subj []byte) bool { ++ return len(subj) > 8 && string(subj[:4]) == "foob" ++} ++ ++func (c *client) gatewayInterest(acc, subj string) *SublistResult { ++ ei, _ := c.gw.outsim.Load(acc) ++ var r *SublistResult ++ e := ei.(*outsie) ++ r = e.sl.Match(subj) ++ return r ++} ++ ++func (s *Sublist) Match(subject string) *SublistResult { ++ return nil ++} ++ diff --git a/golang.spec b/golang.spec index 7bbf200..b043ebd 100644 --- a/golang.spec +++ b/golang.spec @@ -106,7 +106,7 @@ Name: golang Version: 1.13 -Release: 0.beta1.2%{?dist}.1 +Release: 0.beta1.2%{?dist}.2 Summary: The Go Programming Language # source tree includes several copies of Mark.Twain-Tom.Sawyer.txt under Public Domain License: BSD and Public Domain @@ -184,6 +184,8 @@ Requires: go-srpm-macros Patch1: 0001-Don-t-use-the-bundled-tzdata-at-runtime-except-for-t.patch Patch2: 0002-syscall-expose-IfInfomsg.X__ifi_pad-on-s390x.patch Patch3: 0003-cmd-go-disable-Google-s-proxy-and-sumdb.patch +# https://github.com/golang/go/commit/8a317ebc0f50339628c003bf06107cd865406dd4 +Patch4: aarch-ICE-fix.patch # Having documentation separate was broken Obsoletes: %{name}-docs < 1.1-4 @@ -310,6 +312,7 @@ Requires: %{name} = %{version}-%{release} %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 cp %{SOURCE1} ./src/runtime/ @@ -548,6 +551,10 @@ fi %endif %changelog +* Thu Aug 01 2019 Jakub Čajka - 1.13-0.beta1.2.2 +- Fix ICE affecting aarch64 +- Resolves: BZ#1735290 + * Thu Jul 25 2019 Fedora Release Engineering - 1.13-0.beta1.2.1 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild