From a747dfc8c574ce97e66459394b9315d1129932e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Thu, 28 Jun 2012 20:14:50 +0200 Subject: [PATCH] Compiler: Fix too aggressive optimization of empty foreach. --- src/treeopt.in | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/treeopt.in b/src/treeopt.in index 58836ae9f4..cebe145de0 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1063,8 +1063,21 @@ F_DO(-, 0 = +[node_is_true($$)]): // No body -- No reason to loop... -F_FOREACH(F_VAL_LVAL(0, *), -): - F_POP_VALUE($0, -); +F_FOREACH(F_VAL_LVAL(0 = +[!($$->node_info & (OPT_SIDE_EFFECT|OPT_ASSIGNMENT))], + 1 = +[($$->token != ':')]), -): +{ + // Note: We still need to set the loop variable as if the last + // turn of the loop has executed, in case it is used later. + $$ = mknode(F_POP_VALUE, + mknode('?', + mkefuncallnode("sizeof", $0), + mknode(':', + mknode(F_ASSIGN, + mknode(F_INDEX, $0, mkintnode(-1)), $1), + NULL)), + 0); +} +; F_LOOP(0, -): F_POP_VALUE($0, -); -- GitLab