diff options
| author | Keith Randall <khr@golang.org> | 2017-09-21 12:52:38 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2017-09-26 16:24:08 +0000 |
| commit | 3f04db41a8dbf6f64304f3e1d34b4c7775fbe55e (patch) | |
| tree | b92aaa507b35ac8c974fddfec084a232290b098b /src/runtime | |
| parent | 08a17966712f6edf1600e3eafb7758a153b55ec4 (diff) | |
| download | go-3f04db41a8dbf6f64304f3e1d34b4c7775fbe55e.tar.xz | |
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>
Diffstat (limited to 'src/runtime')
0 files changed, 0 insertions, 0 deletions
