diff --git a/llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs b/llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs
index 24eb84e..a5d5f04 100644
--- a/llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs
+++ b/llvm/tools/llvm-upgrade/UpgradeParser.cpp.cvs
@@ -1,7 +1,9 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,13 +20,21 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
 
-/* Written by Richard Stallman by simplifying the original so called
-   ``semantic'' parser.  */
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
@@ -37,7 +47,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.1"
+#define YYBISON_VERSION "2.3"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -370,7 +380,7 @@
 
 
 /* Copy the first part of user declarations.  */
-#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 14 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
 
 #include "UpgradeInternals.h"
 #include "llvm/CallingConv.h"
@@ -930,7 +940,6 @@
   }
 }
 
-/// @brief This just makes any name given to it unique, up to MAX_UINT times.
 static std::string makeNameUnique(const std::string& Name) {
   static unsigned UniqueNameCounter = 1;
   std::string Result(Name);
@@ -938,57 +947,6 @@
   return Result;
 }
 
-/// This is the implementation portion of TypeHasInteger. It traverses the
-/// type given, avoiding recursive types, and returns true as soon as it finds
-/// an integer type. If no integer type is found, it returns false.
-static bool TypeHasIntegerI(const Type *Ty, std::vector<const Type*> Stack) {
-  // Handle some easy cases
-  if (Ty->isPrimitiveType() || (Ty->getTypeID() == Type::OpaqueTyID))
-    return false;
-  if (Ty->isInteger())
-    return true;
-  if (const SequentialType *STy = dyn_cast<SequentialType>(Ty))
-    return STy->getElementType()->isInteger();
-
-  // Avoid type structure recursion
-  for (std::vector<const Type*>::iterator I = Stack.begin(), E = Stack.end();
-       I != E; ++I)
-    if (Ty == *I)
-      return false;
-
-  // Push us on the type stack
-  Stack.push_back(Ty);
-
-  if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
-    if (TypeHasIntegerI(FTy->getReturnType(), Stack)) 
-      return true;
-    FunctionType::param_iterator I = FTy->param_begin();
-    FunctionType::param_iterator E = FTy->param_end();
-    for (; I != E; ++I)
-      if (TypeHasIntegerI(*I, Stack))
-        return true;
-    return false;
-  } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
-    StructType::element_iterator I = STy->element_begin();
-    StructType::element_iterator E = STy->element_end();
-    for (; I != E; ++I) {
-      if (TypeHasIntegerI(*I, Stack))
-        return true;
-    }
-    return false;
-  }
-  // There shouldn't be anything else, but its definitely not integer
-  assert(0 && "What type is this?");
-  return false;
-}
-
-/// This is the interface to TypeHasIntegerI. It just provides the type stack,
-/// to avoid recursion, and then calls TypeHasIntegerI.
-static inline bool TypeHasInteger(const Type *Ty) {
-  std::vector<const Type*> TyStack;
-  return TypeHasIntegerI(Ty, TyStack);
-}
-
 // setValueName - Set the specified value to the name given.  The name may be
 // null potentially, in which case this is a noop.  The string passed in is
 // assumed to be a malloc'd string buffer, and is free'd by this function.
@@ -1017,16 +975,16 @@
       }
     }
     if (Existing) {
-      // An existing value of the same name was found. This might have happened
-      // because of the integer type planes collapsing in LLVM 2.0. 
-      if (Existing->getType() == V->getType() &&
-          !TypeHasInteger(Existing->getType())) {
-        // If the type does not contain any integers in them then this can't be
-        // a type plane collapsing issue. It truly is a redefinition and we 
-        // should error out as the assembly is invalid.
-        error("Redefinition of value named '" + Name + "' of type '" +
-              V->getType()->getDescription() + "'");
-        return;
+      if (Existing->getType() == V->getType()) {
+        // The type of the Existing value and the new one are the same. This
+        // is probably a type plane collapsing error. If the types involved
+        // are both integer, just rename it. Otherwise it 
+        // is a redefinition error.
+        if (!Existing->getType()->isInteger()) {
+          error("Redefinition of value named '" + Name + "' in the '" +
+                V->getType()->getDescription() + "' type plane");
+          return;
+        }
       } 
       // In LLVM 2.0 we don't allow names to be re-used for any values in a 
       // function, regardless of Type. Previously re-use of names was okay as 
@@ -1766,9 +1724,10 @@
 # define YYTOKEN_TABLE 0
 #endif
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 1391 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-typedef union YYSTYPE {
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 1339 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+{
   llvm::Module                           *ModuleVal;
   llvm::Function                         *FunctionVal;
   std::pair<llvm::PATypeInfo, char*>     *ArgVal;
@@ -1808,9 +1767,10 @@
   llvm::ICmpInst::Predicate         IPred;
   llvm::FCmpInst::Predicate         FPred;
   llvm::Module::Endianness          Endianness;
-} YYSTYPE;
-/* Line 196 of yacc.c.  */
-#line 1814 "UpgradeParser.tab.c"
+}
+/* Line 187 of yacc.c.  */
+#line 1773 "UpgradeParser.tab.c"
+	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -1821,23 +1781,56 @@
 /* Copy the second part of user declarations.  */
 
 
-/* Line 219 of yacc.c.  */
-#line 1826 "UpgradeParser.tab.c"
+/* Line 216 of yacc.c.  */
+#line 1786 "UpgradeParser.tab.c"
 
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
+#ifdef short
+# undef short
 #endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
 #endif
-#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
 #endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
 #endif
 
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
 #ifndef YY_
 # if YYENABLE_NLS
 #  if ENABLE_NLS
@@ -1850,7 +1843,32 @@
 # endif
 #endif
 
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -1858,64 +1876,76 @@
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if defined (__STDC__) || defined (__cplusplus)
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     define YYINCLUDED_STDLIB_H
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
 #    endif
 #   endif
 #  endif
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
 #  define YYSTACK_FREE YYFREE
 #  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
 #  endif
-#  ifdef __cplusplus
-extern "C" {
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
-#  ifdef __cplusplus
-}
-#  endif
 # endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
 
 
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
+  yytype_int16 yyss;
   YYSTYPE yyvs;
   };
 
@@ -1925,13 +1955,13 @@
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -1942,7 +1972,7 @@
 	  for (yyi = 0; yyi < (Count); yyi++)	\
 	    (To)[yyi] = (From)[yyi];		\
 	}					\
-      while (0)
+      while (YYID (0))
 #  endif
 # endif
 
@@ -1960,28 +1990,22 @@
 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
-    while (0)
+    while (YYID (0))
 
 #endif
 
-#if defined (__STDC__) || defined (__cplusplus)
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
-#endif
-
-/* YYFINAL -- State number of the termination state. */
+/* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  4
 /* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   1712
 
-/* YYNTOKENS -- Number of terminals. */
+/* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  166
-/* YYNNTS -- Number of nonterminals. */
+/* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  79
-/* YYNRULES -- Number of rules. */
+/* YYNRULES -- Number of rules.  */
 #define YYNRULES  308
-/* YYNRULES -- Number of states. */
+/* YYNRULES -- Number of states.  */
 #define YYNSTATES  604
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
@@ -1992,7 +2016,7 @@
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -2040,7 +2064,7 @@
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short int yyprhs[] =
+static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     5,     7,     9,    11,    13,    15,    17,
       19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
@@ -2075,8 +2099,8 @@
      927,   928,   932,   939,   943,   950,   953,   958,   965
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short int yyrhs[] =
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
 {
      200,     0,    -1,     5,    -1,     6,    -1,     3,    -1,     4,
       -1,    79,    -1,    80,    -1,    81,    -1,    82,    -1,    83,
@@ -2178,45 +2202,45 @@
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
-       0,  1531,  1531,  1532,  1540,  1541,  1551,  1551,  1551,  1551,
-    1551,  1551,  1551,  1551,  1551,  1551,  1551,  1555,  1555,  1555,
-    1559,  1559,  1559,  1559,  1559,  1559,  1563,  1563,  1564,  1564,
-    1565,  1565,  1566,  1566,  1567,  1567,  1571,  1571,  1572,  1572,
-    1573,  1573,  1574,  1574,  1575,  1575,  1576,  1576,  1577,  1577,
-    1578,  1579,  1582,  1582,  1582,  1582,  1586,  1586,  1586,  1586,
-    1586,  1586,  1586,  1587,  1587,  1587,  1587,  1587,  1587,  1593,
-    1593,  1593,  1593,  1597,  1597,  1597,  1597,  1601,  1601,  1605,
-    1605,  1610,  1613,  1618,  1619,  1620,  1621,  1622,  1623,  1624,
-    1625,  1629,  1630,  1631,  1632,  1633,  1634,  1635,  1636,  1646,
-    1647,  1655,  1656,  1664,  1673,  1674,  1681,  1682,  1686,  1690,
-    1706,  1707,  1714,  1715,  1722,  1730,  1730,  1730,  1730,  1730,
-    1730,  1730,  1731,  1731,  1731,  1731,  1731,  1736,  1740,  1744,
-    1749,  1758,  1774,  1780,  1793,  1802,  1806,  1817,  1821,  1834,
-    1838,  1845,  1846,  1852,  1859,  1871,  1901,  1914,  1937,  1965,
-    1987,  1998,  2020,  2031,  2040,  2045,  2103,  2110,  2118,  2125,
-    2132,  2136,  2140,  2149,  2164,  2177,  2186,  2214,  2227,  2236,
-    2242,  2248,  2257,  2263,  2269,  2280,  2281,  2290,  2291,  2303,
-    2312,  2313,  2314,  2315,  2316,  2332,  2352,  2354,  2356,  2356,
-    2363,  2363,  2370,  2370,  2377,  2377,  2385,  2387,  2389,  2394,
-    2408,  2409,  2413,  2416,  2424,  2428,  2435,  2439,  2443,  2447,
-    2455,  2455,  2459,  2460,  2464,  2472,  2477,  2485,  2486,  2493,
-    2500,  2504,  2610,  2610,  2614,  2624,  2624,  2628,  2632,  2634,
-    2635,  2639,  2639,  2651,  2652,  2657,  2658,  2659,  2660,  2661,
-    2662,  2663,  2664,  2665,  2686,  2689,  2704,  2705,  2710,  2710,
-    2718,  2727,  2730,  2739,  2749,  2754,  2763,  2774,  2774,  2777,
-    2780,  2783,  2787,  2793,  2808,  2814,  2865,  2868,  2874,  2884,
-    2897,  2926,  2934,  2942,  2946,  2953,  2954,  2958,  2961,  2967,
-    2984,  3000,  3014,  3026,  3038,  3049,  3058,  3067,  3076,  3083,
-    3104,  3128,  3134,  3140,  3146,  3162,  3235,  3243,  3244,  3248,
-    3249,  3253,  3259,  3265,  3271,  3277,  3284,  3296,  3310
+       0,  1479,  1479,  1480,  1488,  1489,  1499,  1499,  1499,  1499,
+    1499,  1499,  1499,  1499,  1499,  1499,  1499,  1503,  1503,  1503,
+    1507,  1507,  1507,  1507,  1507,  1507,  1511,  1511,  1512,  1512,
+    1513,  1513,  1514,  1514,  1515,  1515,  1519,  1519,  1520,  1520,
+    1521,  1521,  1522,  1522,  1523,  1523,  1524,  1524,  1525,  1525,
+    1526,  1527,  1530,  1530,  1530,  1530,  1534,  1534,  1534,  1534,
+    1534,  1534,  1534,  1535,  1535,  1535,  1535,  1535,  1535,  1541,
+    1541,  1541,  1541,  1545,  1545,  1545,  1545,  1549,  1549,  1553,
+    1553,  1558,  1561,  1566,  1567,  1568,  1569,  1570,  1571,  1572,
+    1573,  1577,  1578,  1579,  1580,  1581,  1582,  1583,  1584,  1594,
+    1595,  1603,  1604,  1612,  1621,  1622,  1629,  1630,  1634,  1638,
+    1654,  1655,  1662,  1663,  1670,  1678,  1678,  1678,  1678,  1678,
+    1678,  1678,  1679,  1679,  1679,  1679,  1679,  1684,  1688,  1692,
+    1697,  1706,  1722,  1728,  1741,  1750,  1754,  1765,  1769,  1782,
+    1786,  1793,  1794,  1800,  1807,  1819,  1849,  1862,  1885,  1913,
+    1935,  1946,  1968,  1979,  1988,  1993,  2051,  2058,  2066,  2073,
+    2080,  2084,  2088,  2097,  2112,  2125,  2134,  2162,  2175,  2184,
+    2190,  2196,  2205,  2211,  2217,  2228,  2229,  2238,  2239,  2251,
+    2260,  2261,  2262,  2263,  2264,  2280,  2300,  2302,  2304,  2304,
+    2311,  2311,  2318,  2318,  2325,  2325,  2333,  2335,  2337,  2342,
+    2356,  2357,  2361,  2364,  2372,  2376,  2383,  2387,  2391,  2395,
+    2403,  2403,  2407,  2408,  2412,  2420,  2425,  2433,  2434,  2441,
+    2448,  2452,  2558,  2558,  2562,  2572,  2572,  2576,  2580,  2582,
+    2583,  2587,  2587,  2599,  2600,  2605,  2606,  2607,  2608,  2609,
+    2610,  2611,  2612,  2613,  2634,  2637,  2652,  2653,  2658,  2658,
+    2666,  2675,  2678,  2687,  2697,  2702,  2711,  2722,  2722,  2725,
+    2728,  2731,  2735,  2741,  2756,  2762,  2813,  2816,  2822,  2832,
+    2845,  2874,  2882,  2890,  2894,  2901,  2902,  2906,  2909,  2915,
+    2932,  2948,  2962,  2974,  2986,  2997,  3006,  3015,  3024,  3031,
+    3052,  3076,  3082,  3088,  3094,  3110,  3183,  3191,  3192,  3196,
+    3197,  3201,  3207,  3213,  3219,  3225,  3232,  3244,  3258
 };
 #endif
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL",
@@ -2265,7 +2289,7 @@
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -2288,7 +2312,7 @@
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const yytype_uint8 yyr1[] =
 {
        0,   166,   167,   167,   168,   168,   169,   169,   169,   169,
      169,   169,   169,   169,   169,   169,   169,   170,   170,   170,
@@ -2324,7 +2348,7 @@
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
@@ -2362,7 +2386,7 @@
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned short int yydefact[] =
+static const yytype_uint16 yydefact[] =
 {
      198,     0,    90,   184,     1,   183,   231,    83,    84,    85,
       86,    87,    88,    89,     0,    91,   255,   180,   181,   255,
@@ -2427,8 +2451,8 @@
        0,     0,   268,   265
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
-static const short int yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
 {
       -1,    85,   311,   328,   329,   330,   263,   280,   331,   332,
      219,   220,   251,   221,    25,    15,    37,   522,   369,   456,
@@ -2443,7 +2467,7 @@
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 #define YYPACT_NINF -508
-static const short int yypact[] =
+static const yytype_int16 yypact[] =
 {
     -508,    18,   144,   546,  -508,  -508,  -508,  -508,  -508,  -508,
     -508,  -508,  -508,  -508,     2,   152,    47,  -508,  -508,   -15,
@@ -2509,7 +2533,7 @@
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short int yypgoto[] =
+static const yytype_int16 yypgoto[] =
 {
     -508,  -508,  -508,   356,   357,   360,   145,   147,   371,   374,
     -128,  -127,  -497,  -508,   416,   436,  -117,  -508,  -277,    41,
@@ -2526,7 +2550,7 @@
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -180
-static const short int yytable[] =
+static const yytype_int16 yytable[] =
 {
       88,   235,   249,   250,   238,   371,   105,   115,    39,   393,
      394,    26,   223,   334,   252,    42,    88,   454,     4,   432,
@@ -2702,7 +2726,7 @@
      183,   184,   185
 };
 
-static const short int yycheck[] =
+static const yytype_int16 yycheck[] =
 {
       37,   125,   130,   130,   128,   282,    53,     4,    23,   305,
      306,     3,   111,   222,   131,    30,    53,    34,     0,    15,
@@ -2880,7 +2904,7 @@
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const yytype_uint8 yystos[] =
 {
        0,   200,   201,   202,     0,    25,    31,    41,    42,    43,
       44,    45,    46,    47,    62,   181,   219,   221,   223,   230,
@@ -2970,7 +2994,7 @@
       yychar = (Token);						\
       yylval = (Value);						\
       yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK;						\
+      YYPOPSTACK (1);						\
       goto yybackup;						\
     }								\
   else								\
@@ -2978,7 +3002,7 @@
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;							\
     }								\
-while (0)
+while (YYID (0))
 
 
 #define YYTERROR	1
@@ -2993,7 +3017,7 @@
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)				\
     do									\
-      if (N)								\
+      if (YYID (N))                                                    \
 	{								\
 	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
 	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
@@ -3007,7 +3031,7 @@
 	  (Current).first_column = (Current).last_column =		\
 	    YYRHSLOC (Rhs, 0).last_column;				\
 	}								\
-    while (0)
+    while (YYID (0))
 #endif
 
 
@@ -3019,8 +3043,8 @@
 # if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
-              (Loc).first_line, (Loc).first_column,	\
-              (Loc).last_line,  (Loc).last_column)
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
 # else
 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 # endif
@@ -3047,36 +3071,96 @@
 do {						\
   if (yydebug)					\
     YYFPRINTF Args;				\
-} while (0)
+} while (YYID (0))
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
-do {								\
-  if (yydebug)							\
-    {								\
-      YYFPRINTF (stderr, "%s ", Title);				\
-      yysymprint (stderr,					\
-                  Type, Value);	\
-      YYFPRINTF (stderr, "\n");					\
-    }								\
-} while (0)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_stack_print (short int *bottom, short int *top)
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
 #else
 static void
 yy_stack_print (bottom, top)
-    short int *bottom;
-    short int *top;
+    yytype_int16 *bottom;
+    yytype_int16 *top;
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
+  for (; bottom <= top; ++bottom)
     YYFPRINTF (stderr, " %d", *bottom);
   YYFPRINTF (stderr, "\n");
 }
@@ -3085,37 +3169,45 @@
 do {								\
   if (yydebug)							\
     yy_stack_print ((Bottom), (Top));				\
-} while (0)
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_reduce_print (int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
 #else
 static void
-yy_reduce_print (yyrule)
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
     int yyrule;
 #endif
 {
+  int yynrhs = yyr2[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-             yyrule - 1, yylno);
-  /* Print the symbols being reduced, and their result.  */
-  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      fprintf (stderr, "\n");
+    }
 }
 
 # define YY_REDUCE_PRINT(Rule)		\
 do {					\
   if (yydebug)				\
-    yy_reduce_print (Rule);		\
-} while (0)
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -3149,42 +3241,44 @@
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
-#  if defined (__GLIBC__) && defined (_STRING_H)
+#  if defined __GLIBC__ && defined _STRING_H
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
-#   if defined (__STDC__) || defined (__cplusplus)
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
-  const char *yys = yystr;
-
-  while (*yys++ != '\0')
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
     continue;
-
-  return yys - yystr - 1;
+  return yylen;
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
-#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
 #   define yystpcpy stpcpy
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static char *
-#   if defined (__STDC__) || defined (__cplusplus)
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -3210,7 +3304,7 @@
 {
   if (*yystr == '"')
     {
-      size_t yyn = 0;
+      YYSIZE_T yyn = 0;
       char const *yyp = yystr;
 
       for (;;)
@@ -3245,53 +3339,123 @@
 }
 # endif
 
-#endif /* YYERROR_VERBOSE */
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
 
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
 
 
-#if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if defined (__STDC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yysymprint (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
-{
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
-
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# endif
-  switch (yytype)
-    {
-      default:
-        break;
-    }
-  YYFPRINTF (yyoutput, ")");
-}
-
-#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 #else
@@ -3302,8 +3466,7 @@
     YYSTYPE *yyvaluep;
 #endif
 {
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  YYUSE (yyvaluep);
 
   if (!yymsg)
     yymsg = "Deleting";
@@ -3313,7 +3476,7 @@
     {
 
       default:
-        break;
+	break;
     }
 }
 
@@ -3321,13 +3484,13 @@
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void);
 #else
 int yyparse ();
@@ -3352,14 +3515,18 @@
 `----------*/
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-int yyparse (void *YYPARSE_PARAM)
-# else
-int yyparse (YYPARSE_PARAM)
-  void *YYPARSE_PARAM;
-# endif
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
 #else
@@ -3377,6 +3544,12 @@
   int yyerrstatus;
   /* Look-ahead token as an internal (translated) token number.  */
   int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -3387,9 +3560,9 @@
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
@@ -3398,7 +3571,7 @@
 
 
 
-#define YYPOPSTACK   (yyvsp--, yyssp--)
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
@@ -3407,9 +3580,9 @@
   YYSTYPE yyval;
 
 
-  /* When reducing, the number of symbols on the RHS of the reduced
-     rule.  */
-  int yylen;
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
@@ -3433,8 +3606,7 @@
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
-     have just been pushed. so pushing a state here evens the stacks.
-     */
+     have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
  yysetstate:
@@ -3447,11 +3619,11 @@
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack. Use copies of
+	/* Give user a chance to reallocate the stack.  Use copies of
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 
 
 	/* Each stack pointer address is followed by the size of the
@@ -3479,7 +3651,7 @@
 	yystacksize = YYMAXDEPTH;
 
       {
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
@@ -3514,12 +3686,10 @@
 `-----------*/
 yybackup:
 
-/* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
-/* yyresume: */
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
 
   /* First try to decide what to do without reference to look-ahead token.  */
-
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
@@ -3561,22 +3731,21 @@
   if (yyn == YYFINAL)
     YYACCEPT;
 
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the token being shifted unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  *++yyvsp = yylval;
-
-
   /* Count tokens shifted since error; after three, turn off error
      status.  */
   if (yyerrstatus)
     yyerrstatus--;
 
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
   yystate = yyn;
+  *++yyvsp = yylval;
+
   goto yynewstate;
 
 
@@ -3612,362 +3781,362 @@
   switch (yyn)
     {
         case 3:
-#line 1532 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1480 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
+    if ((yyvsp[(1) - (1)].UIntVal) > (uint32_t)INT32_MAX)     // Outside of my range!
       error("Value too large for type");
-    (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal);
+    (yyval.SIntVal) = (int32_t)(yyvsp[(1) - (1)].UIntVal);
   ;}
     break;
 
   case 5:
-#line 1541 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1489 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
+    if ((yyvsp[(1) - (1)].UInt64Val) > (uint64_t)INT64_MAX)     // Outside of my range!
       error("Value too large for type");
-    (yyval.SInt64Val) = (int64_t)(yyvsp[0].UInt64Val);
+    (yyval.SInt64Val) = (int64_t)(yyvsp[(1) - (1)].UInt64Val);
   ;}
     break;
 
   case 26:
-#line 1563 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1511 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_EQ; ;}
     break;
 
   case 27:
-#line 1563 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1511 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_NE; ;}
     break;
 
   case 28:
-#line 1564 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1512 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_SLT; ;}
     break;
 
   case 29:
-#line 1564 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1512 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_SGT; ;}
     break;
 
   case 30:
-#line 1565 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1513 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_SLE; ;}
     break;
 
   case 31:
-#line 1565 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1513 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_SGE; ;}
     break;
 
   case 32:
-#line 1566 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1514 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_ULT; ;}
     break;
 
   case 33:
-#line 1566 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1514 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_UGT; ;}
     break;
 
   case 34:
-#line 1567 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1515 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_ULE; ;}
     break;
 
   case 35:
-#line 1567 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1515 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.IPred) = ICmpInst::ICMP_UGE; ;}
     break;
 
   case 36:
-#line 1571 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1519 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_OEQ; ;}
     break;
 
   case 37:
-#line 1571 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1519 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_ONE; ;}
     break;
 
   case 38:
-#line 1572 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1520 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_OLT; ;}
     break;
 
   case 39:
-#line 1572 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1520 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_OGT; ;}
     break;
 
   case 40:
-#line 1573 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1521 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_OLE; ;}
     break;
 
   case 41:
-#line 1573 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1521 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_OGE; ;}
     break;
 
   case 42:
-#line 1574 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1522 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_ORD; ;}
     break;
 
   case 43:
-#line 1574 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1522 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_UNO; ;}
     break;
 
   case 44:
-#line 1575 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1523 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_UEQ; ;}
     break;
 
   case 45:
-#line 1575 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1523 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_UNE; ;}
     break;
 
   case 46:
-#line 1576 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1524 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_ULT; ;}
     break;
 
   case 47:
-#line 1576 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1524 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_UGT; ;}
     break;
 
   case 48:
-#line 1577 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1525 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_ULE; ;}
     break;
 
   case 49:
-#line 1577 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1525 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_UGE; ;}
     break;
 
   case 50:
-#line 1578 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1526 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_TRUE; ;}
     break;
 
   case 51:
-#line 1579 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1527 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.FPred) = FCmpInst::FCMP_FALSE; ;}
     break;
 
   case 81:
-#line 1610 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1558 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.StrVal) = (yyvsp[-1].StrVal);
+    (yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
   ;}
     break;
 
   case 82:
-#line 1613 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1561 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.StrVal) = 0;
   ;}
     break;
 
   case 83:
-#line 1618 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1566 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
     break;
 
   case 84:
-#line 1619 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1567 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
     break;
 
   case 85:
-#line 1620 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1568 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
     break;
 
   case 86:
-#line 1621 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1569 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
     break;
 
   case 87:
-#line 1622 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1570 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
     break;
 
   case 88:
-#line 1623 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1571 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
     break;
 
   case 89:
-#line 1624 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1572 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
   case 90:
-#line 1625 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1573 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
     break;
 
   case 91:
-#line 1629 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1577 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::C; ;}
     break;
 
   case 92:
-#line 1630 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1578 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::C; ;}
     break;
 
   case 93:
-#line 1631 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.UIntVal) = CallingConv::CSRet; ;}
+#line 1579 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.UIntVal) = CallingConv::C; ;}
     break;
 
   case 94:
-#line 1632 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1580 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::Fast; ;}
     break;
 
   case 95:
-#line 1633 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1581 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::Cold; ;}
     break;
 
   case 96:
-#line 1634 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1582 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::X86_StdCall; ;}
     break;
 
   case 97:
-#line 1635 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1583 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = CallingConv::X86_FastCall; ;}
     break;
 
   case 98:
-#line 1636 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1584 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val))
+    if ((unsigned)(yyvsp[(2) - (2)].UInt64Val) != (yyvsp[(2) - (2)].UInt64Val))
       error("Calling conv too large");
-    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+    (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
   ;}
     break;
 
   case 99:
-#line 1646 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1594 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = 0; ;}
     break;
 
   case 100:
-#line 1647 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1595 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+    (yyval.UIntVal) = (yyvsp[(2) - (2)].UInt64Val);
     if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
       error("Alignment must be a power of two");
   ;}
     break;
 
   case 101:
-#line 1655 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1603 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.UIntVal) = 0; ;}
     break;
 
   case 102:
-#line 1656 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1604 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.UIntVal) = (yyvsp[0].UInt64Val);
+    (yyval.UIntVal) = (yyvsp[(3) - (3)].UInt64Val);
     if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal)))
       error("Alignment must be a power of two");
   ;}
     break;
 
   case 103:
-#line 1664 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1612 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    for (unsigned i = 0, e = strlen((yyvsp[0].StrVal)); i != e; ++i)
-      if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\')
+    for (unsigned i = 0, e = strlen((yyvsp[(2) - (2)].StrVal)); i != e; ++i)
+      if ((yyvsp[(2) - (2)].StrVal)[i] == '"' || (yyvsp[(2) - (2)].StrVal)[i] == '\\')
         error("Invalid character in section name");
-    (yyval.StrVal) = (yyvsp[0].StrVal);
+    (yyval.StrVal) = (yyvsp[(2) - (2)].StrVal);
   ;}
     break;
 
   case 104:
-#line 1673 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1621 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.StrVal) = 0; ;}
     break;
 
   case 105:
-#line 1674 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.StrVal) = (yyvsp[0].StrVal); ;}
+#line 1622 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.StrVal) = (yyvsp[(1) - (1)].StrVal); ;}
     break;
 
   case 106:
-#line 1681 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1629 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {;}
     break;
 
   case 107:
-#line 1682 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1630 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {;}
     break;
 
   case 108:
-#line 1686 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1634 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    CurGV->setSection((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurGV->setSection((yyvsp[(1) - (1)].StrVal));
+    free((yyvsp[(1) - (1)].StrVal));
   ;}
     break;
 
   case 109:
-#line 1690 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1638 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val)))
+    if ((yyvsp[(2) - (2)].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[(2) - (2)].UInt64Val)))
       error("Alignment must be a power of two");
-    CurGV->setAlignment((yyvsp[0].UInt64Val));
+    CurGV->setAlignment((yyvsp[(2) - (2)].UInt64Val));
     
   ;}
     break;
 
   case 111:
-#line 1707 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1655 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); 
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[(1) - (1)].PrimType).T); 
     (yyval.TypeVal).S = Signless;
   ;}
     break;
 
   case 113:
-#line 1715 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1663 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T); 
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[(1) - (1)].PrimType).T); 
     (yyval.TypeVal).S = Signless;
   ;}
     break;
 
   case 114:
-#line 1722 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1670 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     if (!UpRefs.empty())
-      error("Invalid upreference in type: " + (*(yyvsp[0].TypeVal).T)->getDescription());
-    (yyval.TypeVal) = (yyvsp[0].TypeVal);
+      error("Invalid upreference in type: " + (*(yyvsp[(1) - (1)].TypeVal).T)->getDescription());
+    (yyval.TypeVal) = (yyvsp[(1) - (1)].TypeVal);
   ;}
     break;
 
   case 127:
-#line 1736 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1684 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    (yyval.TypeVal).T = new PATypeHolder((yyvsp[0].PrimType).T);
-    (yyval.TypeVal).S = (yyvsp[0].PrimType).S;
+    (yyval.TypeVal).T = new PATypeHolder((yyvsp[(1) - (1)].PrimType).T);
+    (yyval.TypeVal).S = (yyvsp[(1) - (1)].PrimType).S;
   ;}
     break;
 
   case 128:
-#line 1740 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1688 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TypeVal).T = new PATypeHolder(OpaqueType::get());
     (yyval.TypeVal).S = Signless;
@@ -3975,21 +4144,21 @@
     break;
 
   case 129:
-#line 1744 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1692 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {            // Named types are also simple types...
-    const Type* tmp = getType((yyvsp[0].ValIDVal));
+    const Type* tmp = getType((yyvsp[(1) - (1)].ValIDVal));
     (yyval.TypeVal).T = new PATypeHolder(tmp);
     (yyval.TypeVal).S = Signless; // FIXME: what if its signed?
   ;}
     break;
 
   case 130:
-#line 1749 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1697 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                   // Type UpReference
-    if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) 
+    if ((yyvsp[(2) - (2)].UInt64Val) > (uint64_t)~0U) 
       error("Value out of range");
     OpaqueType *OT = OpaqueType::get();        // Use temporary placeholder
-    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT));  // Add to vector...
+    UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[(2) - (2)].UInt64Val), OT));  // Add to vector...
     (yyval.TypeVal).T = new PATypeHolder(OT);
     (yyval.TypeVal).S = Signless;
     UR_OUT("New Upreference!\n");
@@ -3997,11 +4166,11 @@
     break;
 
   case 131:
-#line 1758 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1706 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {           // Function derived type?
     std::vector<const Type*> Params;
-    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
-           E = (yyvsp[-1].TypeList)->end(); I != E; ++I) {
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[(3) - (4)].TypeList)->begin(),
+           E = (yyvsp[(3) - (4)].TypeList)->end(); I != E; ++I) {
       Params.push_back(I->T->get());
       delete I->T;
     }
@@ -4009,55 +4178,55 @@
     if (isVarArg) Params.pop_back();
 
     (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(
-                           FunctionType::get((yyvsp[-3].TypeVal).T->get(),Params,isVarArg)));
-    (yyval.TypeVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T;    // Delete the return type handle
-    delete (yyvsp[-1].TypeList);      // Delete the argument list
+                           FunctionType::get((yyvsp[(1) - (4)].TypeVal).T->get(),Params,isVarArg)));
+    (yyval.TypeVal).S = (yyvsp[(1) - (4)].TypeVal).S;
+    delete (yyvsp[(1) - (4)].TypeVal).T;    // Delete the return type handle
+    delete (yyvsp[(3) - (4)].TypeList);      // Delete the argument list
   ;}
     break;
 
   case 132:
-#line 1774 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1722 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {          // Sized array type?
-    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(ArrayType::get((yyvsp[-1].TypeVal).T->get(), 
-                                                        (unsigned)(yyvsp[-3].UInt64Val))));
-    (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(ArrayType::get((yyvsp[(4) - (5)].TypeVal).T->get(), 
+                                                        (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
+    (yyval.TypeVal).S = (yyvsp[(4) - (5)].TypeVal).S;
+    delete (yyvsp[(4) - (5)].TypeVal).T;
   ;}
     break;
 
   case 133:
-#line 1780 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1728 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {          // Packed array type?
-     const llvm::Type* ElemTy = (yyvsp[-1].TypeVal).T->get();
-     if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val))
+     const llvm::Type* ElemTy = (yyvsp[(4) - (5)].TypeVal).T->get();
+     if ((unsigned)(yyvsp[(2) - (5)].UInt64Val) != (yyvsp[(2) - (5)].UInt64Val))
         error("Unsigned result not equal to signed result");
      if (!(ElemTy->isInteger() || ElemTy->isFloatingPoint()))
         error("Elements of a PackedType must be integer or floating point");
-     if (!isPowerOf2_32((yyvsp[-3].UInt64Val)))
+     if (!isPowerOf2_32((yyvsp[(2) - (5)].UInt64Val)))
        error("PackedType length should be a power of 2");
      (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PackedType::get(ElemTy, 
-                                          (unsigned)(yyvsp[-3].UInt64Val))));
-     (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
-     delete (yyvsp[-1].TypeVal).T;
+                                          (unsigned)(yyvsp[(2) - (5)].UInt64Val))));
+     (yyval.TypeVal).S = (yyvsp[(4) - (5)].TypeVal).S;
+     delete (yyvsp[(4) - (5)].TypeVal).T;
   ;}
     break;
 
   case 134:
-#line 1793 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1741 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                        // Structure type?
     std::vector<const Type*> Elements;
-    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-1].TypeList)->begin(),
-           E = (yyvsp[-1].TypeList)->end(); I != E; ++I)
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[(2) - (3)].TypeList)->begin(),
+           E = (yyvsp[(2) - (3)].TypeList)->end(); I != E; ++I)
       Elements.push_back(I->T->get());
     (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements)));
     (yyval.TypeVal).S = Signless;
-    delete (yyvsp[-1].TypeList);
+    delete (yyvsp[(2) - (3)].TypeList);
   ;}
     break;
 
   case 135:
-#line 1802 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1750 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                                  // Empty structure type?
     (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>()));
     (yyval.TypeVal).S = Signless;
@@ -4065,22 +4234,22 @@
     break;
 
   case 136:
-#line 1806 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1754 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                // Packed Structure type?
     std::vector<const Type*> Elements;
-    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[-2].TypeList)->begin(),
-           E = (yyvsp[-2].TypeList)->end(); I != E; ++I) {
+    for (std::list<llvm::PATypeInfo>::iterator I = (yyvsp[(3) - (5)].TypeList)->begin(),
+           E = (yyvsp[(3) - (5)].TypeList)->end(); I != E; ++I) {
       Elements.push_back(I->T->get());
       delete I->T;
     }
     (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true)));
     (yyval.TypeVal).S = Signless;
-    delete (yyvsp[-2].TypeList);
+    delete (yyvsp[(3) - (5)].TypeList);
   ;}
     break;
 
   case 137:
-#line 1817 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1765 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                          // Empty packed structure type?
     (yyval.TypeVal).T = new PATypeHolder(StructType::get(std::vector<const Type*>(),true));
     (yyval.TypeVal).S = Signless;
@@ -4088,43 +4257,43 @@
     break;
 
   case 138:
-#line 1821 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1769 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                             // Pointer type?
-    if ((yyvsp[-1].TypeVal).T->get() == Type::LabelTy)
+    if ((yyvsp[(1) - (2)].TypeVal).T->get() == Type::LabelTy)
       error("Cannot form a pointer to a basic block");
-    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PointerType::get((yyvsp[-1].TypeVal).T->get())));
-    (yyval.TypeVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.TypeVal).T = new PATypeHolder(HandleUpRefs(PointerType::get((yyvsp[(1) - (2)].TypeVal).T->get())));
+    (yyval.TypeVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 139:
-#line 1834 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1782 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TypeList) = new std::list<PATypeInfo>();
-    (yyval.TypeList)->push_back((yyvsp[0].TypeVal)); 
+    (yyval.TypeList)->push_back((yyvsp[(1) - (1)].TypeVal)); 
   ;}
     break;
 
   case 140:
-#line 1838 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1786 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back((yyvsp[0].TypeVal));
+    ((yyval.TypeList)=(yyvsp[(1) - (3)].TypeList))->push_back((yyvsp[(3) - (3)].TypeVal));
   ;}
     break;
 
   case 142:
-#line 1846 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1794 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     PATypeInfo VoidTI;
     VoidTI.T = new PATypeHolder(Type::VoidTy);
     VoidTI.S = Signless;
-    ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(VoidTI);
+    ((yyval.TypeList)=(yyvsp[(1) - (3)].TypeList))->push_back(VoidTI);
   ;}
     break;
 
   case 143:
-#line 1852 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1800 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TypeList) = new std::list<PATypeInfo>();
     PATypeInfo VoidTI;
@@ -4135,32 +4304,32 @@
     break;
 
   case 144:
-#line 1859 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1807 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TypeList) = new std::list<PATypeInfo>();
   ;}
     break;
 
   case 145:
-#line 1871 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1819 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { // Nonempty unsized arr
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-3].TypeVal).T->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (4)].TypeVal).T->get());
     if (ATy == 0)
       error("Cannot make array constant with type: '" + 
-            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+            (yyvsp[(1) - (4)].TypeVal).T->get()->getDescription() + "'");
     const Type *ETy = ATy->getElementType();
     int NumElements = ATy->getNumElements();
 
     // Verify that we have the correct size...
-    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+    if (NumElements != -1 && NumElements != (int)(yyvsp[(3) - (4)].ConstVector)->size())
       error("Type mismatch: constant sized array initialized with " +
-            utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+            utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
             itostr(NumElements) + "");
 
     // Verify all elements are correct type!
     std::vector<Constant*> Elems;
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[(3) - (4)].ConstVector))[i].C;
       const Type* ValTy = C->getType();
       if (ETy != ValTy)
         error("Element #" + utostr(i) + " is not of type '" + 
@@ -4169,74 +4338,74 @@
       Elems.push_back(C);
     }
     (yyval.ConstVal).C = ConstantArray::get(ATy, Elems);
-    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T; 
-    delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal).S = (yyvsp[(1) - (4)].TypeVal).S;
+    delete (yyvsp[(1) - (4)].TypeVal).T; 
+    delete (yyvsp[(3) - (4)].ConstVector);
   ;}
     break;
 
   case 146:
-#line 1901 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1849 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal).T->get());
     if (ATy == 0)
       error("Cannot make array constant with type: '" + 
-            (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+            (yyvsp[(1) - (3)].TypeVal).T->get()->getDescription() + "'");
     int NumElements = ATy->getNumElements();
     if (NumElements != -1 && NumElements != 0) 
       error("Type mismatch: constant sized array initialized with 0"
             " arguments, but has size of " + itostr(NumElements) +"");
     (yyval.ConstVal).C = ConstantArray::get(ATy, std::vector<Constant*>());
-    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
-    delete (yyvsp[-2].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (3)].TypeVal).S;
+    delete (yyvsp[(1) - (3)].TypeVal).T;
   ;}
     break;
 
   case 147:
-#line 1914 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1862 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[-2].TypeVal).T->get());
+    const ArrayType *ATy = dyn_cast<ArrayType>((yyvsp[(1) - (3)].TypeVal).T->get());
     if (ATy == 0)
       error("Cannot make array constant with type: '" + 
-            (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+            (yyvsp[(1) - (3)].TypeVal).T->get()->getDescription() + "'");
     int NumElements = ATy->getNumElements();
     const Type *ETy = dyn_cast<IntegerType>(ATy->getElementType());
     if (!ETy || cast<IntegerType>(ETy)->getBitWidth() != 8)
       error("String arrays require type i8, not '" + ETy->getDescription() + 
             "'");
-    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
-    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal)))
+    char *EndStr = UnEscapeLexed((yyvsp[(3) - (3)].StrVal), true);
+    if (NumElements != -1 && NumElements != (EndStr-(yyvsp[(3) - (3)].StrVal)))
       error("Can't build string constant of size " + 
-            itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " + 
+            itostr((int)(EndStr-(yyvsp[(3) - (3)].StrVal))) + " when array has size " + 
             itostr(NumElements) + "");
     std::vector<Constant*> Vals;
-    for (char *C = (char *)(yyvsp[0].StrVal); C != (char *)EndStr; ++C)
+    for (char *C = (char *)(yyvsp[(3) - (3)].StrVal); C != (char *)EndStr; ++C)
       Vals.push_back(ConstantInt::get(ETy, *C));
-    free((yyvsp[0].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
     (yyval.ConstVal).C = ConstantArray::get(ATy, Vals);
-    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
-    delete (yyvsp[-2].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (3)].TypeVal).S;
+    delete (yyvsp[(1) - (3)].TypeVal).T;
   ;}
     break;
 
   case 148:
-#line 1937 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1885 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { // Nonempty unsized arr
-    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[-3].TypeVal).T->get());
+    const PackedType *PTy = dyn_cast<PackedType>((yyvsp[(1) - (4)].TypeVal).T->get());
     if (PTy == 0)
       error("Cannot make packed constant with type: '" + 
-            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
+            (yyvsp[(1) - (4)].TypeVal).T->get()->getDescription() + "'");
     const Type *ETy = PTy->getElementType();
     int NumElements = PTy->getNumElements();
     // Verify that we have the correct size...
-    if (NumElements != -1 && NumElements != (int)(yyvsp[-1].ConstVector)->size())
+    if (NumElements != -1 && NumElements != (int)(yyvsp[(3) - (4)].ConstVector)->size())
       error("Type mismatch: constant sized packed initialized with " +
-            utostr((yyvsp[-1].ConstVector)->size()) +  " arguments, but has size of " + 
+            utostr((yyvsp[(3) - (4)].ConstVector)->size()) +  " arguments, but has size of " + 
             itostr(NumElements) + "");
     // Verify all elements are correct type!
     std::vector<Constant*> Elems;
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+    for (unsigned i = 0; i < (yyvsp[(3) - (4)].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[(3) - (4)].ConstVector))[i].C;
       const Type* ValTy = C->getType();
       if (ETy != ValTy)
         error("Element #" + utostr(i) + " is not of type '" + 
@@ -4245,123 +4414,123 @@
       Elems.push_back(C);
     }
     (yyval.ConstVal).C = ConstantPacked::get(PTy, Elems);
-    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T;
-    delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal).S = (yyvsp[(1) - (4)].TypeVal).S;
+    delete (yyvsp[(1) - (4)].TypeVal).T;
+    delete (yyvsp[(3) - (4)].ConstVector);
   ;}
     break;
 
   case 149:
-#line 1965 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1913 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-3].TypeVal).T->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (4)].TypeVal).T->get());
     if (STy == 0)
       error("Cannot make struct constant with type: '" + 
-            (yyvsp[-3].TypeVal).T->get()->getDescription() + "'");
-    if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes())
+            (yyvsp[(1) - (4)].TypeVal).T->get()->getDescription() + "'");
+    if ((yyvsp[(3) - (4)].ConstVector)->size() != STy->getNumContainedTypes())
       error("Illegal number of initializers for structure type");
 
     // Check to ensure that constants are compatible with the type initializer!
     std::vector<Constant*> Fields;
-    for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) {
-      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+    for (unsigned i = 0, e = (yyvsp[(3) - (4)].ConstVector)->size(); i != e; ++i) {
+      Constant *C = (*(yyvsp[(3) - (4)].ConstVector))[i].C;
       if (C->getType() != STy->getElementType(i))
         error("Expected type '" + STy->getElementType(i)->getDescription() +
               "' for element #" + utostr(i) + " of structure initializer");
       Fields.push_back(C);
     }
     (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
-    (yyval.ConstVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T;
-    delete (yyvsp[-1].ConstVector);
+    (yyval.ConstVal).S = (yyvsp[(1) - (4)].TypeVal).S;
+    delete (yyvsp[(1) - (4)].TypeVal).T;
+    delete (yyvsp[(3) - (4)].ConstVector);
   ;}
     break;
 
   case 150:
-#line 1987 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1935 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-2].TypeVal).T->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (3)].TypeVal).T->get());
     if (STy == 0)
       error("Cannot make struct constant with type: '" + 
-              (yyvsp[-2].TypeVal).T->get()->getDescription() + "'");
+              (yyvsp[(1) - (3)].TypeVal).T->get()->getDescription() + "'");
     if (STy->getNumContainedTypes() != 0)
       error("Illegal number of initializers for structure type");
     (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
-    (yyval.ConstVal).S = (yyvsp[-2].TypeVal).S;
-    delete (yyvsp[-2].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (3)].TypeVal).S;
+    delete (yyvsp[(1) - (3)].TypeVal).T;
   ;}
     break;
 
   case 151:
-#line 1998 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1946 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-5].TypeVal).T->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (6)].TypeVal).T->get());
     if (STy == 0)
       error("Cannot make packed struct constant with type: '" + 
-            (yyvsp[-5].TypeVal).T->get()->getDescription() + "'");
-    if ((yyvsp[-2].ConstVector)->size() != STy->getNumContainedTypes())
+            (yyvsp[(1) - (6)].TypeVal).T->get()->getDescription() + "'");
+    if ((yyvsp[(4) - (6)].ConstVector)->size() != STy->getNumContainedTypes())
       error("Illegal number of initializers for packed structure type");
 
     // Check to ensure that constants are compatible with the type initializer!
     std::vector<Constant*> Fields;
-    for (unsigned i = 0, e = (yyvsp[-2].ConstVector)->size(); i != e; ++i) {
-      Constant *C = (*(yyvsp[-2].ConstVector))[i].C;
+    for (unsigned i = 0, e = (yyvsp[(4) - (6)].ConstVector)->size(); i != e; ++i) {
+      Constant *C = (*(yyvsp[(4) - (6)].ConstVector))[i].C;
       if (C->getType() != STy->getElementType(i))
         error("Expected type '" + STy->getElementType(i)->getDescription() +
               "' for element #" + utostr(i) + " of packed struct initializer");
       Fields.push_back(C);
     }
     (yyval.ConstVal).C = ConstantStruct::get(STy, Fields);
-    (yyval.ConstVal).S = (yyvsp[-5].TypeVal).S;
-    delete (yyvsp[-5].TypeVal).T; 
-    delete (yyvsp[-2].ConstVector);
+    (yyval.ConstVal).S = (yyvsp[(1) - (6)].TypeVal).S;
+    delete (yyvsp[(1) - (6)].TypeVal).T; 
+    delete (yyvsp[(4) - (6)].ConstVector);
   ;}
     break;
 
   case 152:
-#line 2020 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1968 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const StructType *STy = dyn_cast<StructType>((yyvsp[-4].TypeVal).T->get());
+    const StructType *STy = dyn_cast<StructType>((yyvsp[(1) - (5)].TypeVal).T->get());
     if (STy == 0)
       error("Cannot make packed struct constant with type: '" + 
-              (yyvsp[-4].TypeVal).T->get()->getDescription() + "'");
+              (yyvsp[(1) - (5)].TypeVal).T->get()->getDescription() + "'");
     if (STy->getNumContainedTypes() != 0)
       error("Illegal number of initializers for packed structure type");
     (yyval.ConstVal).C = ConstantStruct::get(STy, std::vector<Constant*>());
-    (yyval.ConstVal).S = (yyvsp[-4].TypeVal).S;
-    delete (yyvsp[-4].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (5)].TypeVal).S;
+    delete (yyvsp[(1) - (5)].TypeVal).T;
   ;}
     break;
 
   case 153:
-#line 2031 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1979 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal).T->get());
     if (PTy == 0)
       error("Cannot make null pointer constant with type: '" + 
-            (yyvsp[-1].TypeVal).T->get()->getDescription() + "'");
+            (yyvsp[(1) - (2)].TypeVal).T->get()->getDescription() + "'");
     (yyval.ConstVal).C = ConstantPointerNull::get(PTy);
-    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 154:
-#line 2040 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1988 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ConstVal).C = UndefValue::get((yyvsp[-1].TypeVal).T->get());
-    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.ConstVal).C = UndefValue::get((yyvsp[(1) - (2)].TypeVal).T->get());
+    (yyval.ConstVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 155:
-#line 2045 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 1993 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    const PointerType *Ty = dyn_cast<PointerType>((yyvsp[(1) - (2)].TypeVal).T->get());
     if (Ty == 0)
       error("Global const reference must be a pointer type, not" +
-            (yyvsp[-1].TypeVal).T->get()->getDescription());
+            (yyvsp[(1) - (2)].TypeVal).T->get()->getDescription());
 
     // ConstExprs can exist in the body of a function, thus creating
     // GlobalValues whenever they refer to a variable.  Because we are in
@@ -4372,7 +4541,7 @@
     //
     Function *SavedCurFn = CurFun.CurrentFunction;
     CurFun.CurrentFunction = 0;
-    Value *V = getExistingValue(Ty, (yyvsp[0].ValIDVal));
+    Value *V = getExistingValue(Ty, (yyvsp[(2) - (2)].ValIDVal));
     CurFun.CurrentFunction = SavedCurFn;
 
     // If this is an initializer for a constant pointer, which is referencing a
@@ -4385,14 +4554,14 @@
 
       // First check to see if the forward references value is already created!
       PerModuleInfo::GlobalRefsType::iterator I =
-        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[0].ValIDVal)));
+        CurModule.GlobalRefs.find(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)));
     
       if (I != CurModule.GlobalRefs.end()) {
         V = I->second;             // Placeholder already exists, use it...
-        (yyvsp[0].ValIDVal).destroy();
+        (yyvsp[(2) - (2)].ValIDVal).destroy();
       } else {
         std::string Name;
-        if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name;
+        if ((yyvsp[(2) - (2)].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[(2) - (2)].ValIDVal).Name;
 
         // Create the forward referenced global.
         GlobalValue *GV;
@@ -4407,63 +4576,63 @@
         }
 
         // Keep track of the fact that we have a forward ref to recycle it
-        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[0].ValIDVal)), GV));
+        CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, (yyvsp[(2) - (2)].ValIDVal)), GV));
         V = GV;
       }
     }
     (yyval.ConstVal).C = cast<GlobalValue>(V);
-    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;            // Free the type handle
+    (yyval.ConstVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;            // Free the type handle
   ;}
     break;
 
   case 156:
-#line 2103 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2051 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[-1].TypeVal).T->get() != (yyvsp[0].ConstVal).C->getType())
+    if ((yyvsp[(1) - (2)].TypeVal).T->get() != (yyvsp[(2) - (2)].ConstVal).C->getType())
       error("Mismatched types for constant expression");
-    (yyval.ConstVal) = (yyvsp[0].ConstVal);
-    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.ConstVal) = (yyvsp[(2) - (2)].ConstVal);
+    (yyval.ConstVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 157:
-#line 2110 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2058 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(1) - (2)].TypeVal).T->get();
     if (isa<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(Ty))
       error("Cannot create a null initialized value of this type");
     (yyval.ConstVal).C = Constant::getNullValue(Ty);
-    (yyval.ConstVal).S = (yyvsp[-1].TypeVal).S;
-    delete (yyvsp[-1].TypeVal).T;
+    (yyval.ConstVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 158:
-#line 2118 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2066 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {      // integral constants
-    const Type *Ty = (yyvsp[-1].PrimType).T;
-    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].SInt64Val)))
+    const Type *Ty = (yyvsp[(1) - (2)].PrimType).T;
+    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[(2) - (2)].SInt64Val)))
       error("Constant value doesn't fit in type");
-    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].SInt64Val));
+    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[(2) - (2)].SInt64Val));
     (yyval.ConstVal).S = Signed;
   ;}
     break;
 
   case 159:
-#line 2125 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2073 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {            // integral constants
-    const Type *Ty = (yyvsp[-1].PrimType).T;
-    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[0].UInt64Val)))
+    const Type *Ty = (yyvsp[(1) - (2)].PrimType).T;
+    if (!ConstantInt::isValueValidForType(Ty, (yyvsp[(2) - (2)].UInt64Val)))
       error("Constant value doesn't fit in type");
-    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[0].UInt64Val));
+    (yyval.ConstVal).C = ConstantInt::get(Ty, (yyvsp[(2) - (2)].UInt64Val));
     (yyval.ConstVal).S = Unsigned;
   ;}
     break;
 
   case 160:
-#line 2132 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2080 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                      // Boolean constants
     (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, true);
     (yyval.ConstVal).S = Unsigned;
@@ -4471,7 +4640,7 @@
     break;
 
   case 161:
-#line 2136 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2084 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                     // Boolean constants
     (yyval.ConstVal).C = ConstantInt::get(Type::Int1Ty, false);
     (yyval.ConstVal).S = Unsigned;
@@ -4479,80 +4648,80 @@
     break;
 
   case 162:
-#line 2140 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2088 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                   // Float & Double constants
-    if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal)))
+    if (!ConstantFP::isValueValidForType((yyvsp[(1) - (2)].PrimType).T, (yyvsp[(2) - (2)].FPVal)))
       error("Floating point constant invalid for type");
-    (yyval.ConstVal).C = ConstantFP::get((yyvsp[-1].PrimType).T, (yyvsp[0].FPVal));
+    (yyval.ConstVal).C = ConstantFP::get((yyvsp[(1) - (2)].PrimType).T, (yyvsp[(2) - (2)].FPVal));
     (yyval.ConstVal).S = Signless;
   ;}
     break;
 
   case 163:
-#line 2149 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2097 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* SrcTy = (yyvsp[-3].ConstVal).C->getType();
-    const Type* DstTy = (yyvsp[-1].TypeVal).T->get();
-    Signedness SrcSign = (yyvsp[-3].ConstVal).S;
-    Signedness DstSign = (yyvsp[-1].TypeVal).S;
+    const Type* SrcTy = (yyvsp[(3) - (6)].ConstVal).C->getType();
+    const Type* DstTy = (yyvsp[(5) - (6)].TypeVal).T->get();
+    Signedness SrcSign = (yyvsp[(3) - (6)].ConstVal).S;
+    Signedness DstSign = (yyvsp[(5) - (6)].TypeVal).S;
     if (!SrcTy->isFirstClassType())
       error("cast constant expression from a non-primitive type: '" +
             SrcTy->getDescription() + "'");
     if (!DstTy->isFirstClassType())
       error("cast constant expression to a non-primitive type: '" +
             DstTy->getDescription() + "'");
-    (yyval.ConstVal).C = cast<Constant>(getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal).C, SrcSign, DstTy, DstSign));
+    (yyval.ConstVal).C = cast<Constant>(getCast((yyvsp[(1) - (6)].CastOpVal), (yyvsp[(3) - (6)].ConstVal).C, SrcSign, DstTy, DstSign));
     (yyval.ConstVal).S = DstSign;
-    delete (yyvsp[-1].TypeVal).T;
+    delete (yyvsp[(5) - (6)].TypeVal).T;
   ;}
     break;
 
   case 164:
-#line 2164 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2112 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-2].ConstVal).C->getType();
+    const Type *Ty = (yyvsp[(3) - (5)].ConstVal).C->getType();
     if (!isa<PointerType>(Ty))
       error("GetElementPtr requires a pointer operand");
 
     std::vector<Value*> VIndices;
     std::vector<Constant*> CIndices;
-    upgradeGEPIndices((yyvsp[-2].ConstVal).C->getType(), (yyvsp[-1].ValueList), VIndices, &CIndices);
+    upgradeGEPIndices((yyvsp[(3) - (5)].ConstVal).C->getType(), (yyvsp[(4) - (5)].ValueList), VIndices, &CIndices);
 
-    delete (yyvsp[-1].ValueList);
-    (yyval.ConstVal).C = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal).C, CIndices);
+    delete (yyvsp[(4) - (5)].ValueList);
+    (yyval.ConstVal).C = ConstantExpr::getGetElementPtr((yyvsp[(3) - (5)].ConstVal).C, CIndices);
     (yyval.ConstVal).S = Signless;
   ;}
     break;
 
   case 165:
-#line 2177 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2125 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!(yyvsp[-5].ConstVal).C->getType()->isInteger() ||
-        cast<IntegerType>((yyvsp[-5].ConstVal).C->getType())->getBitWidth() != 1)
+    if (!(yyvsp[(3) - (8)].ConstVal).C->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[(3) - (8)].ConstVal).C->getType())->getBitWidth() != 1)
       error("Select condition must be bool type");
-    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType())
+    if ((yyvsp[(5) - (8)].ConstVal).C->getType() != (yyvsp[(7) - (8)].ConstVal).C->getType())
       error("Select operand types must match");
-    (yyval.ConstVal).C = ConstantExpr::getSelect((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).C = ConstantExpr::getSelect((yyvsp[(3) - (8)].ConstVal).C, (yyvsp[(5) - (8)].ConstVal).C, (yyvsp[(7) - (8)].ConstVal).C);
     (yyval.ConstVal).S = Unsigned;
   ;}
     break;
 
   case 166:
-#line 2186 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2134 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-3].ConstVal).C->getType();
-    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+    const Type *Ty = (yyvsp[(3) - (6)].ConstVal).C->getType();
+    if (Ty != (yyvsp[(5) - (6)].ConstVal).C->getType())
       error("Binary operator types must match");
     // First, make sure we're dealing with the right opcode by upgrading from
     // obsolete versions.
-    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[(1) - (6)].BinaryOpVal), Ty, (yyvsp[(3) - (6)].ConstVal).S);
 
     // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs.
     // To retain backward compatibility with these early compilers, we emit a
     // cast to the appropriate integer type automatically if we are in the
     // broken case.  See PR424 for more information.
     if (!isa<PointerType>(Ty)) {
-      (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+      (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C);
     } else {
       const Type *IntPtrTy = 0;
       switch (CurModule.CurrentModule->getPointerSize()) {
@@ -4561,160 +4730,160 @@
       default: error("invalid pointer binary constant expr");
       }
       (yyval.ConstVal).C = ConstantExpr::get(Opcode, 
-             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-3].ConstVal).C, IntPtrTy),
-             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[-1].ConstVal).C, IntPtrTy));
+             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[(3) - (6)].ConstVal).C, IntPtrTy),
+             ConstantExpr::getCast(Instruction::PtrToInt, (yyvsp[(5) - (6)].ConstVal).C, IntPtrTy));
       (yyval.ConstVal).C = ConstantExpr::getCast(Instruction::IntToPtr, (yyval.ConstVal).C, Ty);
     }
-    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S; 
+    (yyval.ConstVal).S = (yyvsp[(3) - (6)].ConstVal).S; 
   ;}
     break;
 
   case 167:
-#line 2214 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2162 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
-    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+    const Type* Ty = (yyvsp[(3) - (6)].ConstVal).C->getType();
+    if (Ty != (yyvsp[(5) - (6)].ConstVal).C->getType())
       error("Logical operator types must match");
     if (!Ty->isInteger()) {
       if (!isa<PackedType>(Ty) || 
           !cast<PackedType>(Ty)->getElementType()->isInteger())
         error("Logical operator requires integer operands");
     }
-    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-5].BinaryOpVal), Ty, (yyvsp[-3].ConstVal).S);
-    (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
-    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[(1) - (6)].BinaryOpVal), Ty, (yyvsp[(3) - (6)].ConstVal).S);
+    (yyval.ConstVal).C = ConstantExpr::get(Opcode, (yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[(3) - (6)].ConstVal).S;
   ;}
     break;
 
   case 168:
-#line 2227 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2175 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-3].ConstVal).C->getType();
-    if (Ty != (yyvsp[-1].ConstVal).C->getType())
+    const Type* Ty = (yyvsp[(3) - (6)].ConstVal).C->getType();
+    if (Ty != (yyvsp[(5) - (6)].ConstVal).C->getType())
       error("setcc operand types must match");
     unsigned short pred;
-    Instruction::OtherOps Opcode = getCompareOp((yyvsp[-5].BinaryOpVal), pred, Ty, (yyvsp[-3].ConstVal).S);
-    (yyval.ConstVal).C = ConstantExpr::getCompare(Opcode, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    Instruction::OtherOps Opcode = getCompareOp((yyvsp[(1) - (6)].BinaryOpVal), pred, Ty, (yyvsp[(3) - (6)].ConstVal).S);
+    (yyval.ConstVal).C = ConstantExpr::getCompare(Opcode, (yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C);
     (yyval.ConstVal).S = Unsigned;
   ;}
     break;
 
   case 169:
-#line 2236 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2184 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) 
+    if ((yyvsp[(4) - (7)].ConstVal).C->getType() != (yyvsp[(6) - (7)].ConstVal).C->getType()) 
       error("icmp operand types must match");
-    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].IPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[(2) - (7)].IPred), (yyvsp[(4) - (7)].ConstVal).C, (yyvsp[(6) - (7)].ConstVal).C);
     (yyval.ConstVal).S = Unsigned;
   ;}
     break;
 
   case 170:
-#line 2242 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2190 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[-3].ConstVal).C->getType() != (yyvsp[-1].ConstVal).C->getType()) 
+    if ((yyvsp[(4) - (7)].ConstVal).C->getType() != (yyvsp[(6) - (7)].ConstVal).C->getType()) 
       error("fcmp operand types must match");
-    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[-5].FPred), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
+    (yyval.ConstVal).C = ConstantExpr::getCompare((yyvsp[(2) - (7)].FPred), (yyvsp[(4) - (7)].ConstVal).C, (yyvsp[(6) - (7)].ConstVal).C);
     (yyval.ConstVal).S = Unsigned;
   ;}
     break;
 
   case 171:
-#line 2248 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2196 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!(yyvsp[-1].ConstVal).C->getType()->isInteger() ||
-        cast<IntegerType>((yyvsp[-1].ConstVal).C->getType())->getBitWidth() != 8)
+    if (!(yyvsp[(5) - (6)].ConstVal).C->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[(5) - (6)].ConstVal).C->getType())->getBitWidth() != 8)
       error("Shift count for shift constant must be unsigned byte");
-    if (!(yyvsp[-3].ConstVal).C->getType()->isInteger())
+    if (!(yyvsp[(3) - (6)].ConstVal).C->getType()->isInteger())
       error("Shift constant expression requires integer operand");
-    (yyval.ConstVal).C = ConstantExpr::get(getOtherOp((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal).S), (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
-    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+    (yyval.ConstVal).C = ConstantExpr::get(getOtherOp((yyvsp[(1) - (6)].OtherOpVal), (yyvsp[(3) - (6)].ConstVal).S), (yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[(3) - (6)].ConstVal).S;
   ;}
     break;
 
   case 172:
-#line 2257 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2205 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+    if (!ExtractElementInst::isValidOperands((yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C))
       error("Invalid extractelement operands");
-    (yyval.ConstVal).C = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
-    (yyval.ConstVal).S = (yyvsp[-3].ConstVal).S;
+    (yyval.ConstVal).C = ConstantExpr::getExtractElement((yyvsp[(3) - (6)].ConstVal).C, (yyvsp[(5) - (6)].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[(3) - (6)].ConstVal).S;
   ;}
     break;
 
   case 173:
-#line 2263 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2211 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+    if (!InsertElementInst::isValidOperands((yyvsp[(3) - (8)].ConstVal).C, (yyvsp[(5) - (8)].ConstVal).C, (yyvsp[(7) - (8)].ConstVal).C))
       error("Invalid insertelement operands");
-    (yyval.ConstVal).C = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
-    (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+    (yyval.ConstVal).C = ConstantExpr::getInsertElement((yyvsp[(3) - (8)].ConstVal).C, (yyvsp[(5) - (8)].ConstVal).C, (yyvsp[(7) - (8)].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[(3) - (8)].ConstVal).S;
   ;}
     break;
 
   case 174:
-#line 2269 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2217 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C))
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[(3) - (8)].ConstVal).C, (yyvsp[(5) - (8)].ConstVal).C, (yyvsp[(7) - (8)].ConstVal).C))
       error("Invalid shufflevector operands");
-    (yyval.ConstVal).C = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal).C, (yyvsp[-3].ConstVal).C, (yyvsp[-1].ConstVal).C);
-    (yyval.ConstVal).S = (yyvsp[-5].ConstVal).S;
+    (yyval.ConstVal).C = ConstantExpr::getShuffleVector((yyvsp[(3) - (8)].ConstVal).C, (yyvsp[(5) - (8)].ConstVal).C, (yyvsp[(7) - (8)].ConstVal).C);
+    (yyval.ConstVal).S = (yyvsp[(3) - (8)].ConstVal).S;
   ;}
     break;
 
   case 175:
-#line 2280 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); ;}
+#line 2228 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { ((yyval.ConstVector) = (yyvsp[(1) - (3)].ConstVector))->push_back((yyvsp[(3) - (3)].ConstVal)); ;}
     break;
 
   case 176:
-#line 2281 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2229 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.ConstVector) = new std::vector<ConstInfo>();
-    (yyval.ConstVector)->push_back((yyvsp[0].ConstVal));
+    (yyval.ConstVector)->push_back((yyvsp[(1) - (1)].ConstVal));
   ;}
     break;
 
   case 177:
-#line 2290 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2238 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = false; ;}
     break;
 
   case 178:
-#line 2291 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2239 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = true; ;}
     break;
 
   case 179:
-#line 2303 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2251 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal);
+    (yyval.ModuleVal) = ParserResult = (yyvsp[(1) - (1)].ModuleVal);
     CurModule.ModuleDone();
   ;}
     break;
 
   case 180:
-#line 2312 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); ;}
+#line 2260 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal); CurFun.FunctionDone(); ;}
     break;
 
   case 181:
-#line 2313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
+#line 2261 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal); ;}
     break;
 
   case 182:
-#line 2314 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); ;}
+#line 2262 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[(1) - (4)].ModuleVal); ;}
     break;
 
   case 183:
-#line 2315 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); ;}
+#line 2263 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ModuleVal) = (yyvsp[(1) - (2)].ModuleVal); ;}
     break;
 
   case 184:
-#line 2316 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2264 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.ModuleVal) = CurModule.CurrentModule;
     // Emit an error if there are any unresolved types left.
@@ -4730,7 +4899,7 @@
     break;
 
   case 185:
-#line 2332 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2280 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     // Eagerly resolve types.  This is not an optimization, this is a
     // requirement that is due to the fact that we could have this:
@@ -4741,120 +4910,120 @@
     // If types are not resolved eagerly, then the two types will not be
     // determined to be the same type!
     //
-    const Type* Ty = (yyvsp[0].TypeVal).T->get();
-    ResolveTypeTo((yyvsp[-2].StrVal), Ty);
+    const Type* Ty = (yyvsp[(4) - (4)].TypeVal).T->get();
+    ResolveTypeTo((yyvsp[(2) - (4)].StrVal), Ty);
 
-    if (!setTypeName(Ty, (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) {
+    if (!setTypeName(Ty, (yyvsp[(2) - (4)].StrVal)) && !(yyvsp[(2) - (4)].StrVal)) {
       // If this is a named type that is not a redefinition, add it to the slot
       // table.
       CurModule.Types.push_back(Ty);
     }
-    delete (yyvsp[0].TypeVal).T;
+    delete (yyvsp[(4) - (4)].TypeVal).T;
   ;}
     break;
 
   case 186:
-#line 2352 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2300 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {       // Function prototypes can be in const pool
   ;}
     break;
 
   case 187:
-#line 2354 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2302 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {  // Asm blocks can be in the const pool
   ;}
     break;
 
   case 188:
-#line 2356 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2304 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].ConstVal).C == 0) 
+    if ((yyvsp[(5) - (5)].ConstVal).C == 0) 
       error("Global value initializer is not a constant");
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal).C->getType(), (yyvsp[0].ConstVal).C);
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), (yyvsp[(3) - (5)].Linkage), (yyvsp[(4) - (5)].BoolVal), (yyvsp[(5) - (5)].ConstVal).C->getType(), (yyvsp[(5) - (5)].ConstVal).C);
   ;}
     break;
 
   case 189:
-#line 2360 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2308 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     CurGV = 0;
   ;}
     break;
 
   case 190:
-#line 2363 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2311 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[0].TypeVal).T->get();
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), Ty, 0);
-    delete (yyvsp[0].TypeVal).T;
+    const Type *Ty = (yyvsp[(5) - (5)].TypeVal).T->get();
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::ExternalLinkage, (yyvsp[(4) - (5)].BoolVal), Ty, 0);
+    delete (yyvsp[(5) - (5)].TypeVal).T;
   ;}
     break;
 
   case 191:
-#line 2367 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2315 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     CurGV = 0;
   ;}
     break;
 
   case 192:
-#line 2370 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2318 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[0].TypeVal).T->get();
-    CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), Ty, 0);
-    delete (yyvsp[0].TypeVal).T;
+    const Type *Ty = (yyvsp[(5) - (5)].TypeVal).T->get();
+    CurGV = ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[(4) - (5)].BoolVal), Ty, 0);
+    delete (yyvsp[(5) - (5)].TypeVal).T;
   ;}
     break;
 
   case 193:
-#line 2374 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2322 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     CurGV = 0;
   ;}
     break;
 
   case 194:
-#line 2377 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2325 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(5) - (5)].TypeVal).T->get();
     CurGV = 
-      ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), Ty, 0);
-    delete (yyvsp[0].TypeVal).T;
+      ParseGlobalVariable((yyvsp[(2) - (5)].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[(4) - (5)].BoolVal), Ty, 0);
+    delete (yyvsp[(5) - (5)].TypeVal).T;
   ;}
     break;
 
   case 195:
-#line 2382 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2330 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     CurGV = 0;
   ;}
     break;
 
   case 196:
-#line 2385 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2333 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
   ;}
     break;
 
   case 197:
-#line 2387 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2335 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
   ;}
     break;
 
   case 198:
-#line 2389 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2337 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
   ;}
     break;
 
   case 199:
-#line 2394 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2342 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     const std::string &AsmSoFar = CurModule.CurrentModule->getModuleInlineAsm();
-    char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true);
-    std::string NewAsm((yyvsp[0].StrVal), EndStr);
-    free((yyvsp[0].StrVal));
+    char *EndStr = UnEscapeLexed((yyvsp[(1) - (1)].StrVal), true);
+    std::string NewAsm((yyvsp[(1) - (1)].StrVal), EndStr);
+    free((yyvsp[(1) - (1)].StrVal));
 
     if (AsmSoFar.empty())
       CurModule.CurrentModule->setModuleInlineAsm(NewAsm);
@@ -4864,112 +5033,112 @@
     break;
 
   case 200:
-#line 2408 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2356 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Endianness) = Module::BigEndian; ;}
     break;
 
   case 201:
-#line 2409 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2357 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.Endianness) = Module::LittleEndian; ;}
     break;
 
   case 202:
-#line 2413 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2361 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    CurModule.setEndianness((yyvsp[0].Endianness));
+    CurModule.setEndianness((yyvsp[(3) - (3)].Endianness));
   ;}
     break;
 
   case 203:
-#line 2416 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2364 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].UInt64Val) == 32)
+    if ((yyvsp[(3) - (3)].UInt64Val) == 32)
       CurModule.setPointerSize(Module::Pointer32);
-    else if ((yyvsp[0].UInt64Val) == 64)
+    else if ((yyvsp[(3) - (3)].UInt64Val) == 64)
       CurModule.setPointerSize(Module::Pointer64);
     else
-      error("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'");
+      error("Invalid pointer size: '" + utostr((yyvsp[(3) - (3)].UInt64Val)) + "'");
   ;}
     break;
 
   case 204:
-#line 2424 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2372 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurModule.CurrentModule->setTargetTriple((yyvsp[(3) - (3)].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
   ;}
     break;
 
   case 205:
-#line 2428 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2376 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurModule.CurrentModule->setDataLayout((yyvsp[(3) - (3)].StrVal));
+    free((yyvsp[(3) - (3)].StrVal));
   ;}
     break;
 
   case 207:
-#line 2439 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2387 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-      CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-      free((yyvsp[0].StrVal));
+      CurModule.CurrentModule->addLibrary((yyvsp[(3) - (3)].StrVal));
+      free((yyvsp[(3) - (3)].StrVal));
   ;}
     break;
 
   case 208:
-#line 2443 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2391 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal));
-    free((yyvsp[0].StrVal));
+    CurModule.CurrentModule->addLibrary((yyvsp[(1) - (1)].StrVal));
+    free((yyvsp[(1) - (1)].StrVal));
   ;}
     break;
 
   case 209:
-#line 2447 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2395 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { ;}
     break;
 
   case 213:
-#line 2460 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2408 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.StrVal) = 0; ;}
     break;
 
   case 214:
-#line 2464 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2412 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[-1].TypeVal).T->get() == Type::VoidTy)
+    if ((yyvsp[(1) - (2)].TypeVal).T->get() == Type::VoidTy)
       error("void typed arguments are invalid");
-    (yyval.ArgVal) = new std::pair<PATypeInfo, char*>((yyvsp[-1].TypeVal), (yyvsp[0].StrVal));
+    (yyval.ArgVal) = new std::pair<PATypeInfo, char*>((yyvsp[(1) - (2)].TypeVal), (yyvsp[(2) - (2)].StrVal));
   ;}
     break;
 
   case 215:
-#line 2472 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2420 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ArgList) = (yyvsp[-2].ArgList);
-    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
-    delete (yyvsp[0].ArgVal);
+    (yyval.ArgList) = (yyvsp[(1) - (3)].ArgList);
+    (yyval.ArgList)->push_back(*(yyvsp[(3) - (3)].ArgVal));
+    delete (yyvsp[(3) - (3)].ArgVal);
   ;}
     break;
 
   case 216:
-#line 2477 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2425 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
-    (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal));
-    delete (yyvsp[0].ArgVal);
+    (yyval.ArgList)->push_back(*(yyvsp[(1) - (1)].ArgVal));
+    delete (yyvsp[(1) - (1)].ArgVal);
   ;}
     break;
 
   case 217:
-#line 2485 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ArgList) = (yyvsp[0].ArgList); ;}
+#line 2433 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ArgList) = (yyvsp[(1) - (1)].ArgList); ;}
     break;
 
   case 218:
-#line 2486 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2434 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ArgList) = (yyvsp[-2].ArgList);
+    (yyval.ArgList) = (yyvsp[(1) - (3)].ArgList);
     PATypeInfo VoidTI;
     VoidTI.T = new PATypeHolder(Type::VoidTy);
     VoidTI.S = Signless;
@@ -4978,7 +5147,7 @@
     break;
 
   case 219:
-#line 2493 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2441 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.ArgList) = new std::vector<std::pair<PATypeInfo,char*> >();
     PATypeInfo VoidTI;
@@ -4989,18 +5158,18 @@
     break;
 
   case 220:
-#line 2500 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2448 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ArgList) = 0; ;}
     break;
 
   case 221:
-#line 2504 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2452 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    UnEscapeLexed((yyvsp[-5].StrVal));
-    std::string FunctionName((yyvsp[-5].StrVal));
-    free((yyvsp[-5].StrVal));  // Free strdup'd memory!
+    UnEscapeLexed((yyvsp[(3) - (8)].StrVal));
+    std::string FunctionName((yyvsp[(3) - (8)].StrVal));
+    free((yyvsp[(3) - (8)].StrVal));  // Free strdup'd memory!
 
-    const Type* RetTy = (yyvsp[-6].TypeVal).T->get();
+    const Type* RetTy = (yyvsp[(2) - (8)].TypeVal).T->get();
     
     if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
       error("LLVM functions cannot return aggregate types");
@@ -5015,9 +5184,9 @@
     } else if (FunctionName == "llvm.va_copy") {
       ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
       ParamTypeList.push_back(PointerType::get(Type::Int8Ty));
-    } else if ((yyvsp[-3].ArgList)) {   // If there are arguments...
+    } else if ((yyvsp[(5) - (8)].ArgList)) {   // If there are arguments...
       for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
-           I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I) {
+           I = (yyvsp[(5) - (8)].ArgList)->begin(), E = (yyvsp[(5) - (8)].ArgList)->end(); I != E; ++I) {
         const Type *Ty = I->first.T->get();
         ParamTypeList.push_back(Ty);
       }
@@ -5029,7 +5198,7 @@
 
     const FunctionType *FT = FunctionType::get(RetTy, ParamTypeList, isVarArg);
     const PointerType *PFT = PointerType::get(FT);
-    delete (yyvsp[-6].TypeVal).T;
+    delete (yyvsp[(2) - (8)].TypeVal).T;
 
     ValID ID;
     if (!FunctionName.empty()) {
@@ -5073,68 +5242,68 @@
       // argument to another function.
       Fn->setLinkage(CurFun.Linkage);
     }
-    Fn->setCallingConv((yyvsp[-7].UIntVal));
-    Fn->setAlignment((yyvsp[0].UIntVal));
-    if ((yyvsp[-1].StrVal)) {
-      Fn->setSection((yyvsp[-1].StrVal));
-      free((yyvsp[-1].StrVal));
+    Fn->setCallingConv((yyvsp[(1) - (8)].UIntVal));
+    Fn->setAlignment((yyvsp[(8) - (8)].UIntVal));
+    if ((yyvsp[(7) - (8)].StrVal)) {
+      Fn->setSection((yyvsp[(7) - (8)].StrVal));
+      free((yyvsp[(7) - (8)].StrVal));
     }
 
     // Add all of the arguments we parsed to the function...
-    if ((yyvsp[-3].ArgList)) {                     // Is null if empty...
+    if ((yyvsp[(5) - (8)].ArgList)) {                     // Is null if empty...
       if (isVarArg) {  // Nuke the last entry
-        assert((yyvsp[-3].ArgList)->back().first.T->get() == Type::VoidTy && 
-               (yyvsp[-3].ArgList)->back().second == 0 && "Not a varargs marker");
-        delete (yyvsp[-3].ArgList)->back().first.T;
-        (yyvsp[-3].ArgList)->pop_back();  // Delete the last entry
+        assert((yyvsp[(5) - (8)].ArgList)->back().first.T->get() == Type::VoidTy && 
+               (yyvsp[(5) - (8)].ArgList)->back().second == 0 && "Not a varargs marker");
+        delete (yyvsp[(5) - (8)].ArgList)->back().first.T;
+        (yyvsp[(5) - (8)].ArgList)->pop_back();  // Delete the last entry
       }
       Function::arg_iterator ArgIt = Fn->arg_begin();
       for (std::vector<std::pair<PATypeInfo,char*> >::iterator 
-           I = (yyvsp[-3].ArgList)->begin(), E = (yyvsp[-3].ArgList)->end(); I != E; ++I, ++ArgIt) {
+           I = (yyvsp[(5) - (8)].ArgList)->begin(), E = (yyvsp[(5) - (8)].ArgList)->end(); I != E; ++I, ++ArgIt) {
         delete I->first.T;                        // Delete the typeholder...
         setValueName(ArgIt, I->second);           // Insert arg into symtab...
         InsertValue(ArgIt);
       }
-      delete (yyvsp[-3].ArgList);                     // We're now done with the argument list
+      delete (yyvsp[(5) - (8)].ArgList);                     // We're now done with the argument list
     }
   ;}
     break;
 
   case 224:
-#line 2614 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2562 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.FunctionVal) = CurFun.CurrentFunction;
 
     // Make sure that we keep track of the linkage type even if there was a
     // previous "declare".
-    (yyval.FunctionVal)->setLinkage((yyvsp[-2].Linkage));
+    (yyval.FunctionVal)->setLinkage((yyvsp[(1) - (3)].Linkage));
   ;}
     break;
 
   case 227:
-#line 2628 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2576 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
   ;}
     break;
 
   case 229:
-#line 2634 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2582 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;}
     break;
 
   case 230:
-#line 2635 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2583 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;}
     break;
 
   case 231:
-#line 2639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2587 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { CurFun.isDeclare = true; ;}
     break;
 
   case 232:
-#line 2639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2587 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.FunctionVal) = CurFun.CurrentFunction;
     CurFun.FunctionDone();
@@ -5143,68 +5312,68 @@
     break;
 
   case 233:
-#line 2651 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2599 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = false; ;}
     break;
 
   case 234:
-#line 2652 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2600 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = true; ;}
     break;
 
   case 235:
-#line 2657 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    {    (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); ;}
+#line 2605 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    {    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SInt64Val)); ;}
     break;
 
   case 236:
-#line 2658 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); ;}
+#line 2606 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].UInt64Val)); ;}
     break;
 
   case 237:
-#line 2659 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); ;}
+#line 2607 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].FPVal)); ;}
     break;
 
   case 238:
-#line 2660 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2608 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, true)); ;}
     break;
 
   case 239:
-#line 2661 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2609 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValIDVal) = ValID::create(ConstantInt::get(Type::Int1Ty, false)); ;}
     break;
 
   case 240:
-#line 2662 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2610 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValIDVal) = ValID::createNull(); ;}
     break;
 
   case 241:
-#line 2663 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2611 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValIDVal) = ValID::createUndef(); ;}
     break;
 
   case 242:
-#line 2664 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2612 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValIDVal) = ValID::createZeroInit(); ;}
     break;
 
   case 243:
-#line 2665 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2613 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { // Nonempty unsized packed vector
-    const Type *ETy = (*(yyvsp[-1].ConstVector))[0].C->getType();
-    int NumElements = (yyvsp[-1].ConstVector)->size(); 
+    const Type *ETy = (*(yyvsp[(2) - (3)].ConstVector))[0].C->getType();
+    int NumElements = (yyvsp[(2) - (3)].ConstVector)->size(); 
     PackedType* pt = PackedType::get(ETy, NumElements);
     PATypeHolder* PTy = new PATypeHolder(
       HandleUpRefs(PackedType::get(ETy, NumElements)));
     
     // Verify all elements are correct type!
     std::vector<Constant*> Elems;
-    for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) {
-      Constant *C = (*(yyvsp[-1].ConstVector))[i].C;
+    for (unsigned i = 0; i < (yyvsp[(2) - (3)].ConstVector)->size(); i++) {
+      Constant *C = (*(yyvsp[(2) - (3)].ConstVector))[i].C;
       const Type *CTy = C->getType();
       if (ETy != CTy)
         error("Element #" + utostr(i) + " is not of type '" + 
@@ -5213,86 +5382,86 @@
       Elems.push_back(C);
     }
     (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, Elems));
-    delete PTy; delete (yyvsp[-1].ConstVector);
+    delete PTy; delete (yyvsp[(2) - (3)].ConstVector);
   ;}
     break;
 
   case 244:
-#line 2686 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2634 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal).C);
+    (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].ConstVal).C);
   ;}
     break;
 
   case 245:
-#line 2689 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2637 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    char *End = UnEscapeLexed((yyvsp[-2].StrVal), true);
-    std::string AsmStr = std::string((yyvsp[-2].StrVal), End);
-    End = UnEscapeLexed((yyvsp[0].StrVal), true);
-    std::string Constraints = std::string((yyvsp[0].StrVal), End);
-    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[-3].BoolVal));
-    free((yyvsp[-2].StrVal));
-    free((yyvsp[0].StrVal));
+    char *End = UnEscapeLexed((yyvsp[(3) - (5)].StrVal), true);
+    std::string AsmStr = std::string((yyvsp[(3) - (5)].StrVal), End);
+    End = UnEscapeLexed((yyvsp[(5) - (5)].StrVal), true);
+    std::string Constraints = std::string((yyvsp[(5) - (5)].StrVal), End);
+    (yyval.ValIDVal) = ValID::createInlineAsm(AsmStr, Constraints, (yyvsp[(2) - (5)].BoolVal));
+    free((yyvsp[(3) - (5)].StrVal));
+    free((yyvsp[(5) - (5)].StrVal));
   ;}
     break;
 
   case 246:
-#line 2704 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    {  (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); ;}
+#line 2652 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    {  (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].SIntVal)); ;}
     break;
 
   case 247:
-#line 2705 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    {  (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); ;}
+#line 2653 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    {  (yyval.ValIDVal) = ValID::create((yyvsp[(1) - (1)].StrVal)); ;}
     break;
 
   case 250:
-#line 2718 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2666 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { 
-    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
-    (yyval.ValueVal).S = (yyvsp[-1].TypeVal).S;
-    (yyval.ValueVal).V = getVal(Ty, (yyvsp[0].ValIDVal)); 
-    delete (yyvsp[-1].TypeVal).T;
+    const Type *Ty = (yyvsp[(1) - (2)].TypeVal).T->get();
+    (yyval.ValueVal).S = (yyvsp[(1) - (2)].TypeVal).S;
+    (yyval.ValueVal).V = getVal(Ty, (yyvsp[(2) - (2)].ValIDVal)); 
+    delete (yyvsp[(1) - (2)].TypeVal).T;
   ;}
     break;
 
   case 251:
-#line 2727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2675 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
   ;}
     break;
 
   case 252:
-#line 2730 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2678 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { // Do not allow functions with 0 basic blocks   
-    (yyval.FunctionVal) = (yyvsp[-1].FunctionVal);
+    (yyval.FunctionVal) = (yyvsp[(1) - (2)].FunctionVal);
   ;}
     break;
 
   case 253:
-#line 2739 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2687 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal));
-    InsertValue((yyvsp[0].TermInstVal));
-    (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal));
-    InsertValue((yyvsp[-2].BasicBlockVal));
-    (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal);
+    setValueName((yyvsp[(3) - (3)].TermInstVal), (yyvsp[(2) - (3)].StrVal));
+    InsertValue((yyvsp[(3) - (3)].TermInstVal));
+    (yyvsp[(1) - (3)].BasicBlockVal)->getInstList().push_back((yyvsp[(3) - (3)].TermInstVal));
+    InsertValue((yyvsp[(1) - (3)].BasicBlockVal));
+    (yyval.BasicBlockVal) = (yyvsp[(1) - (3)].BasicBlockVal);
   ;}
     break;
 
   case 254:
-#line 2749 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2697 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if ((yyvsp[0].InstVal).I)
-      (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal).I);
-    (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal);
+    if ((yyvsp[(2) - (2)].InstVal).I)
+      (yyvsp[(1) - (2)].BasicBlockVal)->getInstList().push_back((yyvsp[(2) - (2)].InstVal).I);
+    (yyval.BasicBlockVal) = (yyvsp[(1) - (2)].BasicBlockVal);
   ;}
     break;
 
   case 255:
-#line 2754 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2702 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true);
     // Make sure to move the basic block to the correct location in the
@@ -5305,9 +5474,9 @@
     break;
 
   case 256:
-#line 2763 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2711 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[0].StrVal)), true);
+    (yyval.BasicBlockVal) = CurBB = getBBVal(ValID::create((yyvsp[(1) - (1)].StrVal)), true);
     // Make sure to move the basic block to the correct location in the
     // function, instead of leaving it inserted wherever it was first
     // referenced.
@@ -5318,92 +5487,92 @@
     break;
 
   case 259:
-#line 2777 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2725 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {              // Return with a result...
-    (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal).V);
+    (yyval.TermInstVal) = new ReturnInst((yyvsp[(2) - (2)].ValueVal).V);
   ;}
     break;
 
   case 260:
-#line 2780 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2728 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                                       // Return with no result...
     (yyval.TermInstVal) = new ReturnInst();
   ;}
     break;
 
   case 261:
-#line 2783 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2731 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {                         // Unconditional Branch...
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(3) - (3)].ValIDVal));
     (yyval.TermInstVal) = new BranchInst(tmpBB);
   ;}
     break;
 
   case 262:
-#line 2787 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2735 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {  
-    BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal));
-    BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal));
-    Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[-6].ValIDVal));
+    BasicBlock* tmpBBA = getBBVal((yyvsp[(6) - (9)].ValIDVal));
+    BasicBlock* tmpBBB = getBBVal((yyvsp[(9) - (9)].ValIDVal));
+    Value* tmpVal = getVal(Type::Int1Ty, (yyvsp[(3) - (9)].ValIDVal));
     (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal);
   ;}
     break;
 
   case 263:
-#line 2793 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2741 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-7].PrimType).T, (yyvsp[-6].ValIDVal));
-    BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal));
-    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size());
+    Value* tmpVal = getVal((yyvsp[(2) - (9)].PrimType).T, (yyvsp[(3) - (9)].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (9)].ValIDVal));
+    SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[(8) - (9)].JumpTable)->size());
     (yyval.TermInstVal) = S;
-    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
-      E = (yyvsp[-1].JumpTable)->end();
+    std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[(8) - (9)].JumpTable)->begin(),
+      E = (yyvsp[(8) - (9)].JumpTable)->end();
     for (; I != E; ++I) {
       if (ConstantInt *CI = dyn_cast<ConstantInt>(I->first))
           S->addCase(CI, I->second);
       else
         error("Switch case is constant, but not a simple integer");
     }
-    delete (yyvsp[-1].JumpTable);
+    delete (yyvsp[(8) - (9)].JumpTable);
   ;}
     break;
 
   case 264:
-#line 2808 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2756 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    Value* tmpVal = getVal((yyvsp[-6].PrimType).T, (yyvsp[-5].ValIDVal));
-    BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal));
+    Value* tmpVal = getVal((yyvsp[(2) - (8)].PrimType).T, (yyvsp[(3) - (8)].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (8)].ValIDVal));
     SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0);
     (yyval.TermInstVal) = S;
   ;}
     break;
 
   case 265:
-#line 2815 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2763 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     const PointerType *PFTy;
     const FunctionType *Ty;
 
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal).T->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (13)].TypeVal).T->get())) ||
         !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      if ((yyvsp[-7].ValueList)) {
-        for (std::vector<ValueInfo>::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end();
+      if ((yyvsp[(6) - (13)].ValueList)) {
+        for (std::vector<ValueInfo>::iterator I = (yyvsp[(6) - (13)].ValueList)->begin(), E = (yyvsp[(6) - (13)].ValueList)->end();
              I != E; ++I)
           ParamTypes.push_back((*I).V->getType());
       }
       bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
       if (isVarArg) ParamTypes.pop_back();
-      Ty = FunctionType::get((yyvsp[-10].TypeVal).T->get(), ParamTypes, isVarArg);
+      Ty = FunctionType::get((yyvsp[(3) - (13)].TypeVal).T->get(), ParamTypes, isVarArg);
       PFTy = PointerType::get(Ty);
     }
-    Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal));   // Get the function we're calling...
-    BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal));
-    BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal));
+    Value *V = getVal(PFTy, (yyvsp[(4) - (13)].ValIDVal));   // Get the function we're calling...
+    BasicBlock *Normal = getBBVal((yyvsp[(10) - (13)].ValIDVal));
+    BasicBlock *Except = getBBVal((yyvsp[(13) - (13)].ValIDVal));
 
     // Create the call node...
-    if (!(yyvsp[-7].ValueList)) {                                   // Has no arguments?
+    if (!(yyvsp[(6) - (13)].ValueList)) {                                   // Has no arguments?
       (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
     } else {                                     // Has arguments?
       // Loop through FunctionType's arguments and ensure they are specified
@@ -5411,7 +5580,7 @@
       //
       FunctionType::param_iterator I = Ty->param_begin();
       FunctionType::param_iterator E = Ty->param_end();
-      std::vector<ValueInfo>::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end();
+      std::vector<ValueInfo>::iterator ArgI = (yyvsp[(6) - (13)].ValueList)->begin(), ArgE = (yyvsp[(6) - (13)].ValueList)->end();
 
       std::vector<Value*> Args;
       for (; ArgI != ArgE && I != E; ++ArgI, ++I) {
@@ -5426,62 +5595,62 @@
 
       (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, Args);
     }
-    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal));
-    delete (yyvsp[-10].TypeVal).T;
-    delete (yyvsp[-7].ValueList);
+    cast<InvokeInst>((yyval.TermInstVal))->setCallingConv((yyvsp[(2) - (13)].UIntVal));
+    delete (yyvsp[(3) - (13)].TypeVal).T;
+    delete (yyvsp[(6) - (13)].ValueList);
   ;}
     break;
 
   case 266:
-#line 2865 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2813 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TermInstVal) = new UnwindInst();
   ;}
     break;
 
   case 267:
-#line 2868 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2816 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.TermInstVal) = new UnreachableInst();
   ;}
     break;
 
   case 268:
-#line 2874 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2822 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.JumpTable) = (yyvsp[-5].JumpTable);
-    Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+    (yyval.JumpTable) = (yyvsp[(1) - (6)].JumpTable);
+    Constant *V = cast<Constant>(getExistingValue((yyvsp[(2) - (6)].PrimType).T, (yyvsp[(3) - (6)].ValIDVal)));
     
     if (V == 0)
       error("May only switch on a constant pool value");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (6)].ValIDVal));
     (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB));
   ;}
     break;
 
   case 269:
-#line 2884 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2832 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
-    Constant *V = cast<Constant>(getExistingValue((yyvsp[-4].PrimType).T, (yyvsp[-3].ValIDVal)));
+    Constant *V = cast<Constant>(getExistingValue((yyvsp[(1) - (5)].PrimType).T, (yyvsp[(2) - (5)].ValIDVal)));
 
     if (V == 0)
       error("May only switch on a constant pool value");
 
-    BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (5)].ValIDVal));
     (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); 
   ;}
     break;
 
   case 270:
-#line 2897 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2845 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     bool omit = false;
-    if ((yyvsp[-1].StrVal))
-      if (BitCastInst *BCI = dyn_cast<BitCastInst>((yyvsp[0].InstVal).I))
+    if ((yyvsp[(1) - (2)].StrVal))
+      if (BitCastInst *BCI = dyn_cast<BitCastInst>((yyvsp[(2) - (2)].InstVal).I))
         if (BCI->getSrcTy() == BCI->getDestTy() && 
-            BCI->getOperand(0)->getName() == (yyvsp[-1].StrVal))
+            BCI->getOperand(0)->getName() == (yyvsp[(1) - (2)].StrVal))
           // This is a useless bit cast causing a name redefinition. It is
           // a bit cast from a type to the same type of an operand with the
           // same name as the name we would give this instruction. Since this
@@ -5499,231 +5668,231 @@
       (yyval.InstVal).I = 0;
       (yyval.InstVal).S = Signless;
     } else {
-      setValueName((yyvsp[0].InstVal).I, (yyvsp[-1].StrVal));
-      InsertValue((yyvsp[0].InstVal).I);
-      (yyval.InstVal) = (yyvsp[0].InstVal);
+      setValueName((yyvsp[(2) - (2)].InstVal).I, (yyvsp[(1) - (2)].StrVal));
+      InsertValue((yyvsp[(2) - (2)].InstVal).I);
+      (yyval.InstVal) = (yyvsp[(2) - (2)].InstVal);
     }
   ;}
     break;
 
   case 271:
-#line 2926 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2874 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {    // Used for PHI nodes
     (yyval.PHIList).P = new std::list<std::pair<Value*, BasicBlock*> >();
-    (yyval.PHIList).S = (yyvsp[-5].TypeVal).S;
-    Value* tmpVal = getVal((yyvsp[-5].TypeVal).T->get(), (yyvsp[-3].ValIDVal));
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
+    (yyval.PHIList).S = (yyvsp[(1) - (6)].TypeVal).S;
+    Value* tmpVal = getVal((yyvsp[(1) - (6)].TypeVal).T->get(), (yyvsp[(3) - (6)].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(5) - (6)].ValIDVal));
     (yyval.PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
-    delete (yyvsp[-5].TypeVal).T;
+    delete (yyvsp[(1) - (6)].TypeVal).T;
   ;}
     break;
 
   case 272:
-#line 2934 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2882 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.PHIList) = (yyvsp[-6].PHIList);
-    Value* tmpVal = getVal((yyvsp[-6].PHIList).P->front().first->getType(), (yyvsp[-3].ValIDVal));
-    BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal));
-    (yyvsp[-6].PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
+    (yyval.PHIList) = (yyvsp[(1) - (7)].PHIList);
+    Value* tmpVal = getVal((yyvsp[(1) - (7)].PHIList).P->front().first->getType(), (yyvsp[(4) - (7)].ValIDVal));
+    BasicBlock* tmpBB = getBBVal((yyvsp[(6) - (7)].ValIDVal));
+    (yyvsp[(1) - (7)].PHIList).P->push_back(std::make_pair(tmpVal, tmpBB));
   ;}
     break;
 
   case 273:
-#line 2942 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2890 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {    // Used for call statements, and memory insts...
     (yyval.ValueList) = new std::vector<ValueInfo>();
-    (yyval.ValueList)->push_back((yyvsp[0].ValueVal));
+    (yyval.ValueList)->push_back((yyvsp[(1) - (1)].ValueVal));
   ;}
     break;
 
   case 274:
-#line 2946 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2894 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.ValueList) = (yyvsp[-2].ValueList);
-    (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal));
+    (yyval.ValueList) = (yyvsp[(1) - (3)].ValueList);
+    (yyvsp[(1) - (3)].ValueList)->push_back((yyvsp[(3) - (3)].ValueVal));
   ;}
     break;
 
   case 276:
-#line 2954 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2902 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValueList) = 0; ;}
     break;
 
   case 277:
-#line 2958 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2906 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.BoolVal) = true;
   ;}
     break;
 
   case 278:
-#line 2961 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2909 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     (yyval.BoolVal) = false;
   ;}
     break;
 
   case 279:
-#line 2967 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2915 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+    const Type* Ty = (yyvsp[(2) - (5)].TypeVal).T->get();
     if (!Ty->isInteger() && !Ty->isFloatingPoint() && !isa<PackedType>(Ty))
       error("Arithmetic operator requires integer, FP, or packed operands");
     if (isa<PackedType>(Ty) && 
-        ((yyvsp[-4].BinaryOpVal) == URemOp || (yyvsp[-4].BinaryOpVal) == SRemOp || (yyvsp[-4].BinaryOpVal) == FRemOp || (yyvsp[-4].BinaryOpVal) == RemOp))
+        ((yyvsp[(1) - (5)].BinaryOpVal) == URemOp || (yyvsp[(1) - (5)].BinaryOpVal) == SRemOp || (yyvsp[(1) - (5)].BinaryOpVal) == FRemOp || (yyvsp[(1) - (5)].BinaryOpVal) == RemOp))
       error("Remainder not supported on packed types");
     // Upgrade the opcode from obsolete versions before we do anything with it.
-    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
-    Value* val1 = getVal(Ty, (yyvsp[-2].ValIDVal)); 
-    Value* val2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[(1) - (5)].BinaryOpVal), Ty, (yyvsp[(2) - (5)].TypeVal).S);
+    Value* val1 = getVal(Ty, (yyvsp[(3) - (5)].ValIDVal)); 
+    Value* val2 = getVal(Ty, (yyvsp[(5) - (5)].ValIDVal));
     (yyval.InstVal).I = BinaryOperator::create(Opcode, val1, val2);
     if ((yyval.InstVal).I == 0)
       error("binary operator returned null");
-    (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T;
+    (yyval.InstVal).S = (yyvsp[(2) - (5)].TypeVal).S;
+    delete (yyvsp[(2) - (5)].TypeVal).T;
   ;}
     break;
 
   case 280:
-#line 2984 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2932 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(2) - (5)].TypeVal).T->get();
     if (!Ty->isInteger()) {
       if (!isa<PackedType>(Ty) ||
           !cast<PackedType>(Ty)->getElementType()->isInteger())
         error("Logical operator requires integral operands");
     }
-    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[-4].BinaryOpVal), Ty, (yyvsp[-3].TypeVal).S);
-    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
-    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    Instruction::BinaryOps Opcode = getBinaryOp((yyvsp[(1) - (5)].BinaryOpVal), Ty, (yyvsp[(2) - (5)].TypeVal).S);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[(3) - (5)].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[(5) - (5)].ValIDVal));
     (yyval.InstVal).I = BinaryOperator::create(Opcode, tmpVal1, tmpVal2);
     if ((yyval.InstVal).I == 0)
       error("binary operator returned null");
-    (yyval.InstVal).S = (yyvsp[-3].TypeVal).S;
-    delete (yyvsp[-3].TypeVal).T;
+    (yyval.InstVal).S = (yyvsp[(2) - (5)].TypeVal).S;
+    delete (yyvsp[(2) - (5)].TypeVal).T;
   ;}
     break;
 
   case 281:
-#line 3000 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2948 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-3].TypeVal).T->get();
+    const Type* Ty = (yyvsp[(2) - (5)].TypeVal).T->get();
     if(isa<PackedType>(Ty))
       error("PackedTypes currently not supported in setcc instructions");
     unsigned short pred;
-    Instruction::OtherOps Opcode = getCompareOp((yyvsp[-4].BinaryOpVal), pred, Ty, (yyvsp[-3].TypeVal).S);
-    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
-    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
+    Instruction::OtherOps Opcode = getCompareOp((yyvsp[(1) - (5)].BinaryOpVal), pred, Ty, (yyvsp[(2) - (5)].TypeVal).S);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[(3) - (5)].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[(5) - (5)].ValIDVal));
     (yyval.InstVal).I = CmpInst::create(Opcode, pred, tmpVal1, tmpVal2);
     if ((yyval.InstVal).I == 0)
       error("binary operator returned null");
     (yyval.InstVal).S = Unsigned;
-    delete (yyvsp[-3].TypeVal).T;
+    delete (yyvsp[(2) - (5)].TypeVal).T;
   ;}
     break;
 
   case 282:
-#line 3014 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2962 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(3) - (6)].TypeVal).T->get();
     if (isa<PackedType>(Ty)) 
       error("PackedTypes currently not supported in icmp instructions");
     else if (!Ty->isInteger() && !isa<PointerType>(Ty))
       error("icmp requires integer or pointer typed operands");
-    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
-    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
-    (yyval.InstVal).I = new ICmpInst((yyvsp[-4].IPred), tmpVal1, tmpVal2);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[(4) - (6)].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[(6) - (6)].ValIDVal));
+    (yyval.InstVal).I = new ICmpInst((yyvsp[(2) - (6)].IPred), tmpVal1, tmpVal2);
     (yyval.InstVal).S = Unsigned;
-    delete (yyvsp[-3].TypeVal).T;
+    delete (yyvsp[(3) - (6)].TypeVal).T;
   ;}
     break;
 
   case 283:
-#line 3026 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2974 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-3].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(3) - (6)].TypeVal).T->get();
     if (isa<PackedType>(Ty))
       error("PackedTypes currently not supported in fcmp instructions");
     else if (!Ty->isFloatingPoint())
       error("fcmp instruction requires floating point operands");
-    Value* tmpVal1 = getVal(Ty, (yyvsp[-2].ValIDVal));
-    Value* tmpVal2 = getVal(Ty, (yyvsp[0].ValIDVal));
-    (yyval.InstVal).I = new FCmpInst((yyvsp[-4].FPred), tmpVal1, tmpVal2);
+    Value* tmpVal1 = getVal(Ty, (yyvsp[(4) - (6)].ValIDVal));
+    Value* tmpVal2 = getVal(Ty, (yyvsp[(6) - (6)].ValIDVal));
+    (yyval.InstVal).I = new FCmpInst((yyvsp[(2) - (6)].FPred), tmpVal1, tmpVal2);
     (yyval.InstVal).S = Unsigned;
-    delete (yyvsp[-3].TypeVal).T;
+    delete (yyvsp[(3) - (6)].TypeVal).T;
   ;}
     break;
 
   case 284:
-#line 3038 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2986 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
     warning("Use of obsolete 'not' instruction: Replacing with 'xor");
-    const Type *Ty = (yyvsp[0].ValueVal).V->getType();
+    const Type *Ty = (yyvsp[(2) - (2)].ValueVal).V->getType();
     Value *Ones = ConstantInt::getAllOnesValue(Ty);
     if (Ones == 0)
       error("Expected integral type for not instruction");
-    (yyval.InstVal).I = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal).V, Ones);
+    (yyval.InstVal).I = BinaryOperator::create(Instruction::Xor, (yyvsp[(2) - (2)].ValueVal).V, Ones);
     if ((yyval.InstVal).I == 0)
       error("Could not create a xor instruction");
-    (yyval.InstVal).S = (yyvsp[0].ValueVal).S
+    (yyval.InstVal).S = (yyvsp[(2) - (2)].ValueVal).S
   ;}
     break;
 
   case 285:
-#line 3049 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 2997 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!(yyvsp[0].ValueVal).V->getType()->isInteger() ||
-        cast<IntegerType>((yyvsp[0].ValueVal).V->getType())->getBitWidth() != 8)
+    if (!(yyvsp[(4) - (4)].ValueVal).V->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[(4) - (4)].ValueVal).V->getType())->getBitWidth() != 8)
       error("Shift amount must be int8");
-    if (!(yyvsp[-2].ValueVal).V->getType()->isInteger())
+    if (!(yyvsp[(2) - (4)].ValueVal).V->getType()->isInteger())
       error("Shift constant expression requires integer operand");
-    (yyval.InstVal).I = new ShiftInst(getOtherOp((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal).S), (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
-    (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+    (yyval.InstVal).I = new ShiftInst(getOtherOp((yyvsp[(1) - (4)].OtherOpVal), (yyvsp[(2) - (4)].ValueVal).S), (yyvsp[(2) - (4)].ValueVal).V, (yyvsp[(4) - (4)].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[(2) - (4)].ValueVal).S;
   ;}
     break;
 
   case 286:
-#line 3058 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3006 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *DstTy = (yyvsp[0].TypeVal).T->get();
+    const Type *DstTy = (yyvsp[(4) - (4)].TypeVal).T->get();
     if (!DstTy->isFirstClassType())
       error("cast instruction to a non-primitive type: '" +
             DstTy->getDescription() + "'");
-    (yyval.InstVal).I = cast<Instruction>(getCast((yyvsp[-3].CastOpVal), (yyvsp[-2].ValueVal).V, (yyvsp[-2].ValueVal).S, DstTy, (yyvsp[0].TypeVal).S, true));
-    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
-    delete (yyvsp[0].TypeVal).T;
+    (yyval.InstVal).I = cast<Instruction>(getCast((yyvsp[(1) - (4)].CastOpVal), (yyvsp[(2) - (4)].ValueVal).V, (yyvsp[(2) - (4)].ValueVal).S, DstTy, (yyvsp[(4) - (4)].TypeVal).S, true));
+    (yyval.InstVal).S = (yyvsp[(4) - (4)].TypeVal).S;
+    delete (yyvsp[(4) - (4)].TypeVal).T;
   ;}
     break;
 
   case 287:
-#line 3067 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3015 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!(yyvsp[-4].ValueVal).V->getType()->isInteger() ||
-        cast<IntegerType>((yyvsp[-4].ValueVal).V->getType())->getBitWidth() != 1)
+    if (!(yyvsp[(2) - (6)].ValueVal).V->getType()->isInteger() ||
+        cast<IntegerType>((yyvsp[(2) - (6)].ValueVal).V->getType())->getBitWidth() != 1)
       error("select condition must be bool");
-    if ((yyvsp[-2].ValueVal).V->getType() != (yyvsp[0].ValueVal).V->getType())
+    if ((yyvsp[(4) - (6)].ValueVal).V->getType() != (yyvsp[(6) - (6)].ValueVal).V->getType())
       error("select value types should match");
-    (yyval.InstVal).I = new SelectInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
-    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+    (yyval.InstVal).I = new SelectInst((yyvsp[(2) - (6)].ValueVal).V, (yyvsp[(4) - (6)].ValueVal).V, (yyvsp[(6) - (6)].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[(2) - (6)].ValueVal).S;
   ;}
     break;
 
   case 288:
-#line 3076 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3024 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[0].TypeVal).T->get();
+    const Type *Ty = (yyvsp[(4) - (4)].TypeVal).T->get();
     NewVarArgs = true;
-    (yyval.InstVal).I = new VAArgInst((yyvsp[-2].ValueVal).V, Ty);
-    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
-    delete (yyvsp[0].TypeVal).T;
+    (yyval.InstVal).I = new VAArgInst((yyvsp[(2) - (4)].ValueVal).V, Ty);
+    (yyval.InstVal).S = (yyvsp[(4) - (4)].TypeVal).S;
+    delete (yyvsp[(4) - (4)].TypeVal).T;
   ;}
     break;
 
   case 289:
-#line 3083 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3031 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
-    const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+    const Type* ArgTy = (yyvsp[(2) - (4)].ValueVal).V->getType();
+    const Type* DstTy = (yyvsp[(4) - (4)].TypeVal).T->get();
     ObsoleteVarArgs = true;
     Function* NF = cast<Function>(CurModule.CurrentModule->
       getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
@@ -5735,20 +5904,20 @@
     //b = vaarg foo, t
     AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix");
     CurBB->getInstList().push_back(foo);
-    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+    CallInst* bar = new CallInst(NF, (yyvsp[(2) - (4)].ValueVal).V);
     CurBB->getInstList().push_back(bar);
     CurBB->getInstList().push_back(new StoreInst(bar, foo));
     (yyval.InstVal).I = new VAArgInst(foo, DstTy);
-    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
-    delete (yyvsp[0].TypeVal).T;
+    (yyval.InstVal).S = (yyvsp[(4) - (4)].TypeVal).S;
+    delete (yyvsp[(4) - (4)].TypeVal).T;
   ;}
     break;
 
   case 290:
-#line 3104 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3052 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* ArgTy = (yyvsp[-2].ValueVal).V->getType();
-    const Type* DstTy = (yyvsp[0].TypeVal).T->get();
+    const Type* ArgTy = (yyvsp[(2) - (4)].ValueVal).V->getType();
+    const Type* DstTy = (yyvsp[(4) - (4)].TypeVal).T->get();
     ObsoleteVarArgs = true;
     Function* NF = cast<Function>(CurModule.CurrentModule->
       getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, (Type *)0));
@@ -5761,80 +5930,80 @@
     //b = load foo
     AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix");
     CurBB->getInstList().push_back(foo);
-    CallInst* bar = new CallInst(NF, (yyvsp[-2].ValueVal).V);
+    CallInst* bar = new CallInst(NF, (yyvsp[(2) - (4)].ValueVal).V);
     CurBB->getInstList().push_back(bar);
     CurBB->getInstList().push_back(new StoreInst(bar, foo));
     Instruction* tmp = new VAArgInst(foo, DstTy);
     CurBB->getInstList().push_back(tmp);
     (yyval.InstVal).I = new LoadInst(foo);
-    (yyval.InstVal).S = (yyvsp[0].TypeVal).S;
-    delete (yyvsp[0].TypeVal).T;
+    (yyval.InstVal).S = (yyvsp[(4) - (4)].TypeVal).S;
+    delete (yyvsp[(4) - (4)].TypeVal).T;
   ;}
     break;
 
   case 291:
-#line 3128 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3076 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+    if (!ExtractElementInst::isValidOperands((yyvsp[(2) - (4)].ValueVal).V, (yyvsp[(4) - (4)].ValueVal).V))
       error("Invalid extractelement operands");
-    (yyval.InstVal).I = new ExtractElementInst((yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
-    (yyval.InstVal).S = (yyvsp[-2].ValueVal).S;
+    (yyval.InstVal).I = new ExtractElementInst((yyvsp[(2) - (4)].ValueVal).V, (yyvsp[(4) - (4)].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[(2) - (4)].ValueVal).S;
   ;}
     break;
 
   case 292:
-#line 3134 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3082 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+    if (!InsertElementInst::isValidOperands((yyvsp[(2) - (6)].ValueVal).V, (yyvsp[(4) - (6)].ValueVal).V, (yyvsp[(6) - (6)].ValueVal).V))
       error("Invalid insertelement operands");
-    (yyval.InstVal).I = new InsertElementInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
-    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+    (yyval.InstVal).I = new InsertElementInst((yyvsp[(2) - (6)].ValueVal).V, (yyvsp[(4) - (6)].ValueVal).V, (yyvsp[(6) - (6)].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[(2) - (6)].ValueVal).S;
   ;}
     break;
 
   case 293:
-#line 3140 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3088 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V))
+    if (!ShuffleVectorInst::isValidOperands((yyvsp[(2) - (6)].ValueVal).V, (yyvsp[(4) - (6)].ValueVal).V, (yyvsp[(6) - (6)].ValueVal).V))
       error("Invalid shufflevector operands");
-    (yyval.InstVal).I = new ShuffleVectorInst((yyvsp[-4].ValueVal).V, (yyvsp[-2].ValueVal).V, (yyvsp[0].ValueVal).V);
-    (yyval.InstVal).S = (yyvsp[-4].ValueVal).S;
+    (yyval.InstVal).I = new ShuffleVectorInst((yyvsp[(2) - (6)].ValueVal).V, (yyvsp[(4) - (6)].ValueVal).V, (yyvsp[(6) - (6)].ValueVal).V);
+    (yyval.InstVal).S = (yyvsp[(2) - (6)].ValueVal).S;
   ;}
     break;
 
   case 294:
-#line 3146 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3094 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[0].PHIList).P->front().first->getType();
+    const Type *Ty = (yyvsp[(2) - (2)].PHIList).P->front().first->getType();
     if (!Ty->isFirstClassType())
       error("PHI node operands must be of first class type");
     PHINode *PHI = new PHINode(Ty);
-    PHI->reserveOperandSpace((yyvsp[0].PHIList).P->size());
-    while ((yyvsp[0].PHIList).P->begin() != (yyvsp[0].PHIList).P->end()) {
-      if ((yyvsp[0].PHIList).P->front().first->getType() != Ty) 
+    PHI->reserveOperandSpace((yyvsp[(2) - (2)].PHIList).P->size());
+    while ((yyvsp[(2) - (2)].PHIList).P->begin() != (yyvsp[(2) - (2)].PHIList).P->end()) {
+      if ((yyvsp[(2) - (2)].PHIList).P->front().first->getType() != Ty) 
         error("All elements of a PHI node must be of the same type");
-      PHI->addIncoming((yyvsp[0].PHIList).P->front().first, (yyvsp[0].PHIList).P->front().second);
-      (yyvsp[0].PHIList).P->pop_front();
+      PHI->addIncoming((yyvsp[(2) - (2)].PHIList).P->front().first, (yyvsp[(2) - (2)].PHIList).P->front().second);
+      (yyvsp[(2) - (2)].PHIList).P->pop_front();
     }
     (yyval.InstVal).I = PHI;
-    (yyval.InstVal).S = (yyvsp[0].PHIList).S;
-    delete (yyvsp[0].PHIList).P;  // Free the list...
+    (yyval.InstVal).S = (yyvsp[(2) - (2)].PHIList).S;
+    delete (yyvsp[(2) - (2)].PHIList).P;  // Free the list...
   ;}
     break;
 
   case 295:
-#line 3162 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3110 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
 
     // Handle the short call syntax
     const PointerType *PFTy;
     const FunctionType *FTy;
-    if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal).T->get())) ||
+    if (!(PFTy = dyn_cast<PointerType>((yyvsp[(3) - (7)].TypeVal).T->get())) ||
         !(FTy = dyn_cast<FunctionType>(PFTy->getElementType()))) {
       // Pull out the types of all of the arguments...
       std::vector<const Type*> ParamTypes;
-      if ((yyvsp[-1].ValueList)) {
-        for (std::vector<ValueInfo>::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end();
+      if ((yyvsp[(6) - (7)].ValueList)) {
+        for (std::vector<ValueInfo>::iterator I = (yyvsp[(6) - (7)].ValueList)->begin(), E = (yyvsp[(6) - (7)].ValueList)->end();
              I != E; ++I)
           ParamTypes.push_back((*I).V->getType());
       }
@@ -5842,7 +6011,7 @@
       bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy;
       if (isVarArg) ParamTypes.pop_back();
 
-      const Type *RetTy = (yyvsp[-4].TypeVal).T->get();
+      const Type *RetTy = (yyvsp[(3) - (7)].TypeVal).T->get();
       if (!RetTy->isFirstClassType() && RetTy != Type::VoidTy)
         error("Functions cannot return aggregate types");
 
@@ -5852,10 +6021,10 @@
 
     // First upgrade any intrinsic calls.
     std::vector<Value*> Args;
-    if ((yyvsp[-1].ValueList))
-      for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i < e; ++i) 
-        Args.push_back((*(yyvsp[-1].ValueList))[i].V);
-    Instruction *Inst = upgradeIntrinsicCall(FTy, (yyvsp[-3].ValIDVal), Args);
+    if ((yyvsp[(6) - (7)].ValueList))
+      for (unsigned i = 0, e = (yyvsp[(6) - (7)].ValueList)->size(); i < e; ++i) 
+        Args.push_back((*(yyvsp[(6) - (7)].ValueList))[i].V);
+    Instruction *Inst = upgradeIntrinsicCall(FTy, (yyvsp[(4) - (7)].ValIDVal), Args);
 
     // If we got an upgraded intrinsic
     if (Inst) {
@@ -5863,10 +6032,10 @@
       (yyval.InstVal).S = Signless;
     } else {
       // Get the function we're calling
-      Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal));
+      Value *V = getVal(PFTy, (yyvsp[(4) - (7)].ValIDVal));
 
       // Check the argument values match
-      if (!(yyvsp[-1].ValueList)) {                                   // Has no arguments?
+      if (!(yyvsp[(6) - (7)].ValueList)) {                                   // Has no arguments?
         // Make sure no arguments is a good thing!
         if (FTy->getNumParams() != 0)
           error("No arguments passed to a function that expects arguments");
@@ -5876,7 +6045,7 @@
         //
         FunctionType::param_iterator I = FTy->param_begin();
         FunctionType::param_iterator E = FTy->param_end();
-        std::vector<ValueInfo>::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end();
+        std::vector<ValueInfo>::iterator ArgI = (yyvsp[(6) - (7)].ValueList)->begin(), ArgE = (yyvsp[(6) - (7)].ValueList)->end();
 
         for (; ArgI != ArgE && I != E; ++ArgI, ++I)
           if ((*ArgI).V->getType() != *I)
@@ -5889,157 +6058,155 @@
 
       // Create the call instruction
       CallInst *CI = new CallInst(V, Args);
-      CI->setTailCall((yyvsp[-6].BoolVal));
-      CI->setCallingConv((yyvsp[-5].UIntVal));
+      CI->setTailCall((yyvsp[(1) - (7)].BoolVal));
+      CI->setCallingConv((yyvsp[(2) - (7)].UIntVal));
       (yyval.InstVal).I = CI;
-      (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
+      (yyval.InstVal).S = (yyvsp[(3) - (7)].TypeVal).S;
     }
-    delete (yyvsp[-4].TypeVal).T;
-    delete (yyvsp[-1].ValueList);
+    delete (yyvsp[(3) - (7)].TypeVal).T;
+    delete (yyvsp[(6) - (7)].ValueList);
   ;}
     break;
 
   case 296:
-#line 3235 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3183 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    (yyval.InstVal) = (yyvsp[0].InstVal);
+    (yyval.InstVal) = (yyvsp[(1) - (1)].InstVal);
   ;}
     break;
 
   case 297:
-#line 3243 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
-    { (yyval.ValueList) = (yyvsp[0].ValueList); ;}
+#line 3191 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
+    { (yyval.ValueList) = (yyvsp[(2) - (2)].ValueList); ;}
     break;
 
   case 298:
-#line 3244 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3192 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.ValueList) = new std::vector<ValueInfo>(); ;}
     break;
 
   case 299:
-#line 3248 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3196 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = true; ;}
     break;
 
   case 300:
-#line 3249 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3197 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     { (yyval.BoolVal) = false; ;}
     break;
 
   case 301:
-#line 3253 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3201 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
-    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
-    (yyval.InstVal).I = new MallocInst(Ty, 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal).T;
+    const Type *Ty = (yyvsp[(2) - (3)].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[(2) - (3)].TypeVal).S;
+    (yyval.InstVal).I = new MallocInst(Ty, 0, (yyvsp[(3) - (3)].UIntVal));
+    delete (yyvsp[(2) - (3)].TypeVal).T;
   ;}
     break;
 
   case 302:
-#line 3259 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3207 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-4].TypeVal).T->get();
-    (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
-    (yyval.InstVal).I = new MallocInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal).T;
+    const Type *Ty = (yyvsp[(2) - (6)].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[(2) - (6)].TypeVal).S;
+    (yyval.InstVal).I = new MallocInst(Ty, getVal((yyvsp[(4) - (6)].PrimType).T, (yyvsp[(5) - (6)].ValIDVal)), (yyvsp[(6) - (6)].UIntVal));
+    delete (yyvsp[(2) - (6)].TypeVal).T;
   ;}
     break;
 
   case 303:
-#line 3265 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3213 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-1].TypeVal).T->get();
-    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
-    (yyval.InstVal).I = new AllocaInst(Ty, 0, (yyvsp[0].UIntVal));
-    delete (yyvsp[-1].TypeVal).T;
+    const Type *Ty = (yyvsp[(2) - (3)].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[(2) - (3)].TypeVal).S;
+    (yyval.InstVal).I = new AllocaInst(Ty, 0, (yyvsp[(3) - (3)].UIntVal));
+    delete (yyvsp[(2) - (3)].TypeVal).T;
   ;}
     break;
 
   case 304:
-#line 3271 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3219 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *Ty = (yyvsp[-4].TypeVal).T->get();
-    (yyval.InstVal).S = (yyvsp[-4].TypeVal).S;
-    (yyval.InstVal).I = new AllocaInst(Ty, getVal((yyvsp[-2].PrimType).T, (yyvsp[-1].ValIDVal)), (yyvsp[0].UIntVal));
-    delete (yyvsp[-4].TypeVal).T;
+    const Type *Ty = (yyvsp[(2) - (6)].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[(2) - (6)].TypeVal).S;
+    (yyval.InstVal).I = new AllocaInst(Ty, getVal((yyvsp[(4) - (6)].PrimType).T, (yyvsp[(5) - (6)].ValIDVal)), (yyvsp[(6) - (6)].UIntVal));
+    delete (yyvsp[(2) - (6)].TypeVal).T;
   ;}
     break;
 
   case 305:
-#line 3277 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3225 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type *PTy = (yyvsp[0].ValueVal).V->getType();
+    const Type *PTy = (yyvsp[(2) - (2)].ValueVal).V->getType();
     if (!isa<PointerType>(PTy))
       error("Trying to free nonpointer type '" + PTy->getDescription() + "'");
-    (yyval.InstVal).I = new FreeInst((yyvsp[0].ValueVal).V);
+    (yyval.InstVal).I = new FreeInst((yyvsp[(2) - (2)].ValueVal).V);
     (yyval.InstVal).S = Signless;
   ;}
     break;
 
   case 306:
-#line 3284 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3232 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-1].TypeVal).T->get();
-    (yyval.InstVal).S = (yyvsp[-1].TypeVal).S;
+    const Type* Ty = (yyvsp[(3) - (4)].TypeVal).T->get();
+    (yyval.InstVal).S = (yyvsp[(3) - (4)].TypeVal).S;
     if (!isa<PointerType>(Ty))
       error("Can't load from nonpointer type: " + Ty->getDescription());
     if (!cast<PointerType>(Ty)->getElementType()->isFirstClassType())
       error("Can't load from pointer of non-first-class type: " +
                      Ty->getDescription());
-    Value* tmpVal = getVal(Ty, (yyvsp[0].ValIDVal));
-    (yyval.InstVal).I = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal));
-    delete (yyvsp[-1].TypeVal).T;
+    Value* tmpVal = getVal(Ty, (yyvsp[(4) - (4)].ValIDVal));
+    (yyval.InstVal).I = new LoadInst(tmpVal, "", (yyvsp[(1) - (4)].BoolVal));
+    delete (yyvsp[(3) - (4)].TypeVal).T;
   ;}
     break;
 
   case 307:
-#line 3296 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3244 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[-1].TypeVal).T->get());
+    const PointerType *PTy = dyn_cast<PointerType>((yyvsp[(5) - (6)].TypeVal).T->get());
     if (!PTy)
       error("Can't store to a nonpointer type: " + 
-             (yyvsp[-1].TypeVal).T->get()->getDescription());
+             (yyvsp[(5) - (6)].TypeVal).T->get()->getDescription());
     const Type *ElTy = PTy->getElementType();
-    if (ElTy != (yyvsp[-3].ValueVal).V->getType())
-      error("Can't store '" + (yyvsp[-3].ValueVal).V->getType()->getDescription() +
+    if (ElTy != (yyvsp[(3) - (6)].ValueVal).V->getType())
+      error("Can't store '" + (yyvsp[(3) - (6)].ValueVal).V->getType()->getDescription() +
             "' into space of type '" + ElTy->getDescription() + "'");
-    Value* tmpVal = getVal(PTy, (yyvsp[0].ValIDVal));
-    (yyval.InstVal).I = new StoreInst((yyvsp[-3].ValueVal).V, tmpVal, (yyvsp[-5].BoolVal));
+    Value* tmpVal = getVal(PTy, (yyvsp[(6) - (6)].ValIDVal));
+    (yyval.InstVal).I = new StoreInst((yyvsp[(3) - (6)].ValueVal).V, tmpVal, (yyvsp[(1) - (6)].BoolVal));
     (yyval.InstVal).S = Signless;
-    delete (yyvsp[-1].TypeVal).T;
+    delete (yyvsp[(5) - (6)].TypeVal).T;
   ;}
     break;
 
   case 308:
-#line 3310 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3258 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
     {
-    const Type* Ty = (yyvsp[-2].TypeVal).T->get();
+    const Type* Ty = (yyvsp[(2) - (4)].TypeVal).T->get();
     if (!isa<PointerType>(Ty))
       error("getelementptr insn requires pointer operand");
 
     std::vector<Value*> VIndices;
-    upgradeGEPIndices(Ty, (yyvsp[0].ValueList), VIndices);
+    upgradeGEPIndices(Ty, (yyvsp[(4) - (4)].ValueList), VIndices);
 
-    Value* tmpVal = getVal(Ty, (yyvsp[-1].ValIDVal));
+    Value* tmpVal = getVal(Ty, (yyvsp[(3) - (4)].ValIDVal));
     (yyval.InstVal).I = new GetElementPtrInst(tmpVal, VIndices);
     (yyval.InstVal).S = Signless;
-    delete (yyvsp[-2].TypeVal).T;
-    delete (yyvsp[0].ValueList);
+    delete (yyvsp[(2) - (4)].TypeVal).T;
+    delete (yyvsp[(4) - (4)].ValueList);
   ;}
     break;
 
 
+/* Line 1267 of yacc.c.  */
+#line 6204 "UpgradeParser.tab.c"
       default: break;
     }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
-/* Line 1126 of yacc.c.  */
-#line 6038 "UpgradeParser.tab.c"
-
-  yyvsp -= yylen;
-  yyssp -= yylen;
-
-
+  YYPOPSTACK (yylen);
+  yylen = 0;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
@@ -6068,110 +6235,41 @@
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if YYERROR_VERBOSE
-      yyn = yypact[yystate];
-
-      if (YYPACT_NINF < yyn && yyn < YYLAST)
-	{
-	  int yytype = YYTRANSLATE (yychar);
-	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-	  YYSIZE_T yysize = yysize0;
-	  YYSIZE_T yysize1;
-	  int yysize_overflow = 0;
-	  char *yymsg = 0;
-#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-	  int yyx;
-
-#if 0
-	  /* This is so xgettext sees the translatable formats that are
-	     constructed on the fly.  */
-	  YY_("syntax error, unexpected %s");
-	  YY_("syntax error, unexpected %s, expecting %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-#endif
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
-	  /* Start YYX at -YYN if negative to avoid negative indexes in
-	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytname[yytype];
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      {
-		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-		  {
-		    yycount = 1;
-		    yysize = yysize0;
-		    yyformat[sizeof yyunexpected - 1] = '\0';
-		    break;
-		  }
-		yyarg[yycount++] = yytname[yyx];
-		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-		yysize_overflow |= yysize1 < yysize;
-		yysize = yysize1;
-		yyfmt = yystpcpy (yyfmt, yyprefix);
-		yyprefix = yyor;
-	      }
-
-	  yyf = YY_(yyformat);
-	  yysize1 = yysize + yystrlen (yyf);
-	  yysize_overflow |= yysize1 < yysize;
-	  yysize = yysize1;
-
-	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-	    yymsg = (char *) YYSTACK_ALLOC (yysize);
-	  if (yymsg)
-	    {
-	      /* Avoid sprintf, as that infringes on the user's name space.
-		 Don't have undefined behavior even if the translation
-		 produced a string with the wrong number of "%s"s.  */
-	      char *yyp = yymsg;
-	      int yyi = 0;
-	      while ((*yyp = *yyf))
-		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      yyp++;
-		      yyf++;
-		    }
-		}
-	      yyerror (yymsg);
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
 	      YYSTACK_FREE (yymsg);
-	    }
-	  else
-	    {
-	      yyerror (YY_("syntax error"));
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
 	      goto yyexhaustedlab;
-	    }
-	}
-      else
-#endif /* YYERROR_VERBOSE */
-	yyerror (YY_("syntax error"));
+	  }
+      }
+#endif
     }
 
 
@@ -6182,14 +6280,15 @@
 	 error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
+	{
 	  /* Return failure if at end of input.  */
 	  if (yychar == YYEOF)
 	    YYABORT;
-        }
+	}
       else
 	{
-	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
 	  yychar = YYEMPTY;
 	}
     }
@@ -6207,11 +6306,14 @@
   /* Pacify compilers like GCC when the user code never invokes
      YYERROR and the label yyerrorlab therefore never appears in user
      code.  */
-  if (0)
+  if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-yyvsp -= yylen;
-  yyssp -= yylen;
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
   yystate = *yyssp;
   goto yyerrlab1;
 
@@ -6241,8 +6343,9 @@
 	YYABORT;
 
 
-      yydestruct ("Error: popping", yystos[yystate], yyvsp);
-      YYPOPSTACK;
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
@@ -6253,7 +6356,7 @@
   *++yyvsp = yylval;
 
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -6288,21 +6391,30 @@
   if (yychar != YYEOF && yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
 		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
 		  yystos[*yyssp], yyvsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-  return yyresult;
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
 }
 
 
-#line 3326 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y"
+#line 3274 "/home/asl/proj/llvm/src/tools/llvm-upgrade/UpgradeParser.y"
 
 
 int yyerror(const char *ErrorMsg) {
