From: Michael Munday Date: Wed, 1 Apr 2020 10:21:03 +0000 (-0700) Subject: cmd/compile: mark 'store multiple' as clobbering flags on s390x X-Git-Tag: go1.15beta1~683 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a7a0f0305035948f4c86e08e6e64409ab11a6f67;p=gostls13.git cmd/compile: mark 'store multiple' as clobbering flags on s390x Store multiple instructions can clobber flags on s390x when the offset passed into the assembler is outside the range representable with a signed 20 bit integer. This is because the assembler uses the agfi instruction to implement the large offset. The assembler could use a different sequence of instructions, but for now just mark the instruction as 'clobberFlags' since this is risk free. Noticed while investigating #38195. No test yet since I'm not sure how to get this bug to trigger and I haven't seen it affect real code. Change-Id: I4a6ab96455a3ef8ffacb76ef0166b97eb40ff925 Reviewed-on: https://go-review.googlesource.com/c/go/+/226759 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/compile/internal/ssa/gen/S390XOps.go b/src/cmd/compile/internal/ssa/gen/S390XOps.go index 283a0fa6b5..65460bf6f7 100644 --- a/src/cmd/compile/internal/ssa/gen/S390XOps.go +++ b/src/cmd/compile/internal/ssa/gen/S390XOps.go @@ -630,6 +630,7 @@ func init() { asm: "STMG", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, { name: "STMG3", @@ -640,6 +641,7 @@ func init() { asm: "STMG", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, { name: "STMG4", @@ -657,6 +659,7 @@ func init() { asm: "STMG", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, { name: "STM2", @@ -667,6 +670,7 @@ func init() { asm: "STMY", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, { name: "STM3", @@ -677,6 +681,7 @@ func init() { asm: "STMY", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, { name: "STM4", @@ -694,6 +699,7 @@ func init() { asm: "STMY", faultOnNilArg0: true, symEffect: "Write", + clobberFlags: true, // TODO(mundaym): currently uses AGFI to handle large offsets }, // large move diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 46ca7936dc..bf48bff8f1 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -30110,6 +30110,7 @@ var opcodeTable = [...]opInfo{ name: "STMG2", auxType: auxSymOff, argLen: 4, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMG, @@ -30125,6 +30126,7 @@ var opcodeTable = [...]opInfo{ name: "STMG3", auxType: auxSymOff, argLen: 5, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMG, @@ -30141,6 +30143,7 @@ var opcodeTable = [...]opInfo{ name: "STMG4", auxType: auxSymOff, argLen: 6, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMG, @@ -30158,6 +30161,7 @@ var opcodeTable = [...]opInfo{ name: "STM2", auxType: auxSymOff, argLen: 4, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMY, @@ -30173,6 +30177,7 @@ var opcodeTable = [...]opInfo{ name: "STM3", auxType: auxSymOff, argLen: 5, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMY, @@ -30189,6 +30194,7 @@ var opcodeTable = [...]opInfo{ name: "STM4", auxType: auxSymOff, argLen: 6, + clobberFlags: true, faultOnNilArg0: true, symEffect: SymWrite, asm: s390x.ASTMY,