| // Copyright 2026 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. | |
| package ssacompile | |
| import ( | |
| "testing" | |
| "cmd/compile/internal/ssa" | |
| "cmd/compile/internal/ssa/ssaop" | |
| "cmd/compile/internal/types" | |
| ) | |
| func TestRshCopiesSignBitEverywhere(t *testing.T) { | |
| c := testConfig(t) | |
| f := c.Fun("entry", | |
| Bloc("entry", | |
| Valu("mem", ssaop.OpInitMem, types.TypeMem, 0, nil), | |
| Valu("x", ssaop.OpArg, c.config.Types.Int64, 0, nil), | |
| Valu("y", ssaop.OpArg, c.config.Types.Int64, 1, nil), | |
| Valu("ptr", ssaop.OpArg, c.config.Types.BytePtr, 2, nil), | |
| Valu("signBit", ssaop.OpConst64, c.config.Types.Int64, -1<<63, nil), | |
| Valu("xWithSignBitSet", ssaop.OpOr64, c.config.Types.Int64, 0, nil, "x", "signBit"), | |
| Valu("oneHundredTwentyEight", ssaop.OpConst64, c.config.Types.Int64, 128, nil), | |
| Valu("y", ssaop.OpOr64, c.config.Types.Int64, 0, nil, "y", "oneHundredTwentyEight"), | |
| Valu("rsh", ssaop.OpRsh64x64, c.config.Types.Int64, 0, nil, "xWithSignBitSet", "y"), | |
| Valu("one", ssaop.OpConst64, c.config.Types.Int64, 1, nil), | |
| Valu("and", ssaop.OpAnd64, c.config.Types.Int64, 0, nil, "rsh", "one"), | |
| Valu("mem", ssaop.OpStore, types.TypeMem, 0, nil, "ptr", "and", "mem"), | |
| Exit("mem"))) | |
| CheckFunc(f.f) | |
| ssa.KnownBits(f.f) | |
| CheckFunc(f.f) | |
| if len(f.f.Blocks) != 1 { | |
| t.Fatalf("expected 1 block, got %d", len(f.f.Blocks)) | |
| } | |
| var store *ssa.Value | |
| for _, v := range f.f.Blocks[0].Values { | |
| if v.Op == ssaop.OpStore { | |
| if store != nil { | |
| t.Fatalf("expected 1 store (%v), got a second one %v", store, v) | |
| } | |
| store = v | |
| } | |
| } | |
| if store == nil { | |
| t.Fatalf("expected 1 store, got none") | |
| } | |
| consT := store.Args[1] | |
| for ; consT.Op == ssaop.OpCopy; consT = consT.Args[0] { | |
| } | |
| if consT.Op != ssaop.OpConst64 || consT.AuxInt != 1 { | |
| t.Fatalf("expected store to have constant 1, got %v", consT.LongString()) | |
| } | |
| } |