diff options
| author | Reid Spencer <rspencer@reidspencer.com> | 2007-01-01 01:20:16 +0000 |
|---|---|---|
| committer | Reid Spencer <rspencer@reidspencer.com> | 2007-01-01 01:20:16 +0000 |
| commit | 1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9 (patch) | |
| tree | d0c2c935c4d16059e2215f22d48f02b993ae5f85 /llvm | |
| parent | e8a74ee5eacf0043347df189837c3eb01c759f23 (diff) | |
| download | bcm5719-llvm-1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9.tar.gz bcm5719-llvm-1a5d6f56e2537e9ae4d0260c57c4449527d4c2d9.zip | |
For PR1070:
Remove useless bitcasts by commenting them out.
llvm-svn: 32804
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/tools/llvm-upgrade/UpgradeParser.y | 35 |
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(); } |

