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

Commit f37e029

Browse files
vwaurichOpenModelica-Hudson
authored andcommitted
extend cse3 to find state alias
Belonging to [master]: - #2075 - OpenModelica/OpenModelica-testsuite#804
1 parent b528b72 commit f37e029

File tree

1 file changed

+83
-73
lines changed

1 file changed

+83
-73
lines changed

Compiler/BackEnd/CommonSubExpression.mo

Lines changed: 83 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,49 +2059,52 @@ protected
20592059
list<Integer> partition, varIdcs, adjEqs, pathVarIdcs;
20602060
list<CommonSubExp> cses;
20612061
algorithm
2062-
// getall vars with only 2 adjacent equations
2063-
numVars := BackendVariable.varsSize(allVars);
2064-
(_, pathVarIdcs) := List.filter1OnTrueSync(List.map(arrayList(mTIn), listLength), intEq, 2, List.intRange(numVars));
2065-
pathVars := BackendVariable.listVar1(List.map1(pathVarIdcs, BackendVariable.getVarAtIndexFirst, allVars));
2066-
pathVarIdxMap := listArray(List.map1(pathVarIdcs,Array.getIndexFirst,varMap));
2067-
cses := cseIn;
2068-
eqLst_all := BackendEquation.equationList(allEqs);
2069-
2070-
if BackendVariable.varsSize(pathVars) > 0 then
2071-
for partition in allPartitions loop
2072-
//print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2073-
//print("pathVarIdxMap "+stringDelimitList(List.map(List.map1(pathVarIdcs,Array.getIndexFirst,varMap), intString), ", ")+"\n");
2062+
try
2063+
// getall vars with only 2 adjacent equations
2064+
numVars := BackendVariable.varsSize(allVars);
2065+
(_, pathVarIdcs) := List.filter1OnTrueSync(List.map(arrayList(mTIn), listLength), intEq, 2, List.intRange(numVars));
2066+
pathVars := BackendVariable.listVar1(List.map1(pathVarIdcs, BackendVariable.getVarAtIndexFirst, allVars));
2067+
pathVarIdxMap := listArray(List.map1(pathVarIdcs,Array.getIndexFirst,varMap));
2068+
cses := cseIn;
2069+
eqLst_all := BackendEquation.equationList(allEqs);
2070+
if BackendVariable.varsSize(pathVars) > 0 then
2071+
for partition in allPartitions loop
2072+
//print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2073+
//print("pathVarIdxMap "+stringDelimitList(List.map(List.map1(pathVarIdcs,Array.getIndexFirst,varMap), intString), ", ")+"\n");
20742074

2075-
//get only the partition equations
2076-
eqLst := List.map1(partition,List.getIndexFirst,eqLst_all);
2077-
eqs := BackendEquation.listEquation(eqLst);
2075+
//get only the partition equations
2076+
eqLst := List.map1(partition,List.getIndexFirst,eqLst_all);
2077+
eqs := BackendEquation.listEquation(eqLst);
20782078

2079-
eqSys := BackendDAEUtil.createEqSystem(pathVars, eqs);
2080-
(_, m, mT) := BackendDAEUtil.getIncidenceMatrix(eqSys, BackendDAE.SOLVABLE(), NONE());
2079+
eqSys := BackendDAEUtil.createEqSystem(pathVars, eqs);
2080+
(_, m, mT) := BackendDAEUtil.getIncidenceMatrix(eqSys, BackendDAE.SOLVABLE(), NONE());
20812081

2082-
//BackendDump.dumpIncidenceMatrix(m);
2083-
//BackendDump.dumpIncidenceMatrixT(mT);
2084-
//varAtts := List.threadMap(List.fill(false, arrayLength(mT)), List.fill("", arrayLength(mT)), Util.makeTuple);
2085-
//eqAtts := List.threadMap(List.fill(false, arrayLength(m)), List.fill("", arrayLength(m)), Util.makeTuple);
2086-
//BackendDump.dumpBipartiteGraphStrongComponent2(pathVars, eqs, m, varAtts, eqAtts, "shortenPaths"+stringDelimitList(List.map(partition,intString),"_"));
2082+
//BackendDump.dumpIncidenceMatrix(m);
2083+
//BackendDump.dumpIncidenceMatrixT(mT);
2084+
//varAtts := List.threadMap(List.fill(false, arrayLength(mT)), List.fill("", arrayLength(mT)), Util.makeTuple);
2085+
//eqAtts := List.threadMap(List.fill(false, arrayLength(m)), List.fill("", arrayLength(m)), Util.makeTuple);
2086+
//BackendDump.dumpBipartiteGraphStrongComponent2(pathVars, eqs, m, varAtts, eqAtts, "shortenPaths"+stringDelimitList(List.map(partition,intString),"_"));
20872087

2088-
for idx in 1:arrayLength(mT) loop
2089-
adjEqs := arrayGet(mT,idx);
2088+
for idx in 1:arrayLength(mT) loop
2089+
adjEqs := arrayGet(mT,idx);
20902090

2091-
if listLength(adjEqs)==2 then
2091+
if listLength(adjEqs)==2 then
20922092
//print("varIdx1 "+intString(varIdx)+"\n");
20932093
//print("adjEqs "+stringDelimitList(List.map(adjEqs,intString),",")+"\n");
2094-
adjEqs := list(arrayGet(eqMap,listGet(partition,eq)) for eq in adjEqs);
2095-
varIdx := arrayGet(pathVarIdxMap,idx);
2096-
cses := SHORTCUT_CSE(adjEqs,varIdx)::cses;
2097-
end if;
2098-
end for; //end the variables
2099-
GC.free(m);
2100-
GC.free(mT);
2101-
end for; //end all partitions
2102-
//print("the SHORTPATH cses : \n"+stringDelimitList(List.map(cses, printCSE), "\n")+"\n");
2103-
end if;
2104-
cseOut := cses;
2094+
adjEqs := list(arrayGet(eqMap,listGet(partition,eq)) for eq in adjEqs);
2095+
varIdx := arrayGet(pathVarIdxMap,idx);
2096+
cses := SHORTCUT_CSE(adjEqs,varIdx)::cses;
2097+
end if;
2098+
end for; //end the variables
2099+
GC.free(m);
2100+
GC.free(mT);
2101+
end for; //end all partitions
2102+
//print("the SHORTPATH cses : \n"+stringDelimitList(List.map(cses, printCSE), "\n")+"\n");
2103+
end if;
2104+
cseOut := cses;
2105+
else
2106+
cseOut := cseIn;
2107+
end try;
21052108
end shortenPaths;
21062109

21072110
protected function getCSE2"traverses the partitions and checks for CSE2 i.e a=b+const. ; c = b+const. --> a=c
@@ -2177,50 +2180,57 @@ algorithm
21772180
Integer sharedVarIdx, eqIdx1, eqIdx2, varIdx1, varIdx2;
21782181
list<Integer> varIdcs1, varIdcs2, sharedVarIdcs, eqIdcs;
21792182
list<Integer> loop1;
2183+
list<list<Integer>> loops;
21802184
BackendDAE.Equation eq1, eq2;
21812185
BackendDAE.Var var1, var2;
21822186
DAE.Exp varExp1, varExp2, lhs, rhs1, rhs2;
21832187
array<Integer> varMapArr, eqMapArr;
2188+
list<CommonSubExp> cseLst;
21842189
case(_, _, _, _, _, _, _, _)
2185-
equation
2186-
//print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
2190+
algorithm
2191+
//print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
21872192
// partition has only one loop
2188-
({loop1}, _, _) = ResolveLoops.resolveLoops_findLoops({partition}, m, mT, findExactlyOneLoop=true);
2193+
(loops, _, _) := ResolveLoops.resolveLoops_findLoops({partition}, m, mT, findExactlyOneLoop=false);
2194+
cseLst := cseIn;
2195+
for loop1 in loops loop
21892196
//print("loop1 "+stringDelimitList(List.map(loop1, intString), ", ")+"\n");
2190-
{eqIdx1, eqIdx2} = loop1;
2191-
varIdcs1 = arrayGet(m, eqIdx1);
2192-
varIdcs2 = arrayGet(m, eqIdx2);
2193-
(sharedVarIdcs, varIdcs1, varIdcs2) = List.intersection1OnTrue(varIdcs1, varIdcs2, intEq);
2194-
//print("sharedVarIdcs "+stringDelimitList(List.map(sharedVarIdcs, intString), ", ")+"\n");
2195-
//print("varIdcs1 "+stringDelimitList(List.map(varIdcs1, intString), ", ")+"\n");
2196-
//print("varIdcs2 "+stringDelimitList(List.map(varIdcs2, intString), ", ")+"\n");
2197-
{varIdx1} = varIdcs1;
2198-
{varIdx2} = varIdcs2;
2199-
{eq1, eq2} = BackendEquation.getList(loop1, eqs);
2200-
var1 = BackendVariable.getVarAt(vars, varIdx1);
2201-
var2 = BackendVariable.getVarAt(vars, varIdx2);
2202-
2203-
// compare the actual equations
2204-
varExp1 = BackendVariable.varExp(var1);
2205-
varExp2 = BackendVariable.varExp(var2);
2206-
BackendDAE.EQUATION(exp=lhs, scalar=rhs1) = eq1;
2207-
(rhs1, _) = ExpressionSolve.solve(lhs, rhs1, varExp1);
2208-
BackendDAE.EQUATION(exp=lhs, scalar=rhs2) = eq2;
2209-
(rhs2, _) = ExpressionSolve.solve(lhs, rhs2, varExp2);
2210-
true = Expression.expEqual(rhs1, rhs2);
2211-
//print("rhs1 " +ExpressionDump.printExpStr(rhs1)+"\n");
2212-
//print("rhs2 " +ExpressionDump.printExpStr(rhs2)+"\n");
2213-
//print("is equal\n");
2214-
// build CSE
2215-
eqMapArr = listArray(eqMap);
2216-
varMapArr = listArray(varMap);
2217-
sharedVarIdcs = list(arrayGet(varMapArr, i) for i in sharedVarIdcs);
2218-
varIdcs1 = listAppend(varIdcs1, varIdcs2);
2219-
varIdcs1 = list(arrayGet(varMapArr, i) for i in varIdcs1);
2220-
eqIdcs = list(arrayGet(eqMapArr,i) for i in loop1);
2221-
GC.free(eqMapArr);
2222-
GC.free(varMapArr);
2223-
then ASSIGNMENT_CSE(eqIdcs, sharedVarIdcs, varIdcs1)::cseIn;
2197+
{eqIdx1, eqIdx2} := loop1;
2198+
varIdcs1 := arrayGet(m, eqIdx1);
2199+
varIdcs2 := arrayGet(m, eqIdx2);
2200+
(sharedVarIdcs, varIdcs1, varIdcs2) := List.intersection1OnTrue(varIdcs1, varIdcs2, intEq);
2201+
//print("sharedVarIdcs "+stringDelimitList(List.map(sharedVarIdcs, intString), ", ")+"\n");
2202+
//print("varIdcs1 "+stringDelimitList(List.map(varIdcs1, intString), ", ")+"\n");
2203+
//print("varIdcs2 "+stringDelimitList(List.map(varIdcs2, intString), ", ")+"\n");
2204+
{varIdx1} := varIdcs1;
2205+
{varIdx2} := varIdcs2;
2206+
{eq1, eq2} := BackendEquation.getList(loop1, eqs);
2207+
var1 := BackendVariable.getVarAt(vars, varIdx1);
2208+
var2 := BackendVariable.getVarAt(vars, varIdx2);
2209+
2210+
// compare the actual equations
2211+
varExp1 := BackendVariable.varExp(var1);
2212+
varExp2 := BackendVariable.varExp(var2);
2213+
BackendDAE.EQUATION(exp=lhs, scalar=rhs1) := eq1;
2214+
(rhs1, _) := ExpressionSolve.solve(lhs, rhs1, varExp1);
2215+
BackendDAE.EQUATION(exp=lhs, scalar=rhs2) := eq2;
2216+
(rhs2, _) := ExpressionSolve.solve(lhs, rhs2, varExp2);
2217+
if Expression.expEqual(rhs1, rhs2) then
2218+
//print("rhs1 " +ExpressionDump.printExpStr(rhs1)+"\n");
2219+
//print("rhs2 " +ExpressionDump.printExpStr(rhs2)+"\n");
2220+
//print("is equal\n");
2221+
// build CSE
2222+
eqMapArr := listArray(eqMap);
2223+
varMapArr := listArray(varMap);
2224+
sharedVarIdcs := list(arrayGet(varMapArr, i) for i in sharedVarIdcs);
2225+
varIdcs1 := listAppend(varIdcs1, varIdcs2);
2226+
varIdcs1 := list(arrayGet(varMapArr, i) for i in varIdcs1);
2227+
eqIdcs := list(arrayGet(eqMapArr,i) for i in loop1);
2228+
GC.free(eqMapArr);
2229+
GC.free(varMapArr);
2230+
cseLst := ASSIGNMENT_CSE(eqIdcs, sharedVarIdcs, varIdcs1)::cseLst;
2231+
end if;
2232+
end for;
2233+
then cseLst;
22242234
else cseIn;
22252235
end matchcontinue;
22262236
end getCSE3;

0 commit comments

Comments
 (0)