This Go patch by Cherry Zhang changes the Go frontend to call builtin memcmp directly, instead of going through a C function __go_memcmp. This allows more optimizations in the compiler backend. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 272608) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -1232eef628227ef855c5fa6d94b31778b2e74a85 +338e4baf88a4ae676205dff601dbef2d31b19d2d The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/expressions.cc =================================================================== --- gcc/go/gofrontend/expressions.cc (revision 272608) +++ gcc/go/gofrontend/expressions.cc (working copy) @@ -6199,7 +6199,8 @@ Binary_expression::lower_compare_to_memc TYPE_INFO_SIZE); Expression* call = Runtime::make_call(Runtime::MEMCMP, loc, 3, a1, a2, len); - Expression* zero = Expression::make_integer_ul(0, NULL, loc); + Type* int32_type = Type::lookup_integer_type("int32"); + Expression* zero = Expression::make_integer_ul(0, int32_type, loc); return Expression::make_binary(this->op_, call, zero, loc); } Index: gcc/go/gofrontend/runtime.def =================================================================== --- gcc/go/gofrontend/runtime.def (revision 272608) +++ gcc/go/gofrontend/runtime.def (working copy) @@ -29,7 +29,7 @@ // result types. // The standard C memcmp function, used for struct comparisons. -DEF_GO_RUNTIME(MEMCMP, "__go_memcmp", P3(POINTER, POINTER, UINTPTR), R1(INT)) +DEF_GO_RUNTIME(MEMCMP, "__builtin_memcmp", P3(POINTER, POINTER, UINTPTR), R1(INT32)) // Decode a non-ASCII rune from a string. DEF_GO_RUNTIME(DECODERUNE, "runtime.decoderune", P2(STRING, INT), Index: libgo/Makefile.am =================================================================== --- libgo/Makefile.am (revision 272608) +++ libgo/Makefile.am (working copy) @@ -459,7 +459,6 @@ runtime_files = \ runtime/go-fieldtrack.c \ runtime/go-matherr.c \ runtime/go-memclr.c \ - runtime/go-memcmp.c \ runtime/go-memequal.c \ runtime/go-nanotime.c \ runtime/go-now.c \ Index: libgo/Makefile.in =================================================================== --- libgo/Makefile.in (revision 272608) +++ libgo/Makefile.in (working copy) @@ -244,8 +244,8 @@ am__objects_3 = runtime/aeshash.lo runti runtime/go-cgo.lo runtime/go-construct-map.lo \ runtime/go-ffi.lo runtime/go-fieldtrack.lo \ runtime/go-matherr.lo runtime/go-memclr.lo \ - runtime/go-memcmp.lo runtime/go-memequal.lo \ - runtime/go-nanotime.lo runtime/go-now.lo runtime/go-nosys.lo \ + runtime/go-memequal.lo runtime/go-nanotime.lo \ + runtime/go-now.lo runtime/go-nosys.lo \ runtime/go-reflect-call.lo runtime/go-runtime-error.lo \ runtime/go-setenv.lo runtime/go-signal.lo \ runtime/go-unsafe-pointer.lo runtime/go-unsetenv.lo \ @@ -892,7 +892,6 @@ runtime_files = \ runtime/go-fieldtrack.c \ runtime/go-matherr.c \ runtime/go-memclr.c \ - runtime/go-memcmp.c \ runtime/go-memequal.c \ runtime/go-nanotime.c \ runtime/go-now.c \ @@ -1343,8 +1342,6 @@ runtime/go-matherr.lo: runtime/$(am__dir runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-memclr.lo: runtime/$(am__dirstamp) \ runtime/$(DEPDIR)/$(am__dirstamp) -runtime/go-memcmp.lo: runtime/$(am__dirstamp) \ - runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-memequal.lo: runtime/$(am__dirstamp) \ runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-nanotime.lo: runtime/$(am__dirstamp) \ @@ -1436,7 +1433,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-fieldtrack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-matherr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memclr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memcmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memequal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-nanotime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-nosys.Plo@am__quote@ Index: libgo/runtime/go-memcmp.c =================================================================== --- libgo/runtime/go-memcmp.c (revision 272608) +++ libgo/runtime/go-memcmp.c (nonexistent) @@ -1,13 +0,0 @@ -/* go-memcmp.c -- the go memory comparison function. - - Copyright 2012 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. */ - -#include "runtime.h" - -intgo -__go_memcmp (const void *p1, const void *p2, uintptr len) -{ - return __builtin_memcmp (p1, p2, len); -}