summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-upgrade
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-01-01 01:20:16 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-01-01 01:20:16 +0000
commit1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9 (patch)
treed0c2c935c4d16059e2215f22d48f02b993ae5f85 /llvm/tools/llvm-upgrade
parente8a74ee5eacf0043347df189837c3eb01c759f23 (diff)
downloadbcm5719-llvm-1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9.tar.gz
bcm5719-llvm-1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9.zip
For PR1070:
Remove useless bitcasts by commenting them out. llvm-svn: 32804
Diffstat (limited to 'llvm/tools/llvm-upgrade')
-rw-r--r--llvm/tools/llvm-upgrade/UpgradeParser.y35
1 files changed, 33 insertions, 2 deletions
diff --git a/llvm/tools/llvm-upgrade/UpgradeParser.y b/llvm/tools/llvm-upgrade/UpgradeParser.y
index de8df5246a0..761bda1cdfc 100644
--- a/llvm/tools/llvm-upgrade/UpgradeParser.y
+++ b/llvm/tools/llvm-upgrade/UpgradeParser.y
@@ -38,6 +38,15 @@ static uint64_t unique = 1;
// 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 @@ JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
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 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
} 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();
}
OpenPOWER on IntegriCloud