produce a warning if a mask produced by complementing a 32-bit value is subsequently zero-extended to 64-bits, which is unlikely to do what was intended. Reference: /n/sources/patch/applied/6c-checkmask Date: Thu Feb 28 18:53:26 CET 2013 Signed-off-by: charles.forsyth@gmail.com --- /sys/src/cmd/6c/cgen.c Thu Feb 28 18:52:20 2013 +++ /sys/src/cmd/6c/cgen.c Thu Feb 28 18:52:13 2013 @@ -2,6 +2,7 @@ /* ,x/^(print|prtree)\(/i/\/\/ */ int castup(Type*, Type*); +void checkmask(Node*, Node*); void cgen(Node *n, Node *nn) @@ -257,6 +258,8 @@ break; } } + if(n->op == OAND) + checkmask(n, r); if(r->addable >= INDEXED && !hardconst(r)) { regalloc(&nod, l, nn); cgen(l, &nod); @@ -521,6 +524,8 @@ goto asbitop; if(typefd[l->type->etype] || typefd[r->type->etype]) goto asfop; + if(o == OASAND) + checkmask(n, r); if(l->complex >= r->complex) { if(hardleft) reglcgen(&nod, l, Z); @@ -1861,6 +1866,22 @@ return ft == TULONG || ft == TUINT || ft == TUSHORT; } return 0; +} + +/* + * vl &= ~ul or vl & ~ul + * create a ul mask with top bits zero, which is usually wrong + */ +void +checkmask(Node *n, Node *r) +{ + Node *rl; + + if((n->op == OAND || n->op == OASAND) && + r->op == OCAST && + (rl = r->left)->op == OCOM && + typesuv[n->type->etype] && typeu[rl->type->etype] && typechl[rl->type->etype]) + warn(n, "32-bit mask zero-extended to 64 bits"); } void