aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-05-15 19:50:34 +0000
committerDan Gohman <gohman@apple.com>2008-05-15 19:50:34 +0000
commit041e2eb51721bcfecee5d9c9fc409ff185526e47 (patch)
treebb8e3b74ffb3950147e74e621ffa5e8f14040cd2
parentd208a803a614a0ce6d5a8c6df045fd130f5dfed7 (diff)
IR support for extractvalue and insertvalue instructions. Also, begin
moving toward making structs and arrays first-class types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51157 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Constants.h9
-rw-r--r--include/llvm/Instruction.def10
-rw-r--r--include/llvm/Instructions.h358
-rw-r--r--include/llvm/Support/InstVisitor.h2
-rw-r--r--lib/AsmParser/llvmAsmParser.cpp.cvs572
-rw-r--r--lib/AsmParser/llvmAsmParser.h.cvs2
-rw-r--r--lib/AsmParser/llvmAsmParser.y5
-rw-r--r--lib/AsmParser/llvmAsmParser.y.cvs8
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp13
-rw-r--r--lib/VMCore/ConstantFold.cpp21
-rw-r--r--lib/VMCore/ConstantFold.h4
-rw-r--r--lib/VMCore/Constants.cpp225
-rw-r--r--lib/VMCore/Instructions.cpp69
-rw-r--r--lib/VMCore/Verifier.cpp2
-rw-r--r--test/Verifier/2002-11-05-GetelementptrPointers.ll6
15 files changed, 946 insertions, 360 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h
index 87a29396ee..65c3a737c8 100644
--- a/include/llvm/Constants.h
+++ b/include/llvm/Constants.h
@@ -575,6 +575,11 @@ protected:
Constant *Elt, Constant *Idx);
static Constant *getShuffleVectorTy(const Type *Ty, Constant *V1,
Constant *V2, Constant *Mask);
+ static Constant *getExtractValueTy(const Type *Ty, Constant *Agg,
+ Constant * const *Idxs, unsigned NumIdxs);
+ static Constant *getInsertValueTy(const Type *Ty, Constant *Agg,
+ Constant *Val,
+ Constant * const *Idxs, unsigned NumIdxs);
public:
// Static methods to construct a ConstantExpr of different kinds. Note that
@@ -706,6 +711,10 @@ public:
static Constant *getExtractElement(Constant *Vec, Constant *Idx);
static Constant *getInsertElement(Constant *Vec, Constant *Elt,Constant *Idx);
static Constant *getShuffleVector(Constant *V1, Constant *V2, Constant *Mask);
+ static Constant *getExtractValue(Constant *Agg,
+ Constant* const *IdxList, unsigned NumIdx);
+ static Constant *getInsertValue(Constant *Agg, Constant *Val,
+ Constant* const *IdxList, unsigned NumIdx);
/// Floating point negation must be implemented with f(x) = -0.0 - x. This
/// method returns the negative zero constant for floating point or vector
diff --git a/include/llvm/Instruction.def b/include/llvm/Instruction.def
index f5ed4531a0..2189c86cfb 100644
--- a/include/llvm/Instruction.def
+++ b/include/llvm/Instruction.def
@@ -161,15 +161,17 @@ HANDLE_OTHER_INST(44, Select , SelectInst ) // select instruction
HANDLE_OTHER_INST(45, UserOp1, Instruction) // May be used internally in a pass
HANDLE_OTHER_INST(46, UserOp2, Instruction) // Internal to passes only
HANDLE_OTHER_INST(47, VAArg , VAArgInst ) // vaarg instruction
-HANDLE_OTHER_INST(48, ExtractElement, ExtractElementInst)// extract from vector.
+HANDLE_OTHER_INST(48, ExtractElement, ExtractElementInst)// extract from vector
HANDLE_OTHER_INST(49, InsertElement, InsertElementInst) // insert into vector
HANDLE_OTHER_INST(50, ShuffleVector, ShuffleVectorInst) // shuffle two vectors.
HANDLE_OTHER_INST(51, GetResult, GetResultInst) // Extract individual value
//from aggregate result
-HANDLE_OTHER_INST(52, VICmp , VICmpInst ) // Vec Int comparison instruction.
-HANDLE_OTHER_INST(53, VFCmp , VFCmpInst ) // Vec FP point comparison instr.
+HANDLE_OTHER_INST(52, ExtractValue, ExtractValueInst)// extract from aggregate
+HANDLE_OTHER_INST(53, InsertValue, InsertValueInst) // insert into aggregate
+HANDLE_OTHER_INST(54, VICmp , VICmpInst ) // Vec Int comparison instruction.
+HANDLE_OTHER_INST(55, VFCmp , VFCmpInst ) // Vec FP point comparison instr.
- LAST_OTHER_INST(53)
+ LAST_OTHER_INST(55)
#undef FIRST_TERM_INST
#undef HANDLE_TERM_INST
diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h
index e5de229c74..d65657bd33 100644
--- a/include/llvm/Instructions.h
+++ b/include/llvm/Instructions.h
@@ -408,28 +408,23 @@ class GetElementPtrInst : public Instruction {
/// pointer type.
///
static const Type *getIndexedType(const Type *Ptr,
- Value* const *Idx, unsigned NumIdx,
- bool AllowStructLeaf = false);
+ Value* const *Idx, unsigned NumIdx);
template<typename InputIterator>
static const Type *getIndexedType(const Type *Ptr,
InputIterator IdxBegin,
InputIterator IdxEnd,
- bool AllowStructLeaf,
// This argument ensures that we
// have an iterator we can do
// arithmetic on in constant time
std::random_access_iterator_tag) {
unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
- if (NumIdx > 0) {
+ if (NumIdx > 0)
// This requires that the iterator points to contiguous memory.
- return(getIndexedType(Ptr, (Value *const *)&*IdxBegin, NumIdx,
- AllowStructLeaf));
- }
- else {
- return(getIndexedType(Ptr, (Value *const*)0, NumIdx, AllowStructLeaf));
- }
+ return getIndexedType(Ptr, (Value *const *)&*IdxBegin, NumIdx);
+ else
+ return getIndexedType(Ptr, (Value *const*)0, NumIdx);
}
/// Constructors - Create a getelementptr instruction with a base pointer an
@@ -508,11 +503,10 @@ public:
template<typename InputIterator>
static const Type *getIndexedType(const Type *Ptr,
InputIterator IdxBegin,
- InputIterator IdxEnd,
- bool AllowStructLeaf = false) {
- return(getIndexedType(Ptr, IdxBegin, IdxEnd, AllowStructLeaf,
+ InputIterator IdxEnd) {
+ return getIndexedType(Ptr, IdxBegin, IdxEnd,
typename std::iterator_traits<InputIterator>::
- iterator_category()));
+ iterator_category());
}
static const Type *getIndexedType(const Type *Ptr, Value *Idx);
@@ -573,7 +567,7 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr,
Instruction *InsertBefore)
: Instruction(PointerType::get(checkType(
getIndexedType(Ptr->getType(),
- IdxBegin, IdxEnd, true)),
+ IdxBegin, IdxEnd)),
cast<PointerType>(Ptr->getType())
->getAddressSpace()),
GetElementPtr,
@@ -591,7 +585,7 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr,
BasicBlock *InsertAtEnd)
: Instruction(PointerType::get(checkType(
getIndexedType(Ptr->getType(),
- IdxBegin, IdxEnd, true)),
+ IdxBegin, IdxEnd)),
cast<PointerType>(Ptr->getType())
->getAddressSpace()),
GetElementPtr,
@@ -1498,6 +1492,338 @@ struct OperandTraits<ShuffleVectorInst> : FixedNumOperandTraits<3> {
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorInst, Value)
//===----------------------------------------------------------------------===//
+// ExtractValueInst Class
+//===----------------------------------------------------------------------===//
+
+/// ExtractValueInst - This instruction extracts a value
+/// from an aggregate value
+///
+class ExtractValueInst : public Instruction {
+ ExtractValueInst(const ExtractValueInst &EVI);
+ void init(Value *Agg, Value* const *Idx, unsigned NumIdx);
+ void init(Value *Agg, Value *Idx);
+
+ template<typename InputIterator>
+ void init(Value *Agg, InputIterator IdxBegin, InputIterator IdxEnd,
+ const std::string &Name,
+ // This argument ensures that we have an iterator we can
+ // do arithmetic on in constant time
+ std::random_access_iterator_tag) {
+ unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
+
+ if (NumIdx > 0) {
+ // This requires that the iterator points to contiguous memory.
+ init(Agg, &*IdxBegin, NumIdx); // FIXME: for the general case
+ // we have to build an array here
+ }
+ else {
+ init(Agg, 0, NumIdx);
+ }
+
+ setName(Name);
+ }
+
+ /// getIndexedType - Returns the type of the element that would be extracted
+ /// with an extractvalue instruction with the specified parameters.
+ ///
+ /// A null type is returned if the indices are invalid for the specified
+ /// pointer type.
+ ///
+ static const Type *getIndexedType(const Type *Agg,
+ Value* const *Idx, unsigned NumIdx);
+
+ template<typename InputIterator>
+ static const Type *getIndexedType(const Type *Ptr,
+ InputIterator IdxBegin,
+ InputIterator IdxEnd,
+ // This argument ensures that we
+ // have an iterator we can do
+ // arithmetic on in constant time
+ std::random_access_iterator_tag) {
+ unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
+
+ if (NumIdx > 0)
+ // This requires that the iterator points to contiguous memory.
+ return getIndexedType(Ptr, (Value *const *)&*IdxBegin, NumIdx);
+ else
+ return getIndexedType(Ptr, (Value *const*)0, NumIdx);
+ }
+
+ /// Constructors - Create a extractvalue instruction with a base pointer an
+ /// list of indices. The first ctor can optionally insert before an existing
+ /// instruction, the second appends the new instruction to the specified
+ /// BasicBlock.
+ template<typename InputIterator>
+ inline ExtractValueInst(Value *Agg, InputIterator IdxBegin,
+ InputIterator IdxEnd,
+ unsigned Values,
+ const std::string &Name,
+ Instruction *InsertBefore);
+ template<typename InputIterator>
+ inline ExtractValueInst(Value *Agg,
+ InputIterator IdxBegin, InputIterator IdxEnd,
+ unsigned Values,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+
+ /// Constructors - These two constructors are convenience methods because one
+ /// and two index extractvalue instructions are so common.
+ ExtractValueInst(Value *Agg, Value *Idx, const std::string &Name = "",
+ Instruction *InsertBefore = 0);
+ ExtractValueInst(Value *Agg, Value *Idx,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+public:
+ template<typename InputIterator>
+ static ExtractValueInst *Create(Value *Agg, InputIterator IdxBegin,
+ InputIterator IdxEnd,
+ const std::string &Name = "",
+ Instruction *InsertBefore = 0) {
+ typename std::iterator_traits<InputIterator>::difference_type Values =
+ 1 + std::distance(IdxBegin, IdxEnd);
+ return new(Values)
+ ExtractValueInst(Agg, IdxBegin, IdxEnd, Values, Name, InsertBefore);
+ }
+ template<typename InputIterator>
+ static ExtractValueInst *Create(Value *Agg,
+ InputIterator IdxBegin, InputIterator IdxEnd,
+ const std::string &Name,
+ BasicBlock *InsertAtEnd) {
+ typename std::iterator_traits<InputIterator>::difference_type Values =
+ 1 + std::distance(IdxBegin, IdxEnd);
+ return new(Values)
+ ExtractValueInst(Agg, IdxBegin, IdxEnd, Values, Name, InsertAtEnd);
+ }
+
+ /// Constructors - These two creators are convenience methods because one
+ /// index extractvalue instructions are much more common than those with
+ /// more than one.
+ static ExtractValueInst *Create(Value *Agg, Value *Idx,
+ const std::string &Name = "",
+ Instruction *InsertBefore = 0) {
+ return new(2) ExtractValueInst(Agg, Idx, Name, InsertBefore);
+ }
+ static ExtractValueInst *Create(Value *Agg, Value *Idx,
+ const std::string &Name,
+ BasicBlock *InsertAtEnd) {
+ return new(2) ExtractValueInst(Agg, Idx, Name, InsertAtEnd);
+ }
+
+ virtual ExtractValueInst *clone() const;
+
+ /// Transparently provide more efficient getOperand methods.
+ DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
+
+ // getType - Overload to return most specific pointer type...
+ const PointerType *getType() const {
+ return reinterpret_cast<const PointerType*>(Instruction::getType());
+ }
+
+ /// getIndexedType - Returns the type of the element that would be extracted
+ /// with an extractvalue instruction with the specified parameters.
+ ///
+ /// A null type is returned if the indices are invalid for the specified
+ /// pointer type.
+ ///
+ template<typename InputIterator>
+ static const Type *getIndexedType(const Type *Ptr,
+ InputIterator IdxBegin,
+ InputIterator IdxEnd) {
+ return getIndexedType(Ptr, IdxBegin, IdxEnd,
+ typename std::iterator_traits<InputIterator>::
+ iterator_category());
+ }
+ static const Type *getIndexedType(const Type *Ptr, Value *Idx);
+
+ inline op_iterator idx_begin() { return op_begin()+1; }
+ inline const_op_iterator idx_begin() const { return op_begin()+1; }
+ inline op_iterator idx_end() { return op_end(); }
+ inline const_op_iterator idx_end() const { return op_end(); }
+
+ Value *getAggregateOperand() {
+ return getOperand(0);
+ }
+ const Value *getAggregateOperand() const {
+ return getOperand(0);
+ }
+ static unsigned getAggregateOperandIndex() {
+ return 0U; // get index for modifying correct operand
+ }
+
+ unsigned getNumIndices() const { // Note: always non-negative
+ return getNumOperands() - 1;
+ }
+
+ bool hasIndices() const {
+ return getNumOperands() > 1;
+ }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ExtractValueInst *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return I->getOpcode() == Instruction::ExtractValue;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
+template <>
+struct OperandTraits<ExtractValueInst> : VariadicOperandTraits<1> {
+};
+
+DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractValueInst, Value)
+
+//===----------------------------------------------------------------------===//
+// InsertValueInst Class
+//===----------------------------------------------------------------------===//
+
+/// InsertValueInst - This instruction extracts a value
+/// from an aggregate value
+///
+class InsertValueInst : public Instruction {
+ InsertValueInst(const InsertValueInst &IVI);
+ void init(Value *Agg, Value *Val, Value* const *Idx, unsigned NumIdx);
+ void init(Value *Agg, Value *Val, Value *Idx);
+
+ template<typename InputIterator>
+ void init(Value *Agg, Value *Val,
+ InputIterator IdxBegin, InputIterator IdxEnd,
+ const std::string &Name,
+ // This argument ensures that we have an iterator we can
+ // do arithmetic on in constant time
+ std::random_access_iterator_tag) {
+ unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
+
+ if (NumIdx > 0) {
+ // This requires that the iterator points to contiguous memory.
+ init(Agg, Val, &*IdxBegin, NumIdx); // FIXME: for the general case
+ // we have to build an array here
+ }
+ else {
+ init(Agg, Val, 0, NumIdx);
+ }
+
+ setName(Name);
+ }
+
+ /// Constructors - Create a insertvalue instruction with a base pointer an
+ /// list of indices. The first ctor can optionally insert before an existing
+ /// instruction, the second appends the new instruction to the specified
+ /// BasicBlock.
+ template<typename InputIterator>
+ inline InsertValueInst(Value *Agg, Value *Val, InputIterator IdxBegin,
+ InputIterator IdxEnd,
+ unsigned Values,
+ const std::string &Name,
+ Instruction *InsertBefore);
+ template<typename InputIterator>
+ inline InsertValueInst(Value *Agg, Value *Val,
+ InputIterator IdxBegin, InputIterator IdxEnd,
+ unsigned Values,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+
+ /// Constructors - These two constructors are convenience methods because one
+ /// and two index insertvalue instructions are so common.
+ InsertValueInst(Value *Agg, Value *Val,
+ Value *Idx, const std::string &Name = "",
+ Instruction *InsertBefore = 0);
+ InsertValueInst(Value *Agg, Value *Val, Value *Idx,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+public:
+ template<typename InputIterator>
+ static InsertValueInst *Create(Value *Agg, Value *Val, InputIterator IdxBegin,
+ InputIterator IdxEnd,
+ const std::string &Name = "",
+ Instruction *InsertBefore = 0) {
+ typename std::iterator_traits<InputIterator>::difference_type Values =
+ 1 + std::distance(IdxBegin, IdxEnd);
+ return new(Values)
+ InsertValueInst(Agg, Val, IdxBegin, IdxEnd, Values, Name, InsertBefore);
+ }
+ template<typename InputIterator>
+ static InsertValueInst *Create(Value *Agg, Value *Val,
+ InputIterator IdxBegin, InputIterator IdxEnd,
+ const std::string &Name,
+ BasicBlock *InsertAtEnd) {
+ typename std::iterator_traits<InputIterator>::difference_type Values =
+ 1 + std::distance(IdxBegin, IdxEnd);
+ return new(Values)
+ InsertValueInst(Agg, Val, IdxBegin, IdxEnd, Values, Name, InsertAtEnd);
+ }
+
+ /// Constructors - These two creators are convenience methods because one
+ /// index insertvalue instructions are much more common than those with
+ /// more than one.
+ static InsertValueInst *Create(Value *Agg, Value *Val, Value *Idx,
+ const std::string &Name = "",
+ Instruction *InsertBefore = 0) {
+ return new(3) InsertValueInst(Agg, Val, Idx, Name, InsertBefore);
+ }
+ static InsertValueInst *Create(Value *Agg, Value *Val, Value *Idx,
+ const std::string &Name,
+ BasicBlock *InsertAtEnd) {
+ return new(3) InsertValueInst(Agg, Val, Idx, Name, InsertAtEnd);
+ }
+
+ virtual InsertValueInst *clone() const;
+
+ /// Transparently provide more efficient getOperand methods.
+ DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
+
+ // getType - Overload to return most specific pointer type...
+ const PointerType *getType() const {
+ return reinterpret_cast<const PointerType*>(Instruction::getType());
+ }
+
+ inline op_iterator idx_begin() { return op_begin()+1; }
+ inline const_op_iterator idx_begin() const { return op_begin()+1; }
+ inline op_iterator idx_end() { return op_end(); }
+ inline const_op_iterator idx_end() const { return op_end(); }
+
+ Value *getAggregateOperand() {
+ return getOperand(0);
+ }
+ const Value *getAggregateOperand() const {
+ return getOperand(0);
+ }
+ static unsigned getAggregateOperandIndex() {
+ return 0U; // get index for modifying correct operand
+ }
+
+ Value *getInsertedValueOperand() {
+ return getOperand(1);
+ }
+ const Value *getInsertedValueOperand() const {
+ return getOperand(1);
+ }
+ static unsigned getInsertedValueOperandIndex() {
+ return 1U; // get index for modifying correct operand
+ }
+
+ unsigned getNumIndices() const { // Note: always non-negative
+ return getNumOperands() - 2;
+ }
+
+ bool hasIndices() const {
+ return getNumOperands() > 2;
+ }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const InsertValueInst *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return I->getOpcode() == Instruction::InsertValue;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
+template <>
+struct OperandTraits<InsertValueInst> : VariadicOperandTraits<2> {
+};
+
+DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)
+
+//===----------------------------------------------------------------------===//
// PHINode Class
//===----------------------------------------------------------------------===//
diff --git a/include/llvm/Support/InstVisitor.h b/include/llvm/Support/InstVisitor.h
index 6e9a5c66ab..9606187508 100644
--- a/include/llvm/Support/InstVisitor.h
+++ b/include/llvm/Support/InstVisitor.h
@@ -197,6 +197,8 @@ public:
RetTy visitInsertElementInst(InsertElementInst &I) { DELEGATE(Instruction); }
RetTy visitShuffleVectorInst(ShuffleVectorInst &I) { DELEGATE(Instruction); }
RetTy visitGetResultInst(GetResultInst &I) { DELEGATE(Instruction); }
+ RetTy visitExtractValueInst(ExtractValueInst &I) { DELEGATE(Instruction);}
+ RetTy visitInsertValueInst(InsertValueInst &I) { DELEGATE(Instruction); }
// Next level propagators... if the user does not overload a specific
// instruction type, they can overload one of these to get the whole class
diff --git a/lib/AsmParser/llvmAsmParser.cpp.cvs b/lib/AsmParser/llvmAsmParser.cpp.cvs
index 2a19214b84..d9b6bbe1b9 100644
--- a/lib/AsmParser/llvmAsmParser.cpp.cvs
+++ b/lib/AsmParser/llvmAsmParser.cpp.cvs
@@ -384,7 +384,7 @@
/* Copy the first part of user declarations. */
-#line 14 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 14 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
#include "ParserInternals.h"
#include "llvm/CallingConv.h"
@@ -1340,7 +1340,7 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
-#line 949 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 949 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{
llvm::Module *ModuleVal;
llvm::Function *FunctionVal;
@@ -1852,16 +1852,16 @@ static const yytype_uint16 yyrline[] =
1458, 1465, 1470, 1475, 1482, 1483, 1490, 1497, 1505, 1511,
1523, 1551, 1567, 1594, 1622, 1648, 1668, 1694, 1714, 1726,
1733, 1799, 1809, 1819, 1825, 1835, 1841, 1851, 1856, 1861,
- 1874, 1886, 1908, 1916, 1922, 1933, 1938, 1943, 1948, 1953,
- 1959, 1965, 1974, 1978, 1986, 1986, 1989, 1989, 1992, 2004,
- 2025, 2030, 2038, 2039, 2043, 2043, 2047, 2047, 2050, 2053,
- 2077, 2089, 2088, 2100, 2099, 2109, 2108, 2119, 2159, 2162,
- 2168, 2178, 2182, 2187, 2189, 2194, 2199, 2208, 2218, 2229,
- 2233, 2242, 2251, 2256, 2385, 2385, 2387, 2396, 2396, 2398,
- 2403, 2415, 2419, 2424, 2428, 2432, 2436, 2440, 2444, 2448,
- 2452, 2456, 2481, 2485, 2495, 2499, 2503, 2508, 2515, 2515,
- 2521, 2530, 2535, 2540, 2544, 2553, 2562, 2571, 2575, 2583,
- 2590, 2594, 2599, 2609, 2628, 2637, 2722, 2726, 2733, 2744,
+ 1874, 1886, 1907, 1915, 1921, 1932, 1937, 1942, 1947, 1952,
+ 1958, 1964, 1973, 1977, 1985, 1985, 1988, 1988, 1991, 2003,
+ 2024, 2029, 2037, 2038, 2042, 2042, 2046, 2046, 2049, 2052,
+ 2076, 2088, 2087, 2099, 2098, 2108, 2107, 2118, 2158, 2161,
+ 2167, 2177, 2181, 2186, 2188, 2193, 2198, 2207, 2217, 2228,
+ 2232, 2241, 2250, 2255, 2384, 2384, 2386, 2395, 2395, 2397,
+ 2402, 2414, 2418, 2423, 2427, 2431, 2435, 2439, 2443, 2447,
+ 2451, 2455, 2480, 2484, 2494, 2498, 2502, 2507, 2514, 2514,
+ 2520, 2529, 2534, 2539, 2543, 2552, 2561, 2570, 2574, 2582,
+ 2589, 2593, 2598, 2608, 2627, 2636, 2722, 2726, 2733, 2744,
2757, 2767, 2778, 2788, 2799, 2807, 2817, 2824, 2827, 2828,
2835, 2839, 2844, 2860, 2877, 2891, 2905, 2919, 2933, 2945,
2953, 2960, 2966, 2972, 2978, 2993, 3083, 3088, 3092, 3099,
@@ -3503,152 +3503,152 @@ yyreduce:
switch (yyn)
{
case 29:
-#line 1117 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1117 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;}
break;
case 30:
-#line 1117 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1117 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_NE; ;}
break;
case 31:
-#line 1118 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1118 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;}
break;
case 32:
-#line 1118 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1118 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;}
break;
case 33:
-#line 1119 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1119 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;}
break;
case 34:
-#line 1119 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1119 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;}
break;
case 35:
-#line 1120 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1120 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;}
break;
case 36:
-#line 1120 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1120 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;}
break;
case 37:
-#line 1121 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1121 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;}
break;
case 38:
-#line 1121 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1121 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;}
break;
case 39:
-#line 1125 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1125 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;}
break;
case 40:
-#line 1125 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1125 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;}
break;
case 41:
-#line 1126 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1126 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;}
break;
case 42:
-#line 1126 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1126 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;}
break;
case 43:
-#line 1127 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1127 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;}
break;
case 44:
-#line 1127 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1127 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;}
break;
case 45:
-#line 1128 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1128 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;}
break;
case 46:
-#line 1128 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1128 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;}
break;
case 47:
-#line 1129 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1129 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;}
break;
case 48:
-#line 1129 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1129 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;}
break;
case 49:
-#line 1130 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1130 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;}
break;
case 50:
-#line 1130 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1130 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;}
break;
case 51:
-#line 1131 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1131 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;}
break;
case 52:
-#line 1131 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1131 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;}
break;
case 53:
-#line 1132 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1132 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;}
break;
case 54:
-#line 1133 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1133 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;}
break;
case 65:
-#line 1142 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1142 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.StrVal) = 0; ;}
break;
case 66:
-#line 1144 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1144 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.UIntVal)=(yyvsp[(3) - (4)].UInt64Val); ;}
break;
case 67:
-#line 1145 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1145 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.UIntVal)=0; ;}
break;
case 68:
-#line 1149 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1149 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{
(yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
CHECK_FOR_ERROR
@@ -3656,7 +3656,7 @@ yyreduce:
break;
case 69:
-#line 1153 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1153 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{
(yyval.StrVal) = 0;
CHECK_FOR_ERROR
@@ -3664,7 +3664,7 @@ yyreduce:
break;
case 73:
-#line 1161 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1161 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{
(yyval.StrVal) = 0;
CHECK_FOR_ERROR
@@ -3672,7 +3672,7 @@ yyreduce:
break;
case 74:
-#line 1166 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1166 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{
(yyval.StrVal) = (yyvsp[(1) - (2)].StrVal);
CHECK_FOR_ERROR
@@ -3680,157 +3680,157 @@ yyreduce:
break;
case 75:
-#line 1172 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1172 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::InternalLinkage; ;}
break;
case 76:
-#line 1173 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1173 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::WeakLinkage; ;}
break;
case 77:
-#line 1174 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1174 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;}
break;
case 78:
-#line 1175 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1175 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::AppendingLinkage; ;}
break;
case 79:
-#line 1176 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1176 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;}
break;
case 80:
-#line 1177 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1177 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::CommonLinkage; ;}
break;
case 81:
-#line 1181 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1181 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;}
break;
case 82:
-#line 1182 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1182 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;}
break;
case 83:
-#line 1183 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/llvmAsmParser.y"
+#line 1183 "/Volumes/LLVM/llvm/lib/AsmParser/llvmAsmParser.y"
{ (yyval.Linkage) = GlobalValue::ExternalLinkage; ;}
break;
case 84:
-#line 1187 "/Volumes/MacOS9/gcc/llvm/lib/AsmParser/l