From 4a9fe5d07d042168046e97b3de8b546f9bef6c76 Mon Sep 17 00:00:00 2001 From: sergei Date: Fri, 21 Jun 2013 15:26:14 +0000 Subject: [PATCH] * Fixed register live range in for-loops: o Loop counter node is "left", not "right", o End-value register needs explicit sync. Without these changes, allocating registers in hlcg.a_cmp_reg_loc_label (at the end of loop) could reuse counter or end-value register, resulting in invalid code. git-svn-id: trunk@24924 - --- compiler/ncgflw.pas | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/ncgflw.pas b/compiler/ncgflw.pas index 12743da260..51e1ea1260 100644 --- a/compiler/ncgflw.pas +++ b/compiler/ncgflw.pas @@ -401,7 +401,7 @@ implementation { variable. The start value also doesn't matter. } { loop var } - get_used_regvars(right,usedregvars); + get_used_regvars(left,usedregvars); { loop body } get_used_regvars(t2,usedregvars); { end value (t1) is not necessary (it cannot be a regvar, } @@ -818,6 +818,8 @@ implementation hlcg.a_label(current_asmdata.CurrAsmList,current_procinfo.CurrBreakLabel); sync_regvars(false); + if temptovalue then + hlcg.a_reg_sync(current_asmdata.CurrAsmList,t1.location.register); current_procinfo.CurrContinueLabel:=oldclabel; current_procinfo.CurrBreakLabel:=oldblabel;