mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: clean up some unused code in prove pass
Change-Id: Ib695064c5a77a3f86d1d2a74f96823e65199b8e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/603956 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
2f3fee058f
commit
b538e953ee
2 changed files with 56 additions and 81 deletions
|
|
@ -113,20 +113,6 @@ func (d domain) String() string {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
type pair struct {
|
|
||||||
// a pair of values, ordered by ID.
|
|
||||||
// v can be nil, to mean the zero value.
|
|
||||||
// for booleans the zero value (v == nil) is false.
|
|
||||||
v, w *Value
|
|
||||||
d domain
|
|
||||||
}
|
|
||||||
|
|
||||||
// fact is a pair plus a relation for that pair.
|
|
||||||
type fact struct {
|
|
||||||
p pair
|
|
||||||
r relation
|
|
||||||
}
|
|
||||||
|
|
||||||
// a limit records known upper and lower bounds for a value.
|
// a limit records known upper and lower bounds for a value.
|
||||||
//
|
//
|
||||||
// If we have min>max or umin>umax, then this limit is
|
// If we have min>max or umin>umax, then this limit is
|
||||||
|
|
@ -418,9 +404,8 @@ type factsTable struct {
|
||||||
caps map[ID]*Value
|
caps map[ID]*Value
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkpointFact is an invalid value used for checkpointing
|
// checkpointBound is an invalid value used for checkpointing
|
||||||
// and restoring factsTable.
|
// and restoring factsTable.
|
||||||
var checkpointFact = fact{}
|
|
||||||
var checkpointBound = limitFact{}
|
var checkpointBound = limitFact{}
|
||||||
|
|
||||||
func newFactsTable(f *Func) *factsTable {
|
func newFactsTable(f *Func) *factsTable {
|
||||||
|
|
@ -1162,17 +1147,6 @@ func (ft *factsTable) restore() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func lessByID(v, w *Value) bool {
|
|
||||||
if v == nil && w == nil {
|
|
||||||
// Should not happen, but just in case.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if v == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return w != nil && v.ID < w.ID
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
reverseBits = [...]relation{0, 4, 2, 6, 1, 5, 3, 7}
|
reverseBits = [...]relation{0, 4, 2, 6, 1, 5, 3, 7}
|
||||||
|
|
||||||
|
|
@ -2184,60 +2158,6 @@ func removeBranch(b *Block, branch branch) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// isNonNegative reports whether v is known to be greater or equal to zero.
|
|
||||||
// TODO: no longer used by the prove pass; move elsewhere.
|
|
||||||
func isNonNegative(v *Value) bool {
|
|
||||||
if !v.Type.IsInteger() {
|
|
||||||
v.Fatalf("isNonNegative bad type: %v", v.Type)
|
|
||||||
}
|
|
||||||
// TODO: return true if !v.Type.IsSigned()
|
|
||||||
// SSA isn't type-safe enough to do that now (issue 37753).
|
|
||||||
// The checks below depend only on the pattern of bits.
|
|
||||||
|
|
||||||
switch v.Op {
|
|
||||||
case OpConst64:
|
|
||||||
return v.AuxInt >= 0
|
|
||||||
|
|
||||||
case OpConst32:
|
|
||||||
return int32(v.AuxInt) >= 0
|
|
||||||
|
|
||||||
case OpConst16:
|
|
||||||
return int16(v.AuxInt) >= 0
|
|
||||||
|
|
||||||
case OpConst8:
|
|
||||||
return int8(v.AuxInt) >= 0
|
|
||||||
|
|
||||||
case OpStringLen, OpSliceLen, OpSliceCap,
|
|
||||||
OpZeroExt8to64, OpZeroExt16to64, OpZeroExt32to64,
|
|
||||||
OpZeroExt8to32, OpZeroExt16to32, OpZeroExt8to16,
|
|
||||||
OpCtz64, OpCtz32, OpCtz16, OpCtz8,
|
|
||||||
OpCtz64NonZero, OpCtz32NonZero, OpCtz16NonZero, OpCtz8NonZero,
|
|
||||||
OpBitLen64, OpBitLen32, OpBitLen16, OpBitLen8:
|
|
||||||
return true
|
|
||||||
|
|
||||||
case OpRsh64Ux64, OpRsh32Ux64:
|
|
||||||
by := v.Args[1]
|
|
||||||
return by.Op == OpConst64 && by.AuxInt > 0
|
|
||||||
|
|
||||||
case OpRsh64x64, OpRsh32x64, OpRsh8x64, OpRsh16x64, OpRsh32x32, OpRsh64x32,
|
|
||||||
OpSignExt32to64, OpSignExt16to64, OpSignExt8to64, OpSignExt16to32, OpSignExt8to32:
|
|
||||||
return isNonNegative(v.Args[0])
|
|
||||||
|
|
||||||
case OpAnd64, OpAnd32, OpAnd16, OpAnd8:
|
|
||||||
return isNonNegative(v.Args[0]) || isNonNegative(v.Args[1])
|
|
||||||
|
|
||||||
case OpMod64, OpMod32, OpMod16, OpMod8,
|
|
||||||
OpDiv64, OpDiv32, OpDiv16, OpDiv8,
|
|
||||||
OpOr64, OpOr32, OpOr16, OpOr8,
|
|
||||||
OpXor64, OpXor32, OpXor16, OpXor8:
|
|
||||||
return isNonNegative(v.Args[0]) && isNonNegative(v.Args[1])
|
|
||||||
|
|
||||||
// We could handle OpPhi here, but the improvements from doing
|
|
||||||
// so are very minor, and it is neither simple nor cheap.
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// isConstDelta returns non-nil if v is equivalent to w+delta (signed).
|
// isConstDelta returns non-nil if v is equivalent to w+delta (signed).
|
||||||
func isConstDelta(v *Value) (w *Value, delta int64) {
|
func isConstDelta(v *Value) (w *Value, delta int64) {
|
||||||
cop := OpConst64
|
cop := OpConst64
|
||||||
|
|
|
||||||
|
|
@ -2340,3 +2340,58 @@ func setPos(v *Value, pos src.XPos) bool {
|
||||||
v.Pos = pos
|
v.Pos = pos
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isNonNegative reports whether v is known to be greater or equal to zero.
|
||||||
|
// Note that this is pretty simplistic. The prove pass generates more detailed
|
||||||
|
// nonnegative information about values.
|
||||||
|
func isNonNegative(v *Value) bool {
|
||||||
|
if !v.Type.IsInteger() {
|
||||||
|
v.Fatalf("isNonNegative bad type: %v", v.Type)
|
||||||
|
}
|
||||||
|
// TODO: return true if !v.Type.IsSigned()
|
||||||
|
// SSA isn't type-safe enough to do that now (issue 37753).
|
||||||
|
// The checks below depend only on the pattern of bits.
|
||||||
|
|
||||||
|
switch v.Op {
|
||||||
|
case OpConst64:
|
||||||
|
return v.AuxInt >= 0
|
||||||
|
|
||||||
|
case OpConst32:
|
||||||
|
return int32(v.AuxInt) >= 0
|
||||||
|
|
||||||
|
case OpConst16:
|
||||||
|
return int16(v.AuxInt) >= 0
|
||||||
|
|
||||||
|
case OpConst8:
|
||||||
|
return int8(v.AuxInt) >= 0
|
||||||
|
|
||||||
|
case OpStringLen, OpSliceLen, OpSliceCap,
|
||||||
|
OpZeroExt8to64, OpZeroExt16to64, OpZeroExt32to64,
|
||||||
|
OpZeroExt8to32, OpZeroExt16to32, OpZeroExt8to16,
|
||||||
|
OpCtz64, OpCtz32, OpCtz16, OpCtz8,
|
||||||
|
OpCtz64NonZero, OpCtz32NonZero, OpCtz16NonZero, OpCtz8NonZero,
|
||||||
|
OpBitLen64, OpBitLen32, OpBitLen16, OpBitLen8:
|
||||||
|
return true
|
||||||
|
|
||||||
|
case OpRsh64Ux64, OpRsh32Ux64:
|
||||||
|
by := v.Args[1]
|
||||||
|
return by.Op == OpConst64 && by.AuxInt > 0
|
||||||
|
|
||||||
|
case OpRsh64x64, OpRsh32x64, OpRsh8x64, OpRsh16x64, OpRsh32x32, OpRsh64x32,
|
||||||
|
OpSignExt32to64, OpSignExt16to64, OpSignExt8to64, OpSignExt16to32, OpSignExt8to32:
|
||||||
|
return isNonNegative(v.Args[0])
|
||||||
|
|
||||||
|
case OpAnd64, OpAnd32, OpAnd16, OpAnd8:
|
||||||
|
return isNonNegative(v.Args[0]) || isNonNegative(v.Args[1])
|
||||||
|
|
||||||
|
case OpMod64, OpMod32, OpMod16, OpMod8,
|
||||||
|
OpDiv64, OpDiv32, OpDiv16, OpDiv8,
|
||||||
|
OpOr64, OpOr32, OpOr16, OpOr8,
|
||||||
|
OpXor64, OpXor32, OpXor16, OpXor8:
|
||||||
|
return isNonNegative(v.Args[0]) && isNonNegative(v.Args[1])
|
||||||
|
|
||||||
|
// We could handle OpPhi here, but the improvements from doing
|
||||||
|
// so are very minor, and it is neither simple nor cheap.
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue