From 16222c006d63f8b351263c612461424a288ccae5 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 1 Jan 2007 01:20:16 +0000 Subject: [PATCH] For PR1070: Remove useless bitcasts by commenting them out. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32804 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-upgrade/UpgradeParser.y | 35 ++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/tools/llvm-upgrade/UpgradeParser.y b/tools/llvm-upgrade/UpgradeParser.y index de8df5246a0..761bda1cdfc 100644 --- a/tools/llvm-upgrade/UpgradeParser.y +++ b/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 TypeVector; static TypeVector EnumeratedTypes; typedef std::map 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(); }