From: Donn Seeley Date: Fri, 11 Dec 1987 14:56:06 +0000 (-0800) Subject: utah rcsid 1.14 87/05/03 21:29:03: Add code from VAX compiler for detecting X-Git-Tag: BSD-4_3_Net_1-Snapshot-Development~3085 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/b45bedd3b0511005e1d9ea9116ca006e3e87a2f4 utah rcsid 1.14 87/05/03 21:29:03: Add code from VAX compiler for detecting ridiculous comparisons between small variables and large constants. SCCS-vsn: old/pcc/ccom.tahoe/local2.c 1.23 --- diff --git a/usr/src/old/pcc/ccom.tahoe/local2.c b/usr/src/old/pcc/ccom.tahoe/local2.c index 382b2b08b8..3474fb74b4 100644 --- a/usr/src/old/pcc/ccom.tahoe/local2.c +++ b/usr/src/old/pcc/ccom.tahoe/local2.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)local2.c 1.22 (Berkeley) %G%"; +static char sccsid[] = "@(#)local2.c 1.23 (Berkeley) %G%"; #endif # include "pass2.h" @@ -1297,6 +1297,7 @@ optim2( p ) register NODE *p; { # define nncon(p) ((p)->in.op == ICON && (p)->in.name[0] == 0) register int o, i; register NODE *l, *r; + int lower, upper, result; switch (o = p->in.op) { @@ -1386,6 +1387,95 @@ optim2( p ) register NODE *p; { } } return; + + case ULE: + case ULT: + case UGE: + case UGT: + o -= (UGE-GE); + case EQ: + case NE: + case LE: + case LT: + case GE: + case GT: + /* + * Optimize comparisons against constants which are + * out of the range of a variable's precision. + * This saves some labor out in the code table + * handling ridiculous comparisons... + */ + r = p->in.right; + l = p->in.left; + if (r->in.op != ICON || + r->tn.name[0] != '\0' || + tlen(l) >= tlen(r)) + return; + switch (l->in.type) { + case CHAR: + lower = -(1 << SZCHAR - 1); + upper = (1 << SZCHAR - 1) - 1; + break; + case UCHAR: + lower = 0; + upper = (1 << SZCHAR) - 1; + break; + case SHORT: + lower = -(1 << SZSHORT - 1); + upper = (1 << SZSHORT - 1) - 1; + break; + case USHORT: + lower = 0; + upper = (1 << SZSHORT) - 1; + break; + default: + cerror("unsupported OPLOG in optim2"); + } + result = -1; + i = r->tn.lval; + switch (o) { + case EQ: + case NE: + if (lower == 0 && (unsigned) i > upper) + result = o == NE; + else if (i < lower || i > upper) + result = o == NE; + break; + case LT: + case GE: + if (lower == 0 && (unsigned) i > upper) + result = o == LT; + else if (i <= lower) + result = o != LT; + else if (i > upper) + result = o == LT; + break; + case LE: + case GT: + if (lower == 0 && (unsigned) i >= upper) + result = o == LE; + else if (i < lower) + result = o != LE; + else if (i >= upper) + result = o == LE; + break; + } + if (result == -1) + return; + + if (tshape(l, SAREG|SNAME|SCON|SOREG|STARNM)) { + l->in.op = FREE; + ncopy(p, r); + r->in.op = FREE; + p->tn.type = INT; + p->tn.lval = result; + } else { + p->in.op = COMOP; + p->in.type = INT; + r->tn.type = INT; + r->tn.lval = result; + } + return; } # endif }