ref: c798301cfa0f19e9d044f2afd0886afd6ac2a298
parent: 8510d8a1f452aed36421c7562aa9c7caa5575a03
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 08:21:14 EDT 2012
Reduce sizes on slices and arrays
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -333,6 +333,16 @@
return mkexpr(n->line, Oadd, u, v, NULL);
}
+static Node *slicelen(Simp *s, Node *sl)
+{
+ Node *base, *memb, *load;
+
+ base = mkexpr(sl->line, Oaddr, sl, NULL);
+ memb = mkexpr(sl->line, Oadd, base, ptrsz, NULL);
+ load = mkexpr(sl->line, Oload, memb, NULL);
+ return load;
+}
+
Node *lval(Simp *s, Node *n)
{
Node *r;
@@ -339,8 +349,8 @@
switch (exprop(n)) {
case Ovar: r = n; break;
- case Omemb: r = membaddr(s, n); break;
case Oidx: r = idxaddr(s, n); break;
+ case Omemb: r = membaddr(s, n); break;
default:
die("%s cannot be an lval", opstr(exprop(n)));
break;
@@ -428,8 +438,16 @@
r = mkexpr(n->line, Oload, t, NULL);
break;
case Omemb:
- t = membaddr(s, n);
- r = mkexpr(n->line, Oload, t, NULL);
+ if (exprtype(args[0])->type == Tyslice) {
+ assert(!strcmp(namestr(args[1]), "len"));
+ r = slicelen(s, args[0]);
+ } else if (exprtype(args[0])->type == Tyarray) {
+ assert(!strcmp(namestr(args[1]), "len"));
+ r = exprtype(n)->asize;
+ } else {
+ t = membaddr(s, n);
+ r = mkexpr(n->line, Oload, t, NULL);
+ }
break;
/* fused ops: