Commit 864fcf61 by Cherry Zhang Committed by Ian Lance Taylor

compiler: avoid copy for string([]byte) conversion used in string concatenation

    
    If a string([]byte) conversion is used immediately in a string
    concatenation, we don't need to copy the backing store of the
    byte slice, as the runtime function doesn't hold any reference
    to it.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/182437

	* go.dg/concatstring.go: New test.

From-SVN: r272460
parent ed920373
b1ae35965cadac235d7d218e689944286cccdd90 62d1b667f3e85f72a186b04aad36d701160a4611
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -7408,6 +7408,26 @@ String_concat_expression::do_flatten(Gogo*, Named_object*, ...@@ -7408,6 +7408,26 @@ String_concat_expression::do_flatten(Gogo*, Named_object*,
return this; return this;
Location loc = this->location(); Location loc = this->location();
Type* type = this->type(); Type* type = this->type();
// Mark string([]byte) operands to reuse the backing store.
// runtime.concatstrings does not keep the reference.
//
// Note: in the gc runtime, if all but one inputs are empty,
// concatstrings returns the only nonempty input without copy.
// So it is not safe to reuse the backing store if it is a
// string([]byte) conversion. So the gc compiler does the
// no-copy optimization only when there is at least one
// constant nonempty input. Currently the gccgo runtime
// doesn't do this, so we don't do the check.
for (Expression_list::iterator p = this->exprs_->begin();
p != this->exprs_->end();
++p)
{
Type_conversion_expression* tce = (*p)->conversion_expression();
if (tce != NULL)
tce->set_no_copy(true);
}
Expression* nil_arg = Expression::make_nil(loc); Expression* nil_arg = Expression::make_nil(loc);
Expression* call; Expression* call;
switch (this->exprs_->size()) switch (this->exprs_->size())
......
2019-06-18 Cherry Zhang <cherryyz@google.com>
* go.dg/concatstring.go: New test.
2019-06-18 Thomas Schwinge <thomas@codesourcery.com> 2019-06-18 Thomas Schwinge <thomas@codesourcery.com>
PR fortran/90921 PR fortran/90921
......
// { dg-do compile }
// { dg-options "-fgo-debug-optimization" }
package p
func F(b []byte, x string) string {
return "hello " + string(b) + x // { dg-error "no copy string\\(\\\[\\\]byte\\)" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment