[llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeParser.y

Reid Spencer reid at x10sys.com
Sun Dec 31 17:20:31 PST 2006



Changes in directory llvm/tools/llvm-upgrade:

UpgradeParser.y updated: 1.27 -> 1.28
---
Log message:

For PR1070: http://llvm.org/PR1070 :
Remove useless bitcasts by commenting them out.


---
Diffs of the changes:  (+33 -2)

 UpgradeParser.y |   35 +++++++++++++++++++++++++++++++++--
 1 files changed, 33 insertions(+), 2 deletions(-)


Index: llvm/tools/llvm-upgrade/UpgradeParser.y
diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.27 llvm/tools/llvm-upgrade/UpgradeParser.y:1.28
--- llvm/tools/llvm-upgrade/UpgradeParser.y:1.27	Sat Dec 30 23:45:57 2006
+++ llvm/tools/llvm-upgrade/UpgradeParser.y	Sun Dec 31 19:20:16 2006
@@ -38,6 +38,15 @@
 // definitions and calls.
 static bool AddAttributes = false;
 
+// This bool is used to communicate between the InstVal and Inst rules about
+// whether or not a cast should be deleted. When the flag is set, InstVal has
+// determined that the cast is a candidate. However, it can only be deleted if
+// the value being casted is the same value name as the instruction. The Inst
+// rule makes that comparison if the flag is set and comments out the
+// instruction if they match.
+static bool deleteUselessCastFlag = false;
+static std::string* deleteUselessCastName = 0;
+
 typedef std::vector<TypeInfo> TypeVector;
 static TypeVector EnumeratedTypes;
 typedef std::map<std::string,TypeInfo> TypeMap;
@@ -1152,10 +1161,18 @@
 
 Inst 
   : OptAssign InstVal {
-    if (!$1->empty())
-      *$1 += " = ";
+    if (!$1->empty()) {
+      if (deleteUselessCastFlag && *deleteUselessCastName == *$1) {
+        *$1 += " = ";
+        $1->insert(0, "; "); // don't actually delete it, just comment it out
+        delete deleteUselessCastName;
+      } else {
+        *$1 += " = ";
+      }
+    }
     *$1 += *$2;
     delete $2;
+    deleteUselessCastFlag = false;
     $$ = $1; 
   };
 
@@ -1250,6 +1267,20 @@
     } else {
       *$$ += *$1 + " " + source + " to " + *DstTy.newTy;
     }
+    // Check to see if this is a useless cast of a value to the same name
+    // and the same type. Such casts will probably cause redefinition errors
+    // when assembled and perform no code gen action so just remove them.
+    if (*$1 == "cast" || *$1 == "bitcast")
+      if ($2.type.isInteger() && $4.isInteger() &&
+          $2.type.getBitWidth() == $4.getBitWidth()) {
+        deleteUselessCastFlag = true; // Flag the "Inst" rule
+        deleteUselessCastName = new std::string(*$2.val); // save the name
+        size_t pos = deleteUselessCastName->find_first_of("%\"",0);
+        if (pos != std::string::npos) {
+          // remove the type portion before val
+          deleteUselessCastName->erase(0, pos);
+        }
+      }
     delete $1; $2.destroy();
     delete $3; $4.destroy();
   }






More information about the llvm-commits mailing list