diff -Naur omega/Makefile.config omega/Makefile.config
--- omega/Makefile.config	Fri Nov  1 14:13:47 2002
+++ omega/Makefile.config	Thu Oct 31 11:25:41 2002
@@ -61,6 +61,8 @@
 AR_COMMAND = $(AR) r $(TARGET) $(OBJS) # for all except SunPro CC 
 # AR_COMMAND = $(CC) $(CFLAGS) $(LDFLAGS) -xar $(OBJS) -o $(TARGET)
 
+SHARED_COMMAND = $(CC) -fPIC -shared -o $(TARGET) $(OBJS)
+
 # OS Flags: Set these for your OS, either BSD-style or SYSV-style.
 # BSD-style (SunOS 4.1.x, may work for others.)
 OS_CFLAGS=
@@ -77,7 +79,7 @@
 # end of OS selection
 
 # Where things should be installed:
-DESTDIR=/usr/local
+DESTDIR := $(shell pwd)
 INCL_DESTDIR=$(DESTDIR)/include/omega
 LIB_DESTDIR=$(DESTDIR)/lib
 BIN_DESTDIR=$(DESTDIR)/bin
@@ -89,7 +91,7 @@
 
 # Set these if you have any other things to include.
 # Each of these variables can have a list of directories/libs.
-EXTRA_INCL_PATH=
+EXTRA_INCL_PATH= -I $(shell pwd)/../../../gmp++
 EXTRA_LIB_PATH=
 EXTRA_LIBS=
 
diff -Naur omega/Makefile.rules omega/Makefile.rules
--- omega/Makefile.rules	Thu Jun 29 15:23:24 2000
+++ omega/Makefile.rules	Thu Oct 31 11:25:41 2002
@@ -49,6 +50,10 @@
 	$(RANLIB) $(TARGET)
 	touch .library
 
+.shared_library: $(OBJS)
+	$(SHARED_COMMAND)
+	touch .shared_library
+
 required_libs: always
 	@for libname in $(REQUIRED) ; do\
 	  libdir=`echo $$libname | sed 's/omega/omega_lib/g'` ; \
@@ -134,7 +138,7 @@
 
 
 clean_self: always
-	-$(RM) -f *.o *.o.li *.typ *.val petit[yl].[ch] hpp[yl].[ch] .tables .executable .library TAGS  < /dev/null 2> /dev/null
+	-$(RM) -f *.o *.o.li *.typ *.val petit[yl].[ch] hpp[yl].[ch] .tables .executable .library .shared_library TAGS  < /dev/null 2> /dev/null
 
 veryclean_self: clean
 	-$(RM) -f *.a $(TARGET)
diff -Naur omega/omega_lib/obj/Makefile omega/omega_lib/obj/Makefile
--- omega/omega_lib/obj/Makefile	Thu Jun 29 15:24:04 2000
+++ omega/omega_lib/obj/Makefile	Thu Oct 31 11:26:08 2002
@@ -5,6 +5,7 @@
 
 LIB=omega
 LIB_NAME=lib$(LIB).a
+LIB_SHARED_NAME=lib$(LIB).so
 TARGET=$(LIB_NAME)
 
 # Required libraries
diff -Naur omega/omega_lib/src/AST.c omega/omega_lib/src/AST.c
--- omega/omega_lib/src/AST.c	Tue Oct 29 13:19:52 2002
+++ omega/omega_lib/src/AST.c	Thu Oct 24 19:33:14 2002
@@ -219,9 +219,9 @@
   
 	
 void install_neq(F_And *F, Exp *e1, Exp *e2) {
-	F_Or *or = F->add_or();
-	F_And *and1 = or->add_and();
-	F_And *and2 = or->add_and();
+	F_Or *_or = F->add_or();
+	F_And *and1 = _or->add_and();
+	F_And *and2 = _or->add_and();
 	install_gt(and1,e1,e2);
 	install_gt(and2,e2,e1);
 	};
@@ -237,7 +237,9 @@
 void install_eq(F_And *F, Exp *e1, Exp *e2) {
 	EQ_Handle c = F->add_EQ();
 	c.update_const(e1->constantTerm);
-	if (e2) c.update_const(-e2->constantTerm);
+	if (e2) {
+	  c.update_const(-e2->constantTerm);
+	}
 	foreach_map(r,Variable_Ref*,co,int,e1->coefs,
 		c.update_coef(r->id(F->relation()),co));
 	if (e2) foreach_map(r,Variable_Ref*,co,int,e2->coefs,
@@ -248,7 +250,9 @@
 void install_geq(F_And *F, Exp *e1, Exp *e2) {
 	GEQ_Handle c = F->add_GEQ();
 	c.update_const(e1->constantTerm);
-	if (e2) c.update_const(-e2->constantTerm);
+	if (e2) {
+	  c.update_const(-e2->constantTerm);
+	}
 	foreach_map(r,Variable_Ref*,co,int,e1->coefs,
 		c.update_coef(r->id(F->relation()),co));
 	if (e2) foreach_map(r,Variable_Ref*,co,int,e2->coefs,
@@ -260,7 +264,9 @@
 	GEQ_Handle c = F->add_GEQ();
 	c.update_const(-1);
 	c.update_const(e1->constantTerm);
-	if (e2) c.update_const(-e2->constantTerm);
+	if (e2) {
+	  c.update_const(-e2->constantTerm);
+	}
 	foreach_map(r,Variable_Ref*,co,int,e1->coefs,
 		c.update_coef(r->id(F->relation()),co));
 	if (e2) foreach_map(r,Variable_Ref*,co,int,e2->coefs,
diff -Naur omega/omega_lib/src/closure.c omega/omega_lib/src/closure.c
--- omega/omega_lib/src/closure.c	Tue Oct 29 13:20:03 2002
+++ omega/omega_lib/src/closure.c	Thu Oct 24 19:33:58 2002
@@ -264,7 +264,7 @@
     for (i=1; i<=r.n_inp(); i++)
 	{
 	c_in=h.get_coef(r.input_var(i));
-	if (c_in)
+	if (c_in != 0)
 	    {
 	    if (v!=-1)
 		return 0; 
diff -Naur omega/omega_lib/src/farkas.c omega/omega_lib/src/farkas.c
--- omega/omega_lib/src/farkas.c	Tue Oct 29 13:20:03 2002
+++ omega/omega_lib/src/farkas.c	Tue Oct 22 14:26:09 2002
@@ -203,14 +203,14 @@
     for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) {
       for (Variable_ID_Iterator v1(*(*s)->variables()); v1; v1++) {
 	for (EQ_Iterator eq = (*s)->EQs(); eq.live(); eq.next()) 
-	  if ((*eq).get_coef(*v1)) 
+	  if ((*eq).get_coef(*v1) != 0) 
 	    for (Variable_ID_Iterator v2(*(*s)->variables()); v2; v2++) 
-	      if ((*eq).get_coef(*v2)) 
+	      if ((*eq).get_coef(*v2) != 0) 
 		(*v1)->UF_union(*v2);
 	for (GEQ_Iterator g = (*s)->GEQs(); g.live(); g.next()) 
-	  if ((*g).get_coef(*v1)) 
+	  if ((*g).get_coef(*v1) != 0) 
 	    for (Variable_ID_Iterator v2(*(*s)->variables()); v2; v2++) 
-	      if ((*g).get_coef(*v2)) 
+	      if ((*g).get_coef(*v2) != 0) 
 		(*v1)->UF_union(*v2);
       }
     }
diff -Naur omega/omega_lib/src/omega_core/oc.c omega/omega_lib/src/omega_core/oc.c
--- omega/omega_lib/src/omega_core/oc.c	Tue Oct 29 13:20:07 2002
+++ omega/omega_lib/src/omega_core/oc.c	Tue Oct 22 14:26:11 2002
@@ -126,9 +126,9 @@
 	{
 	int e;
         for (e = nGEQs - 1; e >= 0; e--) 
-		if (GEQs[e].coef[nVars]) deleteGEQ(e);
+		if (GEQs[e].coef[nVars] == 0) deleteGEQ(e);
         for (e = nEQs - 1; e >= 0; e--) 
-		if (EQs[e].coef[nVars]) deleteEQ(e);
+		if (EQs[e].coef[nVars] == 0) deleteEQ(e);
 	nVars--;
         result = simplifyProblem(0,0,0);
 	};
diff -Naur omega/omega_lib/src/omega_core/oc_eq.c omega/omega_lib/src/omega_core/oc_eq.c
--- omega/omega_lib/src/omega_core/oc_eq.c	Tue Oct 29 13:20:07 2002
+++ omega/omega_lib/src/omega_core/oc_eq.c	Tue Oct 22 14:26:11 2002
@@ -11,12 +11,12 @@
     for(i=safeVars+1;i<=nVars;i++) 
 	{
 	if (DBUG) fprintf(outputFile,"checking %s\n",variable(i));
-	for(e=0;e<nGEQs;e++) if (GEQs[e].coef[i]) break;
+	for(e=0;e<nGEQs;e++) if (GEQs[e].coef[i] != 0) break;
 	if (e >= nGEQs) 
 	    {
 	    if (DBUG) fprintf(outputFile,"%s passed GEQ test\n",variable(i));
 	    e2 = -1;
-	    for(e=0;e<nEQs;e++) if (EQs[e].coef[i]) 
+	    for(e=0;e<nEQs;e++) if (EQs[e].coef[i] != 0) 
 		{
 		if (e2 == -1) e2 = e;
 		else 
@@ -137,7 +137,7 @@
 	    if (!(GEQs[e].color || !GEQs[e].coef[i]))
 			unsafeSub = true;
 	for (e = nSUBs - 1; e >= 0; e--) 
-	    if (SUBs[e].coef[i])
+	    if (SUBs[e].coef[i] != 0)
 			unsafeSub = true;
 	if (unsafeSub) {
 		fprintf(outputFile, "UNSAFE RED SUBSTITUTION\n");
@@ -326,7 +326,7 @@
 	    printProblem();
 	assert(inApproximateMode);
 	for (e = nEQs - 1; e >= 0; e--)
-	    if (EQs[e].coef[i]) 
+	    if (EQs[e].coef[i] != 0) 
 		{
 		eqn *eq = &(EQs[e]);
 		int j;
@@ -340,7 +340,7 @@
 		    eq->coef[j] -= check_mul(sub.coef[j], k / c);
 		};
 	for (e = nGEQs - 1; e >= 0; e--)
-	    if (GEQs[e].coef[i]) 
+	    if (GEQs[e].coef[i] != 0) 
 		{
 		eqn *eq = &(GEQs[e]);
 		int j;
@@ -355,7 +355,7 @@
 		eq->touched = 1;
 		};
 	for (e = nSUBs - 1; e >= 0; e--)
-	    if (SUBs[e].coef[i]) 
+	    if (SUBs[e].coef[i] != 0) 
 		{
 		eqn *eq = &(SUBs[e]);
 		int j;
@@ -400,7 +400,7 @@
 	if (EQs[e].color) delay[e]+= 8;
         int nonunitWildCards = 0;
         int unitWildCards = 0;
-	for (i = nVars; i > safeVars; i--) if (EQs[e].coef[i]) 
+	for (i = nVars; i > safeVars; i--) if (EQs[e].coef[i] != 0) 
 	    {
 	    if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1)
 		unitWildCards++;
@@ -408,7 +408,7 @@
 	    };
         int unit = 0;
         int nonUnit = 0;
-	for (; i > 0; i--) if (EQs[e].coef[i]) 
+	for (; i > 0; i--) if (EQs[e].coef[i] != 0) 
 	    {
 	    if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1)
 		unit++;
@@ -514,7 +514,7 @@
 	   };
 
 	for (i = nVars; i > 0; i--) if ((g = eq->coef[i]) != 0) break;
-	for (j = i - 1; j > 0; j--) if (eq->coef[j]) break;
+	for (j = i - 1; j > 0; j--) if (eq->coef[j] != 0) break;
 	if (j < 0) {
 	    fprintf(outputFile, "\nAssertion failure; i = %d, j = %d, g = " coef_fmt "\n",
 				i,j,g);
@@ -553,11 +553,11 @@
 	    if (g2 > 1) 
 		{
 		int e2;
-		for (e2 = e - 1; e2 >= 0; e2--) if (EQs[e2].coef[i]) break;
+		for (e2 = e - 1; e2 >= 0; e2--) if (EQs[e2].coef[i] != 0) break;
 		if (e2 == -1)
-		    for (e2 = nGEQs - 1; e2 >= 0; e2--) if (GEQs[e2].coef[i]) break;
+		    for (e2 = nGEQs - 1; e2 >= 0; e2--) if (GEQs[e2].coef[i] != 0) break;
 		if (e2 == -1)
-		    for (e2 = nSUBs - 1; e2 >= 0; e2--) if (SUBs[e2].coef[i]) break;
+		    for (e2 = nSUBs - 1; e2 >= 0; e2--) if (SUBs[e2].coef[i] != 0) break;
 		if (e2 == -1) 
 		    {
 		    bool change = 0;
diff -Naur omega/omega_lib/src/omega_core/oc_print.c omega/omega_lib/src/omega_core/oc_print.c
--- omega/omega_lib/src/omega_core/oc_print.c	Tue Oct 29 13:20:07 2002
+++ omega/omega_lib/src/omega_core/oc_print.c	Tue Oct 22 14:26:22 2002
@@ -79,6 +79,14 @@
     fprintf(outputFile, (const char *) s);
     }
 
+void // TODO:
+Problem::
+printTerm(const eqn * e, coef_t c) const
+    {
+    //String s = print_term_to_string(e, c);
+    //fprintf(outputFile, (const char *) s);
+    }
+
 void Problem::printSub(int v) const
     {
     String s = print_sub_to_string(v);
@@ -478,7 +486,7 @@
 	    {
 	    live[e] = TRUE;
 	    varCount[e] = 0;
-	    for (v = 1; v <= nVars; v++)  if (GEQs[e].coef[v]) varCount[e]++;
+	    for (v = 1; v <= nVars; v++)  if (GEQs[e].coef[v] != 0) varCount[e]++;
 	    }
 
 	if (!print_in_code_gen_style)
diff -Naur omega/omega_lib/src/omega_core/oc_problems.c omega/omega_lib/src/omega_core/oc_problems.c
--- omega/omega_lib/src/omega_core/oc_problems.c	Tue Oct 29 13:20:07 2002
+++ omega/omega_lib/src/omega_core/oc_problems.c	Fri Oct 25 16:25:06 2002
@@ -1,9 +1,10 @@
 #include <omega/omega_core/oc_i.h> 
+#include <iostream.h>
 
 Problem::~Problem()
     {
-    delete EQs;
-    delete GEQs;
+    delete [] EQs;
+    delete [] GEQs;
     }
 
 
@@ -99,12 +100,12 @@
     {
     if (this != &p2) {
       if(allocEQs < p2.nEQs) {
-	  delete EQs;
+	  delete [] EQs;
 	  allocEQs = padEQs(p2.nEQs);
 	  EQs = new eqn[allocEQs];
       }
       if(allocGEQs < p2.nGEQs) {
-	  delete GEQs;
+	  delete [] GEQs;
 	  allocGEQs = padGEQs(p2.nGEQs);
 	  GEQs = new eqn[allocGEQs];
       }
@@ -153,7 +154,7 @@
 	eqn * new_geqs = new eqn[allocGEQs];
 	for (int e = nGEQs - 2; e >= 0; e--)
 	    eqnncpy(&(new_geqs[e]), &(GEQs[e]), nVars);
-	delete GEQs; 
+	delete [] GEQs; 
 	GEQs = new_geqs;
     }
 //    problem->GEQs[nGEQs-1].color = black;
@@ -169,7 +170,7 @@
 	eqn * new_eqs = new eqn[allocEQs];
 	for (int e = nEQs - 2; e >= 0; e--)
 	    eqnncpy(&(new_eqs[e]), &(EQs[e]), nVars);
-	delete EQs; 
+	delete [] EQs; 
 	EQs = new_eqs;
     }
 // Could do this here, but some calls to newEQ do a copy instead of a zero;
diff -Naur omega/omega_lib/src/omega_core/oc_query.c omega/omega_lib/src/omega_core/oc_query.c
--- omega/omega_lib/src/omega_core/oc_query.c	Tue Oct 29 13:20:09 2002
+++ omega/omega_lib/src/omega_core/oc_query.c	Tue Oct 22 14:26:22 2002
@@ -283,12 +283,12 @@
 		{
 		int e3;
 		for (e3 = nSUBs - 1; e3 >= 0; e3--)
-		    if (SUBs[e3].coef[i])
+		    if (SUBs[e3].coef[i] != 0)
 			break;
 		if (e3 >= 0)
 		    continue;
 		for (e3 = nEQs - 1; e3 >= 0; e3--)
-		    if (EQs[e3].coef[i])
+		    if (EQs[e3].coef[i] != 0)
 			break;
 		if (e3 >= 0)
 		    continue;
@@ -296,7 +296,7 @@
 		    {
 		    isDead[e] = true;
 		    for (e--; e >= 0; e--)
-			if (GEQs[e].coef[i]) isDead[e] = true;
+			if (GEQs[e].coef[i] != 0) isDead[e] = true;
 		    };
 
 
diff -Naur omega/omega_lib/src/omega_core/oc_quick_kill.c omega/omega_lib/src/omega_core/oc_quick_kill.c
--- omega/omega_lib/src/omega_core/oc_quick_kill.c	Tue Oct 29 13:20:09 2002
+++ omega/omega_lib/src/omega_core/oc_quick_kill.c	Fri Oct 18 12:00:41 2002
@@ -130,16 +130,16 @@
 	if (!GEQs[e].essential && GEQs[e].varCount > 1) 
 	    {
 	    int i1,i2,i3;
-	    for (i1 = nVars; i1 >= 1; i1--)  if (GEQs[e].coef[i1]) break;
-	    for (i2 = i1-1; i2 >= 1; i2--)  if (GEQs[e].coef[i2]) break;
-	    for (i3 = i2-1; i3 >= 1; i3--)  if (GEQs[e].coef[i3]) break;
+	    for (i1 = nVars; i1 >= 1; i1--)  if (GEQs[e].coef[i1] != 0) break;
+	    for (i2 = i1-1; i2 >= 1; i2--)  if (GEQs[e].coef[i2] != 0) break;
+	    for (i3 = i2-1; i3 >= 1; i3--)  if (GEQs[e].coef[i3] != 0) break;
 	    assert(i2 >= 1);
 	    for (e2 = nGEQs - 1; e2 >= 0; e2--) if (e!=e2) 
 		{
 		coef_t crossProduct;
 		crossProduct = GEQs[e].coef[i1]*GEQs[e2].coef[i1];
 		crossProduct += GEQs[e].coef[i2]*GEQs[e2].coef[i2];
-		for (i = i3; i >= 1; i--)  if (GEQs[e2].coef[i])
+		for (i = i3; i >= 1; i--)  if (GEQs[e2].coef[i] != 0)
 		    crossProduct += GEQs[e].coef[i]*GEQs[e2].coef[i];
 		if (crossProduct > 0) 
 		    {
@@ -175,9 +175,9 @@
     {
     // if 1 returned, eqn E is of form v1 -coef >= v2 
     for(v1=1;v1<=nVars;v1++)
-	if (GEQs[e].coef[v1]) break;
+	if (GEQs[e].coef[v1] != 0) break;
     for(v2=v1+1;v2<=nVars;v2++)
-	if (GEQs[e].coef[v2]) break;
+	if (GEQs[e].coef[v2] != 0) break;
     if (v2 > nVars) 
 	{
 	if (GEQs[e].coef[v1] == -1) 
diff -Naur omega/omega_lib/src/omega_core/oc_simple.c omega/omega_lib/src/omega_core/oc_simple.c
--- omega/omega_lib/src/omega_core/oc_simple.c	Tue Oct 29 13:20:10 2002
+++ omega/omega_lib/src/omega_core/oc_simple.c	Tue Oct 29 14:18:40 2002
@@ -6,20 +6,20 @@
 checkIfSingleVar(eqn* e, int i)
     {
     for (; i > 0; i--)
-        if (e->coef[i]) 
+        if (e->coef[i] != 0)
 	    {
             i--;
             break;
 	    };
     for (; i > 0; i--)
-        if (e->coef[i])
+        if (e->coef[i] != 0)
             break;
     return (i == 0);
     }
 
 int singleVarGEQ(eqn* e) 
     {
-    return  !e->touched && e->key != 0 && -maxVars <= e->key && e->key <= maxVars;
+    return  (e->touched == 0) && e->key != 0 && -maxVars <= e->key && e->key <= maxVars;
     }
 
 void checkVars(int nVars)
@@ -112,7 +112,7 @@
     for (e = 0; e < nEQs; e++)
         if (EQs[e].color == _red) 
 	    {
-	    for (i = nVars; i > 0; i--) if (EQs[e].coef[i]) break;
+	    for (i = nVars; i > 0; i--) if (EQs[e].coef[i] != 0) break;
 	    if (i == 0 && EQs[e].coef[0] != 0) return 0;
 	    else result+=2;
 	    };
@@ -151,7 +151,7 @@
 	    nEQs--;
 	    }
         else for(i=safeVars+1;i <= nVars;i++)
-	    if (EQs[e].coef[i]) RedVar[i] = 1;
+	    if (EQs[e].coef[i] != 0) RedVar[i] = 1;
 
     for (e = nGEQs-1; e >=0; e--)
         if (GEQs[e].color != _red) 
@@ -160,7 +160,7 @@
 	    nGEQs--;
 	    }
         else for(i=safeVars+1;i <= nVars;i++)
-	    if (GEQs[e].coef[i]) RedVar[i] = 1;
+	    if (GEQs[e].coef[i] != 0) RedVar[i] = 1;
 
     assert(nSUBs == 0);
 
@@ -187,7 +187,7 @@
 	    nEQs--;
 	    }
         else for(i=safeVars+1;i <= nVars;i++)
-	    if (EQs[e].coef[i]) BlackVar[i] = 1;
+	    if (EQs[e].coef[i] != 0) BlackVar[i] = 1;
 
     for (e = nGEQs-1; e >=0; e--)
         if (GEQs[e].color) 
@@ -196,7 +196,7 @@
 	    nGEQs--;
 	    }
         else for(i=safeVars+1;i <= nVars;i++)
-	    if (GEQs[e].coef[i]) BlackVar[i] = 1;
+	    if (GEQs[e].coef[i] != 0) BlackVar[i] = 1;
 
     assert(nSUBs == 0);
 
@@ -275,7 +275,7 @@
     else if (i < nVars) 
 	{
 	for (e = nGEQs - 1; e >= 0; e--)
-	    if (GEQs[e].coef[nVars]) 
+	    if (GEQs[e].coef[nVars] != 0)
 		{
 		GEQs[e].coef[i] = GEQs[e].coef[nVars];
 		GEQs[e].touched = TRUE;
@@ -467,10 +467,10 @@
     for (e = nEQs - 1; e >= 0; e--) 
 	{
 	for (i = nVars; i >= safeVars + 1; i--)
-	    if (EQs[e].coef[i]) 
+	    if (EQs[e].coef[i] != 0)
 		{
 		for (j = i - 1; j >= safeVars + 1; j--)
-		    if (EQs[e].coef[j])
+		    if (EQs[e].coef[j] != 0)
 			break;
 		if (j >= safeVars + 1) 
 		    {
@@ -496,7 +496,7 @@
 		bool preserveThisConstraint = true;
 
 		for (e2 = nEQs - 1; e2 >= 0; e2--)
-		    if (e != e2 && EQs[e2].coef[i]
+		    if (e != e2 && (EQs[e2].coef[i] != 0)
 			&& EQs[e2].color >= EQs[e].color ) 
 			{
 			eqn* eqn = &(EQs[e2]);
@@ -513,14 +513,14 @@
 			g = 0;
 			for (j = nVars; j >= 0; j--)
 			    g = gcd(abs(eqn->coef[j]), g);
-			if (g)
+			if (g != 0)
 			    for (j = nVars; j >= 0; j--)
 				eqn->coef[j] = eqn->coef[j] / g;
 
 			};
 
 		for (e2 = nGEQs - 1; e2 >= 0; e2--)
-		    if (GEQs[e2].coef[i]
+		    if ((GEQs[e2].coef[i] != 0)
 			&& GEQs[e2].color >= EQs[e].color) 
 			{
 			eqn* eqn = &(GEQs[e2]);
@@ -536,7 +536,7 @@
 			renormalize = 1;
 			};
 		for (e2 = nSUBs - 1; e2 >= 0; e2--)
-		    if (SUBs[e2].coef[i]
+		    if ((SUBs[e2].coef[i] != 0)
 			&& SUBs[e2].color >= EQs[e].color ) 
 			{
 			eqn* eqn = &(SUBs[e2]);
@@ -551,7 +551,7 @@
 			g = 0;
 			for (j = nVars; j >= 0; j--)
 			    g = gcd(abs(eqn->coef[j]), g);
-			if (g)
+			if (g != 0) // ED
 			    for (j = nVars; j >= 0; j--)
 				eqn->coef[j] = eqn->coef[j] / g;
 			};
@@ -587,7 +587,7 @@
     checkVars(nVars+1);
     for(i=1;i<=safeVars;i++) if (var[i] > 0) v++;
     assert(v == varsOfInterest);
-    for(e=0;e<nGEQs;e++) assert(GEQs[e].touched || GEQs[e].key != 0);
+    for(e=0;e<nGEQs;e++) assert((GEQs[e].touched != 0) || GEQs[e].key != 0);
     if(!mayBeRed) 
 	{
 	for(e=0;e<nEQs;e++) assert(!EQs[e].color);
@@ -598,12 +598,12 @@
 	    {
 	    int isBlack = 0;
 	    int isRed = 0;
-	    for(e=0;e<nEQs;e++) if (EQs[e].coef[i]) 
+	    for(e=0;e<nEQs;e++) if (EQs[e].coef[i] != 0)
 		{
 		if (EQs[e].color) isRed = 1;
 		else isBlack = 1;
 		}
-	    for(e=0;e<nGEQs;e++) if (GEQs[e].coef[i]) 
+	    for(e=0;e<nGEQs;e++) if (GEQs[e].coef[i] != 0)
 		{
 		if (GEQs[e].color) isRed = 1;
 		else isBlack = 1;
@@ -626,13 +626,13 @@
     int i,j,k;
     coef_t l;
 
-    if (type == redEQ && newVar == nVars && e->coef[newVar]) 
+    if (type == redEQ && newVar == nVars && (e->coef[newVar] != 0))
 	{
 	/* this is really a stride constraint */
 	type = redStride;
 	stride = e->coef[newVar];
 	}
-    else for(i=safeVars+1; i<=nVars;i++) assert(!e->coef[i]);
+    else for(i=safeVars+1; i<=nVars;i++) assert(e->coef[i] == 0);
 
     assert(type != notRed);
     assert(type == redStride || stride == 0);
@@ -679,7 +679,7 @@
 	for(i=0; i<nSUBs;i++) 
 	    {
 	    k = -1;
-	    for(j=1; j<=safeVars;j++) if (var[j] < 0 && SUBs[i].coef[j]) 
+	    for(j=1; j<=safeVars;j++) if (var[j] < 0 && (SUBs[i].coef[j]!=0))
 		{
 		if (k == -1) k = j;
 		else 
@@ -700,7 +700,7 @@
 		};
 	    };
 	l = 1;
-        for(i=1; i<=safeVars;i++) if (var[i] < 0 && e->coef[i]) 
+        for(i=1; i<=safeVars;i++) if (var[i] < 0 && (e->coef[i]!=0))
 	    {
 	    coef_t k;
 	    if (backSub[i] < 0) 
@@ -731,7 +731,7 @@
     redMemory[m].kind = type;
 
     coef[0] = e->coef[0];
-    for(i=1; i<=safeVars;i++)  if(e->coef[i]) 
+    for(i=1; i<=safeVars;i++)  if(e->coef[i] != 0)
 	{
 	if (DEBUG) fprintf(outputFile,"Handling %s:\n", variable(i));
 	if (var[i] > 0) coef[var[i]] += e->coef[i];
@@ -743,7 +743,7 @@
 	    assert(m%s == 0);
 	    m = m/s;
 
-	    for(j=1; j<=safeVars;j++) if (var[j] > 0 && SUBs[backSub[i]].coef[j]) 
+	    for(j=1; j<=safeVars;j++) if (var[j] > 0 && (SUBs[backSub[i]].coef[j] != 0))
 		{
 		coef[var[j]] -= m * SUBs[backSub[i]].coef[j];
 		if (DEBUG) fprintf(outputFile,
@@ -751,7 +751,7 @@
 				   m, SUBs[backSub[i]].coef[j],
 				   variable(j));
 		};
-	    if (SUBs[backSub[i]].coef[0]) 
+	    if (SUBs[backSub[i]].coef[0] != 0)
 		{
 		coef[0] -= m * SUBs[backSub[i]].coef[0];
 		if (DEBUG) fprintf(outputFile,
@@ -769,7 +769,7 @@
 	    {
 	    int j,k;
 	    fprintf(outputFile,"Coef = " coef_fmt ,coef[0]);
-	    for(k=maxVars; k > 0; k--) if (coef[k]) break;
+	    for(k=maxVars; k > 0; k--) if (coef[k] != 0) break;
 	    for(j=1; j<=k;j++)  fprintf(outputFile," " coef_fmt,coef[j]);
 	    fprintf(outputFile,"\n");
             if (type == redStride) fprintf(outputFile,"Stride = " coef_fmt "\n",stride);
@@ -778,7 +778,7 @@
 
     redMemory[m].constantTerm = coef[0];
 	
-    for(i=1; i<=maxVars;i++)  if (coef[i]) 
+    for(i=1; i<=maxVars;i++)  if (coef[i] != 0)
 	{
         int j = redMemory[m].length++;
         redMemory[m].coef[j] = coef[i];
@@ -946,14 +946,14 @@
 normalize()
 
     {
-    int e, i, j, k;
+    int e, i, k; coef_t j;
     int coupledSubscripts = 0;
 
     check();
 
     for (e = 0; e < nGEQs; e++) 
 	{
-	if (!GEQs[e].touched) 
+	if (GEQs[e].touched == 0)
 	    {
 	    if (!singleVarGEQ(&GEQs[e]))
 		coupledSubscripts = 1;
@@ -975,7 +975,7 @@
 	    {
 	    int *p = &packing[0];
 	    for (k = 1; k <= nVars; k++)
-		if (GEQs[e].coef[k]) 
+		if (GEQs[e].coef[k] != 0)
 		    {
 		    *(p++) = k;
 		    };
@@ -1020,7 +1020,7 @@
 		coupledSubscripts = 1;
 		i0 = topVar;
 		i = packing[i0--];
-		g = GEQs[e].coef[i];
+ 		g = GEQs[e].coef[i];
 		hashCode = g * (i + 3);
 		if (g < 0)
 		    g = -g;
@@ -1071,11 +1071,11 @@
 		    printGEQ(&GEQs[e]);
 		    fprintf(outputFile, "\n");
 		    };
-		j = (int) (g2 % (coef_t) hashTableSize);
-		assert (g2 % (coef_t) hashTableSize == j);
+		j = (g2 % hashTableSize);
+		assert (g2 % hashTableSize == j); // TODO:
 		while (1) 
 		    {
-		    eqn *proto = &(hashMaster[j]);
+		    eqn *proto = &(hashMaster[j.get_sint()]); // this will assert if can't fit into int
 		    if (proto->touched == g2) 
 			{
 			if (proto->coef[0] == topVar) 
diff -Naur omega/omega_lib/src/omega_core/oc_solve.c omega/omega_lib/src/omega_core/oc_solve.c
--- omega/omega_lib/src/omega_core/oc_solve.c	Tue Oct 29 13:20:15 2002
+++ omega/omega_lib/src/omega_core/oc_solve.c	Tue Oct 29 14:19:11 2002
@@ -250,7 +253,7 @@
 		    else 
 			{
 			coef_t splinters= int_div(diff, g) - int_div(diff - grey, g);
-			if (splinters) exact = 0;
+			if (splinters != 0) exact = 0;
 			disjointSplinters += splinters;
 			if (g > 1) unit++;
 			darkConstraints++;
@@ -379,7 +382,7 @@
 					printGEQ(&(GEQs[new_eqn]));
 					fprintf(outputFile, "\n");
 					}
-				    assert(GEQs[new_eqn].coef[i] == 0);
+				    assert(GEQs[new_eqn].coef[i] == 0);
 				    };
 				};
 			deadEqns[numDead++] = e1;
@@ -434,7 +437,7 @@
 #ifndef NDEBUG
 	for(e=0;e<nSUBs;e++)
 	    for(i=safeVars+1;i<=nVars;i++)
-		assert(!SUBs[e].coef[i]);
+		assert(SUBs[e].coef[i] == 0);
 #endif
 
         check();
@@ -486,7 +489,7 @@
 		fprintf(outputFile, "upper bound = " coef_fmt "\n", upperBound);
 	    if (DEBUG)
 		fprintf(outputFile, "lower bound = " coef_fmt "\n", lowerBound);
-	    if (lowerBound > upperBound) 
+	    if (lowerBound > upperBound)
 		{
 		if (TRACE)
 		    fprintf(outputFile, "equations have no solution (H)\n");
@@ -498,7 +501,7 @@
 		if (safeVars == 1) 
 		    {
 
-		    if (lowerBound == upperBound && !uColor && !lColor) 
+		     if (lowerBound == upperBound && !uColor && !lColor) 
 			{
 			int e = newEQ();
 			assert(e == 0);
@@ -580,7 +583,7 @@
 	    fprintf(outputFile, "\nafter normalization:\n");
 	    printProblem();
 	    fprintf(outputFile, "\n");
-	    for(e=0;e<nGEQs;e++) assert(!GEQs[e].touched);
+	    for(e=0;e<nGEQs;e++) assert(GEQs[e].touched == 0);
 	    fprintf(outputFile, "eliminating variable using fourier-motzkin elimination\n");
 	    };
 
@@ -1343,10 +1346,10 @@
 
 int
 Problem::
-parallelSplinter(int e, int diff, int desiredResult)
+parallelSplinter(int e, coef_t& diff, int desiredResult)
     {
     Problem *tmpProblem;
-    int i;
+    coef_t i;
     if (DBUG) 
 	{
 	fprintf(outputFile, "Using parallel splintering\n");
@@ -1432,7 +1435,7 @@
 	for (i = nVars; i > fv; i--) 
 	    {
 	    for (e = nGEQs - 1; e >= 0; e--)
-		if (GEQs[e].coef[i])
+		if (GEQs[e].coef[i] != 0)
 		    break;
 	    if (e < 0)
 		e2 = e;
@@ -1452,12 +1455,12 @@
 		{
 		int e3;
 		for (e3 = nSUBs - 1; e3 >= 0; e3--)
-		    if (SUBs[e3].coef[i])
+		    if (SUBs[e3].coef[i] != 0)
 			break;
 		if (e3 >= 0)
 		    continue;
 		for (e3 = nEQs - 1; e3 >= 0; e3--)
-		    if (EQs[e3].coef[i])
+		    if (EQs[e3].coef[i] != 0)
 			break;
 		if (e3 >= 0)
 		    continue;
@@ -1467,7 +1470,7 @@
 		    {
 		    deleteGEQ(e);
 		    for (e--; e >= 0; e--)
-			if (GEQs[e].coef[i]) 
+			if (GEQs[e].coef[i] != 0)
 			    {
 			    deleteGEQ(e);
 			    };
@@ -1519,7 +1522,7 @@
 	    if (!isRedVar[i] && !isDeadVar[i]) 
 		{
 		for (e = nGEQs - 1; e >= 0; e--)
-		    if (!isDeadGEQ[e] && GEQs[e].coef[i])
+		    if (!isDeadGEQ[e] && (GEQs[e].coef[i] != 0))
 			break;
 		if (e < 0)
 		    e2 = e;
@@ -1539,19 +1542,19 @@
 		    {
 		    int e3;
 		    for (e3 = nSUBs - 1; e3 >= 0; e3--)
-			if (SUBs[e3].coef[i])
+			if (SUBs[e3].coef[i] != 0)
 			    break;
 		    if (e3 >= 0)
 			continue;
 		    for (e3 = nEQs - 1; e3 >= 0; e3--)
-			if (EQs[e3].coef[i])
+			if (EQs[e3].coef[i] != 0)
 			    break;
 		    if (e3 >= 0)
 			continue;
 		    if (DBUG)
 			fprintf(outputFile, "a free red elimination of %s\n", variable(i));
 		    for (; e >= 0; e--)
-			if (GEQs[e].coef[i])
+			if (GEQs[e].coef[i] != 0)
 			    isDeadGEQ[e] = 1;
 		    tryAgain = 1;
 		    isDeadVar[i] = 1;
diff -Naur omega/omega_lib/src/omega_core/oc_util.c omega/omega_lib/src/omega_core/oc_util.c
--- omega/omega_lib/src/omega_core/oc_util.c	Tue Oct 29 13:20:15 2002
+++ omega/omega_lib/src/omega_core/oc_util.c	Tue Oct 22 14:26:30 2002
@@ -74,7 +74,7 @@
 	{
 	unprotect[i] = (var[i] < 0);
 	for (e = nSUBs - 1; e >= 0; e--)
-	    if (SUBs[e].coef[i])
+	    if (SUBs[e].coef[i] != 0)
 		unprotect[i] = 0;
 	};
     for (i = 1; i <= safeVars; i++) if (unprotect[i]) any=1;
@@ -290,7 +290,7 @@
 	{
 	for(e=0;e<nEQs;e++) if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1)  
 	    {
-	    for(j=nVars;j>i;j--) if (EQs[e].coef[j]) break;
+	    for(j=nVars;j>i;j--) if (EQs[e].coef[j] != 0) break;
 	    if (i==j) 
 		{
 		doElimination(e, i);
diff -Naur omega/omega_lib/src/pres_conj.c omega/omega_lib/src/pres_conj.c
--- omega/omega_lib/src/pres_conj.c	Tue Oct 29 13:20:06 2002
+++ omega/omega_lib/src/pres_conj.c	Fri Oct 25 16:57:21 2002
@@ -484,7 +484,7 @@
   return &mappedVars;
 }
 
-Stride_Handle Conjunct::add_stride(int step, int preserves_level)
+Stride_Handle Conjunct::add_stride(coef_t& step, int preserves_level)
     {
     assert_not_finalized();
     Variable_ID wild = declare();
@@ -1308,10 +1309,10 @@
 bool Conjunct::query_variable_used(Variable_ID v)
 {
  for (GEQ_Iterator g = GEQs(); g.live(); g.next()) {
-	if ((*g).get_coef(v)) return true;
+	if ((*g).get_coef(v) != 0) return true;
 	}
  for (EQ_Iterator e = EQs(); e.live(); e.next()) {
-	if ((*e).get_coef(v)) return true;
+	if ((*e).get_coef(v) != 0) return true;
 	}
  return false;
 }
diff -Naur omega/omega_lib/src/pres_logic.c omega/omega_lib/src/pres_logic.c
--- omega/omega_lib/src/pres_logic.c	Tue Oct 29 13:20:07 2002
+++ omega/omega_lib/src/pres_logic.c	Tue Oct 22 14:26:11 2002
@@ -42,7 +42,7 @@
   return pos_conj->add_EQ(preserves_level);
 }
 
-Stride_Handle F_And::add_stride(int step, int preserves_level) {
+Stride_Handle F_And::add_stride(coef_t& step, int preserves_level) {
   assert_not_finalized();
   if (pos_conj == NULL || pos_conj->problem->nEQs >= maxEQs) {
     pos_conj = NULL;
diff -Naur omega/omega_lib/include/omega/AST.h omega/omega_lib/include/omega/AST.h
--- omega/omega_lib/include/omega/AST.h	Tue Oct 29 13:16:28 2002
+++ omega/omega_lib/include/omega/AST.h	Fri Oct 18 11:57:29 2002
@@ -105,7 +105,7 @@
 
 typedef struct {
 	Exp *e;
-	int step;
+	coef_t step;
 	} strideConstraint;
 
 class AST;
diff -Naur omega/omega_lib/include/omega/omega_core/oc.h omega/omega_lib/include/omega/omega_core/oc.h
--- omega/omega_lib/include/omega/omega_core/oc.h	Tue Oct 29 13:16:29 2002
+++ omega/omega_lib/include/omega/omega_core/oc.h	Tue Oct 22 14:26:01 2002
@@ -9,6 +9,8 @@
 #include <basic/util.h>
 #include <omega/omega_core/debugging.h>
 
+#include <gmp++.h>
+
 #define maxVars 56
 
 extern int maxGEQs;
@@ -46,10 +48,19 @@
 
 #else
 
-typedef int coef_t;  // type of coefficients
-#define coef_fmt  "%d"
-#define posInfinity (0x7ffffff)
-#define negInfinity (-0x7ffffff)
+typedef BigInt coef_t; // BigInt type of coefficients
+
+//typedef int coef_t;  // type of coefficients
+
+//TODO: we must do something about this c style formatting expr
+#define coef_fmt  "%x"
+
+//TODO: define stuff in the mpz_class to represent pos inf
+#define posInfinity BigInt::posInfinity
+#define negInfinity BigInt::negInfinity
+
+//#define posInfinity (0x7ffffff)
+//#define negInfinity (-0x7ffffff)
 
 #endif
 
@@ -91,11 +102,48 @@
 extern FILE *outputFile; /* printProblem writes its output to this file */
 #define doTrace (trace && TRACE)
 #define isRed(e) (desiredResult == SIMPLIFY && (e)->color)
-#define eqnncpy(e1,e2,s) {int *p00,*q00,*r00; p00 = (int *)(e1); q00 = (int *)(e2); r00 = &p00[headerWords+1+s]; while(p00 < r00) *p00++ = *q00++; }
+
+//#define eqnncpy(e1,e2,s) {int *p00,*q00,*r00; p00 = (int *)(e1); q00 = (int *)(e2); r00 = &p00[headerWords+1+s]; while(p00 < r00) *p00++ = *q00++; }
 #define eqncpy(e1,e2) eqnncpy(e1,e2,nVars)
-#define eqnnzero(e,s) {int *p00,*r00; p00 = (int *)(e); r00 = &p00[headerWords+1+(s)]; while(p00 < r00) *p00++ = 0;}
+
+inline void eqnncpy(eqn* e1, eqn* e2, int nVars) {
+
+	// header
+	e1->key = e2->key;
+	e1->touched = e2->touched;
+	e1->color = e2->color;
+	e1->essential = e2->essential;
+	e1->varCount = e2->varCount;
+
+	//int s = nVars + 1;
+
+	// for # vars
+	for (int i = 0; i <= nVars; i++)
+		e1->coef[i] = e2->coef[i];
+}
+
+
+// NOTE: VERY BAD UNTYPESAFE ZEROING OF eqn
+//#define eqnnzero(e,s) {int *p00,*r00; p00 = (int *)(e); r00 = &p00[headerWords+1+(s)]; while(p00 < r00) *p00++ = 0;}
 #define eqnzero(e) eqnnzero(e,nVars)
 
+inline void eqnnzero(eqn* e, int nVars) {
+
+	// header
+	e->key = 0;	
+	e->touched = 0;
+	e->color = 0;
+	e->essential = 0;
+	e->varCount = 0;
+
+	//int s = nVars + 1;
+	
+	// for # vars
+	for (int i = 0; i <= nVars; i++)
+		e->coef[i] = 0;
+}
+
+
 extern int mayBeRed;
 
 #ifdef SPEED
@@ -220,8 +268,9 @@
 void query_difference(int v1, int v2,
         coef_t &lowerBound, coef_t &upperBound, bool &guaranteed);
 int solve(int desiredResult);
-String print_term_to_string(const eqn *e, int c) const;
+ String print_term_to_string(const eqn *e, int c) const;
 void printTerm(const eqn * e, int c) const;
+void printTerm(const eqn * e, coef_t c) const; // TODO:
 String printEqnToString(const eqn * e, int test, int extra) const;
 void sprintEqn(char *str, const eqn * e, int is_geq,int extra) const;
 void printEqn(const eqn * e, int is_geq, int extra) const;
@@ -273,7 +322,7 @@
                    coef_t &lbSplinters,
                    coef_t &ubSplinters,
                    int &parallelLB);
-int parallelSplinter(int e, int diff, int desiredResult);
+int parallelSplinter(int e, coef_t& diff, int desiredResult);
 int solveGEQ( int desiredResult);
 void setInternals();
 void setExternals();
diff -Naur omega/omega_lib/include/omega/pres_conj.h omega/omega_lib/include/omega/pres_conj.h
--- omega/omega_lib/include/omega/pres_conj.h	Tue Oct 29 13:16:29 2002
+++ omega/omega_lib/include/omega/pres_conj.h	Tue Oct 22 14:25:59 2002
@@ -127,7 +127,7 @@
 
       // create new constraints with all co-efficients 0
       // These are public in F_And, use them from there.
-  EQ_Handle   add_stride(int step, int preserves_level = 0);
+  EQ_Handle   add_stride(coef_t& step, int preserves_level = 0);
   EQ_Handle   add_EQ(int preserves_level = 0);
   GEQ_Handle  add_GEQ(int preserves_level = 0);
   EQ_Handle   add_EQ(const Constraint_Handle &c, int preserves_level = 0);
diff -Naur omega/omega_lib/include/omega/pres_logic.h omega/omega_lib/include/omega/pres_logic.h
--- omega/omega_lib/include/omega/pres_logic.h	Tue Oct 29 13:16:29 2002
+++ omega/omega_lib/include/omega/pres_logic.h	Tue Oct 22 14:25:59 2002
@@ -23,7 +23,7 @@
     // leading corresponding in,out variables known to be equal
     GEQ_Handle     add_GEQ(int preserves_level = 0);
     EQ_Handle      add_EQ(int preserves_level = 0);
-    Stride_Handle  add_stride(int step, int preserves_level = 0);
+    Stride_Handle  add_stride(coef_t& step, int preserves_level = 0);
     EQ_Handle   add_EQ(const Constraint_Handle &c, int preserves_level = 0);
     GEQ_Handle  add_GEQ(const Constraint_Handle &c, int preserves_level = 0);
 
diff -Naur omega/basic/include/basic/String.h omega/basic/include/basic/String.h
--- omega/basic/include/basic/String.h	Tue Oct 29 13:13:13 2002
+++ omega/basic/include/basic/String.h	Fri Oct 18 11:56:51 2002
@@ -86,6 +86,11 @@
 inline String itoS(LONGLONG i) 
   { char t[65]; sprintf(t,"%lld",i); return t;}
 
+inline String itoS(BigInt& b)
+  {
+	  return b.toCharArray();
+  }
+
 #if defined SCREWED_UP_CASTING_RULES
 static int	operator==(const String &x, const char *y)
 		    { return x == (String) y; }
diff -Naur omega/basic/include/basic/util.h omega/basic/include/basic/util.h
--- omega/basic/include/basic/util.h	Tue Oct 29 13:13:13 2002
+++ omega/basic/include/basic/util.h	Fri Oct 18 11:56:51 2002
@@ -32,6 +32,9 @@
 
 #include <basic/assert.h>
 
+#include <gmp++.h>
+
+
 #ifdef __SUNPRO_CC
 template<class T,class S> inline T max(T x, S y) {
 	if (x >= y) return x; else return y;
@@ -84,6 +87,14 @@
     return x * y;
 }
 
+
+inline BigInt&
+check_pos_mul(BigInt& x, BigInt& y) {
+
+	return x*y;
+}
+
+
 inline LONGLONG
 check_pos_mul(LONGLONG x, LONGLONG y) {
 #if !defined NDEBUG
diff -Naur omega/omega_lib/src/pres_dnf.c omega/omega_lib/src/pres_dnf.c
--- omega/omega_lib/src/pres_dnf.c	Fri Nov  1 16:06:18 2002
+++ omega/omega_lib/src/pres_dnf.c	Fri Jul 25 15:12:45 2003
@@ -846,7 +846,8 @@
 		    (*pc) = 0;
 		    }
 		}
-	    else if(positive_conjunct==NULL && neg_conjs->is_definitely_false()) {
+	    else if(positive_conjunct==NULL && neg_conjs->is_definitely_false()
+				&& !pos_dnfs.empty()) { // empty cond added by Ed check on this bp 849
 		pos_dnf_i = List_Iterator<DNF*>(pos_dnfs);
 		new_dnf = *pos_dnf_i;
 	        *pos_dnf_i = NULL;
