Turns out the recent IRStmt_NoOp hackery broke the IR optimiser quite
seriously.  It was still transforming correctly, but many of the
transformations had been hampered by no longer being able to recognise
no-ops properly.  This hopefully fixes it.



git-svn-id: svn://svn.valgrind.org/vex/trunk@1069 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/ir/iropt.c b/priv/ir/iropt.c
index 407e4e0..c652f9b 100644
--- a/priv/ir/iropt.c
+++ b/priv/ir/iropt.c
@@ -529,7 +529,7 @@
    for (i = 0; i < bb->stmts_used; i++) {
       IRStmt* st = bb->stmts[i];
 
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
 
       /* Deal with Gets */
@@ -759,7 +759,8 @@
    HashHW* env = newHHW();
    for (i = bb->stmts_used-1; i >= 0; i--) {
       st = bb->stmts[i];
-      if (!st)
+
+      if (st->tag == Ist_NoOp)
          continue;
 
       /* Deal with conditional exits. */
@@ -1520,12 +1521,12 @@
       st2 = in->stmts[i];
 
       /* perhaps st2 is already a no-op? */
-      if (!st2) continue;
+      if (st2->tag == Ist_NoOp) continue;
 
       st2 = subst_and_fold_Stmt( env, st2 );
 
       /* If the statement has been folded into a no-op, forget it. */
-      if (!st2) continue;
+      if (st2->tag == Ist_NoOp) continue;
 
       /* Now consider what the stmt looks like.  If it's of the form
          't = const' or 't1 = t2', add it to the running environment
@@ -1687,7 +1688,7 @@
    /* Work backwards through the stmts */
    for (i = bb->stmts_used-1; i >= 0; i--) {
       st = bb->stmts[i];
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
       if (st->tag == Ist_Tmp
           && set[(Int)(st->Ist.Tmp.tmp)] == False) {
@@ -1731,10 +1732,9 @@
    for (i = bb->stmts_used-1; i >= 0; i--) {
       st = bb->stmts[i];
 
-      if (!st 
-          || st->tag != Ist_Tmp
+      if (st->tag != Ist_Tmp
           || st->Ist.Tmp.data->tag != Iex_CCall)
-        continue;
+         continue;
 
       ex = (*specHelper)( st->Ist.Tmp.data->Iex.CCall.cee->name,
                           st->Ist.Tmp.data->Iex.CCall.args );
@@ -1991,7 +1991,7 @@
       st = bb->stmts[i];
 
       /* ignore not-interestings */
-      if ((!st) || st->tag != Ist_Tmp)
+      if (st->tag != Ist_Tmp)
          continue;
 
       t = st->Ist.Tmp.tmp;
@@ -2083,7 +2083,7 @@
      +/- a constant. */
    for (j = startHere; j >= 0; j--) {
       st = bb->stmts[j];
-      if (!st || st->tag != Ist_Tmp) 
+      if (st->tag != Ist_Tmp) 
          continue;
       if (st->Ist.Tmp.tmp != var)
          continue;
@@ -2117,7 +2117,7 @@
 
    for (i = bb->stmts_used-1; i >= 0; i--) {
       st = bb->stmts[i];
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
 
       /* Try to collapse 't1 = Add32/Sub32(t2, con)'. */
@@ -2347,7 +2347,8 @@
 
    for (j = startHere; j >= 0; j--) {
       st = bb->stmts[j];
-      if (!st) continue;
+      if (st->tag == Ist_NoOp) 
+         continue;
 
       if (st->tag == Ist_Put) {
          /* Non-indexed Put.  This can't give a binding, but we do
@@ -2544,7 +2545,7 @@
 
    for (i = bb->stmts_used-1; i >= 0; i--) {
       st = bb->stmts[i];
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
 
       if (st->tag == Ist_Tmp
@@ -2585,7 +2586,7 @@
 
    for (i = 0; i < bb->stmts_used; i++) {
       st = bb->stmts[i];
-      if (!st || st->tag != Ist_PutI)
+      if (st->tag != Ist_PutI)
          continue;
       /* Ok, search forwards from here to see if we can find another
          PutI which makes this one redundant, and dodging various 
@@ -2603,7 +2604,7 @@
       delete = False;
       for (j = i+1; j < bb->stmts_used; j++) {
          stj = bb->stmts[j];
-         if (!stj) 
+         if (stj->tag == Ist_NoOp) 
             continue;
          if (identicalPutIs(st, stj)) {
             /* success! */
@@ -2932,8 +2933,6 @@
          (void)newIRTemp(bb1->tyenv, bb2->tyenv->types[i]);
 
       for (i = 0; i < bb2->stmts_used; i++) {
-         if (bb2->stmts[i] == NULL)
-            continue;
          /* deltaIRStmt destructively modifies the stmt, but 
             that's OK since bb2 is a complete fresh copy of bb1. */
          deltaIRStmt(bb2->stmts[i], n_vars);
@@ -3305,7 +3304,7 @@
 
       /* No more binds to invalidate. */
       if (oldest_op == 1<<30)
-        return;
+         return;
 
       /* the oldest bind to invalidate has been identified */
       vassert(oldest_op != 1<<31 && oldest_k != 1<<31);
@@ -3345,7 +3344,7 @@
 
    for (i = 0; i < bb->stmts_used; i++) {
       st = bb->stmts[i];
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
       occCount_Stmt( env, st );
    }
@@ -3364,8 +3363,6 @@
 
    for (i = 0; i < bb->stmts_used; i++) {
       st = bb->stmts[i];
-      if (!st)
-         continue;
       if (st->tag != Ist_Tmp)
          continue;
 
@@ -3404,7 +3401,7 @@
    j = 0;
    for (i = 0; i < bb->stmts_used; i++) {
       st = bb->stmts[i];
-      if (!st)
+      if (st->tag == Ist_NoOp)
          continue;
      
       if (st->tag == Ist_Tmp) {
@@ -3579,9 +3576,6 @@
 
    for (i = 0; i < bb->stmts_used; i++) {
       st = bb->stmts[i];
-      if (!st)
-         continue;
-
       switch (st->tag) {
          case Ist_PutI: 
             return True;