From: Russ Cox Date: Sun, 11 Apr 2010 22:24:44 +0000 (-0700) Subject: gc: compile s == "" as len(s) == 0 X-Git-Tag: weekly.2010-04-13~15 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c9293f0cc7e049b3edb8a199983ac4d95ce249b2;p=gostls13.git gc: compile s == "" as len(s) == 0 R=ken2 CC=golang-dev https://golang.org/cl/840043 --- diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index ced798e6ba..34ac32436b 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1053,6 +1053,30 @@ walkexpr(Node **np, NodeList **init) goto ret; case OCMPSTR: + // If one argument to the comparison is an empty string, + // comparing the lengths instead will yield the same result + // without the function call. + if((isconst(n->left, CTSTR) && n->left->val.u.sval->len == 0) || + (isconst(n->right, CTSTR) && n->right->val.u.sval->len == 0)) { + r = nod(n->etype, nod(OLEN, n->left, N), nod(OLEN, n->right, N)); + typecheck(&r, Erv); + walkexpr(&r, init); + n = r; + goto ret; + } + + // s + "badgerbadgerbadger" == "badgerbadgerbadger" + if((n->etype == OEQ || n->etype == ONE) && + isconst(n->right, CTSTR) && + n->left->op == OADDSTR && isconst(n->left->right, CTSTR) && + cmpslit(n->right, n->left->right) == 0) { + r = nod(n->etype, nod(OLEN, n->left->left, N), nodintconst(0)); + typecheck(&r, Erv); + walkexpr(&r, init); + n = r; + goto ret; + } + // sys_cmpstring(s1, s2) :: 0 r = mkcall("cmpstring", types[TINT], init, conv(n->left, types[TSTRING]),