&& isSameCall(callAux, "runtime.memequal")
=> (MakeResult (ConstBool <typ.Bool> [true]) mem)
+(Static(Call|LECall) {callAux} p q _ mem)
+ && isSameCall(callAux, "runtime.memequal")
+ && isSamePtr(p, q)
+ => (MakeResult (ConstBool <typ.Bool> [true]) mem)
+
// Turn known-size calls to memclrNoHeapPointers into a Zero.
// Note that we are using types.Types[types.TUINT8] instead of sptr.Type.Elem() - see issue 55122 and CL 431496 for more details.
(SelectN [0] call:(StaticCall {sym} sptr (Const(64|32) [c]) mem))
return rewriteValuegeneric_OpSlicemask(v)
case OpSqrt:
return rewriteValuegeneric_OpSqrt(v)
+ case OpStaticCall:
+ return rewriteValuegeneric_OpStaticCall(v)
case OpStaticLECall:
return rewriteValuegeneric_OpStaticLECall(v)
case OpStore:
}
return false
}
+func rewriteValuegeneric_OpStaticCall(v *Value) bool {
+ b := v.Block
+ typ := &b.Func.Config.Types
+ // match: (StaticCall {callAux} p q _ mem)
+ // cond: isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)
+ // result: (MakeResult (ConstBool <typ.Bool> [true]) mem)
+ for {
+ if len(v.Args) != 4 {
+ break
+ }
+ callAux := auxToCall(v.Aux)
+ mem := v.Args[3]
+ p := v.Args[0]
+ q := v.Args[1]
+ if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
+ break
+ }
+ v.reset(OpMakeResult)
+ v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
+ v0.AuxInt = boolToAuxInt(true)
+ v.AddArg2(v0, mem)
+ return true
+ }
+ return false
+}
func rewriteValuegeneric_OpStaticLECall(v *Value) bool {
b := v.Block
config := b.Func.Config
v.AddArg2(v0, mem)
return true
}
+ // match: (StaticLECall {callAux} p q _ mem)
+ // cond: isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)
+ // result: (MakeResult (ConstBool <typ.Bool> [true]) mem)
+ for {
+ if len(v.Args) != 4 {
+ break
+ }
+ callAux := auxToCall(v.Aux)
+ mem := v.Args[3]
+ p := v.Args[0]
+ q := v.Args[1]
+ if !(isSameCall(callAux, "runtime.memequal") && isSamePtr(p, q)) {
+ break
+ }
+ v.reset(OpMakeResult)
+ v0 := b.NewValue0(v.Pos, OpConstBool, typ.Bool)
+ v0.AuxInt = boolToAuxInt(true)
+ v.AddArg2(v0, mem)
+ return true
+ }
// match: (StaticLECall {callAux} _ (Const64 [0]) (Const64 [0]) mem)
// cond: isSameCall(callAux, "runtime.makeslice")
// result: (MakeResult (Addr <v.Type.FieldType(0)> {ir.Syms.Zerobase} (SB)) mem)
bsink = []byte("0123456789ab")
}
+// self-equality is always true. See issue 60777.
+func EqualSelf(s string) bool {
+ // amd64:`MOVL\t\$1, AX`,-`.*memequal.*`
+ return s == s
+}
+func NotEqualSelf(s string) bool {
+ // amd64:`XORL\tAX, AX`,-`.*memequal.*`
+ return s != s
+}
+
var bsink []byte