diff options
| author | 2025-11-06 09:19:00 +0100 | |
|---|---|---|
| committer | 2025-11-06 09:26:46 +0100 | |
| commit | a292164e0a590d5ddcab97b07c490983ba5eeaac (patch) | |
| tree | bc23be85274ed56c551a89bd17a08c6e063bbe4d | |
| parent | 140b7e6e0a8113d5c51e4df03f78fe248b9d3786 (diff) | |
c: do fold conditional exprs
| -rw-r--r-- | c/c.c | 17 |
1 files changed, 16 insertions, 1 deletions
@@ -3376,6 +3376,14 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) return narrow(fn, cls, ex->ty, r, 0); return r; case ECOND: + if (eval(&ex->sub[0], EVFOLD)) { + bool k = isflt(ex->sub[0].ty) ? ex->sub[0].f != 0.0 : ex->sub[0].u != 0; + assert(ex->sub[0].t == ENUMLIT); + r = compileexpr(fn, &ex->sub[2-k], discard); + if (discard) return NOREF; + return cvt(fn, ex->ty, ex->sub[2-k].ty, r); + } + if (ex->ty.t == TYVOID || discard) { struct block *tr, *fl, *end; condjump(fn, &sub[0], tr = newblk(fn), fl = newblk(fn)); @@ -3389,9 +3397,16 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) useblk(fn, end); return NOREF; } - /* fallthru */ + return condexprvalue(fn, ex, discard); case ELOGAND: case ELOGIOR: + if (eval(&ex->sub[0], EVFOLD)) { + bool k = isflt(ex->sub[0].ty) ? ex->sub[0].f != 0.0 : ex->sub[0].u != 0; + assert(ex->sub[0].t == ENUMLIT); + r = compileexpr(fn, &ex->sub[k], discard); + if (discard) return NOREF; + return cvt(fn, mktype(TYBOOL), ex->sub[k].ty, r); + } return condexprvalue(fn, ex, discard); case ESEQ: expreffects(fn, &sub[0]); |