Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 5cb3f41

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Make matchcontinue inputs volatile
This avoids problems with C-compilers making too many optimizations. Belonging to [master]: - #2131
1 parent 782245f commit 5cb3f41

1 file changed

Lines changed: 17 additions & 34 deletions

File tree

Compiler/Template/CodegenCFunctions.tpl

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4242,37 +4242,19 @@ template tempDeclZero(String ty, Text &varDecls)
42424242

42434243
end tempDeclZero;
42444244

4245-
template tempDeclMatchInput(String ty, String prefix, String startIndex, String index, Text &varDecls)
4245+
template tempDeclMatchInput(MatchType matchTy, String ty, String startIndex, String index, Text &varDecls)
42464246
"Declares a temporary variable in varDecls for variables in match input list and returns the name."
42474247
::=
4248-
let newVar
4249-
=
4250-
match ty /* TODO! FIXME! UGLY! UGLY! hack! */
4251-
case "modelica_metatype"
4252-
case "metamodelica_string"
4253-
case "metamodelica_string_const"
4254-
then 'tmpMeta[<%startIndex%>+<%index%>]'
4255-
else
4256-
let newVarIx = '<%prefix%>_in<%index%>'
4257-
let &varDecls += '<%ty%> <%newVarIx%>;<%\n%>'
4258-
newVarIx
4259-
newVar
4248+
// Note: We use volatile variables in matchcontinue to avoid problems with optimizing compilers
4249+
let ix = 'tmp<%startIndex%>_<%index%>'
4250+
let &varDecls += '<% match matchTy case MATCHCONTINUE(__) then 'volatile '%><%ty%> <%ix%>;'
4251+
ix
42604252
end tempDeclMatchInput;
42614253

4262-
template getTempDeclMatchInputName(list<Exp> inputs, String prefix, String startIndex, Integer index)
4254+
template getTempDeclMatchInputName(String startIndex, Integer index)
42634255
"Returns the name of the temporary variable from the match input list."
42644256
::=
4265-
let typ = '<%expTypeFromExpModelica(listGet(inputs, index))%>'
4266-
let newVar =
4267-
match typ /* TODO! FIXME! UGLY! UGLY! hack! */
4268-
case "modelica_metatype"
4269-
case "metamodelica_string"
4270-
case "metamodelica_string_const"
4271-
then 'tmpMeta[<%startIndex%>+<%intSub(index, 1)%>]'
4272-
else
4273-
let newVarIx = '<%prefix%>_in<%intSub(index, 1)%>'
4274-
newVarIx
4275-
newVar
4257+
'tmp<%startIndex%>_<%index%>'
42764258
end getTempDeclMatchInputName;
42774259

42784260
template tempDeclMatchOutput(String ty, String prefix, String startIndex, String index, Text &varDecls)
@@ -6684,22 +6666,22 @@ case exp as MATCHEXPRESSION(__) then
66846666
let &preExpInput = buffer ""
66856667
let &expInput = buffer ""
66866668
// get the current index of tmpMeta and reserve N=listLength(inputs) values in it!
6687-
let startIndexInputs = '<%System.tmpTickIndexReserve(1, listLength(inputs))%>'
6688-
let ignore3 = (List.threadTuple(inputs,aliases) |> (exp,alias) hasindex i0 =>
6689-
let typ = '<%expTypeFromExpModelica(exp)%>'
6690-
let decl = tempDeclMatchInput(typ, prefix, startIndexInputs, i0, &varDeclsInput)
6691-
let &expInput += '<%decl%> = <%daeExp(exp, context, &preExpInput, &varDeclsInput, &auxFunction)%>;<%\n%>'
6669+
let startIndexInputs = '<%System.tmpTickIndexReserve(0, 0)%>'
6670+
let ignore3 = (List.threadTuple(inputs,aliases) |> (e1,alias) hasindex i1 fromindex 1 =>
6671+
let typ = '<%expTypeFromExpModelica(e1)%>'
6672+
let decl = tempDeclMatchInput(exp.matchType, typ, startIndexInputs, i1, &varDeclsInput)
6673+
let &expInput += '<%decl%> = <%daeExp(e1, context, &preExpInput, &varDeclsInput, &auxFunction)%>;<%\n%>'
66926674
let &expInput += alias |> a => let &varDeclsInput += '<%typ%> _<%a%>;' '_<%a%> = <%decl%>;' ; separator="\n"
66936675
""; empty)
66946676
let ix = match exp.matchType
66956677
case MATCH(switch=SOME((switchIndex,ty as T_STRING(__),div))) then
6696-
let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6678+
let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
66976679
'stringHashDjb2Mod(<%matchInputVar%>,<%div%>)'
66986680
case MATCH(switch=SOME((switchIndex,ty as T_METATYPE(__),_))) then
6699-
let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6681+
let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
67006682
'valueConstructor(<%matchInputVar%>)'
67016683
case MATCH(switch=SOME((switchIndex,ty as T_INTEGER(__),_))) then
6702-
let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6684+
let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
67036685
'<%matchInputVar%>'
67046686
case MATCH(switch=SOME(_)) then
67056687
error(sourceInfo(), 'Unknown switch: <%ExpressionDumpTpl.dumpExp(exp,"\"")%>')
@@ -6823,7 +6805,8 @@ template daeExpMatchCases(list<MatchCase> cases, list<Exp> tupleAssignExps, DAE.
68236805
let &assignments = buffer ""
68246806
let &preRes = buffer ""
68256807
let &varFrees = buffer ""
6826-
let patternMatching = (sortPatternsByComplexity(c.patterns) |> (lhs,i0) => patternMatch(lhs,'<%getTempDeclMatchInputName(inputs, prefix, startIndexInputs, i0)%>', onPatternFail, &varDeclsCaseInner, &assignments); empty)
6808+
let patternMatching = (sortPatternsByComplexity(c.patterns) |> (lhs,i0)
6809+
=> patternMatch(lhs,'<%getTempDeclMatchInputName(startIndexInputs, i0)%>', onPatternFail, &varDeclsCaseInner, &assignments); empty)
68276810
let() = System.tmpTickSetIndex(startTmpTickIndex,1)
68286811
let stmts = (c.body |> stmt => algStatement(stmt, context, &varDeclsCaseInner, &auxFunction); separator="\n")
68296812
let &preGuardCheck = buffer ""

0 commit comments

Comments
 (0)