From fc7048a0c4c4b9647f032edfba74f7d7a62335e1 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 13 Dec 2025 17:04:33 +0100 Subject: c: case/default labels only create new blocks when necessary --- c/c.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/c/c.c b/c/c.c index 7e521b6..d79439a 100644 --- a/c/c.c +++ b/c/c.c @@ -3816,21 +3816,25 @@ stmt(struct comp *cm, struct function *fn) warn(&ex.span, "overflow converting case value to switch condition type"); } expect(cm, ':', NULL); - begin = newblk(fn); - EMITS putbranch(fn, begin); - useblk(fn, begin); + if (!fn->curblk || (fn->curblk->phi.n > 0 || fn->curblk->ins.n > 0)) { + begin = newblk(fn); + EMITS putbranch(fn, begin); + useblk(fn, begin); + } if (cm->switchstmt) vpush(&cm->switchstmt->cases, ((struct swcase) {ex.i, fn->curblk, ex.span})); } else if (tk.t == TKWdefault) { /* default ':' */ if (!cm->switchstmt) error(&tk.span, "'default' outside of switch statement"); expect(cm, ':', NULL); - begin = newblk(fn); - EMITS putbranch(fn, begin); - useblk(fn, begin); + if (!fn->curblk || (fn->curblk->phi.n > 0 || fn->curblk->ins.n > 0)) { + begin = newblk(fn); + EMITS putbranch(fn, begin); + useblk(fn, begin); + } if (cm->switchstmt) { if (cm->switchstmt->bdefault) error(&tk.span, "multiple 'default' labels in one switch"); - cm->switchstmt->bdefault = begin; + cm->switchstmt->bdefault = fn->curblk; } } else if (tk.t == TKIDENT && match(cm, NULL, ':')) { /*