]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: fix sign-extension merging rules
authorKeith Randall <khr@golang.org>
Thu, 21 Sep 2017 19:52:38 +0000 (12:52 -0700)
committerKeith Randall <khr@golang.org>
Tue, 26 Sep 2017 16:24:08 +0000 (16:24 +0000)
commit3f04db41a8dbf6f64304f3e1d34b4c7775fbe55e
treeb92aaa507b35ac8c974fddfec084a232290b098b
parent08a17966712f6edf1600e3eafb7758a153b55ec4
cmd/compile: fix sign-extension merging rules

If we have

  y = <int16> (MOVBQSX x)
  z = <int32> (MOVWQSX y)

We used to use this rewrite rule:

(MOVWQSX x:(MOVBQSX _)) -> x

But that resulted in replacing z with a value whose type
is only int16.  Then if z is spilled and restored, it gets
zero extended instead of sign extended.

Instead use the rule

(MOVWQSX (MOVBQSX x)) -> (MOVBQSX x)

The result is has the correct type, so it can be spilled
and restored correctly.  It might mean that a few more extension
ops might not be eliminated, but that's the price for correctness.

Fixes #21963

Change-Id: I6ec82c3d2dbe43cc1fee6fb2bd6b3a72fca3af00
Reviewed-on: https://go-review.googlesource.com/65290
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/rewriteAMD64.go
test/fixedbugs/issue21963.go [new file with mode: 0644]