• Keith Randall's avatar
    cmd/compile: fix sign-extension merging rules · 3f04db41
    Keith Randall authored
    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/65290Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
    Run-TryBot: Cherry Zhang <cherryyz@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    3f04db41
issue21963.go 483 Bytes