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

Reid Spencer reid at x10sys.com
Sat Dec 2 08:19:42 PST 2006



Changes in directory llvm/tools/llvm-upgrade:

UpgradeParser.y updated: 1.12 -> 1.13
ParserInternals.h updated: 1.5 -> 1.6
UpgradeParser.h updated: 1.8 -> 1.9
---
Log message:

Implement the GEP upgrade for non-constant unsigned indices


---
Diffs of the changes:  (+87 -56)

 ParserInternals.h |    2 
 UpgradeParser.h   |    2 
 UpgradeParser.y   |  139 ++++++++++++++++++++++++++++++++----------------------
 3 files changed, 87 insertions(+), 56 deletions(-)


Index: llvm/tools/llvm-upgrade/UpgradeParser.y
diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.12 llvm/tools/llvm-upgrade/UpgradeParser.y:1.13
--- llvm/tools/llvm-upgrade/UpgradeParser.y:1.12	Sat Dec  2 09:16:01 2006
+++ llvm/tools/llvm-upgrade/UpgradeParser.y	Sat Dec  2 10:19:28 2006
@@ -31,6 +31,7 @@
 static std::ostream *O = 0;
 std::istream* LexInput = 0;
 unsigned SizeOfPointer = 32;
+static uint64_t unique = 1;
 
 typedef std::vector<TypeInfo> TypeVector;
 static TypeVector EnumeratedTypes;
@@ -173,8 +174,9 @@
     if (isConst)
       Source = "ulong fptoui(" + Source + " to ulong)";
     else {
-      *O << "    %cast_upgrade = fptoui " + Source + " to ulong\n";
-      Source = "ulong %cast_upgrade";
+      *O << "    %cast_upgrade" << unique << " = fptoui " << Source 
+         << " to ulong\n";
+      Source = "ulong %cast_upgrade" + llvm::utostr(unique);
     }
     // Update the SrcTy for the getCastOpcode call below
     SrcTy.destroy();
@@ -248,7 +250,7 @@
 %type <String> OptTailCall InstVal OptVolatile
 %type <String> MemoryInst SymbolicValueRef OptSideEffect GlobalType
 %type <String> FnDeclareLinkage BasicBlockList BigOrLittle AsmBlock
-%type <String> Name ValueRef ConstValueRef ConstVector
+%type <String> Name ConstValueRef ConstVector
 %type <String> ShiftOps SetCondOps LogicalOps ArithmeticOps CastOps 
 
 %type <ValList> ValueRefList ValueRefListE IndexList
@@ -259,7 +261,7 @@
 %type <String> IntVal EInt64Val 
 %type <Const>  ConstVal
 
-%type <Value> ResolvedVal
+%type <Value> ValueRef ResolvedVal 
 
 %start Module
 
@@ -905,17 +907,28 @@
 SymbolicValueRef : IntVal | Name ;
 
 // ValueRef - A reference to a definition... either constant or symbolic
-ValueRef : SymbolicValueRef | ConstValueRef;
-
+ValueRef 
+  : SymbolicValueRef {
+    $$.val = $1;
+    $$.constant = false;
+    $$.type.newTy = 0;
+    $$.type.oldTy = UnresolvedTy;
+  }
+  | ConstValueRef {
+    $$.val = $1;
+    $$.constant = true;
+    $$.type.newTy = 0;
+    $$.type.oldTy = UnresolvedTy;
+  }
+  ;
 
 // ResolvedVal - a <type> <value> pair.  This is used only in cases where the
 // type immediately preceeds the value reference, and allows complex constant
 // pool references (for things like: 'ret [2 x int] [ int 12, int 42]')
 ResolvedVal : Types ValueRef {
+    $$ = $2;
     $$.type = $1;
-    $$.val = new std::string(*$1.newTy + " ");
-    *$$.val += *$2;
-    delete $2;
+    $$.val->insert(0, *$1.newTy + " ");
   };
 
 BasicBlockList : BasicBlockList BasicBlock {
@@ -958,27 +971,29 @@
     $$ = 0;
   }
   | BR LABEL ValueRef {                         // Unconditional Branch...
-    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3 << "\n";
-    delete $1; $2.destroy(); delete $3;
+    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3.val << "\n";
+    delete $1; $2.destroy(); $3.destroy();
     $$ = 0;
   }                                                  // Conditional Branch...
   | BR BOOL ValueRef ',' LABEL ValueRef ',' LABEL ValueRef {  
-    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3 << ", " 
-       << *$5.newTy << " " << *$6 << ", " << *$8.newTy << " " << *$9 << "\n";
-    delete $1; $2.destroy(); delete $3; $5.destroy(); delete $6; 
-    $8.destroy(); delete $9;
+    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3.val << ", " 
+       << *$5.newTy << " " << *$6.val << ", " << *$8.newTy << " " 
+       << *$9.val << "\n";
+    delete $1; $2.destroy(); $3.destroy(); $5.destroy(); $6.destroy(); 
+    $8.destroy(); $9.destroy();
     $$ = 0;
   }
   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' JumpTable ']' {
-    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3 << ", " << *$5.newTy 
-       << " " << *$6 << " [" << *$8 << " ]\n";
-    delete $1; $2.destroy(); delete $3; $5.destroy(); delete $6; delete $8;
+    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3.val << ", " 
+       << *$5.newTy << " " << *$6.val << " [" << *$8 << " ]\n";
+    delete $1; $2.destroy(); $3.destroy(); $5.destroy(); $6.destroy(); 
+    delete $8;
     $$ = 0;
   }
   | SWITCH IntType ValueRef ',' LABEL ValueRef '[' ']' {
-    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3 << ", " 
-       << *$5.newTy << " " << *$6 << "[]\n";
-    delete $1; $2.destroy(); delete $3; $5.destroy(); delete $6;
+    *O << "    " << *$1 << " " << *$2.newTy << " " << *$3.val << ", " 
+       << *$5.newTy << " " << *$6.val << "[]\n";
+    delete $1; $2.destroy(); $3.destroy(); $5.destroy(); $6.destroy();
     $$ = 0;
   }
   | OptAssign INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
@@ -986,7 +1001,7 @@
     *O << "    ";
     if (!$1->empty())
       *O << *$1 << " = ";
-    *O << *$2 << " " << *$3 << " " << *$4.newTy << " " << *$5 << " (";
+    *O << *$2 << " " << *$3 << " " << *$4.newTy << " " << *$5.val << " (";
     for (unsigned i = 0; i < $7->size(); ++i) {
       ValueInfo& VI = (*$7)[i];
       *O << *VI.val;
@@ -994,11 +1009,11 @@
         *O << ", ";
       VI.destroy();
     }
-    *O << ") " << *$9 << " " << *$10.newTy << " " << *$11 << " " 
-       << *$12 << " " << *$13.newTy << " " << *$14 << "\n";
-    delete $1; delete $2; delete $3; $4.destroy(); delete $5; delete $7; 
-    delete $9; $10.destroy(); delete $11; delete $12; $13.destroy(); 
-    delete $14; 
+    *O << ") " << *$9 << " " << *$10.newTy << " " << *$11.val << " " 
+       << *$12 << " " << *$13.newTy << " " << *$14.val << "\n";
+    delete $1; delete $2; delete $3; $4.destroy(); $5.destroy(); delete $7; 
+    delete $9; $10.destroy(); $11.destroy(); delete $12; $13.destroy(); 
+    $14.destroy(); 
     $$ = 0;
   }
   | UNWIND {
@@ -1013,14 +1028,14 @@
   };
 
 JumpTable : JumpTable IntType ConstValueRef ',' LABEL ValueRef {
-    *$1 += " " + *$2.newTy + " " + *$3 + ", " + *$5.newTy + " " + *$6;
-    $2.destroy(); delete $3; $5.destroy(); delete $6;
+    *$1 += " " + *$2.newTy + " " + *$3 + ", " + *$5.newTy + " " + *$6.val;
+    $2.destroy(); delete $3; $5.destroy(); $6.destroy();
     $$ = $1;
   }
   | IntType ConstValueRef ',' LABEL ValueRef {
     $2->insert(0, *$1.newTy + " " );
-    *$2 += ", " + *$4.newTy + " " + *$5;
-    $1.destroy(); $4.destroy(); delete $5;
+    *$2 += ", " + *$4.newTy + " " + *$5.val;
+    $1.destroy(); $4.destroy(); $5.destroy();
     $$ = $2;
   };
 
@@ -1035,14 +1050,15 @@
 
 PHIList 
   : Types '[' ValueRef ',' ValueRef ']' {    // Used for PHI nodes
-    $3->insert(0, *$1.newTy + "[");
-    *$3 += "," + *$5 + "]";
-    $1.destroy(); delete $5;
-    $$ = $3;
+    $3.val->insert(0, *$1.newTy + "[");
+    *$3.val += "," + *$5.val + "]";
+    $1.destroy(); $5.destroy();
+    $$ = new std::string(*$3.val);
+    $3.destroy();
   }
   | PHIList ',' '[' ValueRef ',' ValueRef ']' {
-    *$1 += ", [" + *$4 + "," + *$6 + "]";
-    delete $4; delete $6;
+    *$1 += ", [" + *$4.val + "," + *$6.val + "]";
+    $4.destroy(); $6.destroy();
     $$ = $1;
   };
 
@@ -1073,18 +1089,18 @@
   ;
 
 InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
-    *$1 += " " + *$2.newTy + " " + *$3 + ", " + *$5;
-    $2.destroy(); delete $3; delete $5;
+    *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;
+    $2.destroy(); $3.destroy(); $5.destroy();
     $$ = $1;
   }
   | LogicalOps Types ValueRef ',' ValueRef {
-    *$1 += " " + *$2.newTy + " " + *$3 + ", " + *$5;
-    $2.destroy(); delete $3; delete $5;
+    *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;
+    $2.destroy(); $3.destroy(); $5.destroy();
     $$ = $1;
   }
   | SetCondOps Types ValueRef ',' ValueRef {
-    *$1 += " " + *$2.newTy + " " + *$3 + ", " + *$5;
-    $2.destroy(); delete $3; delete $5;
+    *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;
+    $2.destroy(); $3.destroy(); $5.destroy();
     $$ = $1;
   }
   | NOT ResolvedVal {
@@ -1149,7 +1165,7 @@
       *$1 += " " + *$2;
     if (!$1->empty())
       *$1 += " ";
-    *$1 += *$3.newTy + " " + *$4 + "(";
+    *$1 += *$3.newTy + " " + *$4.val + "(";
     for (unsigned i = 0; i < $6->size(); ++i) {
       ValueInfo& VI = (*$6)[i];
       *$1 += *VI.val;
@@ -1158,7 +1174,7 @@
       VI.destroy();
     }
     *$1 += ")";
-    delete $2; $3.destroy(); delete $4; delete $6;
+    delete $2; $3.destroy(); $4.destroy(); delete $6;
     $$ = $1;
   }
   | MemoryInst ;
@@ -1183,10 +1199,10 @@
     $$ = $1;
   }
   | MALLOC Types ',' UINT ValueRef OptCAlign {
-    *$1 += " " + *$2.newTy + ", " + *$4.newTy + " " + *$5;
+    *$1 += " " + *$2.newTy + ", " + *$4.newTy + " " + *$5.val;
     if (!$6->empty())
       *$1 += " " + *$6;
-    $2.destroy(); $4.destroy(); delete $5; delete $6;
+    $2.destroy(); $4.destroy(); $5.destroy(); delete $6;
     $$ = $1;
   }
   | ALLOCA Types OptCAlign {
@@ -1197,10 +1213,10 @@
     $$ = $1;
   }
   | ALLOCA Types ',' UINT ValueRef OptCAlign {
-    *$1 += " " + *$2.newTy + ", " + *$4.newTy + " " + *$5;
+    *$1 += " " + *$2.newTy + ", " + *$4.newTy + " " + *$5.val;
     if (!$6->empty())
       *$1 += " " + *$6;
-    $2.destroy(); $4.destroy(); delete $5; delete $6;
+    $2.destroy(); $4.destroy(); $5.destroy(); delete $6;
     $$ = $1;
   }
   | FREE ResolvedVal {
@@ -1211,25 +1227,38 @@
   | OptVolatile LOAD Types ValueRef {
     if (!$1->empty())
       *$1 += " ";
-    *$1 += *$2 + " " + *$3.newTy + " " + *$4;
-    delete $2; $3.destroy(); delete $4;
+    *$1 += *$2 + " " + *$3.newTy + " " + *$4.val;
+    delete $2; $3.destroy(); $4.destroy();
     $$ = $1;
   }
   | OptVolatile STORE ResolvedVal ',' Types ValueRef {
     if (!$1->empty())
       *$1 += " ";
-    *$1 += *$2 + " " + *$3.val + ", " + *$5.newTy + " " + *$6;
-    delete $2; $3.destroy(); $5.destroy(); delete $6;
+    *$1 += *$2 + " " + *$3.val + ", " + *$5.newTy + " " + *$6.val;
+    delete $2; $3.destroy(); $5.destroy(); $6.destroy();
     $$ = $1;
   }
   | GETELEMENTPTR Types ValueRef IndexList {
-    *$1 += " " + *$2.newTy + " " + *$3;
+    // Upgrade the indices
+    for (unsigned i = 0; i < $4->size(); ++i) {
+      ValueInfo& VI = (*$4)[i];
+      if (VI.type.isUnsigned() && !VI.isConstant() && 
+          VI.type.getBitWidth() < 64) {
+        std::string* old = VI.val;
+        *O << "    %gep_upgrade" << unique << " = zext " << *old 
+           << " to ulong\n";
+        VI.val = new std::string("ulong %gep_upgrade" + llvm::utostr(unique++));
+        VI.type.oldTy = ULongTy;
+        delete old;
+      }
+    }
+    *$1 += " " + *$2.newTy + " " + *$3.val;
     for (unsigned i = 0; i < $4->size(); ++i) {
       ValueInfo& VI = (*$4)[i];
       *$1 += ", " + *VI.val;
       VI.destroy();
     }
-    $2.destroy(); delete $3; delete $4;
+    $2.destroy(); $3.destroy(); delete $4;
     $$ = $1;
   };
 


Index: llvm/tools/llvm-upgrade/ParserInternals.h
diff -u llvm/tools/llvm-upgrade/ParserInternals.h:1.5 llvm/tools/llvm-upgrade/ParserInternals.h:1.6
--- llvm/tools/llvm-upgrade/ParserInternals.h:1.5	Sat Dec  2 09:16:01 2006
+++ llvm/tools/llvm-upgrade/ParserInternals.h	Sat Dec  2 10:19:28 2006
@@ -101,6 +101,8 @@
 struct ValueInfo {
   std::string* val;
   TypeInfo type;
+  bool constant;
+  bool isConstant() const { return constant; }
   void destroy() { delete val; type.destroy(); }
 };
 


Index: llvm/tools/llvm-upgrade/UpgradeParser.h
diff -u llvm/tools/llvm-upgrade/UpgradeParser.h:1.8 llvm/tools/llvm-upgrade/UpgradeParser.h:1.9
--- llvm/tools/llvm-upgrade/UpgradeParser.h:1.8	Sat Dec  2 09:16:01 2006
+++ llvm/tools/llvm-upgrade/UpgradeParser.h	Sat Dec  2 10:19:28 2006
@@ -281,7 +281,7 @@
 
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 209 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeParser.y"
+#line 211 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeParser.y"
 typedef union YYSTYPE {
   std::string*    String;
   TypeInfo        Type;






More information about the llvm-commits mailing list