[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