8 # include <ctype.h> /* for isdigit */
9 # include "lclintMacros.nf"
11 # include "cgrammar.h"
12 # include "cgrammar_tokens.h"
14 # include "exprChecks.h"
15 # include "exprNodeSList.h"
18 /*@access constraint, exprNode @*/
21 static constraint inequalitySubstitute (/*@returned@*/ constraint p_c, constraintList p_p);
24 static bool rangeCheck (arithType p_ar1, /*@observer@*/ constraintExpr p_expr1, arithType p_ar2, /*@observer@*/ constraintExpr p_expr2);
26 static constraint inequalitySubstituteUnsound (/*@returned@*/ constraint p_c, constraintList p_p);
28 static constraint constraint_searchandreplace (/*@returned@*/ constraint p_c, constraintExpr p_old, constraintExpr p_newExpr);
31 static constraint constraint_addOr (/*@returned@*/ constraint p_orig, /*@observer@*/ constraint p_orConstr);
33 static bool resolveOr (/*@temp@*/constraint p_c, /*@observer@*/ /*@temp@*/ constraintList p_list);
35 static /*@only@*/ constraintList reflectChangesEnsuresFree1 (/*@only@*/ constraintList p_pre2, constraintList p_post1);
37 /*********************************************/
42 /*@only@*/ constraintList constraintList_mergeEnsuresFreeFirst (constraintList list1, constraintList list2)
46 ret = constraintList_mergeEnsures (list1, list2);
48 constraintList_free(list1);
52 /*@only@*/ constraintList constraintList_mergeEnsures (constraintList list1, constraintList list2)
57 //ret = constraintList_makeNew();
59 llassert(constraintList_isDefined(list1) );
60 llassert(constraintList_isDefined(list2) );
62 DPRINTF(( message ("constraintList_mergeEnsures: list1 %s list2 %s",
63 constraintList_print(list1), constraintList_print(list2)
66 ret = constraintList_fixConflicts (list1, list2);
67 ret = reflectChangesEnsuresFree1 (ret, list2);
68 temp = constraintList_subsumeEnsures (ret, list2);
69 constraintList_free(ret);
72 temp = constraintList_subsumeEnsures (list2, ret);
74 temp = constraintList_addList (temp, ret);
75 constraintList_free(ret);
77 DPRINTF(( message ("constraintList_mergeEnsures: returning %s ",
78 constraintList_print(temp) )
83 //ret = constraintList_addList (ret, list2);
88 /*@only@*/ constraintList constraintList_mergeRequiresFreeFirst (/*@only@*/ constraintList list1, constraintList list2)
92 ret = constraintList_mergeRequires(list1, list2);
94 constraintList_free(list1);
99 /*@only@*/ constraintList constraintList_mergeRequires (constraintList list1, constraintList list2)
104 DPRINTF((message ("constraintList_mergeRequires: merging %s and %s ", constraintList_print (list1), constraintList_print(list2) ) ) );
106 /* get constraints in list1 not satified by list2 */
107 temp = constraintList_reflectChanges(list1, list2);
108 DPRINTF((message ("constraintList_mergeRequires: temp = %s", constraintList_print(temp) ) ) );
110 /*get constraints in list2 not satified by temp*/
111 ret = constraintList_reflectChanges(list2, temp);
113 DPRINTF((message ("constraintList_mergeRequires: ret = %s", constraintList_print(ret) ) ) );
115 ret = constraintList_addListFree (ret, temp);
117 DPRINTF((message ("constraintList_mergeRequires: returning %s", constraintList_print(ret) ) ) );
122 /* old name mergeResolve renamed for czech naming convention */
123 void exprNode_mergeResolve (exprNode parent, exprNode child1, exprNode child2)
125 constraintList temp, temp2;
127 DPRINTF( (message ("magically merging constraint into parent:%s for", exprNode_unparse (parent) )) );
129 DPRINTF( (message (" children: %s and %s", exprNode_unparse (child1), exprNode_unparse(child2) ) ) );
131 if (exprNode_isError (child1) || exprNode_isError(child2) )
133 if (exprNode_isError (child1) && !exprNode_isError(child2) )
135 constraintList_free(parent->requiresConstraints);
137 parent->requiresConstraints = constraintList_copy (child2->requiresConstraints);
138 constraintList_free(parent->ensuresConstraints);
140 parent->ensuresConstraints = constraintList_copy (child2->ensuresConstraints);
141 DPRINTF((message ("Copied child constraints: pre: %s and post: %s",
142 constraintList_print( child2->requiresConstraints),
143 constraintList_print (child2->ensuresConstraints)
150 llassert(exprNode_isError(child2) );
151 //parent->requiresConstraints = constraintList_makeNew();
152 //parent->ensuresConstraints = constraintList_makeNew();
157 llassert(!exprNode_isError (child1) && ! exprNode_isError(child2) );
159 DPRINTF( (message ("Child constraints are %s %s and %s %s",
160 constraintList_print (child1->requiresConstraints),
161 constraintList_print (child1->ensuresConstraints),
162 constraintList_print (child2->requiresConstraints),
163 constraintList_print (child2->ensuresConstraints)
167 constraintList_free(parent->requiresConstraints);
169 parent->requiresConstraints = constraintList_copy (child1->requiresConstraints);
171 if ( context_getFlag (FLG_ORCONSTRAINT) )
172 temp = constraintList_reflectChangesOr (child2->requiresConstraints, child1->ensuresConstraints);
174 temp = constraintList_reflectChanges(child2->requiresConstraints, child1->ensuresConstraints);
176 temp2 = constraintList_mergeRequires (parent->requiresConstraints, temp);
177 constraintList_free(parent->requiresConstraints);
178 constraintList_free(temp);
180 parent->requiresConstraints = temp2;
182 DPRINTF( (message ("Parent requires constraints are %s ",
183 constraintList_print (parent->requiresConstraints)
186 constraintList_free(parent->ensuresConstraints);
188 parent->ensuresConstraints = constraintList_mergeEnsures(child1->ensuresConstraints,
189 child2->ensuresConstraints);
192 DPRINTF( (message ("Parent constraints are %s and %s ",
193 constraintList_print (parent->requiresConstraints),
194 constraintList_print (parent->ensuresConstraints)
202 /*@only@*/ constraintList constraintList_subsumeEnsures (constraintList list1, constraintList list2)
205 ret = constraintList_makeNew();
206 constraintList_elements (list1, el)
209 DPRINTF ((message ("Examining %s", constraint_print (el) ) ) );
210 if (!constraintList_resolve (el, list2) )
213 temp = constraint_copy(el);
214 ret = constraintList_add (ret, temp);
218 DPRINTF ( (message ("Subsuming %s", constraint_print (el) ) ) );
220 } end_constraintList_elements;
227 /*used to be reflectChangesFreePre renamed for Czech naming conventino*/
228 /* tries to resolve constraints in list pre2 using post1 */
229 /*@only@*/ constraintList constraintList_reflectChangesFreePre (/*@only@*/ constraintList pre2, /*@observer@*/ constraintList post1)
233 ret = constraintList_reflectChanges(pre2, post1);
235 constraintList_free (pre2);
241 /* tries to resolve constraints in list pre2 using post1 */
242 /*@only@*/ constraintList constraintList_reflectChanges(/*@observer@*/ constraintList pre2, /*@observer@*/ constraintList post1)
249 ret = constraintList_makeNew();
250 DPRINTF((message ("reflectChanges: lists %s and %s", constraintList_print(pre2), constraintList_print(post1) )));
252 constraintList_elements (pre2, el)
254 if (!constraintList_resolve (el, post1) )
256 temp = constraint_substitute (el, post1);
257 if (!constraintList_resolve (temp, post1) )
259 // try inequality substitution
262 // the inequality substitution may cause us to lose information
263 //so we don't want to store the result but we do it anyway
264 temp2 = constraint_copy (temp);
265 // if (context_getFlag (FLG_ORCONSTRAINT) )
266 temp2 = inequalitySubstitute (temp2, post1);
267 if (!constraintList_resolve (temp2, post1) )
269 temp2 = inequalitySubstituteUnsound (temp2, post1);
270 if (!constraintList_resolve (temp2, post1) )
271 ret = constraintList_add (ret, temp2);
273 constraint_free(temp2);
277 constraint_free(temp2);
280 constraint_free(temp);
282 } end_constraintList_elements;
284 DPRINTF((message ("reflectChanges: returning %s", constraintList_print(ret) ) ) );
289 static constraint constraint_addOr (/*@returned@*/ constraint orig, /*@observer@*/ constraint orConstr)
294 DPRINTF((message("constraint_addor: oring %s onto %s", constraint_printOr(orConstr), constraint_printOr(orig) ) ));
296 while (c->or != NULL)
300 c->or = constraint_copy(orConstr);
302 DPRINTF((message("constraint_addor: returning %s",constraint_printOr(orig) ) ));
308 static bool resolveOr ( /*@temp@*/ constraint c, /*@observer@*/ /*@temp@*/ constraintList list)
312 DPRINTF(( message("resolveOr: constraint %s and list %s", constraint_printOr(c), constraintList_print(list) ) ));
317 if (constraintList_resolve (temp, list) )
321 while (constraint_isDefined(temp));
326 /*This is a "helper" function for doResolveOr */
328 static /*@only@*/ constraint doResolve (/*@only@*/ constraint c, constraintList post1, bool * resolved)
332 if (!resolveOr (c, post1) )
335 temp = constraint_substitute (c, post1);
337 if (!resolveOr (temp, post1) )
339 // try inequality substitution
342 // the inequality substitution may cause us to lose information
343 //so we don't want to store the result but we do it anyway
344 temp2 = constraint_copy (c);
345 // if (context_getFlag (FLG_ORCONSTRAINT) )
346 temp2 = inequalitySubstitute (temp2, post1);
347 if (!resolveOr (temp2, post1) )
349 temp2 = inequalitySubstituteUnsound (temp2, post1);
350 if (!resolveOr (temp2, post1) )
352 if (!constraint_same (temp, temp2) )
353 temp = constraint_addOr (temp, temp2);
356 constraint_free(temp2);
363 constraint_free(temp2);
365 constraint_free(temp);
377 static /*@only@*/ constraint doResolveOr (constraint c, constraintList post1, /*@out@*/bool * resolved)
384 ret = constraint_copy(c);
388 ret = doResolve (ret, post1, resolved);
393 constraint_free(next);
395 /*we don't need to free ret when resolved is false because ret is null*/
396 llassert(ret == NULL);
407 curr = doResolve (curr, post1, resolved);
410 /* curr is null so we don't try to free it*/
411 llassert(curr == NULL);
414 constraint_free(next);
416 constraint_free(ret);
419 ret = constraint_addOr (ret, curr);
420 constraint_free(curr);
430 /* tries to resolve constraints in list pr2 using post1 */
431 /*@only@*/ constraintList constraintList_reflectChangesOr (constraintList pre2, constraintList post1)
436 ret = constraintList_makeNew();
437 DPRINTF((message ("constraintList_reflectChangesOr: lists %s and %s", constraintList_print(pre2), constraintList_print(post1) )));
439 constraintList_elements (pre2, el)
441 temp = doResolveOr (el, post1, &resolved);
445 ret = constraintList_add(ret, temp);
449 /*we don't need to free ret when resolved is false because ret is null*/
450 llassert(temp == NULL);
453 } end_constraintList_elements;
455 DPRINTF((message ("constraintList_reflectChangesOr: returning %s", constraintList_print(ret) ) ) );
458 static /*@only@*/ constraintList reflectChangesEnsures (/*@observer@*/ constraintList pre2, constraintList post1)
462 ret = constraintList_makeNew();
463 constraintList_elements (pre2, el)
465 if (!constraintList_resolve (el, post1) )
467 temp = constraint_substitute (el, post1);
468 llassert (temp != NULL);
470 if (!constraintList_resolve (temp, post1) )
471 ret = constraintList_add (ret, temp);
473 constraint_free(temp);
477 DPRINTF ( (message ("Resolved away %s ", constraint_print(el) ) ) );
479 } end_constraintList_elements;
485 static /*@only@*/ constraintList reflectChangesEnsuresFree1 (/*@only@*/ constraintList pre2, constraintList post1)
489 ret = reflectChangesEnsures (pre2, post1);
491 constraintList_free(pre2);
497 static bool constraint_conflict (constraint c1, constraint c2)
500 if (constraintExpr_similar(c1->lexpr, c2->lexpr) )
503 if (c1->ar == c2->ar)
505 DPRINTF ( (message ("%s conflicts with %s ", constraint_print (c1), constraint_print(c2) ) ) );
510 DPRINTF ( (message ("%s doesn't conflict with %s ", constraint_print (c1), constraint_print(c2) ) ) );
516 static void constraint_fixConflict (/*@temp@*/ constraint good, /*@temp@*/ /*@observer@*/ constraint conflicting) /*@modifies good@*/
518 if (conflicting->ar ==EQ )
520 good->expr = constraintExpr_searchandreplace (good->expr, conflicting->lexpr, conflicting->expr);
521 good = constraint_simplify (good);
527 static bool conflict (constraint c, constraintList list)
530 constraintList_elements (list, el)
532 if ( constraint_conflict(el, c) )
534 constraint_fixConflict (el, c);
537 } end_constraintList_elements;
543 //check if constraint in list1 conflicts with constraints in List2. If so we
544 //remove form list1 and change list2.
545 constraintList constraintList_fixConflicts (constraintList list1, constraintList list2)
548 ret = constraintList_makeNew();
549 llassert(constraintList_isDefined(list1) );
550 constraintList_elements (list1, el)
552 if (! conflict (el, list2) )
555 temp = constraint_copy(el);
556 ret = constraintList_add (ret, temp);
558 } end_constraintList_elements;
563 /*returns true if constraint post satifies cosntriant pre */
564 static bool satifies (constraint pre, constraint post)
566 if (constraint_isAlwaysTrue (pre) )
569 if (!constraintExpr_similar (pre->lexpr, post->lexpr) )
573 if (constraintExpr_isUndefined(post->expr))
579 return rangeCheck (pre->ar, pre->expr, post->ar, post->expr);
583 bool constraintList_resolve (/*@temp@*/ /*@observer@*/ constraint c, /*@temp@*/ /*@observer@*/ constraintList p)
585 constraintList_elements (p, el)
587 if ( satifies (c, el) )
589 DPRINTF ( (message ("\n%s Satifies %s\n ", constraint_print(el), constraint_print(c) ) ) );
592 DPRINTF ( (message ("\n%s does not satify %s\n ", constraint_print(el), constraint_print(c) ) ) );
594 end_constraintList_elements;
595 DPRINTF ( (message ("no constraints satify %s", constraint_print(c) ) ));
599 static bool arithType_canResolve (arithType ar1, arithType ar2)
605 if ( (ar2 == GT) || (ar2 == GTE) || (ar2 == EQ) )
619 if ( (ar2 == LT) || (ar2 == LTE) || (ar2 == EQ) )
628 /* We look for constraint which are tautologies */
630 bool constraint_isAlwaysTrue (/*@observer@*/ /*@temp@*/ constraint c)
633 bool /*@unused@*/ lHasConstant, rHasConstant;
634 int /*@unused@*/ lConstant, rConstant;
639 DPRINTF(( message("constraint_IsAlwaysTrue:examining %s", constraint_print(c) ) ));
641 if (constraintExpr_canGetValue(l) && constraintExpr_canGetValue(r) )
644 cmp = constraintExpr_compare (l, r);
665 if (constraintExpr_similar (l,r) )
684 l = constraintExpr_copy (c->lexpr);
685 r = constraintExpr_copy (c->expr);
687 // l = constraintExpr_propagateConstants (l, &lHasConstant, &lConstant);
688 r = constraintExpr_propagateConstants (r, &rHasConstant, &rConstant);
690 if (constraintExpr_similar (l,r) && (rHasConstant ) )
692 DPRINTF(( message("constraint_IsAlwaysTrue: after removing constants %s and %s are similar", constraintExpr_unparse(l), constraintExpr_unparse(r) ) ));
693 DPRINTF(( message("constraint_IsAlwaysTrue: rconstant is %d", rConstant ) ));
695 constraintExpr_free(l);
696 constraintExpr_free(r);
701 return (rConstant == 0);
703 return (rConstant > 0);
705 return (rConstant >= 0);
707 return (rConstant <= 0);
709 return (rConstant < 0);
719 constraintExpr_free(l);
720 constraintExpr_free(r);
721 DPRINTF(( message("Constraint %s is not always true", constraint_print(c) ) ));
728 static bool rangeCheck (arithType ar1, /*@observer@*/ constraintExpr expr1, arithType ar2, /*@observer@*/ constraintExpr expr2)
731 DPRINTF ((message ("Doing Range CHECK %s and %s", constraintExpr_unparse(expr1), constraintExpr_unparse(expr2) ) ));
733 if (! arithType_canResolve (ar1, ar2) )
739 if (constraintExpr_similar (expr1, expr2) )
743 if (! (constraintExpr_canGetValue (expr1) &&
744 constraintExpr_canGetValue (expr2) ) )
746 constraintExpr e1, e2;
750 e1 = constraintExpr_copy(expr1);
751 e2 = constraintExpr_copy(expr2);
753 e1 = constraintExpr_propagateConstants (e1, &p1, &const1);
755 e2 = constraintExpr_propagateConstants (e2, &p2, &const2);
758 if (const1 <= const2)
759 if (constraintExpr_similar (e1, e2) )
761 constraintExpr_free(e1);
762 constraintExpr_free(e2);
766 DPRINTF( ("Can't Get value"));
768 constraintExpr_free(e1);
769 constraintExpr_free(e2);
773 if (constraintExpr_compare (expr2, expr1) >= 0)
778 if (constraintExpr_similar (expr1, expr2) )
783 if (constraintExpr_similar (expr1, expr2) )
787 if (! (constraintExpr_canGetValue (expr1) &&
788 constraintExpr_canGetValue (expr2) ) )
790 constraintExpr e1, e2;
794 e1 = constraintExpr_copy(expr1);
795 e2 = constraintExpr_copy(expr2);
797 e1 = constraintExpr_propagateConstants (e1, &p1, &const1);
799 e2 = constraintExpr_propagateConstants (e2, &p2, &const2);
802 if (const1 >= const2)
803 if (constraintExpr_similar (e1, e2) )
805 constraintExpr_free(e1);
806 constraintExpr_free(e2);
809 constraintExpr_free(e1);
810 constraintExpr_free(e2);
812 DPRINTF( ("Can't Get value"));
816 if (constraintExpr_compare (expr2, expr1) <= 0)
822 llcontbug((message("Unhandled case in switch: %q", arithType_print(ar1) ) ) );
828 static constraint constraint_searchandreplace (/*@returned@*/ constraint c, constraintExpr old, constraintExpr newExpr)
830 DPRINTF (("Doing replace for lexpr") );
831 c->lexpr = constraintExpr_searchandreplace (c->lexpr, old, newExpr);
832 DPRINTF (("Doing replace for expr") );
833 c->expr = constraintExpr_searchandreplace (c->expr, old, newExpr);
837 bool constraint_search (constraint c, constraintExpr old) /*@*/
842 ret = constraintExpr_search (c->lexpr, old);
843 ret = ret || constraintExpr_search (c->expr, old);
847 //adjust file locs and stuff
848 static constraint constraint_adjust (/*@returned@*/ constraint substitute, /*@observer@*/ constraint old)
850 fileloc loc1, loc2, loc3;
852 DPRINTF ( (message("Start adjust on %s and %s", constraint_print(substitute),
853 constraint_print(old))
856 loc1 = constraint_getFileloc (old);
858 loc2 = constraintExpr_getFileloc (substitute->lexpr);
860 loc3 = constraintExpr_getFileloc (substitute->expr);
863 // special case of an equality that "contains itself"
864 if (constraintExpr_search (substitute->expr, substitute->lexpr) )
865 if (fileloc_closer (loc1, loc3, loc2))
868 DPRINTF ( (message("Doing adjust on %s", constraint_print(substitute) )
870 temp = substitute->lexpr;
871 substitute->lexpr = substitute->expr;
872 substitute->expr = temp;
873 substitute = constraint_simplify(substitute);
884 /* If function preforms substitutes based on inequality
886 It uses the rule x >= y && b < y ===> x >= b + 1
888 Warning this is sound but throws out information
890 constraint inequalitySubstitute (/*@returned@*/ constraint c, constraintList p)
895 constraintList_elements (p, el)
898 // if (!constraint_conflict (c, el) )
901 constraintExpr temp2;
905 //temp = constraint_copy(el);
907 // temp = constraint_adjust(temp, c);
909 if (constraintExpr_same (el->expr, c->expr) )
911 DPRINTF((message ("inequalitySubstitute Replacing %s in %s with %s",
912 constraintExpr_print (c->expr),
913 constraint_print (c),
914 constraintExpr_print (el->expr) )
916 temp2 = constraintExpr_copy (el->lexpr);
917 constraintExpr_free(c->expr);
918 c->expr = constraintExpr_makeIncConstraintExpr (temp2);
923 end_constraintList_elements;
925 c = constraint_simplify(c);
929 /* This function performs substitutions based on the rule:
930 for a constraint of the form expr1 >= expr2; a < b =>
931 a = b -1 for all a in expr1. This will work in most cases.
933 Like inequalitySubstitute we're throwing away some information
936 static constraint inequalitySubstituteUnsound (/*@returned@*/ constraint c, constraintList p)
938 DPRINTF (( message ("Doing inequalitySubstituteUnsound " ) ));
943 constraintList_elements (p, el)
945 DPRINTF (( message ("inequalitySubstituteUnsound examining substituting %s on %s", constraint_print(el), constraint_print(c) ) ));
946 if ( ( el->ar == LTE) || (el->ar == LT) )
947 // if (!constraint_conflict (c, el) )
950 constraintExpr temp2;
952 //temp = constraint_copy(el);
954 // temp = constraint_adjust(temp, c);
955 temp2 = constraintExpr_copy (el->expr);
958 temp2 = constraintExpr_makeDecConstraintExpr (temp2);
960 DPRINTF((message ("Replacing %s in %s with %s",
961 constraintExpr_print (el->lexpr),
962 constraintExpr_print (c->lexpr),
963 constraintExpr_print (temp2) ) ));
965 c->lexpr = constraintExpr_searchandreplace (c->lexpr, el->lexpr, temp2);
966 constraintExpr_free(temp2);
969 end_constraintList_elements;
971 c = constraint_simplify(c);
975 /*@only@*/ constraint constraint_substitute (/*@observer@*/ /*@temp@*/ constraint c, constraintList p)
979 ret = constraint_copy(c);
980 constraintList_elements (p, el)
983 if (!constraint_conflict (ret, el) )
988 temp = constraint_copy(el);
990 temp = constraint_adjust(temp, ret);
992 DPRINTF((message ("Substituting %s in the constraint %s",
993 constraint_print (temp), constraint_print (ret)
997 ret = constraint_searchandreplace (ret, temp->lexpr, temp->expr);
998 DPRINTF(( message ("The new constraint is %s", constraint_print (ret) ) ));
999 constraint_free(temp);
1002 end_constraintList_elements;
1003 DPRINTF(( message ("The finial new constraint is %s", constraint_print (ret) ) ));
1005 ret = constraint_simplify(ret);
1010 /*@only@*/ constraintList constraintList_substituteFreeTarget (/*@only@*/ constraintList target, /*@observer@*/ constraintList subList)
1014 ret = constraintList_substitute (target, subList);
1016 constraintList_free(target);
1021 /* we try to do substitutions on each constraint in target using the constraint in sublist*/
1023 /*@only@*/ constraintList constraintList_substitute (constraintList target,/*2observer@*/ constraintList subList)
1028 ret = constraintList_makeNew();
1030 constraintList_elements(target, el)
1033 //drl possible problem : warning make sure that a side effect is not expected
1035 temp = constraint_substitute(el, subList);
1036 ret = constraintList_add (ret, temp);
1038 end_constraintList_elements;
1043 static constraint constraint_solve (/*@returned@*/ constraint c)
1045 DPRINTF( (message ("Solving %s\n", constraint_print(c) ) ) );
1046 c->expr = constraintExpr_solveBinaryExpr (c->lexpr, c->expr);
1047 DPRINTF( (message ("Solved and got %s\n", constraint_print(c) ) ) );
1052 static arithType flipAr (arithType ar)
1067 llcontbug (message("unexpected value: case not handled"));
1072 static constraint constraint_swapLeftRight (/*@returned@*/ constraint c)
1074 constraintExpr temp;
1075 c->ar = flipAr (c->ar);
1079 DPRINTF(("Swaped left and right sides of constraint"));
1085 constraint constraint_simplify ( /*@returned@*/ constraint c)
1087 c->lexpr = constraintExpr_simplify (c->lexpr);
1088 c->expr = constraintExpr_simplify (c->expr);
1090 if (constraintExpr_isBinaryExpr (c->lexpr) )
1092 c = constraint_solve (c);
1094 c->lexpr = constraintExpr_simplify (c->lexpr);
1095 c->expr = constraintExpr_simplify (c->expr);
1098 if (constraintExpr_isLit(c->lexpr) && (!constraintExpr_isLit(c->expr) ) )
1100 c = constraint_swapLeftRight(c);
1101 /*I don't think this will be an infinate loop*/
1102 c = constraint_simplify(c);
1110 /* returns true if fileloc for term1 is closer to file for term2 than term3*/
1112 bool fileloc_closer (fileloc loc1, fileloc loc2, fileloc loc3)
1115 if (!fileloc_isDefined (loc1) )
1118 if (!fileloc_isDefined (loc2) )
1121 if (!fileloc_isDefined (loc3) )
1127 if (fileloc_equal (loc2, loc3) )
1130 if (fileloc_equal (loc1, loc2) )
1133 if (fileloc_equal (loc1, loc3) )
1136 if ( fileloc_lessthan (loc1, loc2) )
1138 if (fileloc_lessthan (loc2, loc3) )
1140 llassert (fileloc_lessthan (loc1, loc3) );
1149 if ( !fileloc_lessthan (loc1, loc2) )
1151 if (!fileloc_lessthan (loc2, loc3) )
1153 llassert (!fileloc_lessthan (loc1, loc3) );