From e4d87aa2de6e52952dca73716386db09aad5a8fd Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Sat, 23 Dec 2006 06:05:41 +0000 Subject: [PATCH] For PR950: This patch removes the SetCC instructions and replaces them with the ICmp and FCmp instructions. The SetCondInst instruction has been removed and been replaced with ICmpInst and FCmpInst. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32751 91177308-0d34-0410-b5e6-96231b3b80d8 --- examples/Fibonacci/fibonacci.cpp | 2 +- examples/ParallelJIT/ParallelJIT.cpp | 2 +- .../Analysis/ScalarEvolutionExpressions.h | 6 +- include/llvm/Constants.h | 13 +- include/llvm/InstrTypes.h | 14 + include/llvm/Instruction.def | 86 +- include/llvm/Instruction.h | 16 +- include/llvm/Instructions.h | 99 +- include/llvm/Pass.h | 2 +- include/llvm/Support/ConstantRange.h | 26 +- include/llvm/Support/InstVisitor.h | 1 - include/llvm/Support/PatternMatch.h | 46 +- include/llvm/Transforms/Utils/Local.h | 14 +- lib/Analysis/BasicAliasAnalysis.cpp | 3 +- lib/Analysis/ConstantRange.cpp | 197 +- lib/Analysis/IPA/Andersens.cpp | 5 +- lib/Analysis/IPA/GlobalsModRef.cpp | 4 +- lib/Analysis/LoopInfo.cpp | 18 +- lib/Analysis/ScalarEvolution.cpp | 198 +- lib/Analysis/ValueNumbering.cpp | 5 + lib/AsmParser/Lexer.cpp.cvs | 1268 +++--- lib/AsmParser/Lexer.l | 6 - lib/AsmParser/Lexer.l.cvs | 6 - lib/AsmParser/llvmAsmParser.cpp.cvs | 4051 +++++++++-------- lib/AsmParser/llvmAsmParser.h.cvs | 223 +- lib/AsmParser/llvmAsmParser.y | 24 +- lib/AsmParser/llvmAsmParser.y.cvs | 48 +- lib/CodeGen/IntrinsicLowering.cpp | 4 +- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 193 +- lib/ExecutionEngine/Interpreter/Execution.cpp | 441 +- lib/ExecutionEngine/Interpreter/Interpreter.h | 2 + lib/Support/ConstantRange.cpp | 197 +- lib/Target/CBackend/CBackend.cpp | 401 +- lib/Target/CBackend/Makefile | 2 +- lib/Target/CBackend/Writer.cpp | 401 +- lib/Target/README.txt | 2 +- lib/Transforms/ExprTypeConvert.cpp | 28 +- lib/Transforms/IPO/GlobalOpt.cpp | 64 +- lib/Transforms/IPO/SimplifyLibCalls.cpp | 40 +- .../Instrumentation/RSProfiling.cpp | 19 +- lib/Transforms/LevelRaise.cpp | 3 - lib/Transforms/Scalar/CorrelatedExprs.cpp | 376 +- lib/Transforms/Scalar/IndVarSimplify.cpp | 10 +- .../Scalar/InstructionCombining.cpp | 1704 ++++--- lib/Transforms/Scalar/LICM.cpp | 2 +- lib/Transforms/Scalar/LoopStrengthReduce.cpp | 17 +- lib/Transforms/Scalar/LoopUnswitch.cpp | 7 +- lib/Transforms/Scalar/LowerPacked.cpp | 43 +- lib/Transforms/Scalar/PredicateSimplifier.cpp | 344 +- lib/Transforms/Scalar/Reassociate.cpp | 9 +- lib/Transforms/Scalar/SCCP.cpp | 88 + .../Scalar/ScalarReplAggregates.cpp | 4 +- lib/Transforms/Utils/CloneFunction.cpp | 12 +- lib/Transforms/Utils/Local.cpp | 30 +- lib/Transforms/Utils/LowerInvoke.cpp | 12 +- lib/Transforms/Utils/LowerSwitch.cpp | 7 +- lib/Transforms/Utils/SimplifyCFG.cpp | 49 +- lib/VMCore/ConstantFold.cpp | 1377 +++--- lib/VMCore/ConstantFold.h | 4 +- lib/VMCore/ConstantFolding.h | 4 +- lib/VMCore/Constants.cpp | 65 +- lib/VMCore/Instruction.cpp | 54 +- lib/VMCore/Instructions.cpp | 137 +- lib/VMCore/SymbolTable.cpp | 2 +- lib/VMCore/Verifier.cpp | 4 - .../Stacker/lib/compiler/StackerCompiler.cpp | 50 +- test/CFrontend/2006-12-14-ordered_expr.c | 3 +- .../IndVarsSimplify/tripcount_infinite.llx | 4 +- .../2006-12-08-Phi-ICmp-Op-Fold.ll | 2 +- .../InstCombine/2006-12-10-ICmp-GEP-GEP.ll | 165 + .../InstCombine/2006-12-15-Range-Test.ll | 32 + test/Transforms/InstCombine/JavaCompare.ll | 2 +- test/Transforms/InstCombine/cast.ll | 11 +- test/Transforms/InstCombine/set.ll | 2 +- .../InstCombine/setcc-strength-reduce.ll | 2 +- .../2006-08-11-LoopSimplifyLongTime.ll.bc | Bin 165219 -> 165491 bytes .../exit_compare_live_range.ll | 2 +- .../SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll | 144 + test/Transforms/SimplifyCFG/DeadSetCC.ll | 2 +- tools/bugpoint/Miscompilation.cpp | 4 +- tools/llvm-upgrade/UpgradeParser.cpp | 406 +- tools/llvm-upgrade/UpgradeParser.cpp.cvs | 406 +- tools/llvm-upgrade/UpgradeParser.h | 2 +- tools/llvm-upgrade/UpgradeParser.h.cvs | 2 +- tools/llvm-upgrade/UpgradeParser.y | 18 +- tools/llvm-upgrade/UpgradeParser.y.cvs | 18 +- tools/llvm2cpp/CppWriter.cpp | 137 +- 87 files changed, 7714 insertions(+), 6241 deletions(-) create mode 100644 test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll create mode 100644 test/Transforms/InstCombine/2006-12-15-Range-Test.ll create mode 100644 test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll diff --git a/examples/Fibonacci/fibonacci.cpp b/examples/Fibonacci/fibonacci.cpp index 6f775515fba..96aeb6340aa 100644 --- a/examples/Fibonacci/fibonacci.cpp +++ b/examples/Fibonacci/fibonacci.cpp @@ -58,7 +58,7 @@ static Function *CreateFibFunction(Module *M) { BasicBlock* RecurseBB = new BasicBlock("recurse", FibF); // Create the "if (arg < 2) goto exitbb" - Value *CondInst = BinaryOperator::createSetLE(ArgX, Two, "cond", BB); + Value *CondInst = new ICmpInst(ICmpInst::ICMP_SLE, ArgX, Two, "cond", BB); new BranchInst(RetBB, RecurseBB, CondInst, BB); // Create: ret int 1 diff --git a/examples/ParallelJIT/ParallelJIT.cpp b/examples/ParallelJIT/ParallelJIT.cpp index dfda1263786..7f2e1bfc10b 100644 --- a/examples/ParallelJIT/ParallelJIT.cpp +++ b/examples/ParallelJIT/ParallelJIT.cpp @@ -83,7 +83,7 @@ static Function *CreateFibFunction(Module *M) BasicBlock* RecurseBB = new BasicBlock("recurse", FibF); // Create the "if (arg < 2) goto exitbb" - Value *CondInst = BinaryOperator::createSetLE(ArgX, Two, "cond", BB); + Value *CondInst = new ICmpInst(ICmpInst::ICMP_SLE, ArgX, Two, "cond", BB); new BranchInst(RetBB, RecurseBB, CondInst, BB); // Create: ret int 1 diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h index c261dfc8e59..b9bf93b8c79 100644 --- a/include/llvm/Analysis/ScalarEvolutionExpressions.h +++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h @@ -426,8 +426,10 @@ namespace llvm { /// looking at this is that it returns the first iteration number where the /// value is not in the condition, thus computing the exit count. If the /// iteration count can't be computed, an instance of SCEVCouldNotCompute is - /// returned. - SCEVHandle getNumIterationsInRange(ConstantRange Range) const; + /// returned. The isSigned parameter indicates whether the ConstantRange + /// should be treated as signed or unsigned. + SCEVHandle getNumIterationsInRange(ConstantRange Range, + bool isSigned) const; SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym, const SCEVHandle &Conc) const; diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 2a0c62423d6..a6050f44a63 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -496,8 +496,8 @@ protected: // ConstantExprs in intermediate forms. static Constant *getTy(const Type *Ty, unsigned Opcode, Constant *C1, Constant *C2); - static Constant *getCompareTy(unsigned Opcode, unsigned short pred, - Constant *C1, Constant *C2); + static Constant *getCompareTy(unsigned short pred, Constant *C1, + Constant *C2); static Constant *getShiftTy(const Type *Ty, unsigned Opcode, Constant *C1, Constant *C2); static Constant *getSelectTy(const Type *Ty, @@ -604,8 +604,7 @@ public: static Constant *get(unsigned Opcode, Constant *C1, Constant *C2); /// @brief Return an ICmp or FCmp comparison operator constant expression. - static Constant *getCompare(unsigned Opcode, unsigned short pred, - Constant *C1, Constant *C2); + static Constant *getCompare(unsigned short pred, Constant *C1, Constant *C2); /// ConstantExpr::get* - Return some common constants without having to /// specify the full Instruction::OPCODE identifier. @@ -624,12 +623,6 @@ public: static Constant *getAnd(Constant *C1, Constant *C2); static Constant *getOr(Constant *C1, Constant *C2); static Constant *getXor(Constant *C1, Constant *C2); - static Constant *getSetEQ(Constant *C1, Constant *C2); - static Constant *getSetNE(Constant *C1, Constant *C2); - static Constant *getSetLT(Constant *C1, Constant *C2); - static Constant *getSetGT(Constant *C1, Constant *C2); - static Constant *getSetLE(Constant *C1, Constant *C2); - static Constant *getSetGE(Constant *C1, Constant *C2); static Constant* getICmp(unsigned short pred, Constant* LHS, Constant* RHS); static Constant* getFCmp(unsigned short pred, Constant* LHS, Constant* RHS); static Constant *getShl(Constant *C1, Constant *C2); diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h index b3ec55921fd..152f4773ebe 100644 --- a/include/llvm/InstrTypes.h +++ b/include/llvm/InstrTypes.h @@ -543,6 +543,20 @@ public: /// @brief Determine if this is an equals/not equals predicate. bool isEquality(); + /// @returns true if the predicate is unsigned, false otherwise. + /// @brief Determine if the predicate is an unsigned operation. + static bool isUnsigned(unsigned short predicate); + + /// @returns true if the predicate is signed, false otherwise. + /// @brief Determine if the predicate is an signed operation. + static bool isSigned(unsigned short predicate); + + /// @brief Determine if the predicate is an ordered operation. + static bool isOrdered(unsigned short predicate); + + /// @brief Determine if the predicate is an unordered operation. + static bool isUnordered(unsigned short predicate); + /// @brief Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const CmpInst *) { return true; } static inline bool classof(const Instruction *I) { diff --git a/include/llvm/Instruction.def b/include/llvm/Instruction.def index db41734fa49..c33c4483be6 100644 --- a/include/llvm/Instruction.def +++ b/include/llvm/Instruction.def @@ -118,61 +118,53 @@ HANDLE_BINARY_INST(15, FRem , BinaryOperator) HANDLE_BINARY_INST(16, And , BinaryOperator) HANDLE_BINARY_INST(17, Or , BinaryOperator) HANDLE_BINARY_INST(18, Xor , BinaryOperator) - -// Binary comparison operators... -HANDLE_BINARY_INST(19, SetEQ , SetCondInst) -HANDLE_BINARY_INST(20, SetNE , SetCondInst) -HANDLE_BINARY_INST(21, SetLE , SetCondInst) -HANDLE_BINARY_INST(22, SetGE , SetCondInst) -HANDLE_BINARY_INST(23, SetLT , SetCondInst) -HANDLE_BINARY_INST(24, SetGT , SetCondInst) - LAST_BINARY_INST(24) + LAST_BINARY_INST(18) // Memory operators... - FIRST_MEMORY_INST(25) -HANDLE_MEMORY_INST(25, Malloc, MallocInst) // Heap management instructions -HANDLE_MEMORY_INST(26, Free , FreeInst ) -HANDLE_MEMORY_INST(27, Alloca, AllocaInst) // Stack management -HANDLE_MEMORY_INST(28, Load , LoadInst ) // Memory manipulation instrs -HANDLE_MEMORY_INST(29, Store , StoreInst ) -HANDLE_MEMORY_INST(30, GetElementPtr, GetElementPtrInst) - LAST_MEMORY_INST(30) + FIRST_MEMORY_INST(19) +HANDLE_MEMORY_INST(19, Malloc, MallocInst) // Heap management instructions +HANDLE_MEMORY_INST(20, Free , FreeInst ) +HANDLE_MEMORY_INST(21, Alloca, AllocaInst) // Stack management +HANDLE_MEMORY_INST(22, Load , LoadInst ) // Memory manipulation instrs +HANDLE_MEMORY_INST(23, Store , StoreInst ) +HANDLE_MEMORY_INST(24, GetElementPtr, GetElementPtrInst) + LAST_MEMORY_INST(24) // Cast operators ... // NOTE: The order matters here because CastInst::isEliminableCastPair // NOTE: (see Instructions.cpp) encodes a table based on this ordering. - FIRST_CAST_INST(31) -HANDLE_CAST_INST(31, Trunc , TruncInst ) // Truncate integers -HANDLE_CAST_INST(32, ZExt , ZExtInst ) // Zero extend integers -HANDLE_CAST_INST(33, SExt , SExtInst ) // Sign extend integers -HANDLE_CAST_INST(34, FPToUI , FPToUIInst ) // floating point -> UInt -HANDLE_CAST_INST(35, FPToSI , FPToSIInst ) // floating point -> SInt -HANDLE_CAST_INST(36, UIToFP , UIToFPInst ) // UInt -> floating point -HANDLE_CAST_INST(37, SIToFP , SIToFPInst ) // SInt -> floating point -HANDLE_CAST_INST(38, FPTrunc , FPTruncInst ) // Truncate floating point -HANDLE_CAST_INST(39, FPExt , FPExtInst ) // Extend floating point -HANDLE_CAST_INST(40, PtrToInt, PtrToIntInst) // Pointer -> Integer -HANDLE_CAST_INST(41, IntToPtr, IntToPtrInst) // Integer -> Pointer -HANDLE_CAST_INST(42, BitCast , BitCastInst ) // Type cast - LAST_CAST_INST(42) + FIRST_CAST_INST(25) +HANDLE_CAST_INST(25, Trunc , TruncInst ) // Truncate integers +HANDLE_CAST_INST(26, ZExt , ZExtInst ) // Zero extend integers +HANDLE_CAST_INST(27, SExt , SExtInst ) // Sign extend integers +HANDLE_CAST_INST(28, FPToUI , FPToUIInst ) // floating point -> UInt +HANDLE_CAST_INST(29, FPToSI , FPToSIInst ) // floating point -> SInt +HANDLE_CAST_INST(30, UIToFP , UIToFPInst ) // UInt -> floating point +HANDLE_CAST_INST(31, SIToFP , SIToFPInst ) // SInt -> floating point +HANDLE_CAST_INST(32, FPTrunc , FPTruncInst ) // Truncate floating point +HANDLE_CAST_INST(33, FPExt , FPExtInst ) // Extend floating point +HANDLE_CAST_INST(34, PtrToInt, PtrToIntInst) // Pointer -> Integer +HANDLE_CAST_INST(35, IntToPtr, IntToPtrInst) // Integer -> Pointer +HANDLE_CAST_INST(36, BitCast , BitCastInst ) // Type cast + LAST_CAST_INST(36) // Other operators... - FIRST_OTHER_INST(43) -HANDLE_OTHER_INST(43, ICmp , ICmpInst ) // Integer comparison instruction -HANDLE_OTHER_INST(44, FCmp , FCmpInst ) // Floating point comparison instr. -HANDLE_OTHER_INST(45, PHI , PHINode ) // PHI node instruction -HANDLE_OTHER_INST(46, Call , CallInst ) // Call a function -HANDLE_OTHER_INST(47, Shl , ShiftInst ) // Shift Left operations (logical) -HANDLE_OTHER_INST(48, LShr , ShiftInst ) // Logical Shift right (unsigned) -HANDLE_OTHER_INST(49, AShr , ShiftInst ) // Arithmetic shift right (signed) -HANDLE_OTHER_INST(50, Select , SelectInst ) // select instruction -HANDLE_OTHER_INST(51, UserOp1, Instruction) // May be used internally in a pass -HANDLE_OTHER_INST(52, UserOp2, Instruction) // Internal to passes only -HANDLE_OTHER_INST(53, VAArg , VAArgInst ) // vaarg instruction -HANDLE_OTHER_INST(54, ExtractElement, ExtractElementInst)// extract from vector. -HANDLE_OTHER_INST(55, InsertElement, InsertElementInst) // insert into vector -HANDLE_OTHER_INST(56, ShuffleVector, ShuffleVectorInst) // shuffle two vectors. - LAST_OTHER_INST(56) + FIRST_OTHER_INST(37) +HANDLE_OTHER_INST(37, ICmp , ICmpInst ) // Integer comparison instruction +HANDLE_OTHER_INST(38, FCmp , FCmpInst ) // Floating point comparison instr. +HANDLE_OTHER_INST(39, PHI , PHINode ) // PHI node instruction +HANDLE_OTHER_INST(40, Call , CallInst ) // Call a function +HANDLE_OTHER_INST(41, Shl , ShiftInst ) // Shift Left operations (logical) +HANDLE_OTHER_INST(42, LShr , ShiftInst ) // Logical Shift right (unsigned) +HANDLE_OTHER_INST(43, AShr , ShiftInst ) // Arithmetic shift right (signed) +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(49, InsertElement, InsertElementInst) // insert into vector +HANDLE_OTHER_INST(50, ShuffleVector, ShuffleVectorInst) // shuffle two vectors. + LAST_OTHER_INST(50) #undef FIRST_TERM_INST #undef HANDLE_TERM_INST diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h index ce759699024..a0376c785e5 100644 --- a/include/llvm/Instruction.h +++ b/include/llvm/Instruction.h @@ -71,6 +71,16 @@ public: /// extra information (e.g. load is volatile) agree. bool isIdenticalTo(Instruction *I) const; + /// This function determines if the specified instruction executes the same + /// operation as the current one. This means that the opcodes, type, operand + /// types and any other factors affecting the operation must be the same. This + /// is similar to isIdenticalTo except the operands themselves don't have to + /// be identical. + /// @returns true if the specified instruction is the same operation as + /// the current one. + /// @brief Determine if one instruction is the same operation as another. + bool isSameOperationAs(Instruction *I) const; + /// use_back - Specialize the methods defined in Value, as we know that an /// instruction can only be used by other instructions. Instruction *use_back() { return cast(*use_begin());} @@ -155,12 +165,6 @@ public: bool isCommutative() const { return isCommutative(getOpcode()); } static bool isCommutative(unsigned op); - /// isComparison - Return true if the instruction is a Set* instruction: - /// - bool isComparison() const { return isComparison(getOpcode()); } - static bool isComparison(unsigned op); - - /// isTrappingInstruction - Return true if the instruction may trap. /// bool isTrapping() const { diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index 5f7125678d8..c7866235260 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -440,7 +440,8 @@ public: ICMP_SLT = 40, ///< signed less than ICMP_SLE = 41, ///< signed less or equal FIRST_ICMP_PREDICATE = ICMP_EQ, - LAST_ICMP_PREDICATE = ICMP_SLE + LAST_ICMP_PREDICATE = ICMP_SLE, + BAD_ICMP_PREDICATE = ICMP_SLE + 1 }; /// @brief Constructor with insert-before-instruction semantics. @@ -490,16 +491,30 @@ public: /// This is a static version that you can use without an instruction /// available. /// @brief Return the predicate as if the operands were swapped. - static Predicate getSwappedPredicate(Predicate Opcode); + static Predicate getSwappedPredicate(Predicate pred); + + /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc. + /// @returns the predicate that would be the result if the operand were + /// regarded as signed. + /// @brief Return the signed version of the predicate + Predicate getSignedPredicate() const { + return getSignedPredicate(getPredicate()); + } + + /// This is a static version that you can use without an instruction. + /// @brief Return the signed version of the predicate. + static Predicate getSignedPredicate(Predicate pred); /// This also tests for commutativity. If isEquality() returns true then - /// the predicate is also commutative. Only the equality predicates are - /// commutative. + /// the predicate is also commutative. /// @returns true if the predicate of this instruction is EQ or NE. /// @brief Determine if this is an equality predicate. bool isEquality() const { return SubclassData == ICMP_EQ || SubclassData == ICMP_NE; } + + /// @returns true if the predicate of this ICmpInst is commutative + /// @brief Determine if this relation is commutative. bool isCommutative() const { return isEquality(); } /// @returns true if the predicate is relational (not EQ or NE). @@ -508,6 +523,14 @@ public: return !isEquality(); } + /// @returns true if the predicate of this ICmpInst is signed, false otherwise + /// @brief Determine if this instruction's predicate is signed. + bool isSignedPredicate() { return isSignedPredicate(getPredicate()); } + + /// @returns true if the predicate provided is signed, false otherwise + /// @brief Determine if the predicate is signed. + static bool isSignedPredicate(Predicate pred); + /// Exchange the two operands to this instruction in such a way that it does /// not modify the semantics of the instruction. The predicate value may be /// changed to retain the same result if the predicate is order dependent @@ -559,7 +582,8 @@ public: FCMP_UNE =14, ///< 1 1 1 0 True if unordered or not equal FCMP_TRUE =15, ///< 1 1 1 1 Always true (always folded) FIRST_FCMP_PREDICATE = FCMP_FALSE, - LAST_FCMP_PREDICATE = FCMP_TRUE + LAST_FCMP_PREDICATE = FCMP_TRUE, + BAD_FCMP_PREDICATE = FCMP_TRUE + 1 }; /// @brief Constructor with insert-before-instruction semantics. @@ -646,71 +670,6 @@ public: } }; - -//===----------------------------------------------------------------------===// -// SetCondInst Class -//===----------------------------------------------------------------------===// - -/// SetCondInst class - Represent a setCC operator, where CC is eq, ne, lt, gt, -/// le, or ge. -/// -class SetCondInst : public BinaryOperator { -public: - SetCondInst(BinaryOps Opcode, Value *LHS, Value *RHS, - const std::string &Name = "", Instruction *InsertBefore = 0); - SetCondInst(BinaryOps Opcode, Value *LHS, Value *RHS, - const std::string &Name, BasicBlock *InsertAtEnd); - - /// getInverseCondition - Return the inverse of the current condition opcode. - /// For example seteq -> setne, setgt -> setle, setlt -> setge, etc... - /// - BinaryOps getInverseCondition() const { - return getInverseCondition(getOpcode()); - } - - /// getInverseCondition - Static version that you can use without an - /// instruction available. - /// - static BinaryOps getInverseCondition(BinaryOps Opcode); - - /// getSwappedCondition - Return the condition opcode that would be the result - /// of exchanging the two operands of the setcc instruction without changing - /// the result produced. Thus, seteq->seteq, setle->setge, setlt->setgt, etc. - /// - BinaryOps getSwappedCondition() const { - return getSwappedCondition(getOpcode()); - } - - /// getSwappedCondition - Static version that you can use without an - /// instruction available. - /// - static BinaryOps getSwappedCondition(BinaryOps Opcode); - - /// isEquality - Return true if this comparison is an ==/!= comparison. - /// - bool isEquality() const { - return getOpcode() == SetEQ || getOpcode() == SetNE; - } - - /// isRelational - Return true if this comparison is a /<=/>= comparison. - /// - bool isRelational() const { - return !isEquality(); - } - - // Methods for support type inquiry through isa, cast, and dyn_cast: - static inline bool classof(const SetCondInst *) { return true; } - static inline bool classof(const Instruction *I) { - return I->getOpcode() == SetEQ || I->getOpcode() == SetNE || - I->getOpcode() == SetLE || I->getOpcode() == SetGE || - I->getOpcode() == SetLT || I->getOpcode() == SetGT; - } - static inline bool classof(const Value *V) { - return isa(V) && classof(cast(V)); - } -}; - - //===----------------------------------------------------------------------===// // CallInst Class //===----------------------------------------------------------------------===// diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index 3a271bb54bb..a5c1c61c4bf 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -36,7 +36,7 @@ #include #include -//#define USE_OLD_PASSMANAGER 1 +#define USE_OLD_PASSMANAGER 1 namespace llvm { diff --git a/include/llvm/Support/ConstantRange.h b/include/llvm/Support/ConstantRange.h index f50e97959d7..806dc805229 100644 --- a/include/llvm/Support/ConstantRange.h +++ b/include/llvm/Support/ConstantRange.h @@ -12,13 +12,19 @@ // constant, which MAY wrap around the end of the numeric range. To do this, it // keeps track of a [lower, upper) bound, which specifies an interval just like // STL iterators. When used with boolean values, the following are important -// ranges (other integral ranges use min/max values for special range values): +// ranges: : // // [F, F) = {} = Empty set // [T, F) = {T} // [F, T) = {F} // [T, T) = {F, T} = Full set // +// The other integral ranges use min/max values for special range values. For +// example, for 8-bit types, it uses: +// [0, 0) = {} = Empty set +// [255, 255) = {0..255} = Full Set +// +// Note that ConstantRange always keeps unsigned values. //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_CONSTANT_RANGE_H @@ -51,9 +57,11 @@ class ConstantRange { /// ConstantRange(Constant *Lower, Constant *Upper); - /// Initialize a set of values that all satisfy the condition with C. - /// - ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C); + /// Initialize a set of values that all satisfy the predicate with C. The + /// predicate should be either an ICmpInst::Predicate or FCmpInst::Predicate + /// value. + /// @brief Get a range for a relation with a constant integral. + ConstantRange(unsigned short predicate, ConstantIntegral *C); /// getLower - Return the lower value for this range... /// @@ -79,11 +87,13 @@ class ConstantRange { /// isWrappedSet - Return true if this set wraps around the top of the range, /// for example: [100, 8) /// - bool isWrappedSet() const; + bool isWrappedSet(bool isSigned) const; /// contains - Return true if the specified value is in the set. + /// The isSigned parameter indicates whether the comparisons should be + /// performed as if the values are signed or not. /// - bool contains(ConstantInt *Val) const; + bool contains(ConstantInt *Val, bool isSigned) const; /// getSingleElement - If this set contains a single element, return it, /// otherwise return null. @@ -117,7 +127,7 @@ class ConstantRange { /// one of the sets but not the other. For example: [100, 8) intersect [3, /// 120) yields [3, 120) /// - ConstantRange intersectWith(const ConstantRange &CR) const; + ConstantRange intersectWith(const ConstantRange &CR, bool isSigned) const; /// union - Return the range that results from the union of this range with /// another range. The resultant range is guaranteed to include the elements @@ -125,7 +135,7 @@ class ConstantRange { /// [3, 15), which includes 9, 10, and 11, which were not included in either /// set before. /// - ConstantRange unionWith(const ConstantRange &CR) const; + ConstantRange unionWith(const ConstantRange &CR, bool isSigned) const; /// zeroExtend - Return a new range in the specified integer type, which must /// be strictly larger than the current type. The returned range will diff --git a/include/llvm/Support/InstVisitor.h b/include/llvm/Support/InstVisitor.h index f444febce6d..15e5e9822b1 100644 --- a/include/llvm/Support/InstVisitor.h +++ b/include/llvm/Support/InstVisitor.h @@ -167,7 +167,6 @@ public: RetTy visitInvokeInst(InvokeInst &I) { DELEGATE(TerminatorInst);} RetTy visitUnwindInst(UnwindInst &I) { DELEGATE(TerminatorInst);} RetTy visitUnreachableInst(UnreachableInst &I) { DELEGATE(TerminatorInst);} - RetTy visitSetCondInst(SetCondInst &I) { DELEGATE(BinaryOperator);} RetTy visitICmpInst(ICmpInst &I) { DELEGATE(CmpInst);} RetTy visitFCmpInst(FCmpInst &I) { DELEGATE(CmpInst);} RetTy visitMallocInst(MallocInst &I) { DELEGATE(AllocationInst);} diff --git a/include/llvm/Support/PatternMatch.h b/include/llvm/Support/PatternMatch.h index 2974ad39d4d..6db214292a1 100644 --- a/include/llvm/Support/PatternMatch.h +++ b/include/llvm/Support/PatternMatch.h @@ -247,13 +247,6 @@ struct BinaryOpClass_match { } }; -template -inline BinaryOpClass_match -m_SetCond(Instruction::BinaryOps &Op, const LHS &L, const RHS &R) { - return BinaryOpClass_match(Op, L, R); -} - template inline BinaryOpClass_match m_Shift(Instruction::OtherOps &Op, const LHS &L, const RHS &R) { @@ -269,6 +262,45 @@ m_Shift(const LHS &L, const RHS &R) { ShiftInst, Instruction::OtherOps>(Op, L, R); } +//===----------------------------------------------------------------------===// +// Matchers for CmpInst classes +// + +template +struct CmpClass_match { + PredicateTy &Predicate; + LHS_t L; + RHS_t R; + + CmpClass_match(PredicateTy &Pred, const LHS_t &LHS, + const RHS_t &RHS) + : Predicate(Pred), L(LHS), R(RHS) {} + + template + bool match(OpTy *V) { + if (Class *I = dyn_cast(V)) + if (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) { + Predicate = I->getPredicate(); + return true; + } + return false; + } +}; + +template +inline CmpClass_match +m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) { + return CmpClass_match(Pred, L, R); +} + +template +inline CmpClass_match +m_FCmp(FCmpInst::Predicate &Pred, const LHS &L, const RHS &R) { + return CmpClass_match(Pred, L, R); +} + //===----------------------------------------------------------------------===// // Matchers for unary operators // diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h index 4ee2f1a120b..4fc016d02be 100644 --- a/include/llvm/Transforms/Utils/Local.h +++ b/include/llvm/Transforms/Utils/Local.h @@ -49,13 +49,15 @@ bool ConstantFoldTerminator(BasicBlock *BB); Constant *ConstantFoldInstruction(Instruction *I); /// ConstantFoldInstOperands - Attempt to constant fold an instruction with the -/// specified opcode and operands. If successful, the constant result is -/// returned, if not, null is returned. Note that this function can fail when -/// attempting to fold instructions like loads and stores, which have no -/// constant expression form. +/// specified operands. If successful, the constant result is returned, if not, +/// null is returned. Note that this function can fail when attempting to +/// fold instructions like loads and stores, which have no constant expression +/// form. /// -Constant *ConstantFoldInstOperands(unsigned Opc, const Type *DestTy, - const std::vector &Ops); +Constant *ConstantFoldInstOperands( + const Instruction *I, ///< The model instruction + const std::vector &Ops ///< The constant operands to use. +); /// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index b1ea1969f33..d37a4b176f7 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -590,7 +590,8 @@ BasicAliasAnalysis::CheckGEPInstructions( // Make sure they are comparable (ie, not constant expressions), and // make sure the GEP with the smaller leading constant is GEP1. if (G1OC) { - Constant *Compare = ConstantExpr::getSetGT(G1OC, G2OC); + Constant *Compare = ConstantExpr::getICmp(ICmpInst::ICMP_SGT, + G1OC, G2OC); if (ConstantBool *CV = dyn_cast(Compare)) { if (CV->getValue()) // If they are comparable and G2 > G1 std::swap(GEP1Ops, GEP2Ops); // Make GEP1 < GEP2 diff --git a/lib/Analysis/ConstantRange.cpp b/lib/Analysis/ConstantRange.cpp index 762d5c358ad..69d85c2e38e 100644 --- a/lib/Analysis/ConstantRange.cpp +++ b/lib/Analysis/ConstantRange.cpp @@ -24,56 +24,43 @@ #include "llvm/Support/ConstantRange.h" #include "llvm/Constants.h" #include "llvm/Instruction.h" +#include "llvm/Instructions.h" #include "llvm/Type.h" #include "llvm/Support/Streams.h" #include using namespace llvm; -static ConstantIntegral *getMaxValue(const Type *Ty) { - switch (Ty->getTypeID()) { - case Type::BoolTyID: return ConstantBool::getTrue(); - case Type::SByteTyID: - case Type::ShortTyID: - case Type::IntTyID: - case Type::LongTyID: { - // Calculate 011111111111111... - unsigned TypeBits = Ty->getPrimitiveSize()*8; - int64_t Val = INT64_MAX; // All ones - Val >>= 64-TypeBits; // Shift out unwanted 1 bits... - return ConstantInt::get(Ty, Val); - } - - case Type::UByteTyID: - case Type::UShortTyID: - case Type::UIntTyID: - case Type::ULongTyID: return ConstantInt::getAllOnesValue(Ty); - - default: return 0; +static ConstantIntegral *getMaxValue(const Type *Ty, bool isSigned = false) { + if (Ty == Type::BoolTy) + return ConstantBool::getTrue(); + if (Ty->isInteger()) { + if (isSigned) { + // Calculate 011111111111111... + unsigned TypeBits = Ty->getPrimitiveSize()*8; + int64_t Val = INT64_MAX; // All ones + Val >>= 64-TypeBits; // Shift out unwanted 1 bits... + return ConstantInt::get(Ty, Val); + } + return ConstantInt::getAllOnesValue(Ty); } + return 0; } // Static constructor to create the minimum constant for an integral type... -static ConstantIntegral *getMinValue(const Type *Ty) { - switch (Ty->getTypeID()) { - case Type::BoolTyID: return ConstantBool::getFalse(); - case Type::SByteTyID: - case Type::ShortTyID: - case Type::IntTyID: - case Type::LongTyID: { - // Calculate 1111111111000000000000 - unsigned TypeBits = Ty->getPrimitiveSize()*8; - int64_t Val = -1; // All ones - Val <<= TypeBits-1; // Shift over to the right spot - return ConstantInt::get(Ty, Val); - } - - case Type::UByteTyID: - case Type::UShortTyID: - case Type::UIntTyID: - case Type::ULongTyID: return ConstantInt::get(Ty, 0); - - default: return 0; +static ConstantIntegral *getMinValue(const Type *Ty, bool isSigned = false) { + if (Ty == Type::BoolTy) + return ConstantBool::getFalse(); + if (Ty->isInteger()) { + if (isSigned) { + // Calculate 1111111111000000000000 + unsigned TypeBits = Ty->getPrimitiveSize()*8; + int64_t Val = -1; // All ones + Val <<= TypeBits-1; // Shift over to the right spot + return ConstantInt::get(Ty, Val); + } + return ConstantInt::get(Ty, 0); } + return 0; } static ConstantIntegral *Next(ConstantIntegral *CI) { if (ConstantBool *CB = dyn_cast(CI)) @@ -84,25 +71,30 @@ static ConstantIntegral *Next(ConstantIntegral *CI) { return cast(Result); } -static bool LT(ConstantIntegral *A, ConstantIntegral *B) { - Constant *C = ConstantExpr::getSetLT(A, B); +static bool LT(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + Constant *C = ConstantExpr::getICmp( + (isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT), A, B); assert(isa(C) && "Constant folding of integrals not impl??"); return cast(C)->getValue(); } -static bool LTE(ConstantIntegral *A, ConstantIntegral *B) { - Constant *C = ConstantExpr::getSetLE(A, B); +static bool LTE(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + Constant *C = ConstantExpr::getICmp( + (isSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE), A, B); assert(isa(C) && "Constant folding of integrals not impl??"); return cast(C)->getValue(); } -static bool GT(ConstantIntegral *A, ConstantIntegral *B) { return LT(B, A); } +static bool GT(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + return LT(B, A, isSigned); } -static ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B) { - return LT(A, B) ? A : B; +static ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B, + bool isSigned) { + return LT(A, B, isSigned) ? A : B; } -static ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B) { - return GT(A, B) ? A : B; +static ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B, + bool isSigned) { + return GT(A, B, isSigned) ? A : B; } /// Initialize a full (the default) or empty set for the specified type. @@ -118,47 +110,62 @@ ConstantRange::ConstantRange(const Type *Ty, bool Full) { /// Initialize a range to hold the single specified value. /// -ConstantRange::ConstantRange(Constant *V) - : Lower(cast(V)), Upper(Next(cast(V))) { -} +ConstantRange::ConstantRange(Constant *V) + : Lower(cast(V)), Upper(Next(cast(V))) { } /// Initialize a range of values explicitly... this will assert out if /// Lower==Upper and Lower != Min or Max for its type (or if the two constants /// have different types) /// -ConstantRange::ConstantRange(Constant *L, Constant *U) +ConstantRange::ConstantRange(Constant *L, Constant *U) : Lower(cast(L)), Upper(cast(U)) { assert(Lower->getType() == Upper->getType() && "Incompatible types for ConstantRange!"); // Make sure that if L & U are equal that they are either Min or Max... assert((L != U || (L == getMaxValue(L->getType()) || - L == getMinValue(L->getType()))) && - "Lower == Upper, but they aren't min or max for type!"); + L == getMinValue(L->getType()))) + && "Lower == Upper, but they aren't min or max for type!"); } /// Initialize a set of values that all satisfy the condition with C. /// -ConstantRange::ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C) { - switch (SetCCOpcode) { - default: assert(0 && "Invalid SetCC opcode to ConstantRange ctor!"); - case Instruction::SetEQ: Lower = C; Upper = Next(C); return; - case Instruction::SetNE: Upper = C; Lower = Next(C); return; - case Instruction::SetLT: +ConstantRange::ConstantRange(unsigned short ICmpOpcode, ConstantIntegral *C) { + switch (ICmpOpcode) { + default: assert(0 && "Invalid ICmp opcode to ConstantRange ctor!"); + case ICmpInst::ICMP_EQ: Lower = C; Upper = Next(C); return; + case ICmpInst::ICMP_NE: Upper = C; Lower = Next(C); return; + case ICmpInst::ICMP_ULT: Lower = getMinValue(C->getType()); Upper = C; return; - case Instruction::SetGT: + case ICmpInst::ICMP_SLT: + Lower = getMinValue(C->getType(), true); + Upper = C; + return; + case ICmpInst::ICMP_UGT: + Lower = Next(C); + Upper = getMinValue(C->getType()); // Min = Next(Max) + return; + case ICmpInst::ICMP_SGT: Lower = Next(C); - Upper = getMinValue(C->getType()); // Min = Next(Max) + Upper = getMinValue(C->getType(), true); // Min = Next(Max) return; - case Instruction::SetLE: + case ICmpInst::ICMP_ULE: Lower = getMinValue(C->getType()); Upper = Next(C); return; - case Instruction::SetGE: + case ICmpInst::ICMP_SLE: + Lower = getMinValue(C->getType(), true); + Upper = Next(C); + return; + case ICmpInst::ICMP_UGE: + Lower = C; + Upper = getMinValue(C->getType()); // Min = Next(Max) + return; + case ICmpInst::ICMP_SGE: Lower = C; - Upper = getMinValue(C->getType()); // Min = Next(Max) + Upper = getMinValue(C->getType(), true); // Min = Next(Max) return; } } @@ -182,11 +189,10 @@ bool ConstantRange::isEmptySet() const { /// isWrappedSet - Return true if this set wraps around the top of the range, /// for example: [100, 8) /// -bool ConstantRange::isWrappedSet() const { - return GT(Lower, Upper); +bool ConstantRange::isWrappedSet(bool isSigned) const { + return GT(Lower, Upper, isSigned); } - /// getSingleElement - If this set contains a single element, return it, /// otherwise return null. ConstantIntegral *ConstantRange::getSingleElement() const { @@ -212,19 +218,17 @@ uint64_t ConstantRange::getSetSize() const { /// contains - Return true if the specified value is in the set. /// -bool ConstantRange::contains(ConstantInt *Val) const { +bool ConstantRange::contains(ConstantInt *Val, bool isSigned) const { if (Lower == Upper) { if (isFullSet()) return true; return false; } - if (!isWrappedSet()) - return LTE(Lower, Val) && LT(Val, Upper); - return LTE(Lower, Val) || LT(Val, Upper); + if (!isWrappedSet(isSigned)) + return LTE(Lower, Val, isSigned) && LT(Val, Upper, isSigned); + return LTE(Lower, Val, isSigned) || LT(Val, Upper, isSigned); } - - /// subtract - Subtract the specified constant from the endpoints of this /// constant range. ConstantRange ConstantRange::subtract(ConstantInt *CI) const { @@ -241,15 +245,16 @@ ConstantRange ConstantRange::subtract(ConstantInt *CI) const { // it is known that LHS is wrapped and RHS isn't. // static ConstantRange intersect1Wrapped(const ConstantRange &LHS, - const ConstantRange &RHS) { - assert(LHS.isWrappedSet() && !RHS.isWrappedSet()); + const ConstantRange &RHS, + bool isSigned) { + assert(LHS.isWrappedSet(isSigned) && !RHS.isWrappedSet(isSigned)); // Check to see if we overlap on the Left side of RHS... // - if (LT(RHS.getLower(), LHS.getUpper())) { + if (LT(RHS.getLower(), LHS.getUpper(), isSigned)) { // We do overlap on the left side of RHS, see if we overlap on the right of // RHS... - if (GT(RHS.getUpper(), LHS.getLower())) { + if (GT(RHS.getUpper(), LHS.getLower(), isSigned)) { // Ok, the result overlaps on both the left and right sides. See if the // resultant interval will be smaller if we wrap or not... // @@ -262,11 +267,10 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, // No overlap on the right, just on the left. return ConstantRange(RHS.getLower(), LHS.getUpper()); } - } else { // We don't overlap on the left side of RHS, see if we overlap on the right // of RHS... - if (GT(RHS.getUpper(), LHS.getLower())) { + if (GT(RHS.getUpper(), LHS.getLower(), isSigned)) { // Simple overlap... return ConstantRange(LHS.getLower(), RHS.getUpper()); } else { @@ -279,30 +283,31 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, /// intersect - Return the range that results from the intersection of this /// range with another range. /// -ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { +ConstantRange ConstantRange::intersectWith(const ConstantRange &CR, + bool isSigned) const { assert(getType() == CR.getType() && "ConstantRange types don't agree!"); // Handle common special cases if (isEmptySet() || CR.isFullSet()) return *this; if (isFullSet() || CR.isEmptySet()) return CR; - if (!isWrappedSet()) { - if (!CR.isWrappedSet()) { - ConstantIntegral *L = Max(Lower, CR.Lower); - ConstantIntegral *U = Min(Upper, CR.Upper); + if (!isWrappedSet(isSigned)) { + if (!CR.isWrappedSet(isSigned)) { + ConstantIntegral *L = Max(Lower, CR.Lower, isSigned); + ConstantIntegral *U = Min(Upper, CR.Upper, isSigned); - if (LT(L, U)) // If range isn't empty... + if (LT(L, U, isSigned)) // If range isn't empty... return ConstantRange(L, U); else return ConstantRange(getType(), false); // Otherwise, return empty set } else - return intersect1Wrapped(CR, *this); + return intersect1Wrapped(CR, *this, isSigned); } else { // We know "this" is wrapped... - if (!CR.isWrappedSet()) - return intersect1Wrapped(*this, CR); + if (!CR.isWrappedSet(isSigned)) + return intersect1Wrapped(*this, CR, isSigned); else { // Both ranges are wrapped... - ConstantIntegral *L = Max(Lower, CR.Lower); - ConstantIntegral *U = Min(Upper, CR.Upper); + ConstantIntegral *L = Max(Lower, CR.Lower, isSigned); + ConstantIntegral *U = Min(Upper, CR.Upper, isSigned); return ConstantRange(L, U); } } @@ -315,7 +320,8 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { /// 15), which includes 9, 10, and 11, which were not included in either set /// before. /// -ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const { +ConstantRange ConstantRange::unionWith(const ConstantRange &CR, + bool isSigned) const { assert(getType() == CR.getType() && "ConstantRange types don't agree!"); assert(0 && "Range union not implemented yet!"); @@ -325,7 +331,7 @@ ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const { /// zeroExtend - Return a new range in the specified integer type, which must /// be strictly larger than the current type. The returned range will -/// correspond to the possible range of values if the source range had been +/// correspond to the possible range of values as if the source range had been /// zero extended. ConstantRange ConstantRange::zeroExtend(const Type *Ty) const { assert(getLower()->getType()->getPrimitiveSize() < Ty->getPrimitiveSize() && @@ -346,7 +352,7 @@ ConstantRange ConstantRange::zeroExtend(const Type *Ty) const { /// truncate - Return a new range in the specified integer type, which must be /// strictly smaller than the current type. The returned range will -/// correspond to the possible range of values if the source range had been +/// correspond to the possible range of values as if the source range had been /// truncated to the specified type. ConstantRange ConstantRange::truncate(const Type *Ty) const { assert(getLower()->getType()->getPrimitiveSize() > Ty->getPrimitiveSize() && @@ -360,7 +366,6 @@ ConstantRange ConstantRange::truncate(const Type *Ty) const { ConstantExpr::getTrunc(getUpper(), Ty)); } - /// print - Print out the bounds to a stream... /// void ConstantRange::print(std::ostream &OS) const { diff --git a/lib/Analysis/IPA/Andersens.cpp b/lib/Analysis/IPA/Andersens.cpp index 5d2841187a6..805e771e542 100644 --- a/lib/Analysis/IPA/Andersens.cpp +++ b/lib/Analysis/IPA/Andersens.cpp @@ -325,7 +325,8 @@ namespace { void visitGetElementPtrInst(GetElementPtrInst &GEP); void visitPHINode(PHINode &PN); void visitCastInst(CastInst &CI); - void visitSetCondInst(SetCondInst &SCI) {} // NOOP! + void visitICmpInst(ICmpInst &ICI) {} // NOOP! + void visitFCmpInst(FCmpInst &ICI) {} // NOOP! void visitSelectInst(SelectInst &SI); void visitVAArg(VAArgInst &I); void visitInstruction(Instruction &I); @@ -778,6 +779,8 @@ void Andersens::visitInstruction(Instruction &I) { case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: + case Instruction::ICmp: + case Instruction::FCmp: return; default: // Is this something we aren't handling yet? diff --git a/lib/Analysis/IPA/GlobalsModRef.cpp b/lib/Analysis/IPA/GlobalsModRef.cpp index 7c305b7a5ed..e34d03bbdd0 100644 --- a/lib/Analysis/IPA/GlobalsModRef.cpp +++ b/lib/Analysis/IPA/GlobalsModRef.cpp @@ -251,8 +251,8 @@ bool GlobalsModRef::AnalyzeUsesOfPointer(Value *V, } else { return true; } - } else if (SetCondInst *SCI = dyn_cast(*UI)) { - if (!isa(SCI->getOperand(1))) + } else if (ICmpInst *ICI = dyn_cast(*UI)) { + if (!isa(ICI->getOperand(1))) return true; // Allow comparison against null. } else if (FreeInst *F = dyn_cast(*UI)) { Writers.push_back(F->getParent()->getParent()); diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index b33e414bf04..27f175058f2 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -536,7 +536,7 @@ Instruction *Loop::getCanonicalInductionVariableIncrement() const { /// returns null. /// Value *Loop::getTripCount() const { - // Canonical loops will end with a 'setne I, V', where I is the incremented + // Canonical loops will end with a 'cmp ne I, V', where I is the incremented // canonical induction variable and V is the trip count of the loop. Instruction *Inc = getCanonicalInductionVariableIncrement(); if (Inc == 0) return 0; @@ -546,15 +546,17 @@ Value *Loop::getTripCount() const { IV->getIncomingBlock(contains(IV->getIncomingBlock(1))); if (BranchInst *BI = dyn_cast(BackedgeBlock->getTerminator())) - if (BI->isConditional()) - if (SetCondInst *SCI = dyn_cast(BI->getCondition())) - if (SCI->getOperand(0) == Inc) + if (BI->isConditional()) { + if (ICmpInst *ICI = dyn_cast(BI->getCondition())) { + if (ICI->getOperand(0) == Inc) if (BI->getSuccessor(0) == getHeader()) { - if (SCI->getOpcode() == Instruction::SetNE) - return SCI->getOperand(1); - } else if (SCI->getOpcode() == Instruction::SetEQ) { - return SCI->getOperand(1); + if (ICI->getPredicate() == ICmpInst::ICMP_NE) + return ICI->getOperand(1); + } else if (ICI->getPredicate() == ICmpInst::ICMP_EQ) { + return ICI->getOperand(1); } + } + } return 0; } diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index bc1f9a0d307..fcfab9e1c9b 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -177,8 +177,7 @@ SCEVHandle SCEVConstant::get(ConstantInt *V) { // are signless. There won't be a need to bitcast then. if (V->getType()->isSigned()) { const Type *NewTy = V->getType()->getUnsignedVersion(); - V = cast( - ConstantExpr::getBitCast(V, NewTy)); + V = cast(ConstantExpr::getBitCast(V, NewTy)); } SCEVConstant *&R = (*SCEVConstants)[V]; @@ -461,15 +460,8 @@ SCEVHandle SCEVUnknown::getIntegerSCEV(int Val, const Type *Ty) { C = Constant::getNullValue(Ty); else if (Ty->isFloatingPoint()) C = ConstantFP::get(Ty, Val); - /// FIXME:Signless. when integer types are signless, just change this to: - /// else - /// C = ConstantInt::get(Ty, Val); - else if (Ty->isSigned()) + else C = ConstantInt::get(Ty, Val); - else { - C = ConstantInt::get(Ty->getSignedVersion(), Val); - C = ConstantExpr::getBitCast(C, Ty); - } return SCEVUnknown::get(C); } @@ -514,8 +506,7 @@ static SCEVHandle PartialFact(SCEVHandle V, unsigned NumSteps) { for (; NumSteps; --NumSteps) Result *= Val-(NumSteps-1); Constant *Res = ConstantInt::get(Type::ULongTy, Result); - return SCEVUnknown::get( - ConstantExpr::getTruncOrBitCast(Res, V->getType())); + return SCEVUnknown::get(ConstantExpr::getTruncOrBitCast(Res, V->getType())); } const Type *Ty = V->getType(); @@ -1162,7 +1153,7 @@ namespace { SCEVHandle ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, const Loop *L, - unsigned SetCCOpcode); + ICmpInst::Predicate p); /// ComputeIterationCountExhaustively - If the trip is known to execute a /// constant number of times (the condition evolves only from constants), @@ -1521,17 +1512,21 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) { BranchInst *ExitBr = dyn_cast(ExitingBlock->getTerminator()); if (ExitBr == 0) return UnknownValue; assert(ExitBr->isConditional() && "If unconditional, it can't be in loop!"); - SetCondInst *ExitCond = dyn_cast(ExitBr->getCondition()); - if (ExitCond == 0) // Not a setcc + ICmpInst *ExitCond = dyn_cast(ExitBr->getCondition()); + + // If its not an integer comparison then compute it the hard way. + // Note that ICmpInst deals with pointer comparisons too so we must check + // the type of the operand. + if (ExitCond == 0 || !ExitCond->getOperand(0)->getType()->isIntegral()) return ComputeIterationCountExhaustively(L, ExitBr->getCondition(), ExitBr->getSuccessor(0) == ExitBlock); - // If the condition was exit on true, convert the condition to exit on false. - Instruction::BinaryOps Cond; + // If the condition was exit on true, convert the condition to exit on false + ICmpInst::Predicate Cond; if (ExitBr->getSuccessor(1) == ExitBlock) - Cond = ExitCond->getOpcode(); + Cond = ExitCond->getPredicate(); else - Cond = ExitCond->getInverseCondition(); + Cond = ExitCond->getInversePredicate(); // Handle common loops like: for (X = "string"; *X; ++X) if (LoadInst *LI = dyn_cast(ExitCond->getOperand(0))) @@ -1550,12 +1545,12 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) { Tmp = getSCEVAtScope(RHS, L); if (!isa(Tmp)) RHS = Tmp; - // At this point, we would like to compute how many iterations of the loop the - // predicate will return true for these inputs. + // At this point, we would like to compute how many iterations of the + // loop the predicate will return true for these inputs. if (isa(LHS) && !isa(RHS)) { // If there is a constant, force it into the RHS. std::swap(LHS, RHS); - Cond = SetCondInst::getSwappedCondition(Cond); + Cond = ICmpInst::getSwappedPredicate(Cond); } // FIXME: think about handling pointer comparisons! i.e.: @@ -1590,53 +1585,48 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) { CompRange = ConstantRange(NewL, NewU); } - SCEVHandle Ret = AddRec->getNumIterationsInRange(CompRange); + SCEVHandle Ret = AddRec->getNumIterationsInRange(CompRange, + ICmpInst::isSignedPredicate(Cond)); if (!isa(Ret)) return Ret; } } switch (Cond) { - case Instruction::SetNE: // while (X != Y) + case ICmpInst::ICMP_NE: { // while (X != Y) // Convert to: while (X-Y != 0) - if (LHS->getType()->isInteger()) { - SCEVHandle TC = HowFarToZero(SCEV::getMinusSCEV(LHS, RHS), L); - if (!isa(TC)) return TC; - } + SCEVHandle TC = HowFarToZero(SCEV::getMinusSCEV(LHS, RHS), L); + if (!isa(TC)) return TC; break; - case Instruction::SetEQ: + } + case ICmpInst::ICMP_EQ: { // Convert to: while (X-Y == 0) // while (X == Y) - if (LHS->getType()->isInteger()) { - SCEVHandle TC = HowFarToNonZero(SCEV::getMinusSCEV(LHS, RHS), L); - if (!isa(TC)) return TC; - } + SCEVHandle TC = HowFarToNonZero(SCEV::getMinusSCEV(LHS, RHS), L); + if (!isa(TC)) return TC; break; - case Instruction::SetLT: - if (LHS->getType()->isInteger() && - ExitCond->getOperand(0)->getType()->isSigned()) { - SCEVHandle TC = HowManyLessThans(LHS, RHS, L); - if (!isa(TC)) return TC; - } + } + case ICmpInst::ICMP_SLT: { + SCEVHandle TC = HowManyLessThans(LHS, RHS, L); + if (!isa(TC)) return TC; break; - case Instruction::SetGT: - if (LHS->getType()->isInteger() && - ExitCond->getOperand(0)->getType()->isSigned()) { - SCEVHandle TC = HowManyLessThans(RHS, LHS, L); - if (!isa(TC)) return TC; - } + } + case ICmpInst::ICMP_SGT: { + SCEVHandle TC = HowManyLessThans(RHS, LHS, L); + if (!isa(TC)) return TC; break; + } default: #if 0 cerr << "ComputeIterationCount "; if (ExitCond->getOperand(0)->getType()->isUnsigned()) cerr << "[unsigned] "; cerr << *LHS << " " - << Instruction::getOpcodeName(Cond) << " " << *RHS << "\n"; + << Instruction::getOpcodeName(Instruction::ICmp) + << " " << *RHS << "\n"; #endif break; } - return ComputeIterationCountExhaustively(L, ExitCond, - ExitBr->getSuccessor(0) == ExitBlock); + ExitBr->getSuccessor(0) == ExitBlock); } static ConstantInt * @@ -1686,7 +1676,8 @@ GetAddressedElementFromGlobal(GlobalVariable *GV, /// 'setcc load X, cst', try to se if we can compute the trip count. SCEVHandle ScalarEvolutionsImpl:: ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, - const Loop *L, unsigned SetCCOpcode) { + const Loop *L, + ICmpInst::Predicate predicate) { if (LI->isVolatile()) return UnknownValue; // Check to see if the loaded pointer is a getelementptr of a global. @@ -1742,7 +1733,7 @@ ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, if (Result == 0) break; // Cannot compute! // Evaluate the condition for this iteration. - Result = ConstantExpr::get(SetCCOpcode, Result, RHS); + Result = ConstantExpr::getICmp(predicate, Result, RHS); if (!isa(Result)) break; // Couldn't decide for sure if (cast(Result)->getValue() == false) { #if 0 @@ -1761,7 +1752,7 @@ ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, /// CanConstantFold - Return true if we can constant fold an instruction of the /// specified type, assuming that all operands were constants. static bool CanConstantFold(const Instruction *I) { - if (isa(I) || isa(I) || + if (isa(I) || isa(I) || isa(I) || isa(I) || isa(I) || isa(I)) return true; @@ -1790,11 +1781,18 @@ static Constant *ConstantFold(const Instruction *I, return ConstantFoldCall(cast(GV), Operands); } return 0; - case Instruction::GetElementPtr: + case Instruction::GetElementPtr: { Constant *Base = Operands[0]; Operands.erase(Operands.begin()); return ConstantExpr::getGetElementPtr(Base, Operands); } + case Instruction::ICmp: + return ConstantExpr::getICmp( + cast(I)->getPredicate(), Operands[0], Operands[1]); + case Instruction::FCmp: + return ConstantExpr::getFCmp( + cast(I)->getPredicate(), Operands[0], Operands[1]); + } return 0; } @@ -2226,8 +2224,8 @@ SCEVHandle ScalarEvolutionsImpl::HowFarToZero(SCEV *V, const Loop *L) { // Pick the smallest positive root value. assert(R1->getType()->isUnsigned()&&"Didn't canonicalize to unsigned?"); if (ConstantBool *CB = - dyn_cast(ConstantExpr::getSetLT(R1->getValue(), - R2->getValue()))) { + dyn_cast(ConstantExpr::getICmp(ICmpInst::ICMP_ULT, + R1->getValue(), R2->getValue()))) { if (CB->getValue() == false) std::swap(R1, R2); // R1 is the minimum root now. @@ -2257,7 +2255,8 @@ SCEVHandle ScalarEvolutionsImpl::HowFarToNonZero(SCEV *V, const Loop *L) { // already. If so, the backedge will execute zero times. if (SCEVConstant *C = dyn_cast(V)) { Constant *Zero = Constant::getNullValue(C->getValue()->getType()); - Constant *NonZero = ConstantExpr::getSetNE(C->getValue(), Zero); + Constant *NonZero = + ConstantExpr::getICmp(ICmpInst::ICMP_NE, C->getValue(), Zero); if (NonZero == ConstantBool::getTrue()) return getSCEV(Zero); return UnknownValue; // Otherwise it will loop infinitely. @@ -2318,40 +2317,46 @@ HowManyLessThans(SCEV *LHS, SCEV *RHS, const Loop *L) { // Now that we found a conditional branch that dominates the loop, check to // see if it is the comparison we are looking for. - SetCondInst *SCI =dyn_cast(LoopEntryPredicate->getCondition()); - if (!SCI) return UnknownValue; - Value *PreCondLHS = SCI->getOperand(0); - Value *PreCondRHS = SCI->getOperand(1); - Instruction::BinaryOps Cond; - if (LoopEntryPredicate->getSuccessor(0) == PreheaderDest) - Cond = SCI->getOpcode(); - else - Cond = SCI->getInverseCondition(); + if (ICmpInst *ICI = dyn_cast(LoopEntryPredicate->getCondition())){ + Value *PreCondLHS = ICI->getOperand(0); + Value *PreCondRHS = ICI->getOperand(1); + ICmpInst::Predicate Cond; + if (LoopEntryPredicate->getSuccessor(0) == PreheaderDest) + Cond = ICI->getPredicate(); + else + Cond = ICI->getInversePredicate(); - switch (Cond) { - case Instruction::SetGT: - std::swap(PreCondLHS, PreCondRHS); - Cond = Instruction::SetLT; - // Fall Through. - case Instruction::SetLT: - if (PreCondLHS->getType()->isInteger() && - PreCondLHS->getType()->isSigned()) { - if (RHS != getSCEV(PreCondRHS)) - return UnknownValue; // Not a comparison against 'm'. - - if (SCEV::getMinusSCEV(AddRec->getOperand(0), One) - != getSCEV(PreCondLHS)) - return UnknownValue; // Not a comparison against 'n-1'. + switch (Cond) { + case ICmpInst::ICMP_UGT: + std::swap(PreCondLHS, PreCondRHS); + Cond = ICmpInst::ICMP_ULT; break; - } else { - return UnknownValue; + case ICmpInst::ICMP_SGT: + std::swap(PreCondLHS, PreCondRHS); + Cond = ICmpInst::ICMP_SLT; + break; + default: break; } - default: break; - } - //cerr << "Computed Loop Trip Count as: " - // << *SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)) << "\n"; - return SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)); + if (Cond == ICmpInst::ICMP_SLT) { + if (PreCondLHS->getType()->isInteger()) { + if (RHS != getSCEV(PreCondRHS)) + return UnknownValue; // Not a comparison against 'm'. + + if (SCEV::getMinusSCEV(AddRec->getOperand(0), One) + != getSCEV(PreCondLHS)) + return UnknownValue; // Not a comparison against 'n-1'. + } + else return UnknownValue; + } else if (Cond == ICmpInst::ICMP_ULT) + return UnknownValue; + + // cerr << "Computed Loop Trip Count as: " + // << // *SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)) << "\n"; + return SCEV::getMinusSCEV(RHS, AddRec->getOperand(0)); + } + else + return UnknownValue; } return UnknownValue; @@ -2362,7 +2367,8 @@ HowManyLessThans(SCEV *LHS, SCEV *RHS, const Loop *L) { /// this is that it returns the first iteration number where the value is not in /// the condition, thus computing the exit count. If the iteration count can't /// be computed, an instance of SCEVCouldNotCompute is returned. -SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { +SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range, + bool isSigned) const { if (Range.isFullSet()) // Infinite loop. return new SCEVCouldNotCompute(); @@ -2374,7 +2380,7 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { SCEVHandle Shifted = SCEVAddRecExpr::get(Operands, getLoop()); if (SCEVAddRecExpr *ShiftedAddRec = dyn_cast(Shifted)) return ShiftedAddRec->getNumIterationsInRange( - Range.subtract(SC->getValue())); + Range.subtract(SC->getValue()),isSigned); // This is strange and shouldn't happen. return new SCEVCouldNotCompute(); } @@ -2392,7 +2398,7 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { // First check to see if the range contains zero. If not, the first // iteration exits. ConstantInt *Zero = ConstantInt::get(getType(), 0); - if (!Range.contains(Zero)) return SCEVConstant::get(Zero); + if (!Range.contains(Zero, isSigned)) return SCEVConstant::get(Zero); if (isAffine()) { // If this is an affine expression then we have this situation: @@ -2418,12 +2424,12 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { // range, then we computed our trip count, otherwise wrap around or other // things must have happened. ConstantInt *Val = EvaluateConstantChrecAtConstant(this, ExitValue); - if (Range.contains(Val)) + if (Range.contains(Val, isSigned)) return new SCEVCouldNotCompute(); // Something strange happened // Ensure that the previous value is in the range. This is a sanity check. assert(Range.contains(EvaluateConstantChrecAtConstant(this, - ConstantExpr::getSub(ExitValue, One))) && + ConstantExpr::getSub(ExitValue, One)), isSigned) && "Linear scev computation is off in a bad way!"); return SCEVConstant::get(cast(ExitValue)); } else if (isQuadratic()) { @@ -2444,8 +2450,8 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { // Pick the smallest positive root value. assert(R1->getType()->isUnsigned() && "Didn't canonicalize to unsigned?"); if (ConstantBool *CB = - dyn_cast(ConstantExpr::getSetLT(R1->getValue(), - R2->getValue()))) { + dyn_cast(ConstantExpr::getICmp(ICmpInst::ICMP_ULT, + R1->getValue(), R2->getValue()))) { if (CB->getValue() == false) std::swap(R1, R2); // R1 is the minimum root now. @@ -2454,14 +2460,14 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { // for "X*X < 5", for example, we should not return a root of 2. ConstantInt *R1Val = EvaluateConstantChrecAtConstant(this, R1->getValue()); - if (Range.contains(R1Val)) { + if (Range.contains(R1Val, isSigned)) { // The next iteration must be out of the range... Constant *NextVal = ConstantExpr::getAdd(R1->getValue(), ConstantInt::get(R1->getType(), 1)); R1Val = EvaluateConstantChrecAtConstant(this, NextVal); - if (!Range.contains(R1Val)) + if (!Range.contains(R1Val, isSigned)) return SCEVUnknown::get(NextVal); return new SCEVCouldNotCompute(); // Something strange happened } @@ -2472,7 +2478,7 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { ConstantExpr::getSub(R1->getValue(), ConstantInt::get(R1->getType(), 1)); R1Val = EvaluateConstantChrecAtConstant(this, NextVal); - if (Range.contains(R1Val)) + if (Range.contains(R1Val, isSigned)) return R1; return new SCEVCouldNotCompute(); // Something strange happened } @@ -2494,7 +2500,7 @@ SCEVHandle SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range) const { return new SCEVCouldNotCompute(); // Check to see if we found the value! - if (!Range.contains(cast(Val)->getValue())) + if (!Range.contains(cast(Val)->getValue(), isSigned)) return SCEVConstant::get(TestVal); // Increment to test the next index. diff --git a/lib/Analysis/ValueNumbering.cpp b/lib/Analysis/ValueNumbering.cpp index 73d7ed3e4a6..5c57fb74a4f 100644 --- a/lib/Analysis/ValueNumbering.cpp +++ b/lib/Analysis/ValueNumbering.cpp @@ -161,6 +161,11 @@ static inline bool isIdenticalBinaryInst(const Instruction &I1, I1.getParent()->getParent() != I2->getParent()->getParent()) return false; + // If they are CmpInst instructions, check their predicates + if (CmpInst *CI1 = dyn_cast(&const_cast(I1))) + if (CI1->getPredicate() != cast(I2)->getPredicate()) + return false; + // They are identical if both operands are the same! if (I1.getOperand(0) == I2->getOperand(0) && I1.getOperand(1) == I2->getOperand(1)) diff --git a/lib/AsmParser/Lexer.cpp.cvs b/lib/AsmParser/Lexer.cpp.cvs index a36a7535747..f480d1c10c3 100644 --- a/lib/AsmParser/Lexer.cpp.cvs +++ b/lib/AsmParser/Lexer.cpp.cvs @@ -317,38 +317,37 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 147 -#define YY_END_OF_BUFFER 148 -static yyconst short int yy_acclist[225] = +#define YY_NUM_RULES 141 +#define YY_END_OF_BUFFER 142 +static yyconst short int yy_acclist[219] = { 0, - 148, 146, 147, 145, 146, 147, 145, 147, 146, 147, - 146, 147, 146, 147, 146, 147, 146, 147, 146, 147, - 138, 146, 147, 138, 146, 147, 1, 146, 147, 146, - 147, 146, 147, 146, 147, 146, 147, 146, 147, 146, - 147, 146, 147, 146, 147, 146, 147, 146, 147, 146, - 147, 146, 147, 146, 147, 146, 147, 146, 147, 146, - 147, 146, 147, 146, 147, 146, 147, 146, 147, 146, - 147, 137, 135, 134, 134, 141, 139, 143, 138, 1, - 120, 38, 80, 81, 70, 22, 137, 134, 134, 142, - 143, 19, 143, 144, 60, 69, 36, 31, 39, 3, - - 51, 62, 90, 95, 93, 94, 92, 91, 96, 100, - 119, 85, 83, 115, 84, 82, 61, 98, 89, 87, - 88, 86, 99, 97, 71, 136, 143, 143, 117, 46, - 101, 79, 65, 127, 68, 78, 128, 53, 116, 21, - 140, 64, 104, 67, 23, 4, 58, 63, 52, 66, - 45, 11, 103, 143, 33, 2, 5, 55, 106, 57, - 47, 73, 77, 75, 76, 74, 72, 49, 129, 102, - 48, 54, 20, 126, 42, 56, 27, 41, 110, 109, - 7, 122, 30, 125, 35, 59, 114, 108, 121, 24, - 25, 107, 123, 50, 118, 113, 40, 6, 26, 105, - - 34, 8, 16, 9, 111, 10, 112, 32, 12, 14, - 13, 29, 37, 15, 28, 124, 130, 132, 133, 43, - 131, 17, 44, 18 + 142, 140, 141, 139, 140, 141, 139, 141, 140, 141, + 140, 141, 140, 141, 140, 141, 140, 141, 140, 141, + 132, 140, 141, 132, 140, 141, 1, 140, 141, 140, + 141, 140, 141, 140, 141, 140, 141, 140, 141, 140, + 141, 140, 141, 140, 141, 140, 141, 140, 141, 140, + 141, 140, 141, 140, 141, 140, 141, 140, 141, 140, + 141, 140, 141, 140, 141, 140, 141, 140, 141, 140, + 141, 131, 129, 128, 128, 135, 133, 137, 132, 1, + 114, 38, 74, 75, 70, 22, 131, 128, 128, 136, + 137, 19, 137, 138, 60, 69, 36, 31, 39, 3, + + 51, 62, 84, 89, 87, 88, 86, 85, 90, 94, + 113, 79, 77, 109, 78, 76, 61, 92, 83, 81, + 82, 80, 93, 91, 71, 130, 137, 137, 111, 46, + 95, 73, 65, 121, 68, 72, 122, 53, 110, 21, + 134, 64, 98, 67, 23, 4, 58, 63, 52, 66, + 45, 11, 97, 137, 33, 2, 5, 55, 100, 57, + 47, 49, 123, 96, 48, 54, 20, 120, 42, 56, + 27, 41, 104, 103, 7, 116, 30, 119, 35, 59, + 108, 102, 115, 24, 25, 101, 117, 50, 112, 107, + 40, 6, 26, 99, 34, 8, 16, 9, 105, 10, + + 106, 32, 12, 14, 13, 29, 37, 15, 28, 118, + 124, 126, 127, 43, 125, 17, 44, 18 } ; -static yyconst short int yy_accept[581] = +static yyconst short int yy_accept[570] = { 0, 1, 1, 1, 2, 4, 7, 9, 11, 13, 15, 17, 19, 21, 24, 27, 30, 32, 34, 36, 38, @@ -372,47 +371,46 @@ static yyconst short int yy_accept[581] = 102, 102, 102, 102, 102, 102, 103, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 111, 111, 112, - 112, 112, 112, 112, 112, 112, 112, 113, 114, 115, - 115, 115, 115, 115, 116, 117, 117, 117, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 119, 120, 121, - 121, 121, 122, 122, 123, 123, 124, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, - 127, 128, 128, 128, 128, 129, 129, 129, 129, 130, - 130, 130, 131, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 133, 134, - 134, 134, 134, 134, 135, 136, 136, 136, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 138, 139, 140, - - 140, 140, 141, 141, 141, 141, 142, 142, 143, 143, - 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, - 145, 145, 145, 146, 146, 146, 147, 147, 148, 148, - 149, 150, 150, 150, 150, 150, 150, 151, 151, 151, - 152, 152, 153, 153, 153, 154, 155, 156, 156, 156, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 158, 158, 159, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, - 161, 161, 161, 161, 161, 161, 162, 162, 162, 163, - 164, 165, 166, 167, 168, 169, 169, 169, 169, 170, - - 170, 170, 170, 171, 172, 172, 173, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 175, 175, 175, 176, - 176, 176, 176, 176, 176, 176, 176, 177, 178, 178, - 178, 179, 180, 181, 181, 181, 182, 182, 182, 182, - 182, 183, 183, 184, 185, 186, 187, 187, 187, 187, - 188, 188, 188, 189, 190, 191, 192, 193, 193, 194, - 195, 196, 196, 196, 196, 196, 196, 197, 197, 198, - 198, 199, 200, 200, 200, 200, 200, 200, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, - - 203, 204, 204, 204, 204, 204, 205, 206, 207, 207, - 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, - 211, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, - 213, 213, 214, 214, 214, 214, 214, 215, 215, 215, - 215, 215, 216, 216, 217, 217, 217, 217, 217, 217, - 217, 217, 217, 217, 217, 217, 217, 218, 218, 219, - 220, 220, 221, 221, 222, 223, 224, 224, 225, 225 + 112, 112, 112, 112, 112, 112, 113, 114, 115, 115, + 115, 115, 115, 116, 117, 117, 117, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 119, 120, 121, 121, + 121, 122, 122, 123, 123, 124, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 126, 126, 126, 127, + 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, + 130, 131, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 133, 134, 134, + 134, 134, 134, 135, 136, 136, 136, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 138, 139, 140, 140, + + 140, 141, 141, 141, 141, 142, 142, 143, 143, 143, + 144, 144, 144, 144, 144, 145, 145, 145, 146, 146, + 146, 147, 147, 148, 148, 149, 150, 150, 150, 150, + 150, 150, 151, 151, 151, 152, 152, 153, 153, 153, + 154, 155, 156, 156, 156, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, + 158, 159, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, + 161, 162, 162, 162, 163, 163, 163, 163, 164, 164, + 164, 164, 165, 166, 166, 167, 168, 168, 168, 168, + + 168, 168, 168, 168, 168, 169, 169, 169, 170, 170, + 170, 170, 170, 170, 170, 170, 171, 172, 172, 172, + 173, 174, 175, 175, 175, 176, 176, 176, 176, 176, + 177, 177, 178, 179, 180, 181, 181, 181, 181, 182, + 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, + 190, 190, 190, 190, 190, 190, 191, 191, 192, 192, + 193, 194, 194, 194, 194, 194, 194, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 196, 196, 196, 196, + 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, + 198, 198, 198, 198, 198, 199, 200, 201, 201, 202, + + 202, 202, 202, 203, 203, 203, 203, 204, 204, 205, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, + 207, 208, 208, 208, 208, 208, 209, 209, 209, 209, + 209, 210, 210, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 212, 212, 213, 214, + 214, 215, 215, 216, 217, 218, 218, 219, 219 } ; static yyconst int yy_ec[256] = @@ -456,143 +454,141 @@ static yyconst int yy_meta[44] = 3, 3, 3 } ; -static yyconst short int yy_base[585] = +static yyconst short int yy_base[574] = { 0, - 0, 0, 1248, 1249, 1249, 1249, 1243, 1232, 36, 40, + 0, 0, 1226, 1227, 1227, 1227, 1221, 1210, 36, 40, 44, 50, 56, 62, 0, 63, 66, 81, 89, 47, 108, 91, 95, 92, 72, 109, 134, 119, 117, 160, - 120, 191, 139, 121, 136, 150, 1241, 1249, 1230, 1249, + 120, 191, 139, 121, 136, 150, 1219, 1227, 1208, 1227, 0, 165, 180, 197, 219, 70, 224, 239, 244, 0, - 68, 152, 93, 128, 158, 190, 245, 31, 1229, 188, - 182, 211, 48, 207, 248, 210, 122, 124, 1228, 209, + 68, 152, 93, 128, 158, 190, 245, 31, 1207, 188, + 182, 211, 48, 207, 248, 210, 122, 124, 1206, 209, 257, 258, 185, 259, 260, 261, 262, 263, 264, 265, - 266, 276, 273, 287, 286, 278, 294, 295, 1227, 297, + 266, 276, 273, 287, 286, 278, 294, 295, 1205, 297, 299, 300, 305, 306, 303, 313, 307, 311, 301, 316, - 46, 317, 318, 325, 326, 329, 333, 327, 334, 337, - 351, 346, 354, 1226, 358, 342, 338, 360, 363, 365, - 362, 368, 372, 369, 364, 271, 384, 387, 231, 389, - 394, 1225, 0, 404, 408, 1224, 426, 443, 0, 1223, - 408, 395, 1222, 409, 412, 1221, 414, 1220, 431, 430, - 432, 1219, 420, 434, 444, 446, 448, 449, 452, 454, - 455, 450, 457, 458, 466, 180, 462, 469, 470, 473, - 474, 472, 475, 477, 484, 486, 480, 490, 487, 497, - 500, 502, 503, 504, 505, 1218, 506, 1217, 1216, 1215, - 1214, 1213, 1212, 396, 1211, 1210, 510, 507, 1209, 535, - - 512, 511, 516, 514, 546, 525, 1208, 1207, 1206, 526, - 518, 549, 550, 1205, 1204, 551, 552, 1203, 553, 554, - 559, 556, 562, 565, 560, 564, 1202, 1201, 1200, 572, - 566, 1199, 577, 1198, 578, 1197, 1196, 581, 580, 582, - 585, 517, 588, 586, 592, 597, 1195, 599, 600, 1249, - 611, 628, 632, 636, 641, 602, 604, 642, 1194, 643, - 613, 1193, 1192, 605, 644, 645, 646, 647, 649, 648, - 650, 654, 651, 653, 658, 655, 665, 1191, 1190, 657, - 670, 673, 676, 1189, 1188, 671, 677, 1187, 678, 681, - 683, 685, 684, 679, 688, 690, 1186, 1185, 1184, 689, - - 696, 1183, 691, 699, 692, 0, 708, 1182, 701, 709, - 712, 718, 719, 720, 1181, 713, 721, 724, 725, 1180, - 730, 737, 1179, 734, 723, 1178, 740, 1177, 745, 1176, - 1175, 746, 748, 750, 752, 749, 1174, 751, 753, 1173, - 755, 1172, 758, 762, 1171, 785, 1170, 764, 763, 1169, - 765, 770, 785, 779, 788, 773, 761, 776, 789, 791, - 792, 796, 797, 1168, 798, 1167, 1166, 799, 801, 802, - 806, 803, 807, 810, 811, 816, 817, 1165, 820, 821, - 822, 825, 827, 831, 832, 1164, 824, 838, 1163, 1162, - 1161, 1160, 1159, 1158, 1157, 839, 841, 843, 1156, 844, - - 846, 848, 1155, 1154, 847, 1153, 1152, 852, 850, 849, - 853, 855, 860, 863, 867, 1151, 870, 871, 1150, 873, - 874, 875, 876, 877, 878, 879, 1149, 1148, 887, 882, - 1147, 1146, 1145, 888, 893, 1144, 880, 898, 901, 900, - 1143, 904, 1142, 1141, 1140, 1139, 908, 902, 910, 1138, - 912, 914, 1137, 1136, 1135, 1134, 1133, 913, 1132, 1131, - 1130, 915, 916, 918, 920, 917, 1129, 922, 1128, 928, - 1127, 1126, 931, 932, 935, 936, 939, 1125, 940, 937, - 941, 942, 943, 950, 944, 947, 1124, 955, 958, 960, - 962, 963, 968, 969, 972, 1123, 973, 976, 977, 978, - - 1122, 974, 979, 981, 982, 1121, 1118, 1108, 985, 1107, - 984, 988, 1001, 1106, 1002, 1003, 1005, 1105, 990, 1103, - 1102, 1006, 1010, 994, 1015, 1012, 1014, 1016, 1021, 1022, - 1024, 1025, 1026, 1101, 1027, 1030, 1032, 1033, 1036, 1038, - 1034, 1100, 1039, 1035, 1049, 1052, 1098, 1053, 1042, 1055, - 1054, 1097, 1058, 1093, 1059, 1063, 1060, 1061, 1066, 1072, - 1069, 1075, 1077, 1079, 1080, 1081, 1091, 1082, 1083, 726, - 1088, 616, 1085, 615, 515, 476, 1089, 370, 1249, 1124, - 1126, 341, 1130, 151 + 46, 317, 318, 325, 326, 329, 333, 327, 334, 330, + 351, 342, 346, 1204, 358, 354, 337, 361, 360, 363, + 362, 366, 369, 383, 364, 271, 381, 388, 231, 370, + 397, 1203, 0, 402, 406, 1202, 429, 446, 0, 1201, + 406, 412, 1200, 407, 410, 1199, 408, 1198, 413, 419, + 422, 1197, 433, 414, 447, 448, 435, 449, 452, 451, + 454, 459, 455, 458, 460, 180, 466, 462, 469, 475, + 463, 470, 473, 478, 474, 485, 482, 486, 488, 496, + 497, 498, 499, 501, 503, 1196, 506, 1195, 1194, 1193, + 1192, 1191, 1190, 504, 1189, 1188, 511, 507, 1187, 535, + + 512, 514, 513, 517, 523, 1186, 1185, 1184, 529, 515, + 547, 548, 1183, 1182, 549, 551, 1181, 552, 553, 558, + 554, 561, 555, 557, 559, 1180, 1179, 1178, 560, 563, + 1177, 562, 1176, 567, 1175, 1174, 577, 574, 582, 571, + 585, 510, 588, 591, 592, 1173, 594, 595, 1227, 604, + 623, 612, 627, 632, 597, 599, 633, 1172, 634, 635, + 1171, 1170, 636, 615, 637, 639, 641, 642, 644, 645, + 647, 648, 649, 652, 656, 659, 1169, 1168, 658, 663, + 667, 664, 1167, 1166, 668, 669, 1165, 673, 672, 675, + 676, 678, 680, 679, 684, 1164, 1163, 1162, 685, 687, + + 1161, 677, 690, 698, 0, 700, 1160, 704, 705, 1159, + 706, 708, 710, 711, 1158, 714, 715, 1157, 724, 720, + 1156, 725, 1155, 727, 1154, 1153, 728, 726, 730, 734, + 731, 1152, 741, 742, 1151, 743, 1150, 745, 744, 1149, + 753, 1148, 753, 746, 1147, 747, 761, 759, 765, 770, + 756, 773, 771, 774, 776, 778, 780, 781, 1146, 782, + 1145, 1144, 783, 786, 784, 791, 787, 792, 794, 798, + 803, 804, 1143, 806, 805, 809, 810, 811, 812, 818, + 1142, 807, 824, 1141, 826, 827, 829, 1140, 411, 828, + 830, 1139, 1138, 833, 1137, 1136, 835, 832, 834, 838, + + 843, 845, 836, 844, 1135, 853, 846, 1134, 854, 855, + 858, 863, 860, 865, 867, 1133, 1132, 870, 864, 1131, + 1130, 1129, 873, 868, 1128, 879, 881, 889, 876, 1127, + 891, 1126, 1125, 1124, 1123, 892, 878, 893, 1122, 896, + 897, 1121, 1120, 1119, 1118, 1117, 900, 1116, 1115, 1114, + 901, 902, 903, 904, 906, 1113, 908, 1112, 909, 1111, + 1110, 914, 915, 918, 919, 920, 1109, 921, 922, 925, + 926, 928, 933, 932, 937, 1108, 938, 943, 945, 946, + 947, 951, 948, 953, 1107, 956, 959, 961, 957, 1106, + 962, 968, 965, 967, 1105, 1104, 1103, 973, 1102, 969, + + 972, 975, 1101, 983, 987, 989, 1098, 974, 1088, 1086, + 991, 994, 993, 995, 998, 999, 1001, 1004, 1005, 1006, + 1007, 1010, 1085, 1009, 1013, 1012, 1017, 1021, 1024, 1018, + 1084, 1025, 1032, 1035, 1036, 1083, 1037, 1019, 1026, 1038, + 1082, 1043, 1077, 1044, 1045, 1049, 1048, 1053, 1054, 1056, + 1057, 1060, 1063, 1058, 1066, 1076, 1064, 1073, 877, 1068, + 760, 1071, 707, 604, 522, 1069, 368, 1227, 1104, 1106, + 349, 1110, 151 } ; -static yyconst short int yy_def[585] = +static yyconst short int yy_def[574] = { 0, - 579, 1, 579, 579, 579, 579, 580, 581, 582, 579, - 581, 581, 581, 581, 583, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 580, 579, 581, 579, - 584, 584, 579, 579, 581, 581, 581, 581, 581, 583, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 579, 584, 584, 579, 581, 581, 581, 49, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 49, - - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 579, - 579, 579, 579, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - - 581, 581, 581, 581, 581, 200, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 579, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, - 581, 581, 581, 581, 581, 581, 581, 581, 0, 579, - 579, 579, 579, 579 + 568, 1, 568, 568, 568, 568, 569, 570, 571, 568, + 570, 570, 570, 570, 572, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 569, 568, 570, 568, + 573, 573, 568, 568, 570, 570, 570, 570, 570, 572, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 568, 573, 573, 568, 570, 570, 570, 49, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 49, + + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 568, 568, + 568, 568, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + + 570, 570, 570, 570, 200, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 568, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 0, 568, 568, + 568, 568, 568 } ; -static yyconst short int yy_nxt[1293] = +static yyconst short int yy_nxt[1271] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 4, 15, 8, 8, 8, 16, 17, @@ -617,129 +613,125 @@ static yyconst short int yy_nxt[1293] = 43, 43, 43, 40, 109, 40, 110, 111, 40, 112, 101, 40, 152, 40, 40, 135, 44, 44, 44, 44, - 117, 166, 118, 119, 147, 120, 151, 121, 279, 122, + 117, 166, 118, 119, 147, 120, 151, 121, 278, 122, 40, 123, 40, 40, 40, 124, 125, 47, 45, 45, 45, 45, 40, 137, 137, 137, 137, 40, 159, 153, - 138, 154, 246, 156, 40, 162, 138, 47, 48, 48, + 138, 154, 245, 156, 40, 162, 138, 47, 48, 48, 48, 48, 40, 139, 139, 139, 139, 40, 40, 139, 139, 40, 139, 139, 139, 139, 139, 139, 157, 148, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 158, 149, 168, 170, 40, 163, 40, 165, 242, 40, + 158, 149, 168, 170, 40, 163, 40, 165, 241, 40, 167, 40, 164, 173, 172, 178, 169, 174, 171, 40, 40, 175, 176, 179, 177, 181, 184, 40, 40, 180, 40, 183, 40, 40, 40, 185, 40, 182, 40, 40, 40, 194, 189, 186, 40, 187, 40, 191, 193, 40, 40, 40, 188, 196, 195, 198, 190, 197, 40, 40, - 40, 192, 40, 41, 202, 203, 40, 40, 207, 214, - 40, 40, 199, 204, 212, 40, 216, 209, 201, 40, - 210, 205, 208, 215, 40, 206, 211, 40, 217, 213, - 218, 40, 219, 40, 224, 40, 40, 40, 40, 225, - 220, 40, 40, 40, 222, 40, 226, 228, 221, 241, - 232, 240, 230, 235, 236, 223, 227, 40, 231, 233, - - 40, 229, 40, 237, 234, 245, 238, 40, 40, 40, - 243, 239, 244, 134, 134, 134, 134, 251, 251, 251, - 251, 40, 40, 247, 252, 40, 257, 40, 248, 303, - 252, 258, 256, 40, 249, 137, 137, 137, 137, 40, - 260, 264, 138, 40, 40, 40, 259, 40, 138, 253, - 254, 261, 255, 255, 255, 255, 40, 40, 262, 40, - 263, 40, 40, 40, 267, 40, 266, 40, 40, 265, - 40, 40, 274, 272, 270, 40, 268, 269, 271, 40, - 280, 273, 40, 40, 275, 40, 40, 40, 40, 40, - 40, 287, 276, 40, 277, 284, 286, 40, 278, 40, - - 40, 282, 285, 40, 283, 289, 290, 288, 291, 281, - 40, 293, 294, 40, 295, 40, 40, 40, 40, 40, - 40, 297, 292, 40, 40, 40, 298, 40, 40, 40, - 40, 40, 300, 296, 302, 339, 310, 299, 40, 40, - 304, 317, 301, 305, 306, 306, 306, 306, 307, 308, - 306, 306, 309, 306, 306, 306, 306, 306, 306, 40, - 316, 315, 40, 40, 40, 40, 40, 40, 311, 40, - 312, 318, 40, 40, 313, 40, 314, 40, 40, 40, - 320, 319, 323, 324, 326, 40, 321, 328, 325, 322, - 40, 40, 327, 40, 40, 40, 329, 332, 40, 40, - - 334, 40, 330, 335, 341, 40, 336, 333, 331, 340, - 40, 337, 40, 40, 343, 40, 338, 40, 40, 342, - 251, 251, 251, 251, 348, 352, 40, 252, 40, 40, - 344, 351, 347, 252, 253, 253, 345, 346, 346, 346, - 346, 346, 346, 346, 346, 255, 255, 255, 255, 40, - 255, 255, 255, 255, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 356, 40, 40, 40, 361, - 40, 40, 349, 350, 355, 357, 363, 364, 40, 359, - 353, 354, 360, 40, 40, 365, 40, 362, 358, 40, - 40, 40, 40, 366, 40, 372, 40, 40, 40, 371, - - 373, 40, 40, 40, 40, 40, 367, 378, 368, 40, - 369, 377, 40, 370, 40, 374, 376, 375, 380, 379, - 381, 40, 40, 385, 382, 40, 40, 387, 383, 388, - 386, 40, 40, 40, 40, 384, 40, 40, 40, 40, - 390, 392, 394, 40, 396, 389, 397, 40, 398, 395, - 40, 402, 399, 40, 391, 393, 401, 400, 40, 40, - 403, 40, 40, 40, 40, 40, 40, 404, 40, 405, - 408, 40, 406, 407, 40, 40, 40, 40, 40, 409, - 424, 413, 416, 40, 417, 410, 40, 411, 415, 40, - 419, 412, 40, 414, 346, 346, 346, 346, 40, 421, - - 418, 40, 40, 420, 40, 40, 422, 423, 425, 40, - 40, 40, 40, 427, 40, 40, 40, 430, 431, 40, - 40, 426, 428, 40, 40, 432, 429, 433, 435, 40, - 40, 436, 434, 40, 40, 40, 437, 40, 40, 441, - 40, 439, 444, 443, 40, 40, 438, 445, 440, 446, - 442, 40, 40, 447, 40, 449, 40, 40, 448, 40, - 40, 40, 40, 40, 452, 40, 40, 451, 40, 454, - 456, 459, 458, 40, 450, 453, 40, 461, 463, 457, - 40, 462, 455, 40, 40, 460, 40, 40, 40, 40, - 40, 40, 40, 40, 469, 40, 466, 465, 471, 464, - - 40, 40, 480, 468, 475, 476, 40, 467, 478, 473, - 474, 40, 472, 40, 40, 40, 470, 40, 477, 482, - 481, 40, 479, 40, 484, 40, 40, 40, 40, 40, - 40, 40, 486, 40, 488, 40, 483, 489, 490, 493, - 487, 40, 485, 491, 40, 40, 494, 495, 40, 40, - 40, 492, 40, 40, 40, 40, 40, 40, 496, 497, - 40, 502, 503, 40, 501, 498, 499, 504, 40, 505, - 506, 40, 508, 40, 500, 40, 40, 507, 513, 509, - 512, 40, 40, 510, 514, 40, 40, 40, 516, 40, - 40, 40, 40, 511, 40, 40, 518, 40, 40, 515, - - 522, 40, 523, 40, 526, 517, 528, 40, 529, 524, - 519, 527, 520, 521, 40, 40, 40, 525, 40, 40, - 530, 532, 531, 40, 535, 40, 534, 40, 40, 40, - 537, 533, 536, 538, 40, 40, 541, 40, 40, 40, - 40, 539, 544, 40, 546, 40, 40, 40, 40, 40, - 543, 40, 40, 545, 547, 40, 540, 542, 551, 548, - 552, 554, 40, 555, 549, 40, 40, 40, 40, 550, - 553, 40, 40, 40, 40, 558, 40, 556, 559, 40, - 557, 560, 40, 564, 561, 40, 565, 563, 40, 562, - 40, 566, 40, 40, 40, 40, 40, 571, 40, 572, - - 567, 40, 40, 568, 40, 569, 40, 577, 576, 570, - 40, 40, 575, 40, 40, 40, 40, 574, 40, 40, - 40, 40, 573, 578, 37, 37, 37, 37, 39, 39, + 40, 192, 40, 40, 202, 203, 40, 40, 206, 213, + 40, 41, 199, 204, 211, 40, 215, 208, 201, 40, + 209, 216, 207, 214, 40, 205, 210, 40, 218, 212, + 217, 40, 219, 40, 40, 40, 40, 40, 224, 40, + 220, 40, 40, 40, 221, 227, 223, 225, 231, 240, + 234, 235, 229, 226, 40, 222, 40, 232, 230, 228, + + 236, 40, 233, 237, 246, 239, 244, 242, 238, 243, + 40, 134, 134, 134, 134, 250, 250, 250, 250, 40, + 40, 40, 251, 40, 40, 40, 40, 40, 251, 257, + 255, 247, 40, 260, 259, 40, 443, 248, 137, 137, + 137, 137, 40, 256, 258, 138, 40, 261, 40, 264, + 262, 138, 252, 253, 263, 254, 254, 254, 254, 40, + 40, 40, 40, 267, 40, 40, 266, 40, 40, 265, + 271, 40, 40, 40, 269, 40, 40, 268, 270, 40, + 272, 273, 40, 40, 279, 285, 40, 40, 40, 286, + 275, 40, 277, 274, 276, 40, 289, 283, 40, 40, + + 281, 40, 280, 282, 284, 287, 288, 290, 293, 40, + 40, 40, 40, 292, 40, 294, 40, 40, 296, 40, + 40, 291, 297, 40, 40, 40, 40, 40, 40, 299, + 40, 335, 295, 298, 301, 40, 40, 302, 312, 309, + 300, 303, 40, 304, 305, 305, 305, 305, 306, 308, + 305, 305, 307, 305, 305, 305, 305, 305, 305, 310, + 40, 40, 40, 311, 40, 40, 40, 40, 40, 313, + 40, 40, 40, 40, 40, 40, 40, 323, 315, 314, + 40, 318, 319, 321, 40, 316, 320, 40, 317, 329, + 40, 322, 328, 324, 327, 40, 326, 325, 40, 330, + + 331, 40, 333, 334, 40, 40, 336, 40, 40, 338, + 40, 332, 40, 250, 250, 250, 250, 40, 337, 343, + 251, 341, 341, 341, 341, 339, 251, 342, 40, 252, + 252, 340, 341, 341, 341, 341, 254, 254, 254, 254, + 40, 254, 254, 254, 254, 40, 40, 40, 40, 40, + 40, 348, 40, 346, 40, 40, 347, 40, 40, 351, + 40, 40, 40, 344, 345, 40, 356, 350, 352, 40, + 358, 40, 40, 349, 354, 355, 40, 40, 359, 360, + 40, 40, 40, 357, 353, 40, 40, 367, 40, 40, + 40, 40, 40, 40, 361, 368, 366, 40, 40, 362, + + 40, 365, 363, 40, 364, 372, 369, 371, 373, 370, + 374, 40, 375, 40, 378, 377, 376, 40, 40, 40, + 40, 40, 381, 40, 40, 383, 379, 40, 40, 380, + 382, 385, 386, 40, 387, 389, 388, 40, 40, 40, + 40, 40, 384, 40, 40, 392, 390, 40, 391, 393, + 395, 394, 397, 396, 40, 40, 40, 40, 40, 40, + 40, 398, 341, 341, 341, 341, 40, 406, 402, 40, + 404, 405, 40, 40, 40, 399, 400, 409, 40, 401, + 403, 408, 407, 40, 40, 410, 40, 40, 411, 40, + 412, 40, 413, 40, 40, 40, 40, 40, 416, 40, + + 40, 419, 420, 414, 40, 40, 415, 40, 417, 421, + 418, 40, 422, 424, 423, 425, 40, 40, 40, 40, + 40, 426, 40, 40, 40, 40, 430, 432, 428, 433, + 427, 40, 434, 435, 436, 429, 431, 40, 438, 40, + 40, 40, 40, 40, 437, 40, 40, 40, 40, 40, + 441, 40, 445, 448, 440, 447, 40, 40, 40, 40, + 439, 442, 450, 452, 444, 446, 40, 40, 40, 451, + 449, 40, 453, 40, 454, 458, 40, 40, 40, 455, + 40, 40, 456, 40, 457, 460, 40, 464, 465, 40, + 40, 40, 40, 467, 40, 461, 462, 468, 463, 459, + + 466, 469, 40, 470, 40, 40, 40, 471, 475, 40, + 40, 473, 472, 40, 40, 40, 40, 40, 477, 40, + 478, 40, 40, 476, 482, 479, 474, 40, 40, 480, + 483, 40, 40, 40, 40, 40, 484, 481, 40, 40, + 486, 40, 491, 492, 485, 40, 40, 490, 487, 488, + 40, 40, 493, 494, 495, 497, 40, 489, 40, 40, + 40, 40, 496, 502, 40, 501, 40, 498, 503, 40, + 40, 505, 40, 499, 40, 40, 500, 507, 40, 511, + 40, 40, 40, 504, 506, 40, 40, 40, 40, 515, + 512, 517, 518, 508, 519, 509, 40, 510, 513, 516, + + 40, 514, 40, 520, 40, 521, 40, 40, 40, 524, + 523, 40, 40, 527, 40, 522, 525, 40, 40, 40, + 40, 530, 40, 40, 533, 40, 40, 528, 535, 526, + 40, 40, 40, 532, 40, 534, 536, 40, 40, 40, + 531, 529, 537, 540, 538, 40, 541, 543, 40, 40, + 40, 40, 549, 539, 542, 548, 40, 40, 40, 547, + 544, 40, 40, 545, 546, 553, 40, 40, 550, 40, + 40, 40, 552, 40, 551, 554, 40, 40, 555, 40, + 560, 40, 40, 561, 40, 557, 40, 556, 565, 40, + 40, 559, 558, 566, 564, 40, 40, 40, 40, 40, + + 562, 40, 563, 567, 37, 37, 37, 37, 39, 39, 50, 40, 50, 50, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 250, 40, - 40, 40, 40, 40, 132, 40, 38, 579, 3, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579 + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 249, 40, 40, 40, + 40, 40, 132, 40, 38, 568, 3, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568 } ; -static yyconst short int yy_chk[1293] = +static yyconst short int yy_chk[1271] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -757,7 +749,7 @@ static yyconst short int yy_chk[1293] = 19, 21, 26, 24, 23, 23, 21, 24, 21, 21, 29, 26, 28, 31, 34, 67, 21, 68, 31, 29, 21, 54, 21, 34, 28, 68, 26, 27, 35, 35, - 28, 31, 33, 584, 31, 28, 27, 33, 27, 67, + 28, 31, 33, 573, 31, 28, 27, 33, 27, 67, 54, 31, 27, 36, 27, 52, 27, 35, 27, 30, 33, 55, 36, 30, 42, 42, 42, 42, 52, 30, 52, 30, 30, 55, 30, 30, 30, 55, 30, 43, @@ -778,112 +770,108 @@ static yyconst short int yy_chk[1293] = 90, 85, 91, 92, 99, 87, 95, 84, 93, 94, 97, 95, 92, 88, 98, 90, 96, 93, 94, 100, 102, 103, 91, 97, 96, 99, 92, 98, 104, 105, - 108, 93, 106, 582, 103, 104, 107, 109, 105, 108, - 110, 117, 100, 104, 107, 116, 109, 106, 102, 112, - 106, 104, 105, 108, 111, 104, 106, 113, 110, 107, - 111, 115, 112, 118, 116, 121, 119, 125, 120, 117, - 113, 122, 124, 578, 115, 123, 118, 120, 113, 125, - 122, 124, 121, 123, 123, 115, 119, 127, 121, 122, - - 128, 120, 130, 123, 122, 128, 123, 131, 142, 194, - 127, 123, 127, 134, 134, 134, 134, 135, 135, 135, - 135, 141, 144, 130, 135, 145, 142, 147, 131, 194, - 135, 144, 141, 153, 131, 137, 137, 137, 137, 137, - 147, 153, 137, 150, 149, 151, 145, 154, 137, 138, - 138, 149, 138, 138, 138, 138, 138, 155, 150, 156, - 151, 157, 158, 162, 156, 159, 155, 160, 161, 154, - 163, 164, 162, 160, 159, 167, 157, 158, 159, 165, - 167, 161, 168, 169, 162, 172, 170, 171, 173, 576, - 174, 172, 163, 177, 164, 170, 171, 175, 165, 176, - - 179, 169, 170, 178, 169, 174, 175, 173, 176, 168, - 180, 177, 178, 181, 179, 182, 183, 184, 185, 187, - 198, 181, 176, 197, 202, 201, 182, 204, 575, 203, - 242, 211, 184, 180, 187, 242, 204, 183, 206, 210, - 197, 211, 185, 198, 200, 200, 200, 200, 201, 202, - 200, 200, 203, 200, 200, 200, 200, 200, 200, 205, - 210, 206, 212, 213, 216, 217, 219, 220, 205, 222, - 205, 212, 221, 225, 205, 223, 205, 226, 224, 231, - 216, 213, 220, 221, 223, 230, 217, 224, 222, 219, - 233, 235, 223, 239, 238, 240, 225, 231, 241, 244, - - 235, 243, 226, 238, 244, 245, 239, 233, 230, 243, - 246, 240, 248, 249, 246, 256, 241, 257, 264, 245, - 251, 251, 251, 251, 257, 264, 261, 251, 574, 572, - 248, 261, 256, 251, 252, 252, 249, 252, 252, 252, - 252, 253, 253, 253, 253, 254, 254, 254, 254, 254, - 255, 255, 255, 255, 255, 258, 260, 265, 266, 267, - 268, 270, 269, 271, 273, 268, 274, 272, 276, 273, - 280, 275, 258, 260, 267, 269, 275, 276, 277, 271, - 265, 266, 272, 281, 286, 277, 282, 274, 270, 283, - 287, 289, 294, 280, 290, 287, 291, 293, 292, 286, - - 289, 295, 300, 296, 303, 305, 281, 294, 282, 301, - 282, 293, 304, 283, 309, 290, 292, 291, 296, 295, - 300, 307, 310, 305, 301, 311, 316, 309, 303, 310, - 307, 312, 313, 314, 317, 304, 325, 318, 319, 570, - 312, 313, 314, 321, 317, 311, 318, 324, 319, 316, - 322, 325, 321, 327, 312, 313, 324, 322, 329, 332, - 327, 333, 336, 334, 338, 335, 339, 329, 341, 332, - 335, 343, 333, 334, 357, 344, 349, 348, 351, 336, - 357, 343, 348, 352, 349, 338, 356, 339, 344, 358, - 352, 341, 354, 343, 346, 346, 346, 346, 353, 354, - - 351, 355, 359, 353, 360, 361, 355, 356, 358, 362, - 363, 365, 368, 360, 369, 370, 372, 363, 365, 371, - 373, 359, 361, 374, 375, 368, 362, 369, 371, 376, - 377, 372, 370, 379, 380, 381, 373, 387, 382, 377, - 383, 375, 381, 380, 384, 385, 374, 382, 376, 383, - 379, 388, 396, 384, 397, 387, 398, 400, 385, 401, - 405, 402, 410, 409, 397, 408, 411, 396, 412, 400, - 402, 409, 408, 413, 388, 398, 414, 411, 413, 405, - 415, 412, 401, 417, 418, 410, 420, 421, 422, 423, - 424, 425, 426, 437, 421, 430, 417, 415, 423, 414, - - 429, 434, 437, 420, 429, 429, 435, 418, 434, 425, - 426, 438, 424, 440, 439, 448, 422, 442, 430, 439, - 438, 447, 435, 449, 442, 451, 458, 452, 462, 463, - 466, 464, 448, 465, 451, 468, 440, 452, 458, 464, - 449, 470, 447, 462, 473, 474, 465, 466, 475, 476, - 480, 463, 477, 479, 481, 482, 483, 485, 468, 470, - 486, 477, 479, 484, 476, 473, 474, 480, 488, 481, - 482, 489, 484, 490, 475, 491, 492, 483, 490, 485, - 489, 493, 494, 486, 491, 495, 497, 502, 493, 498, - 499, 500, 503, 488, 504, 505, 495, 511, 509, 492, - - 500, 512, 502, 519, 505, 494, 511, 524, 512, 503, - 497, 509, 498, 499, 513, 515, 516, 504, 517, 522, - 513, 516, 515, 523, 522, 526, 519, 527, 525, 528, - 524, 517, 523, 525, 529, 530, 528, 531, 532, 533, - 535, 526, 531, 536, 533, 537, 538, 541, 544, 539, - 530, 540, 543, 532, 535, 549, 527, 529, 539, 536, - 540, 543, 545, 544, 537, 546, 548, 551, 550, 538, - 541, 553, 555, 557, 558, 548, 556, 545, 549, 559, - 546, 550, 561, 556, 551, 560, 557, 555, 562, 553, - 563, 558, 564, 565, 566, 568, 569, 563, 573, 564, - - 559, 571, 577, 560, 567, 561, 554, 573, 571, 562, - 552, 547, 568, 542, 534, 521, 520, 566, 518, 514, - 510, 508, 565, 577, 580, 580, 580, 580, 581, 581, - 583, 507, 583, 583, 506, 501, 496, 487, 478, 472, - 471, 469, 467, 461, 460, 459, 457, 456, 455, 454, - 453, 450, 446, 445, 444, 443, 441, 436, 433, 432, - 431, 428, 427, 419, 416, 407, 406, 404, 403, 399, - 395, 394, 393, 392, 391, 390, 389, 386, 378, 367, - 366, 364, 350, 347, 345, 342, 340, 337, 331, 330, - 328, 326, 323, 320, 315, 308, 302, 299, 298, 297, - - 288, 285, 284, 279, 278, 263, 262, 259, 247, 237, - 236, 234, 232, 229, 228, 227, 218, 215, 214, 209, - 208, 207, 199, 196, 195, 193, 192, 191, 190, 189, - 188, 186, 152, 148, 146, 143, 140, 136, 132, 114, - 89, 69, 59, 39, 37, 8, 7, 3, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579 - + 108, 93, 106, 110, 103, 104, 107, 109, 105, 108, + 117, 571, 100, 104, 107, 112, 109, 106, 102, 113, + 106, 110, 105, 108, 111, 104, 106, 116, 112, 107, + 111, 115, 113, 119, 118, 121, 120, 125, 117, 122, + 113, 567, 123, 130, 115, 120, 116, 118, 122, 125, + 123, 123, 121, 119, 127, 115, 124, 122, 121, 120, + + 123, 128, 122, 123, 130, 124, 128, 127, 123, 127, + 131, 134, 134, 134, 134, 135, 135, 135, 135, 141, + 144, 147, 135, 145, 389, 142, 149, 154, 135, 144, + 141, 131, 150, 149, 147, 151, 389, 131, 137, 137, + 137, 137, 137, 142, 145, 137, 153, 150, 157, 154, + 151, 137, 138, 138, 153, 138, 138, 138, 138, 138, + 155, 156, 158, 157, 160, 159, 156, 161, 163, 155, + 160, 164, 162, 165, 159, 168, 171, 158, 159, 167, + 161, 162, 169, 172, 167, 171, 173, 175, 170, 172, + 163, 174, 165, 162, 164, 177, 175, 170, 176, 178, + + 169, 179, 168, 169, 170, 173, 174, 176, 178, 180, + 181, 182, 183, 177, 184, 179, 185, 194, 181, 187, + 198, 176, 182, 242, 197, 201, 203, 202, 210, 184, + 204, 242, 180, 183, 187, 565, 205, 194, 210, 204, + 185, 197, 209, 198, 200, 200, 200, 200, 201, 203, + 200, 200, 202, 200, 200, 200, 200, 200, 200, 205, + 211, 212, 215, 209, 216, 218, 219, 221, 223, 211, + 224, 220, 225, 229, 222, 232, 230, 223, 215, 212, + 234, 219, 220, 222, 240, 216, 221, 238, 218, 234, + 237, 222, 232, 224, 230, 239, 229, 225, 241, 237, + + 238, 243, 240, 241, 244, 245, 243, 247, 248, 245, + 255, 239, 256, 250, 250, 250, 250, 564, 244, 256, + 250, 252, 252, 252, 252, 247, 250, 255, 264, 251, + 251, 248, 251, 251, 251, 251, 253, 253, 253, 253, + 253, 254, 254, 254, 254, 254, 257, 259, 260, 263, + 265, 264, 266, 260, 267, 268, 263, 269, 270, 267, + 271, 272, 273, 257, 259, 274, 272, 266, 268, 275, + 274, 279, 276, 265, 270, 271, 280, 282, 275, 276, + 281, 285, 286, 273, 269, 289, 288, 286, 290, 291, + 302, 292, 294, 293, 279, 288, 285, 295, 299, 280, + + 300, 282, 281, 303, 281, 292, 289, 291, 293, 290, + 294, 304, 295, 306, 302, 300, 299, 308, 309, 311, + 563, 312, 306, 313, 314, 309, 303, 316, 317, 304, + 308, 312, 313, 320, 314, 317, 316, 319, 322, 328, + 324, 327, 311, 329, 331, 322, 319, 330, 320, 324, + 328, 327, 330, 329, 333, 334, 336, 339, 338, 344, + 346, 331, 341, 341, 341, 341, 343, 344, 338, 351, + 339, 343, 348, 561, 347, 333, 334, 348, 349, 336, + 338, 347, 346, 350, 353, 349, 352, 354, 350, 355, + 351, 356, 352, 357, 358, 360, 363, 365, 355, 364, + + 367, 358, 360, 353, 366, 368, 354, 369, 356, 363, + 357, 370, 364, 366, 365, 367, 371, 372, 375, 374, + 382, 368, 376, 377, 378, 379, 372, 375, 370, 376, + 369, 380, 377, 378, 379, 371, 374, 383, 382, 385, + 386, 390, 387, 391, 380, 398, 394, 399, 397, 403, + 386, 400, 391, 398, 385, 397, 401, 404, 402, 407, + 383, 387, 400, 402, 390, 394, 406, 409, 410, 401, + 399, 411, 403, 413, 404, 410, 412, 419, 414, 406, + 415, 424, 407, 418, 409, 412, 423, 418, 418, 429, + 559, 437, 426, 423, 427, 413, 414, 424, 415, 411, + + 419, 426, 428, 427, 431, 436, 438, 428, 437, 440, + 441, 431, 429, 447, 451, 452, 453, 454, 440, 455, + 441, 457, 459, 438, 453, 447, 436, 462, 463, 451, + 454, 464, 465, 466, 468, 469, 455, 452, 470, 471, + 459, 472, 466, 468, 457, 474, 473, 465, 462, 463, + 475, 477, 469, 470, 471, 473, 478, 464, 479, 480, + 481, 483, 472, 479, 482, 478, 484, 474, 480, 486, + 489, 482, 487, 475, 488, 491, 477, 484, 493, 489, + 494, 492, 500, 481, 483, 501, 498, 508, 502, 494, + 491, 500, 501, 486, 502, 487, 504, 488, 492, 498, + + 505, 493, 506, 504, 511, 505, 513, 512, 514, 511, + 508, 515, 516, 514, 517, 506, 512, 518, 519, 520, + 521, 517, 524, 522, 520, 526, 525, 515, 522, 513, + 527, 530, 538, 519, 528, 521, 524, 529, 532, 539, + 518, 516, 525, 528, 526, 533, 529, 532, 534, 535, + 537, 540, 539, 527, 530, 538, 542, 544, 545, 537, + 533, 547, 546, 534, 535, 545, 548, 549, 540, 550, + 551, 554, 544, 552, 542, 546, 553, 557, 547, 555, + 552, 560, 566, 553, 562, 549, 558, 548, 560, 556, + 543, 551, 550, 562, 557, 541, 536, 531, 523, 510, + + 554, 509, 555, 566, 569, 569, 569, 569, 570, 570, + 572, 507, 572, 572, 503, 499, 497, 496, 495, 490, + 485, 476, 467, 461, 460, 458, 456, 450, 449, 448, + 446, 445, 444, 443, 442, 439, 435, 434, 433, 432, + 430, 425, 422, 421, 420, 417, 416, 408, 405, 396, + 395, 393, 392, 388, 384, 381, 373, 362, 361, 359, + 345, 342, 340, 337, 335, 332, 326, 325, 323, 321, + 318, 315, 310, 307, 301, 298, 297, 296, 287, 284, + 283, 278, 277, 262, 261, 258, 246, 236, 235, 233, + 231, 228, 227, 226, 217, 214, 213, 208, 207, 206, + + 199, 196, 195, 193, 192, 191, 190, 189, 188, 186, + 152, 148, 146, 143, 140, 136, 132, 114, 89, 69, + 59, 39, 37, 8, 7, 3, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -900,7 +888,7 @@ goto find_rule; \ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 1 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" #define INITIAL 0 /*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// // @@ -915,7 +903,7 @@ char *yytext; // //===----------------------------------------------------------------------===*/ #define YY_NEVER_INTERACTIVE 1 -#line 28 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 28 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" #include "ParserInternals.h" #include "llvm/Module.h" #include @@ -1048,7 +1036,7 @@ using namespace llvm; /* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing * it to deal with 64 bit numbers. */ -#line 1052 "Lexer.cpp" +#line 1040 "Lexer.cpp" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1199,10 +1187,10 @@ YY_DECL register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; -#line 186 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 186 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" -#line 1206 "Lexer.cpp" +#line 1194 "Lexer.cpp" if ( yy_init ) { @@ -1250,14 +1238,14 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 580 ) + if ( yy_current_state >= 569 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 579 ); + while ( yy_current_state != 568 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -1295,681 +1283,651 @@ do_action: /* This label is used only to access EOF actions. */ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 188 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 188 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Ignore comments for now */ } YY_BREAK case 2: YY_RULE_SETUP -#line 190 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 190 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return BEGINTOK; } YY_BREAK case 3: YY_RULE_SETUP -#line 191 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 191 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ENDTOK; } YY_BREAK case 4: YY_RULE_SETUP -#line 192 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 192 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TRUETOK; } YY_BREAK case 5: YY_RULE_SETUP -#line 193 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 193 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return FALSETOK; } YY_BREAK case 6: YY_RULE_SETUP -#line 194 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 194 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DECLARE; } YY_BREAK case 7: YY_RULE_SETUP -#line 195 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 195 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return GLOBAL; } YY_BREAK case 8: YY_RULE_SETUP -#line 196 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 196 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CONSTANT; } YY_BREAK case 9: YY_RULE_SETUP -#line 197 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 197 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return INTERNAL; } YY_BREAK case 10: YY_RULE_SETUP -#line 198 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 198 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return LINKONCE; } YY_BREAK case 11: YY_RULE_SETUP -#line 199 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 199 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return WEAK; } YY_BREAK case 12: YY_RULE_SETUP -#line 200 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 200 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return APPENDING; } YY_BREAK case 13: YY_RULE_SETUP -#line 201 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 201 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DLLIMPORT; } YY_BREAK case 14: YY_RULE_SETUP -#line 202 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 202 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DLLEXPORT; } YY_BREAK case 15: YY_RULE_SETUP -#line 203 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 203 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EXTERN_WEAK; } YY_BREAK case 16: YY_RULE_SETUP -#line 204 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 204 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EXTERNAL; } YY_BREAK case 17: YY_RULE_SETUP -#line 205 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 205 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return IMPLEMENTATION; } YY_BREAK case 18: YY_RULE_SETUP -#line 206 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 206 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ZEROINITIALIZER; } YY_BREAK case 19: YY_RULE_SETUP -#line 207 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 207 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DOTDOTDOT; } YY_BREAK case 20: YY_RULE_SETUP -#line 208 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 208 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNDEF; } YY_BREAK case 21: YY_RULE_SETUP -#line 209 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 209 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return NULL_TOK; } YY_BREAK case 22: YY_RULE_SETUP -#line 210 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 210 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TO; } YY_BREAK case 23: YY_RULE_SETUP -#line 211 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 211 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TAIL; } YY_BREAK case 24: YY_RULE_SETUP -#line 212 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 212 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TARGET; } YY_BREAK case 25: YY_RULE_SETUP -#line 213 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 213 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TRIPLE; } YY_BREAK case 26: YY_RULE_SETUP -#line 214 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 214 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DEPLIBS; } YY_BREAK case 27: YY_RULE_SETUP -#line 215 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 215 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ENDIAN; } YY_BREAK case 28: YY_RULE_SETUP -#line 216 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 216 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return POINTERSIZE; } YY_BREAK case 29: YY_RULE_SETUP -#line 217 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 217 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return DATALAYOUT; } YY_BREAK case 30: YY_RULE_SETUP -#line 218 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 218 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return LITTLE; } YY_BREAK case 31: YY_RULE_SETUP -#line 219 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 219 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return BIG; } YY_BREAK case 32: YY_RULE_SETUP -#line 220 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 220 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return VOLATILE; } YY_BREAK case 33: YY_RULE_SETUP -#line 221 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 221 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ALIGN; } YY_BREAK case 34: YY_RULE_SETUP -#line 222 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 222 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SECTION; } YY_BREAK case 35: YY_RULE_SETUP -#line 223 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 223 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return MODULE; } YY_BREAK case 36: YY_RULE_SETUP -#line 224 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 224 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ASM_TOK; } YY_BREAK case 37: YY_RULE_SETUP -#line 225 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 225 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SIDEEFFECT; } YY_BREAK case 38: YY_RULE_SETUP -#line 227 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 227 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CC_TOK; } YY_BREAK case 39: YY_RULE_SETUP -#line 228 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 228 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CCC_TOK; } YY_BREAK case 40: YY_RULE_SETUP -#line 229 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 229 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return CSRETCC_TOK; } YY_BREAK case 41: YY_RULE_SETUP -#line 230 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 230 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return FASTCC_TOK; } YY_BREAK case 42: YY_RULE_SETUP -#line 231 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 231 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return COLDCC_TOK; } YY_BREAK case 43: YY_RULE_SETUP -#line 232 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 232 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return X86_STDCALLCC_TOK; } YY_BREAK case 44: YY_RULE_SETUP -#line 233 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 233 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return X86_FASTCALLCC_TOK; } YY_BREAK case 45: YY_RULE_SETUP -#line 235 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 235 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::VoidTy, VOID); } YY_BREAK case 46: YY_RULE_SETUP -#line 236 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 236 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::BoolTy, BOOL); } YY_BREAK case 47: YY_RULE_SETUP -#line 237 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 237 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::SByteTy, SBYTE); } YY_BREAK case 48: YY_RULE_SETUP -#line 238 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 238 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::UByteTy, UBYTE); } YY_BREAK case 49: YY_RULE_SETUP -#line 239 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 239 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::ShortTy, SHORT); } YY_BREAK case 50: YY_RULE_SETUP -#line 240 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 240 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::UShortTy,USHORT);} YY_BREAK case 51: YY_RULE_SETUP -#line 241 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 241 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::IntTy, INT); } YY_BREAK case 52: YY_RULE_SETUP -#line 242 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 242 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::UIntTy, UINT); } YY_BREAK case 53: YY_RULE_SETUP -#line 243 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 243 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::LongTy, LONG); } YY_BREAK case 54: YY_RULE_SETUP -#line 244 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 244 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::ULongTy, ULONG); } YY_BREAK case 55: YY_RULE_SETUP -#line 245 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 245 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::FloatTy, FLOAT); } YY_BREAK case 56: YY_RULE_SETUP -#line 246 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 246 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::DoubleTy,DOUBLE);} YY_BREAK case 57: YY_RULE_SETUP -#line 247 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 247 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TY(Type::LabelTy, LABEL); } YY_BREAK case 58: YY_RULE_SETUP -#line 248 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 248 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return TYPE; } YY_BREAK case 59: YY_RULE_SETUP -#line 249 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 249 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OPAQUE; } YY_BREAK case 60: YY_RULE_SETUP -#line 251 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 251 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Add, ADD); } YY_BREAK case 61: YY_RULE_SETUP -#line 252 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 252 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Sub, SUB); } YY_BREAK case 62: YY_RULE_SETUP -#line 253 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 253 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Mul, MUL); } YY_BREAK case 63: YY_RULE_SETUP -#line 254 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 254 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, UDiv, UDIV); } YY_BREAK case 64: YY_RULE_SETUP -#line 255 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 255 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SDiv, SDIV); } YY_BREAK case 65: YY_RULE_SETUP -#line 256 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 256 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FDiv, FDIV); } YY_BREAK case 66: YY_RULE_SETUP -#line 257 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 257 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, URem, UREM); } YY_BREAK case 67: YY_RULE_SETUP -#line 258 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 258 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, SRem, SREM); } YY_BREAK case 68: YY_RULE_SETUP -#line 259 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 259 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, FRem, FREM); } YY_BREAK case 69: YY_RULE_SETUP -#line 260 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 260 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, And, AND); } YY_BREAK case 70: YY_RULE_SETUP -#line 261 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 261 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Or , OR ); } YY_BREAK case 71: YY_RULE_SETUP -#line 262 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 262 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(BinaryOpVal, Xor, XOR); } YY_BREAK case 72: YY_RULE_SETUP -#line 263 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetNE, SETNE); } - YY_BREAK -case 73: -YY_RULE_SETUP -#line 264 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); } - YY_BREAK -case 74: -YY_RULE_SETUP -#line 265 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetLT, SETLT); } - YY_BREAK -case 75: -YY_RULE_SETUP -#line 266 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetGT, SETGT); } - YY_BREAK -case 76: -YY_RULE_SETUP -#line 267 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetLE, SETLE); } - YY_BREAK -case 77: -YY_RULE_SETUP -#line 268 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" -{ RET_TOK(BinaryOpVal, SetGE, SETGE); } - YY_BREAK -case 78: -YY_RULE_SETUP -#line 269 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 263 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ICmp, ICMP); } YY_BREAK -case 79: +case 73: YY_RULE_SETUP -#line 270 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 264 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, FCmp, FCMP); } YY_BREAK -case 80: +case 74: YY_RULE_SETUP -#line 271 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 265 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return EQ; } YY_BREAK -case 81: +case 75: YY_RULE_SETUP -#line 272 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 266 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return NE; } YY_BREAK -case 82: +case 76: YY_RULE_SETUP -#line 273 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 267 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SLT; } YY_BREAK -case 83: +case 77: YY_RULE_SETUP -#line 274 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 268 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SGT; } YY_BREAK -case 84: +case 78: YY_RULE_SETUP -#line 275 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 269 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SLE; } YY_BREAK -case 85: +case 79: YY_RULE_SETUP -#line 276 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 270 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return SGE; } YY_BREAK -case 86: +case 80: YY_RULE_SETUP -#line 277 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 271 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ULT; } YY_BREAK -case 87: +case 81: YY_RULE_SETUP -#line 278 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 272 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UGT; } YY_BREAK -case 88: +case 82: YY_RULE_SETUP -#line 279 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 273 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ULE; } YY_BREAK -case 89: +case 83: YY_RULE_SETUP -#line 280 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 274 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UGE; } YY_BREAK -case 90: +case 84: YY_RULE_SETUP -#line 281 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 275 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OEQ; } YY_BREAK -case 91: +case 85: YY_RULE_SETUP -#line 282 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 276 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ONE; } YY_BREAK -case 92: +case 86: YY_RULE_SETUP -#line 283 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 277 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OLT; } YY_BREAK -case 93: +case 87: YY_RULE_SETUP -#line 284 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 278 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OGT; } YY_BREAK -case 94: +case 88: YY_RULE_SETUP -#line 285 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 279 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OLE; } YY_BREAK -case 95: +case 89: YY_RULE_SETUP -#line 286 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 280 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return OGE; } YY_BREAK -case 96: +case 90: YY_RULE_SETUP -#line 287 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 281 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return ORD; } YY_BREAK -case 97: +case 91: YY_RULE_SETUP -#line 288 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 282 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNO; } YY_BREAK -case 98: +case 92: YY_RULE_SETUP -#line 289 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 283 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UEQ; } YY_BREAK -case 99: +case 93: YY_RULE_SETUP -#line 290 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 284 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return UNE; } YY_BREAK -case 100: +case 94: YY_RULE_SETUP -#line 292 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 286 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, PHI, PHI_TOK); } YY_BREAK -case 101: +case 95: YY_RULE_SETUP -#line 293 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 287 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Call, CALL); } YY_BREAK -case 102: +case 96: YY_RULE_SETUP -#line 294 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 288 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, Trunc, TRUNC); } YY_BREAK -case 103: +case 97: YY_RULE_SETUP -#line 295 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 289 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, ZExt, ZEXT); } YY_BREAK -case 104: +case 98: YY_RULE_SETUP -#line 296 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 290 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SExt, SEXT); } YY_BREAK -case 105: +case 99: YY_RULE_SETUP -#line 297 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 291 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPTrunc, FPTRUNC); } YY_BREAK -case 106: +case 100: YY_RULE_SETUP -#line 298 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 292 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPExt, FPEXT); } YY_BREAK -case 107: +case 101: YY_RULE_SETUP -#line 299 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 293 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, UIToFP, UITOFP); } YY_BREAK -case 108: +case 102: YY_RULE_SETUP -#line 300 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 294 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, SIToFP, SITOFP); } YY_BREAK -case 109: +case 103: YY_RULE_SETUP -#line 301 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 295 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToUI, FPTOUI); } YY_BREAK -case 110: +case 104: YY_RULE_SETUP -#line 302 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 296 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, FPToSI, FPTOSI); } YY_BREAK -case 111: +case 105: YY_RULE_SETUP -#line 303 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 297 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, IntToPtr, INTTOPTR); } YY_BREAK -case 112: +case 106: YY_RULE_SETUP -#line 304 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 298 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, PtrToInt, PTRTOINT); } YY_BREAK -case 113: +case 107: YY_RULE_SETUP -#line 305 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 299 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(CastOpVal, BitCast, BITCAST); } YY_BREAK -case 114: +case 108: YY_RULE_SETUP -#line 306 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 300 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Select, SELECT); } YY_BREAK -case 115: +case 109: YY_RULE_SETUP -#line 307 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 301 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, Shl, SHL); } YY_BREAK -case 116: +case 110: YY_RULE_SETUP -#line 308 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 302 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, LShr, LSHR); } YY_BREAK -case 117: +case 111: YY_RULE_SETUP -#line 309 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 303 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, AShr, ASHR); } YY_BREAK -case 118: +case 112: YY_RULE_SETUP -#line 310 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 304 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, VAArg , VAARG); } YY_BREAK -case 119: +case 113: YY_RULE_SETUP -#line 311 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 305 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Ret, RET); } YY_BREAK -case 120: +case 114: YY_RULE_SETUP -#line 312 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 306 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Br, BR); } YY_BREAK -case 121: +case 115: YY_RULE_SETUP -#line 313 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 307 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Switch, SWITCH); } YY_BREAK -case 122: +case 116: YY_RULE_SETUP -#line 314 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 308 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Invoke, INVOKE); } YY_BREAK -case 123: +case 117: YY_RULE_SETUP -#line 315 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 309 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unwind, UNWIND); } YY_BREAK -case 124: +case 118: YY_RULE_SETUP -#line 316 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 310 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(TermOpVal, Unreachable, UNREACHABLE); } YY_BREAK -case 125: +case 119: YY_RULE_SETUP -#line 318 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 312 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Malloc, MALLOC); } YY_BREAK -case 126: +case 120: YY_RULE_SETUP -#line 319 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 313 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Alloca, ALLOCA); } YY_BREAK -case 127: +case 121: YY_RULE_SETUP -#line 320 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 314 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Free, FREE); } YY_BREAK -case 128: +case 122: YY_RULE_SETUP -#line 321 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 315 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Load, LOAD); } YY_BREAK -case 129: +case 123: YY_RULE_SETUP -#line 322 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 316 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, Store, STORE); } YY_BREAK -case 130: +case 124: YY_RULE_SETUP -#line 323 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 317 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(MemOpVal, GetElementPtr, GETELEMENTPTR); } YY_BREAK -case 131: +case 125: YY_RULE_SETUP -#line 325 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 319 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ExtractElement, EXTRACTELEMENT); } YY_BREAK -case 132: +case 126: YY_RULE_SETUP -#line 326 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 320 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, InsertElement, INSERTELEMENT); } YY_BREAK -case 133: +case 127: YY_RULE_SETUP -#line 327 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 321 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { RET_TOK(OtherOpVal, ShuffleVector, SHUFFLEVECTOR); } YY_BREAK -case 134: +case 128: YY_RULE_SETUP -#line 330 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 324 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { UnEscapeLexed(yytext+1); llvmAsmlval.StrVal = strdup(yytext+1); // Skip % return VAR_ID; } YY_BREAK -case 135: +case 129: YY_RULE_SETUP -#line 335 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 329 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-1] = 0; // nuke colon UnEscapeLexed(yytext); @@ -1977,9 +1935,9 @@ YY_RULE_SETUP return LABELSTR; } YY_BREAK -case 136: +case 130: YY_RULE_SETUP -#line 341 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 335 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { yytext[strlen(yytext)-2] = 0; // nuke colon, end quote UnEscapeLexed(yytext+1); @@ -1987,9 +1945,9 @@ YY_RULE_SETUP return LABELSTR; } YY_BREAK -case 137: +case 131: YY_RULE_SETUP -#line 348 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 342 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { // Note that we cannot unescape a string constant here! The // string constant might contain a \00 which would not be // understood by the string stuff. It is valid to make a @@ -2000,14 +1958,14 @@ YY_RULE_SETUP return STRINGCONSTANT; } YY_BREAK -case 138: +case 132: YY_RULE_SETUP -#line 359 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 353 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } YY_BREAK -case 139: +case 133: YY_RULE_SETUP -#line 360 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 354 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); // +1: we have bigger negative range @@ -2017,17 +1975,17 @@ YY_RULE_SETUP return ESINT64VAL; } YY_BREAK -case 140: +case 134: YY_RULE_SETUP -#line 368 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 362 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; } YY_BREAK -case 141: +case 135: YY_RULE_SETUP -#line 373 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 367 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+1); if ((unsigned)Val != Val) @@ -2036,9 +1994,9 @@ YY_RULE_SETUP return UINTVAL; } YY_BREAK -case 142: +case 136: YY_RULE_SETUP -#line 380 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 374 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { uint64_t Val = atoull(yytext+2); // +1: we have bigger negative range @@ -2048,18 +2006,18 @@ YY_RULE_SETUP return SINTVAL; } YY_BREAK -case 143: +case 137: YY_RULE_SETUP -#line 389 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 383 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = atof(yytext); return FPVAL; } YY_BREAK -case 144: +case 138: YY_RULE_SETUP -#line 390 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 384 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { llvmAsmlval.FPVal = HexToFP(yytext); return FPVAL; } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 392 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 386 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Make sure to free the internal buffers for flex when we are * done reading our input! @@ -2068,22 +2026,22 @@ case YY_STATE_EOF(INITIAL): return EOF; } YY_BREAK -case 145: +case 139: YY_RULE_SETUP -#line 400 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 394 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { /* Ignore whitespace */ } YY_BREAK -case 146: +case 140: YY_RULE_SETUP -#line 401 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 395 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" { return yytext[0]; } YY_BREAK -case 147: +case 141: YY_RULE_SETUP -#line 403 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 397 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2087 "Lexer.cpp" +#line 2045 "Lexer.cpp" case YY_END_OF_BUFFER: { @@ -2370,7 +2328,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 580 ) + if ( yy_current_state >= 569 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2400,11 +2358,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 580 ) + if ( yy_current_state >= 569 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 579); + yy_is_jam = (yy_current_state == 568); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -2961,5 +2919,5 @@ int main() return 0; } #endif -#line 403 "/proj/llvm/llvm-4/lib/AsmParser/Lexer.l" +#line 397 "/proj/llvm/llvm-3/lib/AsmParser/Lexer.l" diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l index 93b84be4413..478bfb817e1 100644 --- a/lib/AsmParser/Lexer.l +++ b/lib/AsmParser/Lexer.l @@ -260,12 +260,6 @@ frem { RET_TOK(BinaryOpVal, FRem, FREM); } and { RET_TOK(BinaryOpVal, And, AND); } or { RET_TOK(BinaryOpVal, Or , OR ); } xor { RET_TOK(BinaryOpVal, Xor, XOR); } -setne { RET_TOK(BinaryOpVal, SetNE, SETNE); } -seteq { RET_TOK(BinaryOpVal, SetEQ, SETEQ); } -setlt { RET_TOK(BinaryOpVal, SetLT, SETLT); } -setgt { RET_TOK(BinaryOpVal, SetGT, SETGT); } -setle { RET_TOK(BinaryOpVal, SetLE, SETLE); } -setge { RET_TOK(BinaryOpVal, SetGE, SETGE); } icmp { RET_TOK(OtherOpVal, ICmp, ICMP); } fcmp { RET_TOK(OtherOpVal, FCmp, FCMP); } eq { return EQ; } diff --git a/lib/AsmParser/Lexer.l.cvs b/lib/AsmParser/Lexer.l.cvs index 93b84be4413..478bfb817e1 100644 --- a/lib/AsmParser/Lexer.l.cvs +++ b/lib/AsmParser/Lexer.l.cvs @@ -260,12 +260,6 @@ frem { RET_TOK(BinaryOpVal, FRem, FREM); } and { RET_TOK(BinaryOpVal, And, AND); } or { RET_TOK(BinaryOpVal, Or , OR ); } xor { RET_TOK(BinaryOpVal, Xor, XOR); } -setne { RET_TOK(BinaryOpVal, SetNE, SETNE); } -seteq { RET_TOK(BinaryOpVal, SetEQ, SETEQ); } -setlt { RET_TOK(BinaryOpVal, SetLT, SETLT); } -setgt { RET_TOK(BinaryOpVal, SetGT, SETGT); } -setle { RET_TOK(BinaryOpVal, SetLE, SETLE); } -setge { RET_TOK(BinaryOpVal, SetGE, SETGE); } icmp { RET_TOK(OtherOpVal, ICmp, ICMP); } fcmp { RET_TOK(OtherOpVal, FCmp, FCMP); } eq { return EQ; } diff --git a/lib/AsmParser/llvmAsmParser.cpp.cvs b/lib/AsmParser/llvmAsmParser.cpp.cvs index 955fb871f5d..50f7a821267 100644 --- a/lib/AsmParser/llvmAsmParser.cpp.cvs +++ b/lib/AsmParser/llvmAsmParser.cpp.cvs @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 1.875c. */ +/* A Bison parser, made by GNU Bison 2.1. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 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 @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + 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. @@ -36,6 +36,9 @@ /* Identify Bison output. */ #define YYBISON 1 +/* Bison version. */ +#define YYBISON_VERSION "2.1" + /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -45,8 +48,7 @@ /* Using locations. */ #define YYLSP_NEEDED 0 -/* If NAME_PREFIX is specified substitute the variables and functions - names. */ +/* Substitute the variable and function names. */ #define yyparse llvmAsmparse #define yylex llvmAsmlex #define yyerror llvmAsmerror @@ -149,63 +151,58 @@ AND = 342, OR = 343, XOR = 344, - SETLE = 345, - SETGE = 346, - SETLT = 347, - SETGT = 348, - SETEQ = 349, - SETNE = 350, - ICMP = 351, - FCMP = 352, - EQ = 353, - NE = 354, - SLT = 355, - SGT = 356, - SLE = 357, - SGE = 358, - ULT = 359, - UGT = 360, - ULE = 361, - UGE = 362, - OEQ = 363, - ONE = 364, - OLT = 365, - OGT = 366, - OLE = 367, - OGE = 368, - ORD = 369, - UNO = 370, - UEQ = 371, - UNE = 372, - MALLOC = 373, - ALLOCA = 374, - FREE = 375, - LOAD = 376, - STORE = 377, - GETELEMENTPTR = 378, - TRUNC = 379, - ZEXT = 380, - SEXT = 381, - FPTRUNC = 382, - FPEXT = 383, - BITCAST = 384, - UITOFP = 385, - SITOFP = 386, - FPTOUI = 387, - FPTOSI = 388, - INTTOPTR = 389, - PTRTOINT = 390, - PHI_TOK = 391, - SELECT = 392, - SHL = 393, - LSHR = 394, - ASHR = 395, - VAARG = 396, - EXTRACTELEMENT = 397, - INSERTELEMENT = 398, - SHUFFLEVECTOR = 399 + ICMP = 345, + FCMP = 346, + EQ = 347, + NE = 348, + SLT = 349, + SGT = 350, + SLE = 351, + SGE = 352, + ULT = 353, + UGT = 354, + ULE = 355, + UGE = 356, + OEQ = 357, + ONE = 358, + OLT = 359, + OGT = 360, + OLE = 361, + OGE = 362, + ORD = 363, + UNO = 364, + UEQ = 365, + UNE = 366, + MALLOC = 367, + ALLOCA = 368, + FREE = 369, + LOAD = 370, + STORE = 371, + GETELEMENTPTR = 372, + TRUNC = 373, + ZEXT = 374, + SEXT = 375, + FPTRUNC = 376, + FPEXT = 377, + BITCAST = 378, + UITOFP = 379, + SITOFP = 380, + FPTOUI = 381, + FPTOSI = 382, + INTTOPTR = 383, + PTRTOINT = 384, + PHI_TOK = 385, + SELECT = 386, + SHL = 387, + LSHR = 388, + ASHR = 389, + VAARG = 390, + EXTRACTELEMENT = 391, + INSERTELEMENT = 392, + SHUFFLEVECTOR = 393 }; #endif +/* Tokens. */ #define ESINT64VAL 258 #define EUINT64VAL 259 #define SINTVAL 260 @@ -293,67 +290,61 @@ #define AND 342 #define OR 343 #define XOR 344 -#define SETLE 345 -#define SETGE 346 -#define SETLT 347 -#define SETGT 348 -#define SETEQ 349 -#define SETNE 350 -#define ICMP 351 -#define FCMP 352 -#define EQ 353 -#define NE 354 -#define SLT 355 -#define SGT 356 -#define SLE 357 -#define SGE 358 -#define ULT 359 -#define UGT 360 -#define ULE 361 -#define UGE 362 -#define OEQ 363 -#define ONE 364 -#define OLT 365 -#define OGT 366 -#define OLE 367 -#define OGE 368 -#define ORD 369 -#define UNO 370 -#define UEQ 371 -#define UNE 372 -#define MALLOC 373 -#define ALLOCA 374 -#define FREE 375 -#define LOAD 376 -#define STORE 377 -#define GETELEMENTPTR 378 -#define TRUNC 379 -#define ZEXT 380 -#define SEXT 381 -#define FPTRUNC 382 -#define FPEXT 383 -#define BITCAST 384 -#define UITOFP 385 -#define SITOFP 386 -#define FPTOUI 387 -#define FPTOSI 388 -#define INTTOPTR 389 -#define PTRTOINT 390 -#define PHI_TOK 391 -#define SELECT 392 -#define SHL 393 -#define LSHR 394 -#define ASHR 395 -#define VAARG 396 -#define EXTRACTELEMENT 397 -#define INSERTELEMENT 398 -#define SHUFFLEVECTOR 399 +#define ICMP 345 +#define FCMP 346 +#define EQ 347 +#define NE 348 +#define SLT 349 +#define SGT 350 +#define SLE 351 +#define SGE 352 +#define ULT 353 +#define UGT 354 +#define ULE 355 +#define UGE 356 +#define OEQ 357 +#define ONE 358 +#define OLT 359 +#define OGT 360 +#define OLE 361 +#define OGE 362 +#define ORD 363 +#define UNO 364 +#define UEQ 365 +#define UNE 366 +#define MALLOC 367 +#define ALLOCA 368 +#define FREE 369 +#define LOAD 370 +#define STORE 371 +#define GETELEMENTPTR 372 +#define TRUNC 373 +#define ZEXT 374 +#define SEXT 375 +#define FPTRUNC 376 +#define FPEXT 377 +#define BITCAST 378 +#define UITOFP 379 +#define SITOFP 380 +#define FPTOUI 381 +#define FPTOSI 382 +#define INTTOPTR 383 +#define PTRTOINT 384 +#define PHI_TOK 385 +#define SELECT 386 +#define SHL 387 +#define LSHR 388 +#define ASHR 389 +#define VAARG 390 +#define EXTRACTELEMENT 391 +#define INSERTELEMENT 392 +#define SHUFFLEVECTOR 393 /* Copy the first part of user declarations. */ -#line 14 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 14 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -1208,8 +1199,13 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { # define YYERROR_VERBOSE 0 #endif +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 855 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 855 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; @@ -1252,8 +1248,8 @@ typedef union YYSTYPE { llvm::ICmpInst::Predicate IPredicate; llvm::FCmpInst::Predicate FPredicate; } YYSTYPE; -/* Line 191 of yacc.c. */ -#line 1257 "llvmAsmParser.tab.c" +/* Line 196 of yacc.c. */ +#line 1253 "llvmAsmParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -1264,30 +1260,49 @@ typedef union YYSTYPE { /* Copy the second part of user declarations. */ -/* Line 214 of yacc.c. */ -#line 1269 "llvmAsmParser.tab.c" +/* Line 219 of yacc.c. */ +#line 1265 "llvmAsmParser.tab.c" -#if ! defined (yyoverflow) || YYERROR_VERBOSE +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif -# ifndef YYFREE -# define YYFREE free +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif # endif -# ifndef YYMALLOC -# define YYMALLOC malloc +# ifndef YY_ +# define YY_(msgid) msgid # endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA -# define YYSTACK_ALLOC alloca -# endif -# else -# if defined (alloca) || defined (_ALLOCA_H) -# define YYSTACK_ALLOC alloca -# else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif # endif # endif # endif @@ -1295,13 +1310,39 @@ typedef union YYSTYPE { # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t +# 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 */ # endif +# else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +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))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif # endif #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ @@ -1313,7 +1354,7 @@ typedef union YYSTYPE { /* A type that is properly aligned for any stack member. */ union yyalloc { - short yyss; + short int yyss; YYSTYPE yyvs; }; @@ -1323,7 +1364,7 @@ union yyalloc /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do @@ -1336,7 +1377,7 @@ union yyalloc # define YYCOPY(To, From, Count) \ do \ { \ - register YYSIZE_T yyi; \ + YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ @@ -1365,28 +1406,28 @@ union yyalloc #if defined (__STDC__) || defined (__cplusplus) typedef signed char yysigned_char; #else - typedef short yysigned_char; + typedef short int yysigned_char; #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1476 +#define YYLAST 1390 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 159 +#define YYNTOKENS 153 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 78 +#define YYNNTS 76 /* YYNRULES -- Number of rules. */ -#define YYNRULES 299 +#define YYNRULES 291 /* YYNRULES -- Number of states. */ -#define YYNSTATES 584 +#define YYNSTATES 567 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 399 +#define YYMAXUTOK 393 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ @@ -1396,15 +1437,15 @@ static const unsigned char yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 148, 149, 157, 2, 146, 2, 2, 2, 2, 2, + 142, 143, 151, 2, 140, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 153, 145, 154, 2, 2, 2, 2, 2, 2, 2, + 147, 139, 148, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 150, 147, 152, 2, 2, 2, 2, 2, 158, + 2, 144, 141, 146, 2, 2, 2, 2, 2, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 151, 2, 2, 155, 2, 156, 2, 2, 2, 2, + 145, 2, 2, 149, 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1431,13 +1472,13 @@ static const unsigned char yytranslate[] = 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ -static const unsigned short yyprhs[] = +static const unsigned short int yyprhs[] = { 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, @@ -1446,168 +1487,166 @@ static const unsigned short yyprhs[] = 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, - 139, 141, 143, 145, 147, 149, 151, 153, 156, 157, - 159, 161, 163, 165, 167, 169, 171, 172, 173, 175, - 177, 179, 181, 183, 185, 188, 189, 192, 193, 197, - 200, 201, 203, 204, 208, 210, 213, 215, 217, 219, + 140, 141, 143, 145, 147, 149, 151, 153, 155, 156, + 157, 159, 161, 163, 165, 167, 169, 172, 173, 176, + 177, 181, 184, 185, 187, 188, 192, 194, 197, 199, + 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, - 241, 243, 245, 247, 249, 251, 253, 255, 258, 263, - 269, 275, 279, 282, 288, 293, 296, 298, 302, 304, - 308, 310, 311, 316, 320, 324, 329, 334, 338, 341, - 344, 347, 350, 353, 356, 359, 362, 365, 368, 375, - 381, 390, 397, 404, 411, 419, 427, 434, 441, 450, - 459, 463, 465, 467, 469, 471, 474, 477, 482, 485, - 487, 492, 495, 500, 501, 509, 510, 518, 519, 527, - 528, 536, 540, 545, 546, 548, 550, 552, 556, 560, - 564, 568, 572, 576, 578, 579, 581, 583, 585, 586, - 589, 593, 595, 597, 601, 603, 604, 613, 615, 617, - 621, 623, 625, 628, 629, 631, 633, 634, 639, 640, - 642, 644, 646, 648, 650, 652, 654, 656, 658, 662, - 664, 670, 672, 674, 676, 678, 681, 684, 687, 691, - 694, 695, 697, 700, 703, 707, 717, 727, 736, 750, - 752, 754, 761, 767, 770, 777, 785, 787, 791, 793, - 794, 797, 799, 805, 811, 817, 824, 831, 834, 839, - 844, 851, 856, 861, 868, 875, 878, 886, 888, 891, - 892, 894, 895, 899, 906, 910, 917, 920, 925, 932 + 242, 247, 253, 259, 263, 266, 272, 277, 280, 282, + 286, 288, 292, 294, 295, 300, 304, 308, 313, 318, + 322, 325, 328, 331, 334, 337, 340, 343, 346, 349, + 352, 355, 358, 365, 371, 380, 387, 394, 402, 410, + 417, 424, 433, 442, 446, 448, 450, 452, 454, 457, + 460, 465, 468, 470, 475, 478, 483, 484, 492, 493, + 501, 502, 510, 511, 519, 523, 528, 529, 531, 533, + 535, 539, 543, 547, 551, 555, 559, 561, 562, 564, + 566, 568, 569, 572, 576, 578, 580, 584, 586, 587, + 596, 598, 600, 604, 606, 608, 611, 612, 614, 616, + 617, 622, 623, 625, 627, 629, 631, 633, 635, 637, + 639, 641, 645, 647, 653, 655, 657, 659, 661, 664, + 667, 670, 674, 677, 678, 680, 683, 686, 690, 700, + 710, 719, 733, 735, 737, 744, 750, 753, 760, 768, + 770, 774, 776, 777, 780, 782, 788, 794, 801, 808, + 811, 816, 821, 828, 833, 838, 845, 852, 855, 863, + 865, 868, 869, 871, 872, 876, 883, 887, 894, 897, + 902, 909 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const short yyrhs[] = +static const short int yyrhs[] = { - 193, 0, -1, 5, -1, 6, -1, 3, -1, 4, - -1, 78, -1, 79, -1, 80, -1, 81, -1, 82, - -1, 83, -1, 84, -1, 85, -1, 86, -1, 87, - -1, 88, -1, 89, -1, 90, -1, 91, -1, 92, - -1, 93, -1, 94, -1, 95, -1, 124, -1, 125, - -1, 126, -1, 127, -1, 128, -1, 129, -1, 130, - -1, 131, -1, 132, -1, 133, -1, 134, -1, 135, - -1, 138, -1, 139, -1, 140, -1, 98, -1, 99, - -1, 100, -1, 101, -1, 102, -1, 103, -1, 104, - -1, 105, -1, 106, -1, 107, -1, 108, -1, 109, - -1, 110, -1, 111, -1, 112, -1, 113, -1, 114, - -1, 115, -1, 116, -1, 117, -1, 104, -1, 105, - -1, 106, -1, 107, -1, 27, -1, 28, -1, 16, - -1, 14, -1, 12, -1, 10, -1, 17, -1, 15, - -1, 13, -1, 11, -1, 169, -1, 170, -1, 18, - -1, 19, -1, 205, 145, -1, -1, 41, -1, 42, - -1, 43, -1, 44, -1, 45, -1, 46, -1, 47, - -1, -1, -1, 65, -1, 66, -1, 67, -1, 68, - -1, 69, -1, 70, -1, 64, 4, -1, -1, 57, - 4, -1, -1, 146, 57, 4, -1, 34, 24, -1, - -1, 178, -1, -1, 146, 181, 180, -1, 178, -1, - 57, 4, -1, 184, -1, 8, -1, 186, -1, 8, - -1, 186, -1, 9, -1, 10, -1, 11, -1, 12, - -1, 13, -1, 14, -1, 15, -1, 16, -1, 17, - -1, 18, -1, 19, -1, 20, -1, 21, -1, 48, - -1, 185, -1, 220, -1, 147, 4, -1, 183, 148, - 188, 149, -1, 150, 4, 151, 186, 152, -1, 153, - 4, 151, 186, 154, -1, 155, 187, 156, -1, 155, - 156, -1, 153, 155, 187, 156, 154, -1, 153, 155, - 156, 154, -1, 186, 157, -1, 186, -1, 187, 146, - 186, -1, 187, -1, 187, 146, 37, -1, 37, -1, - -1, 184, 150, 191, 152, -1, 184, 150, 152, -1, - 184, 158, 24, -1, 184, 153, 191, 154, -1, 184, - 155, 191, 156, -1, 184, 155, 156, -1, 184, 38, - -1, 184, 39, -1, 184, 220, -1, 184, 190, -1, - 184, 26, -1, 169, 161, -1, 170, 4, -1, 9, - 27, -1, 9, 28, -1, 172, 7, -1, 165, 148, - 189, 36, 184, 149, -1, 123, 148, 189, 234, 149, - -1, 137, 148, 189, 146, 189, 146, 189, 149, -1, - 162, 148, 189, 146, 189, 149, -1, 163, 148, 189, - 146, 189, 149, -1, 164, 148, 189, 146, 189, 149, - -1, 96, 167, 148, 189, 146, 189, 149, -1, 97, - 168, 148, 189, 146, 189, 149, -1, 166, 148, 189, - 146, 189, 149, -1, 142, 148, 189, 146, 189, 149, - -1, 143, 148, 189, 146, 189, 146, 189, 149, -1, - 144, 148, 189, 146, 189, 146, 189, 149, -1, 191, - 146, 189, -1, 189, -1, 32, -1, 33, -1, 194, - -1, 194, 214, -1, 194, 216, -1, 194, 62, 61, - 200, -1, 194, 25, -1, 195, -1, 195, 173, 20, - 182, -1, 195, 216, -1, 195, 62, 61, 200, -1, - -1, 195, 173, 174, 192, 189, 196, 180, -1, -1, - 195, 173, 50, 192, 184, 197, 180, -1, -1, 195, - 173, 45, 192, 184, 198, 180, -1, -1, 195, 173, - 47, 192, 184, 199, 180, -1, 195, 51, 202, -1, - 195, 58, 145, 203, -1, -1, 24, -1, 56, -1, - 55, -1, 53, 145, 201, -1, 54, 145, 4, -1, - 52, 145, 24, -1, 71, 145, 24, -1, 150, 204, - 152, -1, 204, 146, 24, -1, 24, -1, -1, 22, - -1, 24, -1, 205, -1, -1, 184, 206, -1, 208, - 146, 207, -1, 207, -1, 208, -1, 208, 146, 37, - -1, 37, -1, -1, 175, 182, 205, 148, 209, 149, - 179, 176, -1, 29, -1, 155, -1, 174, 210, 211, - -1, 30, -1, 156, -1, 223, 213, -1, -1, 45, - -1, 47, -1, -1, 31, 217, 215, 210, -1, -1, - 63, -1, 3, -1, 4, -1, 7, -1, 27, -1, - 28, -1, 38, -1, 39, -1, 26, -1, 153, 191, - 154, -1, 190, -1, 61, 218, 24, 146, 24, -1, - 160, -1, 205, -1, 220, -1, 219, -1, 184, 221, - -1, 223, 224, -1, 212, 224, -1, 225, 173, 226, - -1, 225, 228, -1, -1, 23, -1, 72, 222, -1, - 72, 8, -1, 73, 21, 221, -1, 73, 9, 221, - 146, 21, 221, 146, 21, 221, -1, 74, 171, 221, - 146, 21, 221, 150, 227, 152, -1, 74, 171, 221, - 146, 21, 221, 150, 152, -1, 75, 175, 182, 221, - 148, 231, 149, 36, 21, 221, 76, 21, 221, -1, - 76, -1, 77, -1, 227, 171, 219, 146, 21, 221, - -1, 171, 219, 146, 21, 221, -1, 173, 233, -1, - 184, 150, 221, 146, 221, 152, -1, 229, 146, 150, - 221, 146, 221, 152, -1, 222, -1, 230, 146, 222, - -1, 230, -1, -1, 60, 59, -1, 59, -1, 162, - 184, 221, 146, 221, -1, 163, 184, 221, 146, 221, - -1, 164, 184, 221, 146, 221, -1, 96, 167, 184, - 221, 146, 221, -1, 97, 168, 184, 221, 146, 221, - -1, 49, 222, -1, 166, 222, 146, 222, -1, 165, - 222, 36, 184, -1, 137, 222, 146, 222, 146, 222, - -1, 141, 222, 146, 184, -1, 142, 222, 146, 222, - -1, 143, 222, 146, 222, 146, 222, -1, 144, 222, - 146, 222, 146, 222, -1, 136, 229, -1, 232, 175, - 182, 221, 148, 231, 149, -1, 236, -1, 146, 230, - -1, -1, 35, -1, -1, 118, 184, 177, -1, 118, - 184, 146, 15, 221, 177, -1, 119, 184, 177, -1, - 119, 184, 146, 15, 221, 177, -1, 120, 222, -1, - 235, 121, 184, 221, -1, 235, 122, 222, 146, 184, - 221, -1, 123, 184, 221, 234, -1 + 185, 0, -1, 5, -1, 6, -1, 78, -1, 79, + -1, 80, -1, 81, -1, 82, -1, 83, -1, 84, + -1, 85, -1, 86, -1, 87, -1, 88, -1, 89, + -1, 118, -1, 119, -1, 120, -1, 121, -1, 122, + -1, 123, -1, 124, -1, 125, -1, 126, -1, 127, + -1, 128, -1, 129, -1, 132, -1, 133, -1, 134, + -1, 92, -1, 93, -1, 94, -1, 95, -1, 96, + -1, 97, -1, 98, -1, 99, -1, 100, -1, 101, + -1, 102, -1, 103, -1, 104, -1, 105, -1, 106, + -1, 107, -1, 108, -1, 109, -1, 110, -1, 111, + -1, 98, -1, 99, -1, 100, -1, 101, -1, 27, + -1, 28, -1, 16, -1, 14, -1, 12, -1, 10, + -1, 17, -1, 15, -1, 13, -1, 11, -1, 161, + -1, 162, -1, 18, -1, 19, -1, 197, 139, -1, + -1, 41, -1, 42, -1, 43, -1, 44, -1, 45, + -1, 46, -1, 47, -1, -1, -1, 65, -1, 66, + -1, 67, -1, 68, -1, 69, -1, 70, -1, 64, + 4, -1, -1, 57, 4, -1, -1, 140, 57, 4, + -1, 34, 24, -1, -1, 170, -1, -1, 140, 173, + 172, -1, 170, -1, 57, 4, -1, 176, -1, 8, + -1, 178, -1, 8, -1, 178, -1, 9, -1, 10, + -1, 11, -1, 12, -1, 13, -1, 14, -1, 15, + -1, 16, -1, 17, -1, 18, -1, 19, -1, 20, + -1, 21, -1, 48, -1, 177, -1, 212, -1, 141, + 4, -1, 175, 142, 180, 143, -1, 144, 4, 145, + 178, 146, -1, 147, 4, 145, 178, 148, -1, 149, + 179, 150, -1, 149, 150, -1, 147, 149, 179, 150, + 148, -1, 147, 149, 150, 148, -1, 178, 151, -1, + 178, -1, 179, 140, 178, -1, 179, -1, 179, 140, + 37, -1, 37, -1, -1, 176, 144, 183, 146, -1, + 176, 144, 146, -1, 176, 152, 24, -1, 176, 147, + 183, 148, -1, 176, 149, 183, 150, -1, 176, 149, + 150, -1, 176, 38, -1, 176, 39, -1, 176, 212, + -1, 176, 182, -1, 176, 26, -1, 161, 3, -1, + 161, 4, -1, 162, 4, -1, 162, 3, -1, 9, + 27, -1, 9, 28, -1, 164, 7, -1, 157, 142, + 181, 36, 176, 143, -1, 117, 142, 181, 226, 143, + -1, 131, 142, 181, 140, 181, 140, 181, 143, -1, + 155, 142, 181, 140, 181, 143, -1, 156, 142, 181, + 140, 181, 143, -1, 90, 159, 142, 181, 140, 181, + 143, -1, 91, 160, 142, 181, 140, 181, 143, -1, + 158, 142, 181, 140, 181, 143, -1, 136, 142, 181, + 140, 181, 143, -1, 137, 142, 181, 140, 181, 140, + 181, 143, -1, 138, 142, 181, 140, 181, 140, 181, + 143, -1, 183, 140, 181, -1, 181, -1, 32, -1, + 33, -1, 186, -1, 186, 206, -1, 186, 208, -1, + 186, 62, 61, 192, -1, 186, 25, -1, 187, -1, + 187, 165, 20, 174, -1, 187, 208, -1, 187, 62, + 61, 192, -1, -1, 187, 165, 166, 184, 181, 188, + 172, -1, -1, 187, 165, 50, 184, 176, 189, 172, + -1, -1, 187, 165, 45, 184, 176, 190, 172, -1, + -1, 187, 165, 47, 184, 176, 191, 172, -1, 187, + 51, 194, -1, 187, 58, 139, 195, -1, -1, 24, + -1, 56, -1, 55, -1, 53, 139, 193, -1, 54, + 139, 4, -1, 52, 139, 24, -1, 71, 139, 24, + -1, 144, 196, 146, -1, 196, 140, 24, -1, 24, + -1, -1, 22, -1, 24, -1, 197, -1, -1, 176, + 198, -1, 200, 140, 199, -1, 199, -1, 200, -1, + 200, 140, 37, -1, 37, -1, -1, 167, 174, 197, + 142, 201, 143, 171, 168, -1, 29, -1, 149, -1, + 166, 202, 203, -1, 30, -1, 150, -1, 215, 205, + -1, -1, 45, -1, 47, -1, -1, 31, 209, 207, + 202, -1, -1, 63, -1, 3, -1, 4, -1, 7, + -1, 27, -1, 28, -1, 38, -1, 39, -1, 26, + -1, 147, 183, 148, -1, 182, -1, 61, 210, 24, + 140, 24, -1, 154, -1, 197, -1, 212, -1, 211, + -1, 176, 213, -1, 215, 216, -1, 204, 216, -1, + 217, 165, 218, -1, 217, 220, -1, -1, 23, -1, + 72, 214, -1, 72, 8, -1, 73, 21, 213, -1, + 73, 9, 213, 140, 21, 213, 140, 21, 213, -1, + 74, 163, 213, 140, 21, 213, 144, 219, 146, -1, + 74, 163, 213, 140, 21, 213, 144, 146, -1, 75, + 167, 174, 213, 142, 223, 143, 36, 21, 213, 76, + 21, 213, -1, 76, -1, 77, -1, 219, 163, 211, + 140, 21, 213, -1, 163, 211, 140, 21, 213, -1, + 165, 225, -1, 176, 144, 213, 140, 213, 146, -1, + 221, 140, 144, 213, 140, 213, 146, -1, 214, -1, + 222, 140, 214, -1, 222, -1, -1, 60, 59, -1, + 59, -1, 155, 176, 213, 140, 213, -1, 156, 176, + 213, 140, 213, -1, 90, 159, 176, 213, 140, 213, + -1, 91, 160, 176, 213, 140, 213, -1, 49, 214, + -1, 158, 214, 140, 214, -1, 157, 214, 36, 176, + -1, 131, 214, 140, 214, 140, 214, -1, 135, 214, + 140, 176, -1, 136, 214, 140, 214, -1, 137, 214, + 140, 214, 140, 214, -1, 138, 214, 140, 214, 140, + 214, -1, 130, 221, -1, 224, 167, 174, 213, 142, + 223, 143, -1, 228, -1, 140, 222, -1, -1, 35, + -1, -1, 112, 176, 169, -1, 112, 176, 140, 15, + 213, 169, -1, 113, 176, 169, -1, 113, 176, 140, + 15, 213, 169, -1, 114, 214, -1, 227, 115, 176, + 213, -1, 227, 116, 214, 140, 176, 213, -1, 117, + 176, 213, 226, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const unsigned short yyrline[] = +static const unsigned short int yyrline[] = { - 0, 990, 990, 991, 999, 1000, 1010, 1010, 1010, 1010, - 1010, 1010, 1010, 1010, 1010, 1011, 1011, 1011, 1012, 1012, - 1012, 1012, 1012, 1012, 1013, 1013, 1013, 1013, 1013, 1013, - 1014, 1014, 1014, 1014, 1014, 1014, 1015, 1015, 1015, 1017, - 1017, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1025, - 1025, 1026, 1026, 1027, 1027, 1028, 1028, 1029, 1029, 1030, - 1030, 1031, 1031, 1032, 1033, 1038, 1038, 1038, 1038, 1039, - 1039, 1039, 1039, 1040, 1040, 1041, 1041, 1044, 1048, 1053, - 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1062, 1063, 1064, - 1065, 1066, 1067, 1068, 1069, 1078, 1079, 1085, 1086, 1094, - 1102, 1103, 1108, 1109, 1110, 1115, 1129, 1129, 1130, 1130, - 1132, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1143, 1143, - 1143, 1143, 1143, 1143, 1144, 1148, 1152, 1160, 1168, 1181, - 1186, 1198, 1208, 1212, 1222, 1226, 1237, 1242, 1248, 1249, - 1253, 1257, 1268, 1294, 1308, 1338, 1364, 1385, 1398, 1408, - 1413, 1474, 1481, 1489, 1495, 1501, 1505, 1509, 1517, 1529, - 1550, 1558, 1564, 1575, 1581, 1586, 1591, 1600, 1606, 1612, - 1621, 1625, 1633, 1633, 1643, 1651, 1656, 1660, 1664, 1668, - 1683, 1705, 1708, 1711, 1711, 1719, 1719, 1727, 1727, 1735, - 1735, 1744, 1747, 1750, 1754, 1767, 1768, 1770, 1774, 1783, - 1787, 1792, 1794, 1799, 1804, 1813, 1813, 1814, 1814, 1816, - 1823, 1829, 1836, 1840, 1846, 1851, 1856, 1951, 1951, 1953, - 1961, 1961, 1963, 1968, 1969, 1970, 1972, 1972, 1982, 1986, - 1991, 1995, 1999, 2003, 2007, 2011, 2015, 2019, 2023, 2048, - 2052, 2066, 2070, 2076, 2076, 2082, 2087, 2091, 2100, 2111, - 2120, 2132, 2145, 2149, 2153, 2158, 2167, 2186, 2195, 2251, - 2255, 2262, 2273, 2286, 2295, 2304, 2314, 2318, 2325, 2325, - 2327, 2331, 2336, 2355, 2370, 2384, 2395, 2406, 2419, 2428, - 2439, 2447, 2452, 2458, 2464, 2470, 2485, 2544, 2551, 2554, - 2559, 2563, 2570, 2575, 2581, 2586, 2592, 2600, 2612, 2627 + 0, 988, 988, 989, 999, 999, 999, 999, 999, 999, + 999, 999, 999, 1000, 1000, 1000, 1001, 1001, 1001, 1001, + 1001, 1001, 1002, 1002, 1002, 1002, 1002, 1002, 1003, 1003, + 1003, 1005, 1005, 1006, 1006, 1007, 1007, 1008, 1008, 1009, + 1009, 1013, 1013, 1014, 1014, 1015, 1015, 1016, 1016, 1017, + 1017, 1018, 1018, 1019, 1019, 1020, 1021, 1026, 1026, 1026, + 1026, 1027, 1027, 1027, 1027, 1028, 1028, 1029, 1029, 1032, + 1036, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1050, + 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1066, 1067, 1073, + 1074, 1082, 1090, 1091, 1096, 1097, 1098, 1103, 1117, 1117, + 1118, 1118, 1120, 1130, 1130, 1130, 1130, 1130, 1130, 1130, + 1131, 1131, 1131, 1131, 1131, 1131, 1132, 1136, 1140, 1148, + 1156, 1169, 1174, 1186, 1196, 1200, 1210, 1214, 1225, 1230, + 1236, 1237, 1241, 1245, 1256, 1282, 1296, 1326, 1352, 1373, + 1386, 1396, 1401, 1462, 1469, 1477, 1483, 1489, 1495, 1501, + 1505, 1509, 1517, 1529, 1550, 1558, 1564, 1575, 1580, 1585, + 1594, 1600, 1606, 1615, 1619, 1627, 1627, 1637, 1645, 1650, + 1654, 1658, 1662, 1677, 1699, 1702, 1705, 1705, 1713, 1713, + 1721, 1721, 1729, 1729, 1738, 1741, 1744, 1748, 1761, 1762, + 1764, 1768, 1777, 1781, 1786, 1788, 1793, 1798, 1807, 1807, + 1808, 1808, 1810, 1817, 1823, 1830, 1834, 1840, 1845, 1850, + 1945, 1945, 1947, 1955, 1955, 1957, 1962, 1963, 1964, 1966, + 1966, 1976, 1980, 1985, 1989, 1993, 1997, 2001, 2005, 2009, + 2013, 2017, 2042, 2046, 2060, 2064, 2070, 2070, 2076, 2081, + 2085, 2094, 2105, 2114, 2126, 2139, 2143, 2147, 2152, 2161, + 2180, 2189, 2245, 2249, 2256, 2267, 2280, 2289, 2298, 2308, + 2312, 2319, 2319, 2321, 2325, 2330, 2349, 2364, 2375, 2386, + 2399, 2408, 2419, 2427, 2432, 2438, 2444, 2450, 2465, 2524, + 2531, 2534, 2539, 2543, 2550, 2555, 2561, 2566, 2572, 2580, + 2592, 2607 }; #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { @@ -1625,27 +1664,26 @@ static const char *const yytname[] = "COLDCC_TOK", "X86_STDCALLCC_TOK", "X86_FASTCALLCC_TOK", "DATALAYOUT", "RET", "BR", "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "UDIV", "SDIV", "FDIV", "UREM", "SREM", "FREM", "AND", "OR", - "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", "SETNE", "ICMP", - "FCMP", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "ULT", "UGT", "ULE", - "UGE", "OEQ", "ONE", "OLT", "OGT", "OLE", "OGE", "ORD", "UNO", "UEQ", - "UNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", - "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT", "BITCAST", "UITOFP", - "SITOFP", "FPTOUI", "FPTOSI", "INTTOPTR", "PTRTOINT", "PHI_TOK", - "SELECT", "SHL", "LSHR", "ASHR", "VAARG", "EXTRACTELEMENT", + "XOR", "ICMP", "FCMP", "EQ", "NE", "SLT", "SGT", "SLE", "SGE", "ULT", + "UGT", "ULE", "UGE", "OEQ", "ONE", "OLT", "OGT", "OLE", "OGE", "ORD", + "UNO", "UEQ", "UNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", + "GETELEMENTPTR", "TRUNC", "ZEXT", "SEXT", "FPTRUNC", "FPEXT", "BITCAST", + "UITOFP", "SITOFP", "FPTOUI", "FPTOSI", "INTTOPTR", "PTRTOINT", + "PHI_TOK", "SELECT", "SHL", "LSHR", "ASHR", "VAARG", "EXTRACTELEMENT", "INSERTELEMENT", "SHUFFLEVECTOR", "'='", "','", "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'*'", "'c'", "$accept", - "INTVAL", "EINT64VAL", "ArithmeticOps", "LogicalOps", "SetCondOps", - "CastOps", "ShiftOps", "IPredicates", "FPredicates", "SIntType", - "UIntType", "IntType", "FPType", "OptAssign", "OptLinkage", - "OptCallingConv", "OptAlign", "OptCAlign", "SectionString", "OptSection", - "GlobalVarAttributes", "GlobalVarAttribute", "TypesV", "UpRTypesV", - "Types", "PrimType", "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", - "ConstExpr", "ConstVector", "GlobalType", "Module", "FunctionList", - "ConstPool", "@1", "@2", "@3", "@4", "AsmBlock", "BigOrLittle", - "TargetDefinition", "LibrariesDefinition", "LibList", "Name", "OptName", - "ArgVal", "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", - "FunctionHeader", "END", "Function", "FnDeclareLinkage", "FunctionProto", - "@5", "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef", + "INTVAL", "ArithmeticOps", "LogicalOps", "CastOps", "ShiftOps", + "IPredicates", "FPredicates", "SIntType", "UIntType", "IntType", + "FPType", "OptAssign", "OptLinkage", "OptCallingConv", "OptAlign", + "OptCAlign", "SectionString", "OptSection", "GlobalVarAttributes", + "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType", + "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr", + "ConstVector", "GlobalType", "Module", "FunctionList", "ConstPool", "@1", + "@2", "@3", "@4", "AsmBlock", "BigOrLittle", "TargetDefinition", + "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal", + "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader", + "END", "Function", "FnDeclareLinkage", "FunctionProto", "@5", + "OptSideEffect", "ConstValueRef", "SymbolicValueRef", "ValueRef", "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList", "BBTerminatorInst", "JumpTable", "Inst", "PHIList", "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", "IndexList", "OptVolatile", @@ -1656,7 +1694,7 @@ static const char *const yytname[] = # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ -static const unsigned short yytoknum[] = +static const unsigned short int yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, @@ -1671,45 +1709,45 @@ static const unsigned short yytoknum[] = 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 61, 44, 92, 40, 41, - 91, 120, 93, 60, 62, 123, 125, 42, 99 + 385, 386, 387, 388, 389, 390, 391, 392, 393, 61, + 44, 92, 40, 41, 91, 120, 93, 60, 62, 123, + 125, 42, 99 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 159, 160, 160, 161, 161, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 163, 163, 163, 164, 164, - 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 166, 166, 166, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 169, 169, 169, 169, 170, - 170, 170, 170, 171, 171, 172, 172, 173, 173, 174, - 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, - 175, 175, 175, 175, 175, 176, 176, 177, 177, 178, - 179, 179, 180, 180, 181, 181, 182, 182, 183, 183, - 184, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 187, 187, 188, 188, - 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, - 191, 191, 192, 192, 193, 194, 194, 194, 194, 194, - 195, 195, 195, 196, 195, 197, 195, 198, 195, 199, - 195, 195, 195, 195, 200, 201, 201, 202, 202, 202, - 202, 203, 204, 204, 204, 205, 205, 206, 206, 207, - 208, 208, 209, 209, 209, 209, 210, 211, 211, 212, - 213, 213, 214, 215, 215, 215, 217, 216, 218, 218, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 220, 220, 221, 221, 222, 223, 223, 224, 225, - 225, 225, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 227, 227, 228, 229, 229, 230, 230, 231, 231, - 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 234, 234, - 235, 235, 236, 236, 236, 236, 236, 236, 236, 236 + 0, 153, 154, 154, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 156, 156, 156, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, + 158, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, + 161, 162, 162, 162, 162, 163, 163, 164, 164, 165, + 165, 166, 166, 166, 166, 166, 166, 166, 166, 167, + 167, 167, 167, 167, 167, 167, 167, 168, 168, 169, + 169, 170, 171, 171, 172, 172, 173, 173, 174, 174, + 175, 175, 176, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, + 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 183, 183, 184, 184, 185, 186, 186, + 186, 186, 186, 187, 187, 187, 188, 187, 189, 187, + 190, 187, 191, 187, 187, 187, 187, 192, 193, 193, + 194, 194, 194, 194, 195, 196, 196, 196, 197, 197, + 198, 198, 199, 200, 200, 201, 201, 201, 201, 202, + 203, 203, 204, 205, 205, 206, 207, 207, 207, 209, + 208, 210, 210, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 212, 212, 213, 213, 214, 215, + 215, 216, 217, 217, 217, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 219, 219, 220, 221, 221, 222, + 222, 223, 223, 224, 224, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 227, 227, 228, 228, 228, 228, 228, 228, + 228, 228 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1721,580 +1759,542 @@ static const unsigned char yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, + 3, 2, 0, 1, 0, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, - 1, 1, 1, 1, 2, 0, 2, 0, 3, 2, - 0, 1, 0, 3, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, - 5, 3, 2, 5, 4, 2, 1, 3, 1, 3, - 1, 0, 4, 3, 3, 4, 4, 3, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, - 8, 6, 6, 6, 7, 7, 6, 6, 8, 8, - 3, 1, 1, 1, 1, 2, 2, 4, 2, 1, - 4, 2, 4, 0, 7, 0, 7, 0, 7, 0, - 7, 3, 4, 0, 1, 1, 1, 3, 3, 3, - 3, 3, 3, 1, 0, 1, 1, 1, 0, 2, - 3, 1, 1, 3, 1, 0, 8, 1, 1, 3, - 1, 1, 2, 0, 1, 1, 0, 4, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 5, 1, 1, 1, 1, 2, 2, 2, 3, 2, - 0, 1, 2, 2, 3, 9, 9, 8, 13, 1, - 1, 6, 5, 2, 6, 7, 1, 3, 1, 0, - 2, 1, 5, 5, 5, 6, 6, 2, 4, 4, - 6, 4, 4, 6, 6, 2, 7, 1, 2, 0, - 1, 0, 3, 6, 3, 6, 2, 4, 6, 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 4, 5, 5, 3, 2, 5, 4, 2, 1, 3, + 1, 3, 1, 0, 4, 3, 3, 4, 4, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 6, 5, 8, 6, 6, 7, 7, 6, + 6, 8, 8, 3, 1, 1, 1, 1, 2, 2, + 4, 2, 1, 4, 2, 4, 0, 7, 0, 7, + 0, 7, 0, 7, 3, 4, 0, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 1, 0, 1, 1, + 1, 0, 2, 3, 1, 1, 3, 1, 0, 8, + 1, 1, 3, 1, 1, 2, 0, 1, 1, 0, + 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 5, 1, 1, 1, 1, 2, 2, + 2, 3, 2, 0, 1, 2, 2, 3, 9, 9, + 8, 13, 1, 1, 6, 5, 2, 6, 7, 1, + 3, 1, 0, 2, 1, 5, 5, 6, 6, 2, + 4, 4, 6, 4, 4, 6, 6, 2, 7, 1, + 2, 0, 1, 0, 3, 6, 3, 6, 2, 4, + 6, 4 }; /* 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 yydefact[] = +static const unsigned short int yydefact[] = { - 193, 0, 86, 179, 1, 178, 226, 79, 80, 81, - 82, 83, 84, 85, 0, 87, 250, 175, 176, 250, - 205, 206, 0, 0, 0, 86, 0, 181, 223, 0, - 0, 88, 89, 90, 91, 92, 93, 0, 0, 251, - 247, 78, 220, 221, 222, 246, 0, 0, 0, 0, - 191, 0, 0, 0, 0, 0, 0, 0, 77, 224, - 225, 87, 194, 177, 94, 2, 3, 107, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 0, 0, 0, 0, 241, 0, 0, 106, - 125, 110, 242, 126, 217, 218, 219, 291, 249, 0, - 0, 0, 0, 204, 192, 182, 180, 172, 173, 0, - 0, 0, 0, 227, 127, 0, 0, 0, 109, 132, - 136, 0, 0, 141, 135, 290, 0, 271, 0, 0, - 0, 0, 87, 259, 260, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 0, 0, 0, 0, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 0, 0, 36, 37, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 248, 87, 263, 0, 287, - 199, 196, 195, 197, 198, 200, 203, 0, 187, 189, - 185, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 0, 0, 0, 0, 183, 0, 0, 0, - 0, 0, 131, 215, 140, 138, 0, 0, 277, 270, - 253, 252, 0, 0, 68, 72, 67, 71, 66, 70, - 65, 69, 73, 74, 0, 0, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 0, 63, 64, 59, - 60, 61, 62, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 0, 97, 97, 296, 0, 0, 285, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 201, 102, 102, 102, 155, 156, - 4, 5, 153, 154, 157, 152, 148, 149, 0, 0, + 186, 0, 78, 172, 1, 171, 219, 71, 72, 73, + 74, 75, 76, 77, 0, 79, 243, 168, 169, 243, + 198, 199, 0, 0, 0, 78, 0, 174, 216, 0, + 0, 80, 81, 82, 83, 84, 85, 0, 0, 244, + 240, 70, 213, 214, 215, 239, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 69, 217, + 218, 79, 187, 170, 86, 2, 3, 99, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 0, 0, 0, 0, 234, 0, 0, 98, + 117, 102, 235, 118, 210, 211, 212, 283, 242, 0, + 0, 0, 0, 197, 185, 175, 173, 165, 166, 0, + 0, 0, 0, 220, 119, 0, 0, 0, 101, 124, + 128, 0, 0, 133, 127, 282, 0, 264, 0, 0, + 0, 0, 79, 252, 253, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, + 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 0, 0, 28, 29, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 241, 79, + 256, 0, 279, 192, 189, 188, 190, 191, 193, 196, + 0, 180, 182, 178, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 123, 208, 132, 130, 0, + 0, 269, 263, 246, 245, 0, 0, 60, 64, 59, + 63, 58, 62, 57, 61, 65, 66, 0, 0, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, + 55, 56, 51, 52, 53, 54, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 0, 89, 89, 288, + 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 94, 94, 94, + 149, 150, 145, 146, 148, 147, 151, 144, 140, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 151, 150, 102, 108, 108, 134, - 0, 137, 214, 208, 211, 212, 0, 0, 128, 230, - 231, 232, 237, 233, 234, 235, 236, 228, 0, 239, - 244, 243, 245, 0, 254, 0, 0, 0, 0, 0, - 292, 0, 294, 289, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, - 0, 188, 190, 186, 0, 0, 0, 0, 0, 0, - 0, 143, 171, 0, 0, 147, 0, 144, 0, 0, - 0, 0, 0, 184, 129, 130, 133, 207, 209, 0, - 100, 139, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 299, 0, 0, 0, 281, 282, - 0, 0, 0, 0, 0, 279, 278, 0, 297, 0, - 0, 0, 104, 102, 0, 0, 289, 0, 0, 0, - 0, 0, 142, 145, 146, 0, 0, 0, 0, 0, - 213, 210, 101, 95, 0, 238, 0, 0, 269, 0, - 0, 97, 98, 97, 266, 288, 0, 0, 0, 0, - 0, 272, 273, 274, 269, 0, 99, 105, 103, 0, - 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, - 0, 0, 0, 216, 0, 0, 0, 268, 0, 275, - 276, 0, 293, 295, 0, 0, 0, 280, 283, 284, - 0, 298, 0, 0, 159, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 96, 240, 0, 0, 0, 267, - 264, 0, 286, 0, 0, 0, 167, 0, 0, 161, - 162, 163, 158, 166, 0, 257, 0, 0, 0, 265, - 164, 165, 0, 0, 0, 255, 0, 256, 0, 0, - 160, 168, 169, 0, 0, 0, 0, 0, 0, 262, - 0, 0, 261, 258 + 0, 0, 0, 0, 0, 143, 142, 94, 100, 100, + 126, 0, 129, 207, 201, 204, 205, 0, 0, 120, + 223, 224, 225, 230, 226, 227, 228, 229, 221, 0, + 232, 237, 236, 238, 0, 247, 0, 0, 0, 0, + 0, 284, 0, 286, 281, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, + 0, 181, 183, 179, 0, 0, 0, 0, 0, 0, + 0, 135, 164, 0, 0, 139, 0, 136, 0, 0, + 0, 0, 177, 121, 122, 125, 200, 202, 0, 92, + 131, 222, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 291, 0, 0, 0, 273, 274, 0, + 0, 0, 0, 271, 270, 0, 289, 0, 0, 0, + 96, 94, 0, 0, 281, 0, 0, 0, 0, 0, + 134, 137, 138, 0, 0, 0, 0, 206, 203, 93, + 87, 0, 231, 0, 0, 262, 0, 0, 89, 90, + 89, 259, 280, 0, 0, 0, 0, 0, 265, 266, + 262, 0, 91, 97, 95, 0, 0, 0, 0, 0, + 0, 0, 163, 0, 0, 0, 0, 0, 209, 0, + 0, 0, 261, 0, 267, 268, 0, 285, 287, 0, + 0, 0, 272, 275, 276, 0, 290, 0, 0, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 233, + 0, 0, 0, 260, 257, 0, 278, 0, 0, 0, + 160, 0, 0, 155, 156, 152, 159, 0, 250, 0, + 0, 0, 258, 157, 158, 0, 0, 0, 248, 0, + 249, 0, 0, 154, 161, 162, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 254, 251 }; /* YYDEFGOTO[NTERM-NUM]. */ -static const short yydefgoto[] = +static const short int yydefgoto[] = { - -1, 86, 302, 319, 320, 321, 322, 323, 256, 273, - 212, 213, 244, 214, 25, 15, 37, 503, 360, 442, - 463, 381, 443, 87, 88, 215, 90, 91, 121, 226, - 392, 349, 393, 109, 1, 2, 3, 326, 297, 295, - 296, 63, 193, 50, 104, 197, 92, 408, 334, 335, - 336, 38, 96, 16, 44, 17, 61, 18, 28, 413, - 350, 93, 352, 474, 19, 40, 41, 185, 557, 98, - 279, 507, 508, 186, 187, 424, 188, 189 + -1, 86, 311, 312, 313, 314, 249, 266, 205, 206, + 237, 207, 25, 15, 37, 488, 351, 430, 450, 371, + 431, 87, 88, 208, 90, 91, 121, 219, 382, 340, + 383, 109, 1, 2, 3, 317, 289, 287, 288, 63, + 186, 50, 104, 190, 92, 397, 325, 326, 327, 38, + 96, 16, 44, 17, 61, 18, 28, 402, 341, 93, + 343, 461, 19, 40, 41, 178, 540, 98, 272, 492, + 493, 179, 180, 413, 181, 182 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -529 -static const short yypact[] = +#define YYPACT_NINF -514 +static const short int yypact[] = { - -529, 21, 408, 495, -529, -529, -529, -529, -529, -529, - -529, -529, -529, -529, -24, 145, 43, -529, -529, -8, - -529, -529, -20, -63, 30, 137, -51, -529, 152, 73, - 147, -529, -529, -529, -529, -529, -529, 1211, -3, -529, - -529, 176, -529, -529, -529, -529, -32, 57, 71, 72, - -529, 35, 73, 1211, 46, 46, 46, 46, -529, -529, - -529, 145, -529, -529, -529, -529, -529, 74, -529, -529, - -529, -529, -529, -529, -529, -529, -529, -529, -529, -529, - -529, -529, 217, 219, 4, 90, -529, 176, 77, -529, - -529, -105, -529, -529, -529, -529, -529, 1316, -529, 202, - 67, 223, 204, 205, -529, -529, -529, -529, -529, 1231, - 1231, 1231, 1276, -529, -529, 82, 83, 637, -529, -529, - -105, -117, 87, 1018, -529, -529, 1231, -529, 179, 1321, - 15, 178, 145, -529, -529, -529, -529, -529, -529, -529, - -529, -529, -529, -529, -529, -529, -529, -529, -529, -529, - -529, -529, -529, 195, 378, 1231, 1231, 1231, 1231, -529, - -529, -529, -529, -529, -529, -529, -529, -529, -529, -529, - -529, 1231, 1231, -529, -529, -529, 1231, 1231, 1231, 1231, - 1231, 1231, 1231, 1231, 1231, -529, 145, -529, 11, -529, - -529, -529, -529, -529, -529, -529, -529, -98, -529, -529, - -529, 109, 157, 235, 168, 238, 173, 240, 201, 244, - 245, 250, 203, 254, 252, 544, -529, 1231, 1231, 106, - -111, 1231, -529, 1059, -529, 115, 113, 730, -529, -529, - 74, -529, 730, 730, -529, -529, -529, -529, -529, -529, - -529, -529, -529, -529, 730, 1211, -529, -529, -529, -529, - -529, -529, -529, -529, -529, -529, 1231, -529, -529, -529, - -529, -529, -529, -529, -529, -529, -529, -529, -529, -529, - -529, -529, -529, 1231, 117, 124, -529, 730, 121, 129, - 135, 136, 139, 140, 141, 730, 730, 730, 267, 158, - 1211, 1231, 1231, 282, -529, 161, 161, 161, -529, -529, - -529, -529, -529, -529, -529, -529, -529, -529, 195, 378, - 160, 162, 163, 164, 165, 965, 1276, 695, 285, 167, - 170, 171, 172, 174, -529, -529, 161, -64, -87, -529, - 169, -105, -529, 176, -529, 175, 190, 1116, -529, -529, - -529, -529, -529, -529, -529, -529, -529, 253, 1276, -529, - -529, -529, -529, 182, -529, 194, 730, 730, 730, -1, - -529, 5, -529, 196, 730, 193, 1231, 1231, 1231, 1231, - 1231, 198, 199, 200, 1231, 1231, 730, 730, 207, -529, - -11, -529, -529, -529, 206, 208, 1276, 1276, 1276, 1276, - 1276, -529, -529, -66, -78, -529, -85, -529, 1276, 1276, - 1276, 1276, 1276, -529, -529, -529, -529, -529, -529, 1170, - 290, -529, -529, 323, -77, 327, 328, 209, 212, 216, - 730, 346, 730, 1231, -529, 218, 730, 220, -529, -529, - 222, 224, 730, 730, 730, -529, -529, 215, -529, 1231, - 331, 347, -529, 161, 1276, 1276, 196, 225, 227, 229, - 230, 1276, -529, -529, -529, 231, 234, 246, 329, 247, - -529, -529, -529, 312, 248, -529, 730, 730, 1231, 730, - 730, 255, -529, 255, -529, 257, 730, 264, 1231, 1231, - 1231, -529, -529, -529, 1231, 730, -529, -529, -529, 265, - 268, 232, 1276, 1276, 1276, 1276, -529, 1276, 1276, 1276, - 1231, 1276, 386, -529, 375, 269, 270, 257, 251, -529, - -529, 361, -529, -529, 1231, 271, 730, -529, -529, -529, - 272, -529, 1276, 1276, -529, 273, 275, 276, 279, 277, - 281, 283, 287, 291, -529, -529, 407, 114, 398, -529, - -529, 292, -529, 296, 297, 1276, -529, 1276, 1276, -529, - -529, -529, -529, -529, 730, -529, 872, 153, 427, -529, - -529, -529, 307, 308, 309, -529, 313, -529, 872, 730, - -529, -529, -529, 440, 318, 389, 730, 446, 447, -529, - 730, 730, -529, -529 + -514, 47, 80, 817, -514, -514, -514, -514, -514, -514, + -514, -514, -514, -514, -3, 79, 67, -514, -514, -9, + -514, -514, 33, -46, 42, 139, -29, -514, -2, 95, + 126, -514, -514, -514, -514, -514, -514, 1112, -18, -514, + -514, 96, -514, -514, -514, -514, -7, 29, 56, 61, + -514, 34, 95, 1112, 74, 74, 74, 74, -514, -514, + -514, 79, -514, -514, -514, -514, -514, 45, -514, -514, + -514, -514, -514, -514, -514, -514, -514, -514, -514, -514, + -514, -514, 209, 211, 2, 538, -514, 96, 77, -514, + -514, -118, -514, -514, -514, -514, -514, 1252, -514, 201, + 102, 224, 206, 215, -514, -514, -514, -514, -514, 1153, + 1153, 1153, 1173, -514, -514, 112, 115, 598, -514, -514, + -118, -111, 99, 643, -514, -514, 1153, -514, 207, 1214, + 14, 239, 79, -514, -514, -514, -514, -514, -514, -514, + -514, -514, -514, -514, -514, -514, -514, 110, 190, 1153, + 1153, 1153, 1153, -514, -514, -514, -514, -514, -514, -514, + -514, -514, -514, -514, -514, 1153, 1153, -514, -514, -514, + 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, -514, 79, + -514, 48, -514, -514, -514, -514, -514, -514, -514, -514, + -94, -514, -514, -514, 138, 171, 173, 187, 189, 195, + 218, 220, 230, 258, 260, 232, 234, 267, 393, -514, + 1153, 1153, 129, -99, 1153, -514, 967, -514, 140, 135, + 691, -514, -514, 45, -514, 691, 691, -514, -514, -514, + -514, -514, -514, -514, -514, -514, -514, 691, 1112, -514, + -514, -514, -514, -514, -514, -514, -514, -514, -514, 1153, + -514, -514, -514, -514, -514, -514, -514, -514, -514, -514, + -514, -514, -514, -514, -514, -514, 1153, 145, 146, -514, + 691, 158, 163, 164, 165, 167, 169, 170, 691, 691, + 243, 172, 1112, 1153, 1153, 287, -514, 174, 174, 174, + -514, -514, -514, -514, -514, -514, -514, -514, -514, -514, + 110, 190, 176, 177, 188, 191, 192, 914, 1173, 618, + 289, 193, 194, 196, 197, -514, -514, 174, -119, -60, + -514, 181, -118, -514, 96, -514, 175, 198, 1008, -514, + -514, -514, -514, -514, -514, -514, -514, -514, 274, 1173, + -514, -514, -514, -514, 200, -514, 203, 691, 691, 691, + 0, -514, 13, -514, 204, 691, 202, 1153, 1153, 1153, + 1153, 1153, 205, 212, 1153, 1153, 691, 691, 213, -514, + -17, -514, -514, -514, 214, 216, 1173, 1173, 1173, 1173, + 1173, -514, -514, 15, -32, -514, -69, -514, 1173, 1173, + 1173, 1173, -514, -514, -514, -514, -514, -514, 1059, 313, + -514, -514, 327, -31, 333, 334, 217, 222, 223, 691, + 356, 691, 1153, -514, 225, 691, 226, -514, -514, 227, + 238, 691, 691, -514, -514, 228, -514, 1153, 357, 376, + -514, 174, 1173, 1173, 204, 244, 248, 249, 254, 1173, + -514, -514, -514, 255, 256, 347, 257, -514, -514, -514, + 345, 263, -514, 691, 691, 1153, 691, 691, 266, -514, + 266, -514, 268, 691, 269, 1153, 1153, 1153, -514, -514, + 1153, 691, -514, -514, -514, 272, 273, 264, 1173, 1173, + 1173, 1173, -514, 1173, 1173, 1153, 1173, 410, -514, 392, + 280, 277, 268, 283, -514, -514, 366, -514, -514, 1153, + 281, 691, -514, -514, -514, 291, -514, 1173, 1173, -514, + 295, 293, 297, 298, 296, 299, 300, 301, -514, -514, + 419, 51, 405, -514, -514, 304, -514, 302, 303, 1173, + -514, 1173, 1173, -514, -514, -514, -514, 691, -514, 827, + 85, 430, -514, -514, -514, 309, 311, 312, -514, 316, + -514, 827, 691, -514, -514, -514, 436, 318, 385, 691, + 442, 443, -514, 691, 691, -514, -514 }; /* YYPGOTO[NTERM-NUM]. */ -static const short yypgoto[] = +static const short int yypgoto[] = { - -529, -529, -529, 372, 374, 379, 381, 382, 188, 166, - -130, -128, -510, -529, 439, 456, -123, -529, -270, 88, - -529, -285, -529, -49, -529, -37, -529, -68, -36, -529, - -110, 284, -298, 60, -529, -529, -529, -529, -529, -529, - -529, 445, -529, -529, -529, -529, 3, -529, 91, -529, - -529, 441, -529, -529, -529, -529, -529, 498, -529, -529, - -528, -202, 40, -119, -529, 484, -529, -529, -529, -529, - -529, 81, 24, -529, -529, 59, -529, -529 + -514, -514, 368, 369, 370, 371, 185, 168, -130, -129, + -503, -514, 429, 461, -110, -514, -264, 88, -514, -281, + -514, -50, -514, -37, -514, -41, 39, -514, -107, 282, + -289, 22, -514, -514, -514, -514, -514, -514, -514, 437, + -514, -514, -514, -514, 7, -514, 90, -514, -514, 432, + -514, -514, -514, -514, -514, 493, -514, -514, -513, -195, + 38, -117, -514, 478, -514, -514, -514, -514, -514, 86, + 30, -514, -514, 65, -514, -514 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -175 -static const short yytable[] = +#define YYTABLE_NINF -168 +static const short int yytable[] = { - 89, 242, 216, 243, 106, 362, 26, 228, 116, 245, - 231, 382, 383, 325, 420, 39, 89, 120, 394, 396, - 422, 4, 42, 440, 232, 351, 94, 556, 566, 221, - 351, 351, 46, 47, 48, 221, 233, 29, 276, 222, - 574, 403, 351, -108, 26, 330, 441, 568, 293, 120, - 414, 49, 124, 280, 294, 120, 421, 281, 282, 283, - 284, 451, 421, 290, 288, 289, 39, 405, 451, 451, - 124, 454, 198, 199, 200, 351, 453, 465, 107, 108, - 451, 220, 51, 351, 351, 351, 452, 225, 404, 227, - 122, 52, 227, 124, 58, 65, 66, 62, 118, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 20, 99, 21, 110, 111, 112, 274, 275, - 227, 277, 191, 192, 234, 235, 236, 237, 238, 239, - 240, 241, 291, 292, 278, 227, 298, 299, 81, 227, - 227, 227, 227, 285, 286, 287, 227, 227, 43, 327, - 328, 64, 95, 331, 351, 351, 351, 53, 488, 117, - -68, -68, 351, 234, 235, 236, 237, 238, 239, 240, - 241, -67, -67, 378, 351, 351, -66, -66, 7, 8, - 9, 10, 54, 12, 55, 103, 333, 56, 234, 235, - 236, 237, 238, 239, 240, 241, 356, 59, 20, 60, - 21, 512, 100, 513, -65, -65, 300, 301, 89, 30, - 31, 32, 33, 34, 35, 36, 101, 102, 351, 357, - 351, 114, -109, 115, 351, 123, 190, 194, 195, 196, - 351, 351, 351, 217, 218, 223, 358, 82, 229, -72, - 83, 376, -71, 84, -70, 85, 119, 427, -69, 429, - 430, 431, -75, 89, 377, 227, 436, -76, 303, 304, - 329, 337, 338, 359, 351, 351, 555, 351, 351, 331, - 361, 364, 353, 354, 351, 365, 446, 447, 448, 449, - 450, 366, 367, 351, 355, 368, 369, 370, 455, 456, - 457, 458, 459, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 374, 375, 567, 379, 380, 386, 397, - 387, 388, 389, 390, 351, 398, 412, 363, 399, 400, - 401, 409, 402, 406, 440, 371, 372, 373, 415, 227, - 428, 227, 227, 227, 489, 490, 407, 435, 227, 410, - 416, 496, 423, 426, 432, 433, 434, 464, 466, 467, - 472, 487, 351, 439, 444, 486, 445, 468, 469, 517, - 518, 519, 470, 484, 476, 500, 478, 351, 479, 502, - 480, 492, 333, 493, 351, 494, 495, 497, 351, 351, - 498, 524, 525, 526, 527, 528, 227, 529, 530, 531, - 534, 533, 499, 501, 504, 539, 417, 418, 419, 535, - 538, 511, 485, 514, 425, 257, 258, 242, -174, 243, - 516, 522, 543, 544, 523, 536, 437, 438, 421, 545, - 537, 542, 547, 540, 546, 548, 549, 242, 554, 243, - 550, 227, 551, 5, 558, 562, 552, 563, 564, 6, - 553, 227, 227, 227, 559, 560, 561, 227, 569, 7, - 8, 9, 10, 11, 12, 13, 570, 571, 572, 573, - 471, 576, 473, 532, 577, 578, 477, 580, 581, 180, - 14, 181, 481, 482, 483, 385, 182, 227, 183, 184, - 97, 57, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 384, 105, 462, 324, - 461, 27, 113, 45, 475, 491, 505, 506, 520, 509, - 510, 0, 0, 0, 0, -78, 515, 20, 0, 21, - 0, 0, 0, 0, 0, 521, 6, -78, -78, 0, - 0, 0, 0, 0, 0, 0, -78, -78, -78, -78, - -78, -78, -78, 0, 0, -78, 22, 0, 0, 65, - 66, 0, 0, 23, 0, 0, 541, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 21, 0, - 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, - 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, - 582, 583, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 308, 309, 65, 66, 0, 118, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 20, - 0, 21, 0, 0, 0, 0, 0, 310, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 0, 311, 173, 174, 175, 81, 312, 313, 314, 0, - 0, 0, 0, 0, 315, 0, 0, 316, 0, 317, - 65, 66, 318, 118, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 79, 80, 20, 0, 21, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 65, 66, 341, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 21, 0, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, - 84, 347, 85, 219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 308, 309, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 0, 0, 83, 0, 0, 84, 0, - 85, 395, 0, 310, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 0, 311, 173, 174, - 175, 0, 312, 313, 314, 339, 340, 0, 0, 341, - 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 342, 343, - 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 345, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 235, 236, 106, 353, 209, 116, 372, 373, 221, + 26, 94, 224, 316, 39, 409, 89, 428, 539, 384, + 386, 42, 238, 225, -100, 342, 549, 393, 411, 214, + 342, 342, 124, 124, 269, 226, 392, 551, 557, 215, + 429, 214, 342, 59, 120, 60, 285, 4, 26, 273, + 403, 321, 286, 274, 275, 276, 277, 410, 29, 280, + 281, 227, 228, 229, 230, 231, 232, 233, 234, 282, + 410, 439, 191, 192, 193, 342, 120, 110, 111, 112, + -167, 442, 120, 342, 342, 46, 47, 48, 394, 220, + 39, 124, 220, 51, 122, 227, 228, 229, 230, 231, + 232, 233, 234, 52, 49, 5, 107, 108, 439, 439, + 58, 6, 267, 268, 220, 270, 441, 452, 20, 62, + 21, 7, 8, 9, 10, 11, 12, 13, 271, 220, + 64, 95, 99, 220, 220, 220, 220, 278, 279, 220, + 220, 43, 14, 30, 31, 32, 33, 34, 35, 36, + 474, 117, 342, 342, 342, 439, 213, 184, 185, 53, + 342, 440, 218, 283, 284, 290, 291, 368, 100, 318, + 319, 342, 342, 322, -60, -60, -64, -64, 103, 324, + 7, 8, 9, 10, 54, 12, 55, -101, 347, 56, + -59, -59, -63, -63, 497, 101, 498, 538, -58, -58, + 102, 89, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 348, 114, 342, 115, 342, 250, 251, 123, + 342, -62, -62, -57, -57, 183, 342, 342, 187, 349, + 188, 550, 366, -61, -61, 292, 293, 294, 295, 189, + 416, 216, 418, 419, 420, 89, 367, 220, 424, 227, + 228, 229, 230, 231, 232, 233, 234, 210, 342, 342, + 211, 342, 342, 344, 345, -67, 222, -68, 342, 434, + 435, 436, 437, 438, 296, 346, 342, 320, 329, 364, + 328, 443, 444, 445, 446, 350, 352, 322, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 355, 356, 357, 358, 342, 359, 354, 360, + 361, 369, 365, 387, 370, 398, 362, 363, 376, 377, + 220, 417, 220, 220, 220, 475, 476, 423, 220, 395, + 378, 396, 482, 379, 380, 388, 389, 401, 390, 391, + 404, 399, 342, 405, 412, 421, 415, 428, 502, 503, + 504, 451, 422, 427, 453, 454, 432, 342, 433, 455, + 459, 324, 456, 457, 342, 463, 465, 466, 342, 342, + 470, 510, 511, 512, 513, 220, 514, 515, 467, 517, + 473, 472, 523, 485, 478, 406, 407, 408, 479, 480, + 471, 235, 236, 414, 481, 483, 484, 486, 65, 66, + 527, 528, 487, 489, 425, 426, 496, 509, 499, 501, + 235, 236, 507, 508, 518, 20, 519, 21, 220, 297, + 520, 521, 545, 410, 546, 547, 522, 524, 220, 220, + 220, 298, 299, 220, 526, 529, 530, 531, 532, 533, + 537, 541, 534, 535, 536, 543, 544, 458, 516, 460, + 542, 552, 553, 464, 554, 555, 556, 559, 560, 468, + 469, 561, 220, 563, 564, 174, 175, 176, 177, 375, + 97, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 300, 301, 374, 57, 449, 448, 105, + 315, 490, 491, 113, 494, 495, 27, 45, 462, 477, + 505, 500, 0, 0, 0, 0, 0, 0, 0, 506, + 302, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 0, 303, 167, 168, 169, 0, 304, + 305, 306, 0, 0, 0, 0, 0, 307, 0, 525, + 308, 0, 309, 65, 66, 310, 118, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 558, 0, 0, 0, 0, 0, 0, 562, 0, 0, + 0, 565, 566, 65, 66, 0, 118, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 20, 0, 21, 65, 66, 0, 118, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 79, 80, + 20, 0, 21, 0, 0, 0, 81, 0, 65, 66, + 0, 118, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 20, 81, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 217, 0, 83, 0, 0, 84, 0, 85, 119, 0, + 0, 81, 0, 0, 330, 331, 65, 66, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 0, 21, 0, 333, 334, 335, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, + 337, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 83, 0, 0, 84, 0, 85, 212, 0, + 0, 0, 338, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 83, 0, 0, 84, 0, 85, 385, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 300, 301, 0, 82, 0, 0, 83, 0, 0, + 84, 0, 85, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 302, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 0, 303, 167, 168, 169, 0, 304, 305, 306, + 330, 331, 0, 0, 332, 0, 0, -70, 339, 20, + 0, 21, 0, 0, 0, 0, 0, 0, 6, -70, + -70, 0, 0, 333, 334, 335, 0, 0, -70, -70, + -70, -70, -70, -70, -70, 336, 337, -70, 22, 0, + 0, 0, 0, 0, 0, 23, 0, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 308, 309, - 65, 66, 0, 118, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 79, 80, 20, 0, 21, - 0, 0, 0, 0, 0, 310, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 0, 311, - 173, 174, 175, 81, 312, 313, 314, 0, 0, 0, - 0, 0, 0, 65, 66, 348, 118, 68, 69, 70, + 0, 0, 0, 0, 0, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 300, 301, 65, + 66, 0, 118, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 79, 80, 20, 0, 21, 0, + 0, 0, 0, 0, 302, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 0, 303, 167, + 168, 169, 81, 304, 305, 306, 0, 0, 0, 0, + 0, 0, 65, 66, 339, 118, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 20, + 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 323, 0, 0, 0, 0, 0, + 0, 0, 0, 65, 66, 81, 118, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, - 0, 0, 0, 0, 65, 66, 81, 118, 68, 69, + 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 82, 81, 0, 83, 0, + 381, 84, 0, 85, 65, 66, 0, 118, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 20, 0, 21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 82, 0, 0, 83, 0, 391, 84, 0, - 85, 65, 66, 0, 118, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 20, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 82, 0, 0, 83, 0, - 0, 84, 0, 85, 0, 65, 66, 0, 118, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 20, 0, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 460, 0, 83, - 0, 0, 84, 0, 85, 0, 65, 66, 81, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 20, 0, 21, 65, 66, 0, 118, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 20, 0, 21, 0, 0, 0, 81, - 0, 0, 0, 82, 0, 0, 83, 0, 0, 84, - 0, 85, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 65, 66, 0, 118, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 79, 80, 20, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, - 83, 0, 0, 84, 81, 85, 65, 66, 0, 230, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 20, 0, 21, 0, 0, 0, 0, - 0, 125, 0, 0, 0, 0, 0, 0, 82, 0, - 0, 83, 0, 0, 84, 126, 85, 0, 0, 81, - 0, 0, 0, 0, 0, 127, 128, 0, 82, 0, - 0, 83, 0, 0, 84, 0, 85, 0, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81, 82, 0, + 0, 83, 0, 0, 84, 0, 85, 65, 66, 0, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 20, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 83, 0, 0, 84, 0, 85, 65, 66, + 81, 118, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 20, 0, 21, 65, 66, + 0, 118, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 79, 80, 20, 0, 21, 0, 0, + 82, 81, 0, 83, 0, 0, 84, 0, 85, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 66, 81, 223, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 20, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, 84, - 0, 85, 0, 0, 155, 156, 157, 0, 0, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 82, 0, - 0, 83, 0, 0, 84, 0, 85 + 0, 85, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, + 84, 126, 85, 0, 0, 0, 0, 0, 0, 0, + 0, 127, 128, 0, 82, 0, 0, 83, 0, 0, + 84, 0, 85, 0, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 83, 0, + 0, 84, 0, 85, 149, 150, 151, 0, 0, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173 }; -static const short yycheck[] = +static const short int yycheck[] = { - 37, 131, 112, 131, 53, 275, 3, 126, 4, 132, - 129, 296, 297, 215, 15, 23, 53, 85, 316, 317, - 15, 0, 30, 34, 9, 227, 29, 537, 556, 146, - 232, 233, 52, 53, 54, 146, 21, 61, 157, 156, - 568, 326, 244, 148, 41, 156, 57, 557, 146, 117, - 348, 71, 157, 172, 152, 123, 57, 176, 177, 178, - 179, 146, 57, 186, 183, 184, 23, 154, 146, 146, - 157, 156, 109, 110, 111, 277, 154, 154, 32, 33, - 146, 117, 145, 285, 286, 287, 152, 123, 152, 126, - 87, 61, 129, 157, 145, 5, 6, 24, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 145, 24, 55, 56, 57, 155, 156, - 157, 158, 55, 56, 10, 11, 12, 13, 14, 15, - 16, 17, 121, 122, 171, 172, 27, 28, 48, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 156, 217, - 218, 4, 155, 221, 356, 357, 358, 20, 443, 155, - 3, 4, 364, 10, 11, 12, 13, 14, 15, 16, - 17, 3, 4, 292, 376, 377, 3, 4, 41, 42, - 43, 44, 45, 46, 47, 150, 223, 50, 10, 11, - 12, 13, 14, 15, 16, 17, 245, 45, 22, 47, - 24, 471, 145, 473, 3, 4, 3, 4, 245, 64, - 65, 66, 67, 68, 69, 70, 145, 145, 420, 256, - 422, 4, 148, 4, 426, 148, 24, 4, 24, 24, - 432, 433, 434, 151, 151, 148, 273, 147, 59, 4, - 150, 290, 4, 153, 4, 155, 156, 366, 4, 368, - 369, 370, 7, 290, 291, 292, 375, 7, 4, 7, - 154, 146, 149, 146, 466, 467, 152, 469, 470, 337, - 146, 150, 232, 233, 476, 146, 386, 387, 388, 389, - 390, 146, 146, 485, 244, 146, 146, 146, 398, 399, - 400, 401, 402, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 36, 146, 152, 24, 146, 148, 24, - 148, 148, 148, 148, 516, 148, 63, 277, 148, 148, - 148, 146, 148, 154, 34, 285, 286, 287, 146, 366, - 367, 368, 369, 370, 444, 445, 333, 374, 375, 149, - 146, 451, 146, 150, 146, 146, 146, 24, 21, 21, - 4, 4, 554, 146, 148, 24, 148, 148, 146, 478, - 479, 480, 146, 148, 146, 36, 146, 569, 146, 57, - 146, 146, 409, 146, 576, 146, 146, 146, 580, 581, - 146, 149, 492, 493, 494, 495, 423, 497, 498, 499, - 4, 501, 146, 146, 146, 514, 356, 357, 358, 24, - 149, 146, 439, 146, 364, 27, 28, 537, 0, 537, - 146, 146, 522, 523, 146, 146, 376, 377, 57, 146, - 150, 149, 146, 152, 149, 146, 149, 557, 21, 557, - 149, 468, 149, 25, 36, 545, 149, 547, 548, 31, - 149, 478, 479, 480, 152, 149, 149, 484, 21, 41, - 42, 43, 44, 45, 46, 47, 149, 149, 149, 146, - 420, 21, 422, 500, 146, 76, 426, 21, 21, 97, - 62, 97, 432, 433, 434, 309, 97, 514, 97, 97, - 41, 25, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 308, 52, 410, 215, - 409, 3, 61, 19, 423, 446, 466, 467, 484, 469, - 470, -1, -1, -1, -1, 20, 476, 22, -1, 24, - -1, -1, -1, -1, -1, 485, 31, 32, 33, -1, - -1, -1, -1, -1, -1, -1, 41, 42, 43, 44, - 45, 46, 47, -1, -1, 50, 51, -1, -1, 5, - 6, -1, -1, 58, -1, -1, 516, 62, -1, -1, - -1, -1, -1, -1, -1, -1, 22, -1, 24, -1, - 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 38, 39, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 554, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 569, - -1, -1, -1, -1, -1, -1, 576, -1, -1, -1, - 580, 581, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 5, 6, -1, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - -1, 24, -1, -1, -1, -1, -1, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - -1, 137, 138, 139, 140, 48, 142, 143, 144, -1, - -1, -1, -1, -1, 150, -1, -1, 153, -1, 155, - 5, 6, 158, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3, 4, 5, 6, 7, -1, -1, - -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, - -1, -1, 22, -1, 24, -1, 26, 27, 28, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 147, -1, -1, 150, -1, -1, - 153, 61, 155, 156, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 147, -1, -1, 150, -1, -1, 153, -1, - 155, 156, -1, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, -1, 137, 138, 139, - 140, -1, 142, 143, 144, 3, 4, -1, -1, 7, - -1, -1, -1, 153, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 26, 27, - 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 38, 39, -1, -1, -1, -1, -1, -1, -1, -1, + 37, 131, 131, 53, 268, 112, 4, 288, 289, 126, + 3, 29, 129, 208, 23, 15, 53, 34, 521, 308, + 309, 30, 132, 9, 142, 220, 539, 146, 15, 140, + 225, 226, 151, 151, 151, 21, 317, 540, 551, 150, + 57, 140, 237, 45, 85, 47, 140, 0, 41, 166, + 339, 150, 146, 170, 171, 172, 173, 57, 61, 176, + 177, 10, 11, 12, 13, 14, 15, 16, 17, 179, + 57, 140, 109, 110, 111, 270, 117, 55, 56, 57, + 0, 150, 123, 278, 279, 52, 53, 54, 148, 126, + 23, 151, 129, 139, 87, 10, 11, 12, 13, 14, + 15, 16, 17, 61, 71, 25, 32, 33, 140, 140, + 139, 31, 149, 150, 151, 152, 148, 148, 22, 24, + 24, 41, 42, 43, 44, 45, 46, 47, 165, 166, + 4, 149, 139, 170, 171, 172, 173, 174, 175, 176, + 177, 150, 62, 64, 65, 66, 67, 68, 69, 70, + 431, 149, 347, 348, 349, 140, 117, 55, 56, 20, + 355, 146, 123, 115, 116, 27, 28, 284, 139, 210, + 211, 366, 367, 214, 3, 4, 3, 4, 144, 216, + 41, 42, 43, 44, 45, 46, 47, 142, 238, 50, + 3, 4, 3, 4, 458, 139, 460, 146, 3, 4, + 139, 238, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 249, 4, 409, 4, 411, 27, 28, 142, + 415, 3, 4, 3, 4, 24, 421, 422, 4, 266, + 24, 146, 282, 3, 4, 3, 4, 3, 4, 24, + 357, 142, 359, 360, 361, 282, 283, 284, 365, 10, + 11, 12, 13, 14, 15, 16, 17, 145, 453, 454, + 145, 456, 457, 225, 226, 7, 59, 7, 463, 376, + 377, 378, 379, 380, 7, 237, 471, 148, 143, 36, + 140, 388, 389, 390, 391, 140, 140, 328, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 144, 140, 140, 140, 501, 140, 270, 140, + 140, 24, 140, 24, 140, 140, 278, 279, 142, 142, + 357, 358, 359, 360, 361, 432, 433, 364, 365, 148, + 142, 324, 439, 142, 142, 142, 142, 63, 142, 142, + 140, 143, 537, 140, 140, 140, 144, 34, 465, 466, + 467, 24, 140, 140, 21, 21, 142, 552, 142, 142, + 4, 398, 140, 140, 559, 140, 140, 140, 563, 564, + 142, 478, 479, 480, 481, 412, 483, 484, 140, 486, + 4, 24, 499, 36, 140, 347, 348, 349, 140, 140, + 427, 521, 521, 355, 140, 140, 140, 140, 5, 6, + 507, 508, 57, 140, 366, 367, 140, 143, 140, 140, + 540, 540, 140, 140, 4, 22, 24, 24, 455, 26, + 140, 144, 529, 57, 531, 532, 143, 146, 465, 466, + 467, 38, 39, 470, 143, 140, 143, 140, 140, 143, + 21, 36, 143, 143, 143, 143, 143, 409, 485, 411, + 146, 21, 143, 415, 143, 143, 140, 21, 140, 421, + 422, 76, 499, 21, 21, 97, 97, 97, 97, 301, + 41, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 300, 25, 399, 398, 52, + 208, 453, 454, 61, 456, 457, 3, 19, 412, 434, + 470, 463, -1, -1, -1, -1, -1, -1, -1, 471, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, -1, 131, 132, 133, 134, -1, 136, + 137, 138, -1, -1, -1, -1, -1, 144, -1, 501, + 147, -1, 149, 5, 6, 152, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 537, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, + 552, -1, -1, -1, -1, -1, -1, 559, -1, -1, + -1, 563, 564, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, 48, -1, 5, 6, + -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 48, 24, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, + 37, -1, 144, -1, -1, 147, -1, 149, 150, -1, + -1, 48, -1, -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 22, -1, 24, -1, 26, 27, 28, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, + 39, -1, -1, -1, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, 147, -1, 149, 150, -1, + -1, -1, 61, -1, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, 147, -1, 149, 150, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, -1, 141, -1, -1, 144, -1, -1, + 147, -1, 149, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, -1, 131, 132, 133, 134, -1, 136, 137, 138, + 3, 4, -1, -1, 7, -1, -1, 20, 147, 22, + -1, 24, -1, -1, -1, -1, -1, -1, 31, 32, + 33, -1, -1, 26, 27, 28, -1, -1, 41, 42, + 43, 44, 45, 46, 47, 38, 39, 50, 51, -1, + -1, -1, -1, -1, -1, 58, -1, -1, -1, 62, + -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, -1, -1, -1, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, -1, 137, - 138, 139, 140, 48, 142, 143, 144, -1, -1, -1, - -1, -1, -1, 5, 6, 153, 8, 9, 10, 11, + -1, -1, -1, -1, -1, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 5, + 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, + -1, -1, -1, -1, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, -1, 131, 132, + 133, 134, 48, 136, 137, 138, -1, -1, -1, -1, + -1, -1, 5, 6, 147, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, -1, 5, 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, -1, -1, -1, 5, 6, 48, 8, 9, 10, + -1, -1, -1, -1, -1, 141, 48, -1, 144, -1, + 146, 147, -1, 149, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 48, -1, -1, - -1, -1, 147, -1, -1, 150, -1, 152, 153, -1, - 155, 5, 6, -1, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 48, 147, -1, -1, 150, -1, - -1, 153, -1, 155, -1, 5, 6, -1, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 147, 37, -1, 150, - -1, -1, 153, -1, 155, -1, 5, 6, 48, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, 5, 6, -1, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, 48, - -1, -1, -1, 147, -1, -1, 150, -1, -1, 153, - -1, 155, -1, -1, -1, -1, -1, -1, -1, 48, - -1, 5, 6, -1, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 147, -1, -1, - 150, -1, -1, 153, 48, 155, 5, 6, -1, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 35, -1, -1, -1, -1, -1, -1, 147, -1, - -1, 150, -1, -1, 153, 49, 155, -1, -1, 48, - -1, -1, -1, -1, -1, 59, 60, -1, 147, -1, - -1, 150, -1, -1, 153, -1, 155, -1, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 147, -1, -1, 150, -1, -1, 153, - -1, 155, -1, -1, 118, 119, 120, -1, -1, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, -1, -1, -1, -1, -1, -1, -1, 147, -1, - -1, 150, -1, -1, 153, -1, 155 + -1, -1, -1, -1, -1, -1, -1, 48, 141, -1, + -1, 144, -1, -1, 147, -1, 149, 5, 6, -1, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, 147, -1, 149, 5, 6, + 48, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, 5, 6, + -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + 141, 48, -1, 144, -1, -1, 147, -1, 149, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, + 6, 48, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, 147, + -1, 149, 48, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 35, -1, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + 147, 49, 149, -1, -1, -1, -1, -1, -1, -1, + -1, 59, 60, -1, 141, -1, -1, 144, -1, -1, + 147, -1, 149, -1, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, 147, -1, 149, 112, 113, 114, -1, -1, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 193, 194, 195, 0, 25, 31, 41, 42, 43, - 44, 45, 46, 47, 62, 174, 212, 214, 216, 223, - 22, 24, 51, 58, 62, 173, 205, 216, 217, 61, - 64, 65, 66, 67, 68, 69, 70, 175, 210, 23, - 224, 225, 30, 156, 213, 224, 52, 53, 54, 71, - 202, 145, 61, 20, 45, 47, 50, 174, 145, 45, - 47, 215, 24, 200, 4, 5, 6, 8, 9, 10, + 0, 185, 186, 187, 0, 25, 31, 41, 42, 43, + 44, 45, 46, 47, 62, 166, 204, 206, 208, 215, + 22, 24, 51, 58, 62, 165, 197, 208, 209, 61, + 64, 65, 66, 67, 68, 69, 70, 167, 202, 23, + 216, 217, 30, 150, 205, 216, 52, 53, 54, 71, + 194, 139, 61, 20, 45, 47, 50, 166, 139, 45, + 47, 207, 24, 192, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 48, 147, 150, 153, 155, 160, 182, 183, 184, - 185, 186, 205, 220, 29, 155, 211, 173, 228, 145, - 145, 145, 145, 150, 203, 200, 182, 32, 33, 192, - 192, 192, 192, 210, 4, 4, 4, 155, 8, 156, - 186, 187, 205, 148, 157, 35, 49, 59, 60, 72, + 21, 48, 141, 144, 147, 149, 154, 174, 175, 176, + 177, 178, 197, 212, 29, 149, 203, 165, 220, 139, + 139, 139, 139, 144, 195, 192, 174, 32, 33, 184, + 184, 184, 184, 202, 4, 4, 4, 149, 8, 150, + 178, 179, 197, 142, 151, 35, 49, 59, 60, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 118, 119, 120, 123, 124, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 112, + 113, 114, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 162, 163, 164, 165, 166, 226, 232, 233, 235, 236, - 24, 55, 56, 201, 4, 24, 24, 204, 184, 184, - 184, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 169, 170, 172, 184, 189, 151, 151, 156, - 187, 146, 156, 148, 37, 187, 188, 184, 222, 59, - 8, 222, 9, 21, 10, 11, 12, 13, 14, 15, - 16, 17, 169, 170, 171, 175, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 167, 27, 28, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 168, 184, 184, 222, 184, 184, 229, - 222, 222, 222, 222, 222, 184, 184, 184, 222, 222, - 175, 121, 122, 146, 152, 198, 199, 197, 27, 28, - 3, 4, 161, 4, 7, 26, 38, 39, 96, 97, - 123, 137, 142, 143, 144, 150, 153, 155, 158, 162, - 163, 164, 165, 166, 190, 220, 196, 186, 186, 154, - 156, 186, 37, 184, 207, 208, 209, 146, 149, 3, - 4, 7, 26, 27, 28, 38, 39, 61, 153, 190, - 219, 220, 221, 221, 221, 221, 182, 184, 184, 146, - 177, 146, 177, 221, 150, 146, 146, 146, 146, 146, - 146, 221, 221, 221, 36, 146, 182, 184, 222, 24, - 146, 180, 180, 180, 167, 168, 148, 148, 148, 148, - 148, 152, 189, 191, 191, 156, 191, 24, 148, 148, - 148, 148, 148, 180, 152, 154, 154, 205, 206, 146, - 149, 37, 63, 218, 191, 146, 146, 221, 221, 221, - 15, 57, 15, 146, 234, 221, 150, 222, 184, 222, - 222, 222, 146, 146, 146, 184, 222, 221, 221, 146, - 34, 57, 178, 181, 148, 148, 189, 189, 189, 189, - 189, 146, 152, 154, 156, 189, 189, 189, 189, 189, - 37, 207, 178, 179, 24, 154, 21, 21, 148, 146, - 146, 221, 4, 221, 222, 230, 146, 221, 146, 146, - 146, 221, 221, 221, 148, 184, 24, 4, 180, 189, - 189, 234, 146, 146, 146, 146, 189, 146, 146, 146, - 36, 146, 57, 176, 146, 221, 221, 230, 231, 221, - 221, 146, 177, 177, 146, 221, 146, 222, 222, 222, - 231, 221, 146, 146, 149, 189, 189, 189, 189, 189, - 189, 189, 184, 189, 4, 24, 146, 150, 149, 222, - 152, 221, 149, 189, 189, 146, 149, 146, 146, 149, - 149, 149, 149, 149, 21, 152, 171, 227, 36, 152, - 149, 149, 189, 189, 189, 221, 219, 152, 171, 21, - 149, 149, 149, 146, 219, 221, 21, 146, 76, 221, - 21, 21, 221, 221 + 135, 136, 137, 138, 155, 156, 157, 158, 218, 224, + 225, 227, 228, 24, 55, 56, 193, 4, 24, 24, + 196, 176, 176, 176, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 161, 162, 164, 176, 181, + 145, 145, 150, 179, 140, 150, 142, 37, 179, 180, + 176, 214, 59, 8, 214, 9, 21, 10, 11, 12, + 13, 14, 15, 16, 17, 161, 162, 163, 167, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 159, + 27, 28, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 160, 176, 176, 214, + 176, 176, 221, 214, 214, 214, 214, 214, 176, 176, + 214, 214, 167, 115, 116, 140, 146, 190, 191, 189, + 27, 28, 3, 4, 3, 4, 7, 26, 38, 39, + 90, 91, 117, 131, 136, 137, 138, 144, 147, 149, + 152, 155, 156, 157, 158, 182, 212, 188, 178, 178, + 148, 150, 178, 37, 176, 199, 200, 201, 140, 143, + 3, 4, 7, 26, 27, 28, 38, 39, 61, 147, + 182, 211, 212, 213, 213, 213, 213, 174, 176, 176, + 140, 169, 140, 169, 213, 144, 140, 140, 140, 140, + 140, 140, 213, 213, 36, 140, 174, 176, 214, 24, + 140, 172, 172, 172, 159, 160, 142, 142, 142, 142, + 142, 146, 181, 183, 183, 150, 183, 24, 142, 142, + 142, 142, 172, 146, 148, 148, 197, 198, 140, 143, + 37, 63, 210, 183, 140, 140, 213, 213, 213, 15, + 57, 15, 140, 226, 213, 144, 214, 176, 214, 214, + 214, 140, 140, 176, 214, 213, 213, 140, 34, 57, + 170, 173, 142, 142, 181, 181, 181, 181, 181, 140, + 146, 148, 150, 181, 181, 181, 181, 37, 199, 170, + 171, 24, 148, 21, 21, 142, 140, 140, 213, 4, + 213, 214, 222, 140, 213, 140, 140, 140, 213, 213, + 142, 176, 24, 4, 172, 181, 181, 226, 140, 140, + 140, 140, 181, 140, 140, 36, 140, 57, 168, 140, + 213, 213, 222, 223, 213, 213, 140, 169, 169, 140, + 213, 140, 214, 214, 214, 223, 213, 140, 140, 143, + 181, 181, 181, 181, 181, 181, 176, 181, 4, 24, + 140, 144, 143, 214, 146, 213, 143, 181, 181, 140, + 143, 140, 140, 143, 143, 143, 143, 21, 146, 163, + 219, 36, 146, 143, 143, 181, 181, 181, 213, 211, + 146, 163, 21, 143, 143, 143, 140, 211, 213, 21, + 140, 76, 213, 21, 21, 213, 213 }; -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -#endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int -#endif - #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) @@ -2324,26 +2324,59 @@ do \ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up");\ + { \ + yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) + #define YYTERROR 1 #define YYERRCODE 256 -/* YYLLOC_DEFAULT -- Compute the default location (before the actions - are run). */ +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - ((Current).first_line = (Rhs)[1].first_line, \ - (Current).first_column = (Rhs)[1].first_column, \ - (Current).last_line = (Rhs)[N].last_line, \ - (Current).last_column = (Rhs)[N].last_column) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# 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) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif #endif + /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM @@ -2366,19 +2399,13 @@ do { \ YYFPRINTF Args; \ } while (0) -# define YYDSYMPRINT(Args) \ -do { \ - if (yydebug) \ - yysymprint Args; \ -} while (0) - -# define YYDSYMPRINTF(Title, Token, Value, Location) \ +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ - yysymprint (stderr, \ - Token, Value); \ + yysymprint (stderr, \ + Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) @@ -2390,12 +2417,12 @@ do { \ #if defined (__STDC__) || defined (__cplusplus) static void -yy_stack_print (short *bottom, short *top) +yy_stack_print (short int *bottom, short int *top) #else static void yy_stack_print (bottom, top) - short *bottom; - short *top; + short int *bottom; + short int *top; #endif { YYFPRINTF (stderr, "Stack now"); @@ -2425,13 +2452,13 @@ yy_reduce_print (yyrule) #endif { int yyi; - unsigned int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + 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, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); } # define YY_REDUCE_PRINT(Rule) \ @@ -2445,8 +2472,7 @@ do { \ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) -# define YYDSYMPRINT(Args) -# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ @@ -2461,13 +2487,9 @@ int yydebug; if the built-in stack extension method is used). Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ -#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 -# undef YYMAXDEPTH -#endif - #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif @@ -2489,7 +2511,7 @@ yystrlen (yystr) const char *yystr; # endif { - register const char *yys = yystr; + const char *yys = yystr; while (*yys++ != '\0') continue; @@ -2514,8 +2536,8 @@ yystpcpy (yydest, yysrc) const char *yysrc; # endif { - register char *yyd = yydest; - register const char *yys = yysrc; + char *yyd = yydest; + const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; @@ -2525,7 +2547,55 @@ yystpcpy (yydest, yysrc) # endif # endif -#endif /* !YYERROR_VERBOSE */ +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ @@ -2549,15 +2619,15 @@ yysymprint (yyoutput, yytype, yyvaluep) (void) yyvaluep; if (yytype < YYNTOKENS) - { - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); -# ifdef YYPRINT - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - } + 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: @@ -2573,10 +2643,11 @@ yysymprint (yyoutput, yytype, yyvaluep) #if defined (__STDC__) || defined (__cplusplus) static void -yydestruct (int yytype, YYSTYPE *yyvaluep) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void -yydestruct (yytype, yyvaluep) +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif @@ -2584,6 +2655,10 @@ yydestruct (yytype, yyvaluep) /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + switch (yytype) { @@ -2611,10 +2686,10 @@ int yyparse (); -/* The lookahead symbol. */ +/* The look-ahead symbol. */ int yychar; -/* The semantic value of the lookahead symbol. */ +/* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ @@ -2645,12 +2720,12 @@ yyparse () #endif { - register int yystate; - register int yyn; + int yystate; + int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; - /* Lookahead token as an internal (translated) token number. */ + /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; /* Three stacks and their tools: @@ -2662,14 +2737,14 @@ yyparse () to reallocate them elsewhere. */ /* The state stack. */ - short yyssa[YYINITDEPTH]; - short *yyss = yyssa; - register short *yyssp; + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; - register YYSTYPE *yyvsp; + YYSTYPE *yyvsp; @@ -2726,14 +2801,14 @@ yyparse () these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; + short int *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", + yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), @@ -2744,21 +2819,21 @@ yyparse () } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE - goto yyoverflowlab; + goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyoverflowlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { - short *yyss1 = yyss; + short int *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) - goto yyoverflowlab; + goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); @@ -2790,18 +2865,18 @@ yyparse () yybackup: /* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ +/* Read a look-ahead token if we need one and don't already have one. */ /* yyresume: */ - /* First try to decide what to do without reference to lookahead token. */ + /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; - /* Not known => get a lookahead token if don't already have one. */ + /* Not known => get a look-ahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); @@ -2816,7 +2891,7 @@ yybackup: else { yytoken = YYTRANSLATE (yychar); - YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to @@ -2836,8 +2911,8 @@ yybackup: if (yyn == YYFINAL) YYACCEPT; - /* Shift the lookahead token. */ - YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) @@ -2887,712 +2962,702 @@ yyreduce: switch (yyn) { case 3: -#line 991 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 989 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! + if ((yyvsp[0].UIntVal) > (uint32_t)INT32_MAX) // Outside of my range! GEN_ERROR("Value too large for type!"); - yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; + (yyval.SIntVal) = (int32_t)(yyvsp[0].UIntVal); CHECK_FOR_ERROR ;} break; - case 5: -#line 1000 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { - if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! - GEN_ERROR("Value too large for type!"); - yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; - CHECK_FOR_ERROR -;} + case 31: +#line 1005 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_EQ; ;} + break; + + case 32: +#line 1005 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_NE; ;} + break; + + case 33: +#line 1006 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SLT; ;} + break; + + case 34: +#line 1006 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SGT; ;} + break; + + case 35: +#line 1007 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SLE; ;} + break; + + case 36: +#line 1007 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_SGE; ;} + break; + + case 37: +#line 1008 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_ULT; ;} + break; + + case 38: +#line 1008 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_UGT; ;} break; case 39: -#line 1017 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_EQ; ;} +#line 1009 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_ULE; ;} break; case 40: -#line 1017 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_NE; ;} +#line 1009 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.IPredicate) = ICmpInst::ICMP_UGE; ;} break; case 41: -#line 1018 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_SLT; ;} +#line 1013 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OEQ; ;} break; case 42: -#line 1018 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_SGT; ;} +#line 1013 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ONE; ;} break; case 43: -#line 1019 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_SLE; ;} +#line 1014 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OLT; ;} break; case 44: -#line 1019 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_SGE; ;} +#line 1014 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OGT; ;} break; case 45: -#line 1020 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_ULT; ;} +#line 1015 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OLE; ;} break; case 46: -#line 1020 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_UGT; ;} +#line 1015 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_OGE; ;} break; case 47: -#line 1021 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_ULE; ;} +#line 1016 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ORD; ;} break; case 48: -#line 1021 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.IPredicate = ICmpInst::ICMP_UGE; ;} +#line 1016 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UNO; ;} break; case 49: -#line 1025 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_OEQ; ;} +#line 1017 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UEQ; ;} break; case 50: -#line 1025 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_ONE; ;} +#line 1017 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UNE; ;} break; case 51: -#line 1026 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_OLT; ;} +#line 1018 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ULT; ;} break; case 52: -#line 1026 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_OGT; ;} +#line 1018 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UGT; ;} break; case 53: -#line 1027 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_OLE; ;} +#line 1019 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_ULE; ;} break; case 54: -#line 1027 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_OGE; ;} +#line 1019 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_UGE; ;} break; case 55: -#line 1028 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_ORD; ;} +#line 1020 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_TRUE; ;} break; case 56: -#line 1028 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_UNO; ;} +#line 1021 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.FPredicate) = FCmpInst::FCMP_FALSE; ;} break; - case 57: -#line 1029 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_UEQ; ;} + case 69: +#line 1032 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = (yyvsp[-1].StrVal); + CHECK_FOR_ERROR + ;} break; - case 58: -#line 1029 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_UNE; ;} + case 70: +#line 1036 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { + (yyval.StrVal) = 0; + CHECK_FOR_ERROR + ;} break; - case 59: -#line 1030 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_ULT; ;} + case 71: +#line 1041 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::InternalLinkage; ;} break; - case 60: -#line 1030 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_UGT; ;} + case 72: +#line 1042 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::LinkOnceLinkage; ;} break; - case 61: -#line 1031 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_ULE; ;} + case 73: +#line 1043 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::WeakLinkage; ;} break; - case 62: -#line 1031 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_UGE; ;} + case 74: +#line 1044 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::AppendingLinkage; ;} break; - case 63: -#line 1032 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_TRUE; ;} + case 75: +#line 1045 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLImportLinkage; ;} break; - case 64: -#line 1033 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.FPredicate = FCmpInst::FCMP_FALSE; ;} + case 76: +#line 1046 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::DLLExportLinkage; ;} break; case 77: -#line 1044 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { - yyval.StrVal = yyvsp[-1].StrVal; - CHECK_FOR_ERROR - ;} +#line 1047 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalWeakLinkage; ;} break; case 78: -#line 1048 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { - yyval.StrVal = 0; - CHECK_FOR_ERROR - ;} +#line 1048 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Linkage) = GlobalValue::ExternalLinkage; ;} break; case 79: -#line 1053 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::InternalLinkage; ;} +#line 1050 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} break; case 80: -#line 1054 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;} +#line 1051 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::C; ;} break; case 81: -#line 1055 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::WeakLinkage; ;} +#line 1052 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::CSRet; ;} break; case 82: -#line 1056 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::AppendingLinkage; ;} +#line 1053 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Fast; ;} break; case 83: -#line 1057 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::DLLImportLinkage; ;} +#line 1054 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::Cold; ;} break; case 84: -#line 1058 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::DLLExportLinkage; ;} +#line 1055 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_StdCall; ;} break; case 85: -#line 1059 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::ExternalWeakLinkage; ;} +#line 1056 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = CallingConv::X86_FastCall; ;} break; case 86: -#line 1060 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Linkage = GlobalValue::ExternalLinkage; ;} - break; - - case 87: -#line 1062 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::C; ;} - break; - - case 88: -#line 1063 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::C; ;} - break; - - case 89: -#line 1064 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::CSRet; ;} - break; - - case 90: -#line 1065 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::Fast; ;} - break; - - case 91: -#line 1066 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::Cold; ;} - break; - - case 92: -#line 1067 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::X86_StdCall; ;} - break; - - case 93: -#line 1068 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = CallingConv::X86_FastCall; ;} - break; - - case 94: -#line 1069 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 1057 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) + if ((unsigned)(yyvsp[0].UInt64Val) != (yyvsp[0].UInt64Val)) GEN_ERROR("Calling conv too large!"); - yyval.UIntVal = yyvsp[0].UInt64Val; + (yyval.UIntVal) = (yyvsp[0].UInt64Val); CHECK_FOR_ERROR ;} break; - case 95: -#line 1078 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = 0; ;} + case 87: +#line 1066 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} break; - case 96: -#line 1079 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 88: +#line 1067 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR ;} break; - case 97: -#line 1085 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.UIntVal = 0; ;} + case 89: +#line 1073 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.UIntVal) = 0; ;} break; - case 98: -#line 1086 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 90: +#line 1074 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + (yyval.UIntVal) = (yyvsp[0].UInt64Val); + if ((yyval.UIntVal) != 0 && !isPowerOf2_32((yyval.UIntVal))) GEN_ERROR("Alignment must be a power of two!"); CHECK_FOR_ERROR ;} break; - case 99: -#line 1094 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 91: +#line 1082 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.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[0].StrVal)); i != e; ++i) + if ((yyvsp[0].StrVal)[i] == '"' || (yyvsp[0].StrVal)[i] == '\\') GEN_ERROR("Invalid character in section name!"); - yyval.StrVal = yyvsp[0].StrVal; + (yyval.StrVal) = (yyvsp[0].StrVal); CHECK_FOR_ERROR ;} break; - case 100: -#line 1102 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.StrVal = 0; ;} + case 92: +#line 1090 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} break; - case 101: -#line 1103 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.StrVal = yyvsp[0].StrVal; ;} + case 93: +#line 1091 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = (yyvsp[0].StrVal); ;} break; - case 102: -#line 1108 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 94: +#line 1096 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" {;} break; - case 103: -#line 1109 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 95: +#line 1097 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" {;} break; - case 104: -#line 1110 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 96: +#line 1098 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurGV->setSection(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + CurGV->setSection((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR ;} break; - case 105: -#line 1115 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 97: +#line 1103 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) + if ((yyvsp[0].UInt64Val) != 0 && !isPowerOf2_32((yyvsp[0].UInt64Val))) GEN_ERROR("Alignment must be a power of two!"); - CurGV->setAlignment(yyvsp[0].UInt64Val); + CurGV->setAlignment((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} break; - case 107: -#line 1129 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + case 99: +#line 1117 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} break; - case 109: -#line 1130 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + case 101: +#line 1118 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); ;} break; - case 110: -#line 1132 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 102: +#line 1120 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) - GEN_ERROR("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); - yyval.TypeVal = yyvsp[0].TypeVal; + GEN_ERROR("Invalid upreference in type: " + (*(yyvsp[0].TypeVal))->getDescription()); + (yyval.TypeVal) = (yyvsp[0].TypeVal); CHECK_FOR_ERROR ;} break; - case 124: -#line 1144 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 116: +#line 1132 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TypeVal = new PATypeHolder(OpaqueType::get()); + (yyval.TypeVal) = new PATypeHolder(OpaqueType::get()); CHECK_FOR_ERROR ;} break; - case 125: -#line 1148 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 117: +#line 1136 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); + (yyval.TypeVal) = new PATypeHolder((yyvsp[0].PrimType)); CHECK_FOR_ERROR ;} break; - case 126: -#line 1152 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 118: +#line 1140 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Named types are also simple types... - const Type* tmp = getTypeVal(yyvsp[0].ValIDVal); + const Type* tmp = getTypeVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.TypeVal = new PATypeHolder(tmp); + (yyval.TypeVal) = new PATypeHolder(tmp); ;} break; - case 127: -#line 1160 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 119: +#line 1148 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Type UpReference - if (yyvsp[0].UInt64Val > (uint64_t)~0U) GEN_ERROR("Value out of range!"); + if ((yyvsp[0].UInt64Val) > (uint64_t)~0U) GEN_ERROR("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder - UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... - yyval.TypeVal = new PATypeHolder(OT); + UpRefs.push_back(UpRefRecord((unsigned)(yyvsp[0].UInt64Val), OT)); // Add to vector... + (yyval.TypeVal) = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); CHECK_FOR_ERROR ;} break; - case 128: -#line 1168 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 120: +#line 1156 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Function derived type? std::vector Params; - for (std::list::iterator I = yyvsp[-1].TypeList->begin(), - E = yyvsp[-1].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), + E = (yyvsp[-1].TypeList)->end(); I != E; ++I) Params.push_back(*I); bool isVarArg = Params.size() && Params.back() == Type::VoidTy; if (isVarArg) Params.pop_back(); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); - delete yyvsp[-1].TypeList; // Delete the argument list - delete yyvsp[-3].TypeVal; // Delete the return type handle + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(FunctionType::get(*(yyvsp[-3].TypeVal),Params,isVarArg))); + delete (yyvsp[-1].TypeList); // Delete the argument list + delete (yyvsp[-3].TypeVal); // Delete the return type handle CHECK_FOR_ERROR ;} break; - case 129: -#line 1181 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 121: +#line 1169 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Sized array type? - yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(ArrayType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 130: -#line 1186 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 122: +#line 1174 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Packed array type? - const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); - if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) + const llvm::Type* ElemTy = (yyvsp[-1].TypeVal)->get(); + if ((unsigned)(yyvsp[-3].UInt64Val) != (yyvsp[-3].UInt64Val)) GEN_ERROR("Unsigned result not equal to signed result"); if (!ElemTy->isPrimitiveType()) GEN_ERROR("Elemental type of a PackedType must be primitive"); - if (!isPowerOf2_32(yyvsp[-3].UInt64Val)) + if (!isPowerOf2_32((yyvsp[-3].UInt64Val))) GEN_ERROR("Vector length should be a power of 2!"); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PackedType::get(*(yyvsp[-1].TypeVal), (unsigned)(yyvsp[-3].UInt64Val)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 131: -#line 1198 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 123: +#line 1186 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Structure type? std::vector Elements; - for (std::list::iterator I = yyvsp[-1].TypeList->begin(), - E = yyvsp[-1].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-1].TypeList)->begin(), + E = (yyvsp[-1].TypeList)->end(); I != E; ++I) Elements.push_back(*I); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); - delete yyvsp[-1].TypeList; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + delete (yyvsp[-1].TypeList); CHECK_FOR_ERROR ;} break; - case 132: -#line 1208 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 124: +#line 1196 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Empty structure type? - yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); + (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector())); CHECK_FOR_ERROR ;} break; - case 133: -#line 1212 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 125: +#line 1200 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { std::vector Elements; - for (std::list::iterator I = yyvsp[-2].TypeList->begin(), - E = yyvsp[-2].TypeList->end(); I != E; ++I) + for (std::list::iterator I = (yyvsp[-2].TypeList)->begin(), + E = (yyvsp[-2].TypeList)->end(); I != E; ++I) Elements.push_back(*I); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); - delete yyvsp[-2].TypeList; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(StructType::get(Elements, true))); + delete (yyvsp[-2].TypeList); CHECK_FOR_ERROR ;} break; - case 134: -#line 1222 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 126: +#line 1210 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Empty structure type? - yyval.TypeVal = new PATypeHolder(StructType::get(std::vector(), true)); + (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector(), true)); CHECK_FOR_ERROR ;} break; - case 135: -#line 1226 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 127: +#line 1214 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Pointer type? - if (*yyvsp[-1].TypeVal == Type::LabelTy) + if (*(yyvsp[-1].TypeVal) == Type::LabelTy) GEN_ERROR("Cannot form a pointer to a basic block"); - yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); - delete yyvsp[-1].TypeVal; + (yyval.TypeVal) = new PATypeHolder(HandleUpRefs(PointerType::get(*(yyvsp[-1].TypeVal)))); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 136: -#line 1237 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 128: +#line 1225 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TypeList = new std::list(); - yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + (yyval.TypeList) = new std::list(); + (yyval.TypeList)->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR ;} break; - case 137: -#line 1242 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 129: +#line 1230 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(*(yyvsp[0].TypeVal)); delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR ;} break; - case 139: -#line 1249 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 131: +#line 1237 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); + ((yyval.TypeList)=(yyvsp[-2].TypeList))->push_back(Type::VoidTy); CHECK_FOR_ERROR ;} break; - case 140: -#line 1253 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 132: +#line 1241 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - (yyval.TypeList = new std::list())->push_back(Type::VoidTy); + ((yyval.TypeList) = new std::list())->push_back(Type::VoidTy); CHECK_FOR_ERROR ;} break; - case 141: -#line 1257 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 133: +#line 1245 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TypeList = new std::list(); + (yyval.TypeList) = new std::list(); CHECK_FOR_ERROR ;} break; - case 142: -#line 1268 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 134: +#line 1256 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr - const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); + const ArrayType *ATy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->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[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized array initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantArray::get(ATy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR ;} break; - case 143: -#line 1294 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 135: +#line 1282 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) GEN_ERROR("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +"!"); - yyval.ConstVal = ConstantArray::get(ATy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantArray::get(ATy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR ;} break; - case 144: -#line 1308 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 136: +#line 1296 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + const ArrayType *ATy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (ATy == 0) GEN_ERROR("Cannot make array constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); - char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); - if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal)) + char *EndStr = UnEscapeLexed((yyvsp[0].StrVal), true); + if (NumElements != -1 && NumElements != (EndStr-(yyvsp[0].StrVal))) GEN_ERROR("Can't build string constant of size " + - itostr((int)(EndStr-yyvsp[0].StrVal)) + + itostr((int)(EndStr-(yyvsp[0].StrVal))) + " when array has size " + itostr(NumElements) + "!"); std::vector Vals; if (ETy == Type::SByteTy) { - for (signed char *C = (signed char *)yyvsp[0].StrVal; C != (signed char *)EndStr; ++C) + for (signed char *C = (signed char *)(yyvsp[0].StrVal); C != (signed char *)EndStr; ++C) Vals.push_back(ConstantInt::get(ETy, *C)); } else if (ETy == Type::UByteTy) { - for (unsigned char *C = (unsigned char *)yyvsp[0].StrVal; + for (unsigned char *C = (unsigned char *)(yyvsp[0].StrVal); C != (unsigned char*)EndStr; ++C) Vals.push_back(ConstantInt::get(ETy, *C)); } else { - free(yyvsp[0].StrVal); + free((yyvsp[0].StrVal)); GEN_ERROR("Cannot build string arrays of non byte sized elements!"); } - free(yyvsp[0].StrVal); - yyval.ConstVal = ConstantArray::get(ATy, Vals); - delete yyvsp[-2].TypeVal; + free((yyvsp[0].StrVal)); + (yyval.ConstVal) = ConstantArray::get(ATy, Vals); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR ;} break; - case 145: -#line 1338 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 137: +#line 1326 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr - const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); + const PackedType *PTy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make packed constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->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[-1].ConstVector)->size()) GEN_ERROR("Type mismatch: constant sized packed initialized with " + - utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + utostr((yyvsp[-1].ConstVector)->size()) + " arguments, but has size of " + itostr(NumElements) + "!"); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '"+ - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantPacked::get(PTy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR ;} break; - case 146: -#line 1364 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 138: +#line 1352 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); + const StructType *STy = dyn_cast((yyvsp[-3].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-3].TypeVal))->getDescription() + "'!"); - if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes()) + if ((yyvsp[-1].ConstVector)->size() != STy->getNumContainedTypes()) GEN_ERROR("Illegal number of initializers for structure type!"); // Check to ensure that constants are compatible with the type initializer! - for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) - if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i)) + for (unsigned i = 0, e = (yyvsp[-1].ConstVector)->size(); i != e; ++i) + if ((*(yyvsp[-1].ConstVector))[i]->getType() != STy->getElementType(i)) GEN_ERROR("Expected type '" + STy->getElementType(i)->getDescription() + "' for element #" + utostr(i) + " of structure initializer!"); - yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); - delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + (yyval.ConstVal) = ConstantStruct::get(STy, *(yyvsp[-1].ConstVector)); + delete (yyvsp[-3].TypeVal); delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR ;} break; - case 147: -#line 1385 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 139: +#line 1373 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); + const StructType *STy = dyn_cast((yyvsp[-2].TypeVal)->get()); if (STy == 0) GEN_ERROR("Cannot make struct constant with type: '" + - (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-2].TypeVal))->getDescription() + "'!"); if (STy->getNumContainedTypes() != 0) GEN_ERROR("Illegal number of initializers for structure type!"); - yyval.ConstVal = ConstantStruct::get(STy, std::vector()); - delete yyvsp[-2].TypeVal; + (yyval.ConstVal) = ConstantStruct::get(STy, std::vector()); + delete (yyvsp[-2].TypeVal); CHECK_FOR_ERROR ;} break; - case 148: -#line 1398 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 140: +#line 1386 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); + const PointerType *PTy = dyn_cast((yyvsp[-1].TypeVal)->get()); if (PTy == 0) GEN_ERROR("Cannot make null pointer constant with type: '" + - (*yyvsp[-1].TypeVal)->getDescription() + "'!"); + (*(yyvsp[-1].TypeVal))->getDescription() + "'!"); - yyval.ConstVal = ConstantPointerNull::get(PTy); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = ConstantPointerNull::get(PTy); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 149: -#line 1408 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 141: +#line 1396 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = UndefValue::get((yyvsp[-1].TypeVal)->get()); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 150: -#line 1413 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 142: +#line 1401 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); + const PointerType *Ty = dyn_cast((yyvsp[-1].TypeVal)->get()); if (Ty == 0) GEN_ERROR("Global const reference must be a pointer type!"); @@ -3606,7 +3671,7 @@ yyreduce: Function *SavedCurFn = CurFun.CurrentFunction; CurFun.CurrentFunction = 0; - Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal); + Value *V = getValNonImprovising(Ty, (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR CurFun.CurrentFunction = SavedCurFn; @@ -3621,14 +3686,14 @@ yyreduce: // 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[0].ValIDVal))); if (I != CurModule.GlobalRefs.end()) { V = I->second; // Placeholder already exists, use it... - yyvsp[0].ValIDVal.destroy(); + (yyvsp[0].ValIDVal).destroy(); } else { std::string Name; - if (yyvsp[0].ValIDVal.Type == ValID::NameVal) Name = yyvsp[0].ValIDVal.Name; + if ((yyvsp[0].ValIDVal).Type == ValID::NameVal) Name = (yyvsp[0].ValIDVal).Name; // Create the forward referenced global. GlobalValue *GV; @@ -3643,308 +3708,318 @@ yyreduce: } // 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[0].ValIDVal)), GV)); V = GV; } } - yyval.ConstVal = cast(V); - delete yyvsp[-1].TypeVal; // Free the type handle + (yyval.ConstVal) = cast(V); + delete (yyvsp[-1].TypeVal); // Free the type handle CHECK_FOR_ERROR ;} break; - case 151: -#line 1474 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 143: +#line 1462 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) + if ((yyvsp[-1].TypeVal)->get() != (yyvsp[0].ConstVal)->getType()) GEN_ERROR("Mismatched types for constant expression!"); - yyval.ConstVal = yyvsp[0].ConstVal; - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = (yyvsp[0].ConstVal); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 152: -#line 1481 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 144: +#line 1469 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const Type *Ty = yyvsp[-1].TypeVal->get(); + const Type *Ty = (yyvsp[-1].TypeVal)->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) GEN_ERROR("Cannot create a null initialized value of this type!"); - yyval.ConstVal = Constant::getNullValue(Ty); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = Constant::getNullValue(Ty); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 153: -#line 1489 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 145: +#line 1477 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // integral constants - if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) GEN_ERROR("Constant value doesn't fit in type!"); - yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)); CHECK_FOR_ERROR ;} break; - case 154: -#line 1495 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { // integral constants - if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) + case 146: +#line 1483 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) GEN_ERROR("Constant value doesn't fit in type!"); - yyval.ConstVal = ConstantInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} break; - case 155: -#line 1501 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { // Boolean constants - yyval.ConstVal = ConstantBool::getTrue(); + case 147: +#line 1489 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val))) + GEN_ERROR("Constant value doesn't fit in type!"); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} break; - case 156: -#line 1505 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { // Boolean constants - yyval.ConstVal = ConstantBool::getFalse(); + case 148: +#line 1495 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { + if (!ConstantInt::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val))) + GEN_ERROR("Constant value doesn't fit in type!"); + (yyval.ConstVal) = ConstantInt::get((yyvsp[-1].PrimType), (yyvsp[0].SInt64Val)); CHECK_FOR_ERROR ;} break; - case 157: -#line 1509 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 149: +#line 1501 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + (yyval.ConstVal) = ConstantBool::getTrue(); + CHECK_FOR_ERROR + ;} + break; + + case 150: +#line 1505 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + (yyval.ConstVal) = ConstantBool::getFalse(); + CHECK_FOR_ERROR + ;} + break; + + case 151: +#line 1509 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Float & Double constants - if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) + if (!ConstantFP::isValueValidForType((yyvsp[-1].PrimType), (yyvsp[0].FPVal))) GEN_ERROR("Floating point constant invalid for type!!"); - yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); + (yyval.ConstVal) = ConstantFP::get((yyvsp[-1].PrimType), (yyvsp[0].FPVal)); CHECK_FOR_ERROR ;} break; - case 158: -#line 1517 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 152: +#line 1517 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Constant *Val = yyvsp[-3].ConstVal; - const Type *Ty = yyvsp[-1].TypeVal->get(); + Constant *Val = (yyvsp[-3].ConstVal); + const Type *Ty = (yyvsp[-1].TypeVal)->get(); if (!Val->getType()->isFirstClassType()) GEN_ERROR("cast constant expression from a non-primitive type: '" + Val->getType()->getDescription() + "'!"); if (!Ty->isFirstClassType()) GEN_ERROR("cast constant expression to a non-primitive type: '" + Ty->getDescription() + "'!"); - yyval.ConstVal = ConstantExpr::getCast(yyvsp[-5].CastOpVal, yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); - delete yyvsp[-1].TypeVal; + (yyval.ConstVal) = ConstantExpr::getCast((yyvsp[-5].CastOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].TypeVal)->get()); + delete (yyvsp[-1].TypeVal); ;} break; - case 159: -#line 1529 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 153: +#line 1529 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!isa(yyvsp[-2].ConstVal->getType())) + if (!isa((yyvsp[-2].ConstVal)->getType())) GEN_ERROR("GetElementPtr requires a pointer operand!"); const Type *IdxTy = - GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), *yyvsp[-1].ValueList, true); + GetElementPtrInst::getIndexedType((yyvsp[-2].ConstVal)->getType(), *(yyvsp[-1].ValueList), true); if (!IdxTy) GEN_ERROR("Index list invalid for constant getelementptr!"); std::vector IdxVec; - for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i) - if (Constant *C = dyn_cast((*yyvsp[-1].ValueList)[i])) + for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i) + if (Constant *C = dyn_cast((*(yyvsp[-1].ValueList))[i])) IdxVec.push_back(C); else GEN_ERROR("Indices to constant getelementptr must be constants!"); - delete yyvsp[-1].ValueList; + delete (yyvsp[-1].ValueList); - yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); + (yyval.ConstVal) = ConstantExpr::getGetElementPtr((yyvsp[-2].ConstVal), IdxVec); CHECK_FOR_ERROR ;} break; - case 160: -#line 1550 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 154: +#line 1550 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) + if ((yyvsp[-5].ConstVal)->getType() != Type::BoolTy) GEN_ERROR("Select condition must be of boolean type!"); - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Select operand types must match!"); - yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getSelect((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 161: -#line 1558 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 155: +#line 1558 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Binary operator types must match!"); CHECK_FOR_ERROR; - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} break; - case 162: -#line 1564 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 156: +#line 1564 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("Logical operator types must match!"); - if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { - if (!isa(yyvsp[-3].ConstVal->getType()) || - !cast(yyvsp[-3].ConstVal->getType())->getElementType()->isIntegral()) + if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) { + if (!isa((yyvsp[-3].ConstVal)->getType()) || + !cast((yyvsp[-3].ConstVal)->getType())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].BinaryOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 163: -#line 1575 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) - GEN_ERROR("setcc operand types must match!"); - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - CHECK_FOR_ERROR - ;} - break; - - case 164: -#line 1581 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 157: +#line 1575 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("icmp operand types must match!"); - yyval.ConstVal = ConstantExpr::getICmp(yyvsp[-5].IPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getICmp((yyvsp[-5].IPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} break; - case 165: -#line 1586 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 158: +#line 1580 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + if ((yyvsp[-3].ConstVal)->getType() != (yyvsp[-1].ConstVal)->getType()) GEN_ERROR("fcmp operand types must match!"); - yyval.ConstVal = ConstantExpr::getFCmp(yyvsp[-5].FPredicate, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getFCmp((yyvsp[-5].FPredicate), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); ;} break; - case 166: -#line 1591 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 159: +#line 1585 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) + if ((yyvsp[-1].ConstVal)->getType() != Type::UByteTy) GEN_ERROR("Shift count for shift constant must be unsigned byte!"); - if (!yyvsp[-3].ConstVal->getType()->isInteger()) + if (!(yyvsp[-3].ConstVal)->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); CHECK_FOR_ERROR; - yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::get((yyvsp[-5].OtherOpVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 167: -#line 1600 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 160: +#line 1594 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!ExtractElementInst::isValidOperands(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + if (!ExtractElementInst::isValidOperands((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid extractelement operands!"); - yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getExtractElement((yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 168: -#line 1606 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 161: +#line 1600 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!InsertElementInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + if (!InsertElementInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid insertelement operands!"); - yyval.ConstVal = ConstantExpr::getInsertElement(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getInsertElement((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 169: -#line 1612 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 162: +#line 1606 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!ShuffleVectorInst::isValidOperands(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal)) + if (!ShuffleVectorInst::isValidOperands((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal))) GEN_ERROR("Invalid shufflevector operands!"); - yyval.ConstVal = ConstantExpr::getShuffleVector(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + (yyval.ConstVal) = ConstantExpr::getShuffleVector((yyvsp[-5].ConstVal), (yyvsp[-3].ConstVal), (yyvsp[-1].ConstVal)); CHECK_FOR_ERROR ;} break; - case 170: -#line 1621 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 163: +#line 1615 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); + ((yyval.ConstVector) = (yyvsp[-2].ConstVector))->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR ;} break; - case 171: -#line 1625 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 164: +#line 1619 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ConstVector = new std::vector(); - yyval.ConstVector->push_back(yyvsp[0].ConstVal); + (yyval.ConstVector) = new std::vector(); + (yyval.ConstVector)->push_back((yyvsp[0].ConstVal)); CHECK_FOR_ERROR ;} break; - case 172: -#line 1633 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.BoolVal = false; ;} + case 165: +#line 1627 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = false; ;} break; - case 173: -#line 1633 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.BoolVal = true; ;} + case 166: +#line 1627 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.BoolVal) = true; ;} break; - case 174: -#line 1643 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 167: +#line 1637 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; + (yyval.ModuleVal) = ParserResult = (yyvsp[0].ModuleVal); CurModule.ModuleDone(); CHECK_FOR_ERROR; ;} break; - case 175: -#line 1651 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 168: +#line 1645 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = yyvsp[-1].ModuleVal; + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CurFun.FunctionDone(); CHECK_FOR_ERROR ;} break; - case 176: -#line 1656 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 169: +#line 1650 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = yyvsp[-1].ModuleVal; + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CHECK_FOR_ERROR ;} break; - case 177: -#line 1660 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 170: +#line 1654 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = yyvsp[-3].ModuleVal; + (yyval.ModuleVal) = (yyvsp[-3].ModuleVal); CHECK_FOR_ERROR ;} break; - case 178: -#line 1664 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 171: +#line 1658 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = yyvsp[-1].ModuleVal; + (yyval.ModuleVal) = (yyvsp[-1].ModuleVal); CHECK_FOR_ERROR ;} break; - case 179: -#line 1668 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 172: +#line 1662 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ModuleVal = CurModule.CurrentModule; + (yyval.ModuleVal) = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { const ValID &DID = CurModule.LateResolveTypes.begin()->first; @@ -3958,8 +4033,8 @@ yyreduce: ;} break; - case 180: -#line 1683 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 173: +#line 1677 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: @@ -3970,130 +4045,130 @@ yyreduce: // If types are not resolved eagerly, then the two types will not be // determined to be the same type! // - ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal); + ResolveTypeTo((yyvsp[-2].StrVal), *(yyvsp[0].TypeVal)); - if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { + if (!setTypeName(*(yyvsp[0].TypeVal), (yyvsp[-2].StrVal)) && !(yyvsp[-2].StrVal)) { CHECK_FOR_ERROR // If this is a named type that is not a redefinition, add it to the slot // table. - CurModule.Types.push_back(*yyvsp[0].TypeVal); + CurModule.Types.push_back(*(yyvsp[0].TypeVal)); } - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR ;} break; - case 181: -#line 1705 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 174: +#line 1699 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Function prototypes can be in const pool CHECK_FOR_ERROR ;} break; - case 182: -#line 1708 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 175: +#line 1702 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Asm blocks can be in the const pool CHECK_FOR_ERROR ;} break; - case 183: -#line 1711 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 176: +#line 1705 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[0].ConstVal == 0) + if ((yyvsp[0].ConstVal) == 0) GEN_ERROR("Global value initializer is not a constant!"); - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), (yyvsp[-2].Linkage), (yyvsp[-1].BoolVal), (yyvsp[0].ConstVal)->getType(), (yyvsp[0].ConstVal)); CHECK_FOR_ERROR ;} break; - case 184: -#line 1716 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 177: +#line 1710 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ;} break; - case 185: -#line 1719 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 178: +#line 1713 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); ;} break; - case 186: -#line 1723 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 179: +#line 1717 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; CHECK_FOR_ERROR ;} break; - case 187: -#line 1727 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 180: +#line 1721 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::DLLImportLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + CurGV = ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::DLLImportLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); ;} break; - case 188: -#line 1731 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 181: +#line 1725 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; CHECK_FOR_ERROR ;} break; - case 189: -#line 1735 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 182: +#line 1729 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = - ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalWeakLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + ParseGlobalVariable((yyvsp[-3].StrVal), GlobalValue::ExternalWeakLinkage, (yyvsp[-1].BoolVal), *(yyvsp[0].TypeVal), 0); CHECK_FOR_ERROR - delete yyvsp[0].TypeVal; + delete (yyvsp[0].TypeVal); ;} break; - case 190: -#line 1740 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 183: +#line 1734 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; CHECK_FOR_ERROR ;} break; - case 191: -#line 1744 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 184: +#line 1738 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; - case 192: -#line 1747 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 185: +#line 1741 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; - case 193: -#line 1750 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 186: +#line 1744 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { ;} break; - case 194: -#line 1754 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 187: +#line 1748 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.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[0].StrVal), true); + std::string NewAsm((yyvsp[0].StrVal), EndStr); + free((yyvsp[0].StrVal)); if (AsmSoFar.empty()) CurModule.CurrentModule->setModuleInlineAsm(NewAsm); @@ -4103,171 +4178,171 @@ yyreduce: ;} break; - case 195: -#line 1767 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Endianness = Module::BigEndian; ;} + case 188: +#line 1761 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Endianness) = Module::BigEndian; ;} break; - case 196: -#line 1768 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.Endianness = Module::LittleEndian; ;} + case 189: +#line 1762 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.Endianness) = Module::LittleEndian; ;} break; - case 197: -#line 1770 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 190: +#line 1764 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); + CurModule.CurrentModule->setEndianness((yyvsp[0].Endianness)); CHECK_FOR_ERROR ;} break; - case 198: -#line 1774 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 191: +#line 1768 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[0].UInt64Val == 32) + if ((yyvsp[0].UInt64Val) == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); - else if (yyvsp[0].UInt64Val == 64) + else if ((yyvsp[0].UInt64Val) == 64) CurModule.CurrentModule->setPointerSize(Module::Pointer64); else - GEN_ERROR("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); + GEN_ERROR("Invalid pointer size: '" + utostr((yyvsp[0].UInt64Val)) + "'!"); CHECK_FOR_ERROR ;} break; - case 199: -#line 1783 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 192: +#line 1777 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + CurModule.CurrentModule->setTargetTriple((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); ;} break; - case 200: -#line 1787 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 193: +#line 1781 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurModule.CurrentModule->setDataLayout(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + CurModule.CurrentModule->setDataLayout((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); ;} break; - case 202: -#line 1794 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 195: +#line 1788 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR ;} break; - case 203: -#line 1799 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 196: +#line 1793 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); - free(yyvsp[0].StrVal); + CurModule.CurrentModule->addLibrary((yyvsp[0].StrVal)); + free((yyvsp[0].StrVal)); CHECK_FOR_ERROR ;} break; - case 204: -#line 1804 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 197: +#line 1798 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CHECK_FOR_ERROR ;} break; - case 208: -#line 1814 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.StrVal = 0; ;} + case 201: +#line 1808 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.StrVal) = 0; ;} break; - case 209: -#line 1816 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 202: +#line 1810 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (*yyvsp[-1].TypeVal == Type::VoidTy) + if (*(yyvsp[-1].TypeVal) == Type::VoidTy) GEN_ERROR("void typed arguments are invalid!"); - yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); + (yyval.ArgVal) = new std::pair((yyvsp[-1].TypeVal), (yyvsp[0].StrVal)); CHECK_FOR_ERROR ;} break; - case 210: -#line 1823 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 203: +#line 1817 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = yyvsp[-2].ArgList; - yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); - delete yyvsp[0].ArgVal; + (yyval.ArgList) = (yyvsp[-2].ArgList); + (yyvsp[-2].ArgList)->push_back(*(yyvsp[0].ArgVal)); + delete (yyvsp[0].ArgVal); CHECK_FOR_ERROR ;} break; - case 211: -#line 1829 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 204: +#line 1823 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = new std::vector >(); - yyval.ArgList->push_back(*yyvsp[0].ArgVal); - delete yyvsp[0].ArgVal; + (yyval.ArgList) = new std::vector >(); + (yyval.ArgList)->push_back(*(yyvsp[0].ArgVal)); + delete (yyvsp[0].ArgVal); CHECK_FOR_ERROR ;} break; - case 212: -#line 1836 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 205: +#line 1830 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = yyvsp[0].ArgList; + (yyval.ArgList) = (yyvsp[0].ArgList); CHECK_FOR_ERROR ;} break; - case 213: -#line 1840 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 206: +#line 1834 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = yyvsp[-2].ArgList; - yyval.ArgList->push_back(std::pairpush_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); CHECK_FOR_ERROR ;} break; - case 214: -#line 1846 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 207: +#line 1840 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = new std::vector >(); - yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); + (yyval.ArgList) = new std::vector >(); + (yyval.ArgList)->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); CHECK_FOR_ERROR ;} break; - case 215: -#line 1851 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 208: +#line 1845 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ArgList = 0; + (yyval.ArgList) = 0; CHECK_FOR_ERROR ;} break; - case 216: -#line 1857 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 209: +#line 1851 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - UnEscapeLexed(yyvsp[-5].StrVal); - std::string FunctionName(yyvsp[-5].StrVal); - free(yyvsp[-5].StrVal); // Free strdup'd memory! + UnEscapeLexed((yyvsp[-5].StrVal)); + std::string FunctionName((yyvsp[-5].StrVal)); + free((yyvsp[-5].StrVal)); // Free strdup'd memory! - if (!(*yyvsp[-6].TypeVal)->isFirstClassType() && *yyvsp[-6].TypeVal != Type::VoidTy) + if (!(*(yyvsp[-6].TypeVal))->isFirstClassType() && *(yyvsp[-6].TypeVal) != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); std::vector ParamTypeList; - if (yyvsp[-3].ArgList) { // If there are arguments... - for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); - I != yyvsp[-3].ArgList->end(); ++I) + if ((yyvsp[-3].ArgList)) { // If there are arguments... + for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); + I != (yyvsp[-3].ArgList)->end(); ++I) ParamTypeList.push_back(I->first->get()); } bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; if (isVarArg) ParamTypeList.pop_back(); - const FunctionType *FT = FunctionType::get(*yyvsp[-6].TypeVal, ParamTypeList, isVarArg); + const FunctionType *FT = FunctionType::get(*(yyvsp[-6].TypeVal), ParamTypeList, isVarArg); const PointerType *PFT = PointerType::get(FT); - delete yyvsp[-6].TypeVal; + delete (yyvsp[-6].TypeVal); ValID ID; if (!FunctionName.empty()) { @@ -4311,24 +4386,24 @@ yyreduce: // 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[-7].UIntVal)); + Fn->setAlignment((yyvsp[0].UIntVal)); + if ((yyvsp[-1].StrVal)) { + Fn->setSection((yyvsp[-1].StrVal)); + free((yyvsp[-1].StrVal)); } // Add all of the arguments we parsed to the function... - if (yyvsp[-3].ArgList) { // Is null if empty... + if ((yyvsp[-3].ArgList)) { // Is null if empty... if (isVarArg) { // Nuke the last entry - assert(yyvsp[-3].ArgList->back().first->get() == Type::VoidTy && yyvsp[-3].ArgList->back().second == 0&& + assert((yyvsp[-3].ArgList)->back().first->get() == Type::VoidTy && (yyvsp[-3].ArgList)->back().second == 0&& "Not a varargs marker!"); - delete yyvsp[-3].ArgList->back().first; - yyvsp[-3].ArgList->pop_back(); // Delete the last entry + delete (yyvsp[-3].ArgList)->back().first; + (yyvsp[-3].ArgList)->pop_back(); // Delete the last entry } Function::arg_iterator ArgIt = Fn->arg_begin(); - for (std::vector >::iterator I = yyvsp[-3].ArgList->begin(); - I != yyvsp[-3].ArgList->end(); ++I, ++ArgIt) { + for (std::vector >::iterator I = (yyvsp[-3].ArgList)->begin(); + I != (yyvsp[-3].ArgList)->end(); ++I, ++ArgIt) { delete I->first; // Delete the typeholder... setValueName(ArgIt, I->second); // Insert arg into symtab... @@ -4336,140 +4411,140 @@ yyreduce: InsertValue(ArgIt); } - delete yyvsp[-3].ArgList; // We're now done with the argument list + delete (yyvsp[-3].ArgList); // We're now done with the argument list } CHECK_FOR_ERROR ;} break; - case 219: -#line 1953 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 212: +#line 1947 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.FunctionVal = CurFun.CurrentFunction; + (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[-2].Linkage)); ;} break; - case 222: -#line 1963 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 215: +#line 1957 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.FunctionVal = yyvsp[-1].FunctionVal; + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR ;} break; - case 224: -#line 1969 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 217: +#line 1963 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.Linkage = GlobalValue::DLLImportLinkage; ;} break; - case 225: -#line 1970 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 218: +#line 1964 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.Linkage = GlobalValue::ExternalWeakLinkage; ;} break; - case 226: -#line 1972 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 219: +#line 1966 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { CurFun.isDeclare = true; ;} break; - case 227: -#line 1972 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 220: +#line 1966 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.FunctionVal = CurFun.CurrentFunction; + (yyval.FunctionVal) = CurFun.CurrentFunction; CurFun.FunctionDone(); CHECK_FOR_ERROR ;} break; - case 228: -#line 1982 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 221: +#line 1976 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = false; + (yyval.BoolVal) = false; CHECK_FOR_ERROR ;} break; - case 229: -#line 1986 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 222: +#line 1980 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = true; + (yyval.BoolVal) = true; CHECK_FOR_ERROR ;} break; - case 230: -#line 1991 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 223: +#line 1985 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // A reference to a direct constant - yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); + (yyval.ValIDVal) = ValID::create((yyvsp[0].SInt64Val)); CHECK_FOR_ERROR ;} break; - case 231: -#line 1995 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 224: +#line 1989 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); + (yyval.ValIDVal) = ValID::create((yyvsp[0].UInt64Val)); CHECK_FOR_ERROR ;} break; - case 232: -#line 1999 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 225: +#line 1993 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Perhaps it's an FP constant? - yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); + (yyval.ValIDVal) = ValID::create((yyvsp[0].FPVal)); CHECK_FOR_ERROR ;} break; - case 233: -#line 2003 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 226: +#line 1997 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::create(ConstantBool::getTrue()); + (yyval.ValIDVal) = ValID::create(ConstantBool::getTrue()); CHECK_FOR_ERROR ;} break; - case 234: -#line 2007 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 227: +#line 2001 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::create(ConstantBool::getFalse()); + (yyval.ValIDVal) = ValID::create(ConstantBool::getFalse()); CHECK_FOR_ERROR ;} break; - case 235: -#line 2011 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 228: +#line 2005 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::createNull(); + (yyval.ValIDVal) = ValID::createNull(); CHECK_FOR_ERROR ;} break; - case 236: -#line 2015 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 229: +#line 2009 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::createUndef(); + (yyval.ValIDVal) = ValID::createUndef(); CHECK_FOR_ERROR ;} break; - case 237: -#line 2019 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 230: +#line 2013 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // A vector zero constant. - yyval.ValIDVal = ValID::createZeroInit(); + (yyval.ValIDVal) = ValID::createZeroInit(); CHECK_FOR_ERROR ;} break; - case 238: -#line 2023 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 231: +#line 2017 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized packed vector - const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); - int NumElements = yyvsp[-1].ConstVector->size(); + const Type *ETy = (*(yyvsp[-1].ConstVector))[0]->getType(); + int NumElements = (yyvsp[-1].ConstVector)->size(); PackedType* pt = PackedType::get(ETy, NumElements); PATypeHolder* PTy = new PATypeHolder( @@ -4481,112 +4556,112 @@ yyreduce: ); // Verify all elements are correct type! - for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { - if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + for (unsigned i = 0; i < (yyvsp[-1].ConstVector)->size(); i++) { + if (ETy != (*(yyvsp[-1].ConstVector))[i]->getType()) GEN_ERROR("Element #" + utostr(i) + " is not of type '" + ETy->getDescription() +"' as required!\nIt is of type '" + - (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + (*(yyvsp[-1].ConstVector))[i]->getType()->getDescription() + "'."); } - yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); - delete PTy; delete yyvsp[-1].ConstVector; + (yyval.ValIDVal) = ValID::create(ConstantPacked::get(pt, *(yyvsp[-1].ConstVector))); + delete PTy; delete (yyvsp[-1].ConstVector); CHECK_FOR_ERROR ;} break; - case 239: -#line 2048 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 232: +#line 2042 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); + (yyval.ValIDVal) = ValID::create((yyvsp[0].ConstVal)); CHECK_FOR_ERROR ;} break; - case 240: -#line 2052 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 233: +#line 2046 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.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[-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)); CHECK_FOR_ERROR ;} break; - case 241: -#line 2066 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 234: +#line 2060 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is it an integer reference...? - yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); + (yyval.ValIDVal) = ValID::create((yyvsp[0].SIntVal)); CHECK_FOR_ERROR ;} break; - case 242: -#line 2070 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 235: +#line 2064 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is it a named reference...? - yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); + (yyval.ValIDVal) = ValID::create((yyvsp[0].StrVal)); CHECK_FOR_ERROR ;} break; - case 245: -#line 2082 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 238: +#line 2076 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; + (yyval.ValueVal) = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 246: -#line 2087 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 239: +#line 2081 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.FunctionVal = yyvsp[-1].FunctionVal; + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR ;} break; - case 247: -#line 2091 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 240: +#line 2085 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Do not allow functions with 0 basic blocks - yyval.FunctionVal = yyvsp[-1].FunctionVal; + (yyval.FunctionVal) = (yyvsp[-1].FunctionVal); CHECK_FOR_ERROR ;} break; - case 248: -#line 2100 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 241: +#line 2094 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); + setValueName((yyvsp[0].TermInstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR - InsertValue(yyvsp[0].TermInstVal); + InsertValue((yyvsp[0].TermInstVal)); - yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); - InsertValue(yyvsp[-2].BasicBlockVal); - yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; + (yyvsp[-2].BasicBlockVal)->getInstList().push_back((yyvsp[0].TermInstVal)); + InsertValue((yyvsp[-2].BasicBlockVal)); + (yyval.BasicBlockVal) = (yyvsp[-2].BasicBlockVal); CHECK_FOR_ERROR ;} break; - case 249: -#line 2111 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 242: +#line 2105 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (CastInst *CI1 = dyn_cast(yyvsp[0].InstVal)) + if (CastInst *CI1 = dyn_cast((yyvsp[0].InstVal))) if (CastInst *CI2 = dyn_cast(CI1->getOperand(0))) if (CI2->getParent() == 0) - yyvsp[-1].BasicBlockVal->getInstList().push_back(CI2); - yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); - yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; + (yyvsp[-1].BasicBlockVal)->getInstList().push_back(CI2); + (yyvsp[-1].BasicBlockVal)->getInstList().push_back((yyvsp[0].InstVal)); + (yyval.BasicBlockVal) = (yyvsp[-1].BasicBlockVal); CHECK_FOR_ERROR ;} break; - case 250: -#line 2120 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 243: +#line 2114 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BasicBlockVal = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); + (yyval.BasicBlockVal) = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4594,15 +4669,15 @@ yyreduce: // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR ;} break; - case 251: -#line 2132 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 244: +#line 2126 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BasicBlockVal = getBBVal(ValID::create(yyvsp[0].StrVal), true); + (yyval.BasicBlockVal) = getBBVal(ValID::create((yyvsp[0].StrVal)), true); CHECK_FOR_ERROR // Make sure to move the basic block to the correct location in the @@ -4610,97 +4685,97 @@ yyreduce: // referenced. Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); - BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + BBL.splice(BBL.end(), BBL, (yyval.BasicBlockVal)); CHECK_FOR_ERROR ;} break; - case 252: -#line 2145 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 245: +#line 2139 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Return with a result... - yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); + (yyval.TermInstVal) = new ReturnInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 253: -#line 2149 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 246: +#line 2143 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Return with no result... - yyval.TermInstVal = new ReturnInst(); + (yyval.TermInstVal) = new ReturnInst(); CHECK_FOR_ERROR ;} break; - case 254: -#line 2153 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 247: +#line 2147 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Unconditional Branch... - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBB); + (yyval.TermInstVal) = new BranchInst(tmpBB); ;} break; - case 255: -#line 2158 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 248: +#line 2152 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - BasicBlock* tmpBBA = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock* tmpBBA = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal = getVal(Type::BoolTy, yyvsp[-6].ValIDVal); + Value* tmpVal = getVal(Type::BoolTy, (yyvsp[-6].ValIDVal)); CHECK_FOR_ERROR - yyval.TermInstVal = new BranchInst(tmpBBA, tmpBBB, tmpVal); + (yyval.TermInstVal) = new BranchInst(tmpBBA, tmpBBB, tmpVal); ;} break; - case 256: -#line 2167 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 249: +#line 2161 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Value* tmpVal = getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal); + Value* tmpVal = getVal((yyvsp[-7].PrimType), (yyvsp[-6].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - SwitchInst *S = new SwitchInst(tmpVal, tmpBB, yyvsp[-1].JumpTable->size()); - yyval.TermInstVal = S; + SwitchInst *S = new SwitchInst(tmpVal, tmpBB, (yyvsp[-1].JumpTable)->size()); + (yyval.TermInstVal) = S; - std::vector >::iterator I = yyvsp[-1].JumpTable->begin(), - E = yyvsp[-1].JumpTable->end(); + std::vector >::iterator I = (yyvsp[-1].JumpTable)->begin(), + E = (yyvsp[-1].JumpTable)->end(); for (; I != E; ++I) { if (ConstantInt *CI = dyn_cast(I->first)) S->addCase(CI, I->second); else GEN_ERROR("Switch case is constant, but not a simple integer!"); } - delete yyvsp[-1].JumpTable; + delete (yyvsp[-1].JumpTable); CHECK_FOR_ERROR ;} break; - case 257: -#line 2186 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 250: +#line 2180 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Value* tmpVal = getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal); + Value* tmpVal = getVal((yyvsp[-6].PrimType), (yyvsp[-5].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-2].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR SwitchInst *S = new SwitchInst(tmpVal, tmpBB, 0); - yyval.TermInstVal = S; + (yyval.TermInstVal) = S; CHECK_FOR_ERROR ;} break; - case 258: -#line 2196 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 251: +#line 2190 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy; const FunctionType *Ty; - if (!(PFTy = dyn_cast(yyvsp[-10].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-10].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if (yyvsp[-7].ValueList) { - for (std::vector::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end(); + if ((yyvsp[-7].ValueList)) { + for (std::vector::iterator I = (yyvsp[-7].ValueList)->begin(), E = (yyvsp[-7].ValueList)->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -4708,27 +4783,27 @@ yyreduce: bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - Ty = FunctionType::get(yyvsp[-10].TypeVal->get(), ParamTypes, isVarArg); + Ty = FunctionType::get((yyvsp[-10].TypeVal)->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-9].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-9].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR - BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock *Normal = getBBVal((yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal); + BasicBlock *Except = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR // Create the call node... - if (!yyvsp[-7].ValueList) { // Has no arguments? - yyval.TermInstVal = new InvokeInst(V, Normal, Except, std::vector()); + if (!(yyvsp[-7].ValueList)) { // Has no arguments? + (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = yyvsp[-7].ValueList->begin(), ArgE = yyvsp[-7].ValueList->end(); + std::vector::iterator ArgI = (yyvsp[-7].ValueList)->begin(), ArgE = (yyvsp[-7].ValueList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -4738,355 +4813,337 @@ yyreduce: if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - yyval.TermInstVal = new InvokeInst(V, Normal, Except, *yyvsp[-7].ValueList); + (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, *(yyvsp[-7].ValueList)); } - cast(yyval.TermInstVal)->setCallingConv(yyvsp[-11].UIntVal); + cast((yyval.TermInstVal))->setCallingConv((yyvsp[-11].UIntVal)); - delete yyvsp[-10].TypeVal; - delete yyvsp[-7].ValueList; + delete (yyvsp[-10].TypeVal); + delete (yyvsp[-7].ValueList); CHECK_FOR_ERROR ;} break; - case 259: -#line 2251 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 252: +#line 2245 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TermInstVal = new UnwindInst(); + (yyval.TermInstVal) = new UnwindInst(); CHECK_FOR_ERROR ;} break; - case 260: -#line 2255 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 253: +#line 2249 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.TermInstVal = new UnreachableInst(); + (yyval.TermInstVal) = new UnreachableInst(); CHECK_FOR_ERROR ;} break; - case 261: -#line 2262 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 254: +#line 2256 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.JumpTable = yyvsp[-5].JumpTable; - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + (yyval.JumpTable) = (yyvsp[-5].JumpTable); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); ;} break; - case 262: -#line 2273 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 255: +#line 2267 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.JumpTable = new std::vector >(); - Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + (yyval.JumpTable) = new std::vector >(); + Constant *V = cast(getValNonImprovising((yyvsp[-4].PrimType), (yyvsp[-3].ValIDVal))); CHECK_FOR_ERROR if (V == 0) GEN_ERROR("May only switch on a constant pool value!"); - BasicBlock* tmpBB = getBBVal(yyvsp[0].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.JumpTable->push_back(std::make_pair(V, tmpBB)); + (yyval.JumpTable)->push_back(std::make_pair(V, tmpBB)); ;} break; - case 263: -#line 2286 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 256: +#line 2280 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Is this definition named?? if so, assign the name... - setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); + setValueName((yyvsp[0].InstVal), (yyvsp[-1].StrVal)); CHECK_FOR_ERROR - InsertValue(yyvsp[0].InstVal); - yyval.InstVal = yyvsp[0].InstVal; + InsertValue((yyvsp[0].InstVal)); + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR ;} break; - case 264: -#line 2295 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 257: +#line 2289 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Used for PHI nodes - yyval.PHIList = new std::list >(); - Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal); + (yyval.PHIList) = new std::list >(); + Value* tmpVal = getVal(*(yyvsp[-5].TypeVal), (yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.PHIList->push_back(std::make_pair(tmpVal, tmpBB)); - delete yyvsp[-5].TypeVal; + (yyval.PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); + delete (yyvsp[-5].TypeVal); ;} break; - case 265: -#line 2304 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 258: +#line 2298 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.PHIList = yyvsp[-6].PHIList; - Value* tmpVal = getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal); + (yyval.PHIList) = (yyvsp[-6].PHIList); + Value* tmpVal = getVal((yyvsp[-6].PHIList)->front().first->getType(), (yyvsp[-3].ValIDVal)); CHECK_FOR_ERROR - BasicBlock* tmpBB = getBBVal(yyvsp[-1].ValIDVal); + BasicBlock* tmpBB = getBBVal((yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyvsp[-6].PHIList->push_back(std::make_pair(tmpVal, tmpBB)); + (yyvsp[-6].PHIList)->push_back(std::make_pair(tmpVal, tmpBB)); ;} break; - case 266: -#line 2314 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 259: +#line 2308 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { // Used for call statements, and memory insts... - yyval.ValueList = new std::vector(); - yyval.ValueList->push_back(yyvsp[0].ValueVal); + (yyval.ValueList) = new std::vector(); + (yyval.ValueList)->push_back((yyvsp[0].ValueVal)); ;} break; - case 267: -#line 2318 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 260: +#line 2312 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValueList = yyvsp[-2].ValueList; - yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); + (yyval.ValueList) = (yyvsp[-2].ValueList); + (yyvsp[-2].ValueList)->push_back((yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 269: -#line 2325 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { yyval.ValueList = 0; ;} + case 262: +#line 2319 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" + { (yyval.ValueList) = 0; ;} break; - case 270: -#line 2327 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 263: +#line 2321 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = true; + (yyval.BoolVal) = true; CHECK_FOR_ERROR ;} break; - case 271: -#line 2331 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 264: +#line 2325 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = false; + (yyval.BoolVal) = false; CHECK_FOR_ERROR ;} break; - case 272: -#line 2336 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 265: +#line 2330 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && - !isa((*yyvsp[-3].TypeVal).get())) + if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() && + !isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR( "Arithmetic operator requires integer, FP, or packed operands!"); - if (isa((*yyvsp[-3].TypeVal).get()) && - (yyvsp[-4].BinaryOpVal == Instruction::URem || - yyvsp[-4].BinaryOpVal == Instruction::SRem || - yyvsp[-4].BinaryOpVal == Instruction::FRem)) + if (isa((*(yyvsp[-3].TypeVal)).get()) && + ((yyvsp[-4].BinaryOpVal) == Instruction::URem || + (yyvsp[-4].BinaryOpVal) == Instruction::SRem || + (yyvsp[-4].BinaryOpVal) == Instruction::FRem)) GEN_ERROR("U/S/FRem not supported on packed types!"); - Value* val1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* val1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* val2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* val2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, val1, val2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), val1, val2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; + delete (yyvsp[-3].TypeVal); ;} break; - case 273: -#line 2355 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 266: +#line 2349 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!(*yyvsp[-3].TypeVal)->isIntegral()) { - if (!isa(yyvsp[-3].TypeVal->get()) || - !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) + if (!(*(yyvsp[-3].TypeVal))->isIntegral()) { + if (!isa((yyvsp[-3].TypeVal)->get()) || + !cast((yyvsp[-3].TypeVal)->get())->getElementType()->isIntegral()) GEN_ERROR("Logical operator requires integral operands!"); } - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create((yyvsp[-4].BinaryOpVal), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; + delete (yyvsp[-3].TypeVal); ;} break; - case 274: -#line 2370 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" - { - if(isa((*yyvsp[-3].TypeVal).get())) { - GEN_ERROR( - "PackedTypes currently not supported in setcc instructions!"); - } - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); - CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); - CHECK_FOR_ERROR - yyval.InstVal = new SetCondInst(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) - GEN_ERROR("binary operator returned null!"); - delete yyvsp[-3].TypeVal; - ;} - break; - - case 275: -#line 2384 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 267: +#line 2364 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (isa((*yyvsp[-3].TypeVal).get())) + if (isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR("Packed types not supported by icmp instruction"); - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].IPredicate, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].IPredicate), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("icmp operator returned null!"); ;} break; - case 276: -#line 2395 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 268: +#line 2375 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (isa((*yyvsp[-3].TypeVal).get())) + if (isa((*(yyvsp[-3].TypeVal)).get())) GEN_ERROR("Packed types not supported by fcmp instruction"); - Value* tmpVal1 = getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal); + Value* tmpVal1 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[-2].ValIDVal)); CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal2 = getVal(*(yyvsp[-3].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = CmpInst::create(yyvsp[-5].OtherOpVal, yyvsp[-4].FPredicate, tmpVal1, tmpVal2); - if (yyval.InstVal == 0) + (yyval.InstVal) = CmpInst::create((yyvsp[-5].OtherOpVal), (yyvsp[-4].FPredicate), tmpVal1, tmpVal2); + if ((yyval.InstVal) == 0) GEN_ERROR("fcmp operator returned null!"); ;} break; - case 277: -#line 2406 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 269: +#line 2386 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; - Value *Ones = ConstantIntegral::getAllOnesValue(yyvsp[0].ValueVal->getType()); + Value *Ones = ConstantIntegral::getAllOnesValue((yyvsp[0].ValueVal)->getType()); if (Ones == 0) GEN_ERROR("Expected integral type for not instruction!"); - yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); - if (yyval.InstVal == 0) + (yyval.InstVal) = BinaryOperator::create(Instruction::Xor, (yyvsp[0].ValueVal), Ones); + if ((yyval.InstVal) == 0) GEN_ERROR("Could not create a xor instruction!"); CHECK_FOR_ERROR ;} break; - case 278: -#line 2419 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 270: +#line 2399 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[0].ValueVal->getType() != Type::UByteTy) + if ((yyvsp[0].ValueVal)->getType() != Type::UByteTy) GEN_ERROR("Shift amount must be ubyte!"); - if (!yyvsp[-2].ValueVal->getType()->isInteger()) + if (!(yyvsp[-2].ValueVal)->getType()->isInteger()) GEN_ERROR("Shift constant expression requires integer operand!"); CHECK_FOR_ERROR; - yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ShiftInst((yyvsp[-3].OtherOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 279: -#line 2428 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 271: +#line 2408 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Value* Val = yyvsp[-2].ValueVal; - const Type* Ty = yyvsp[0].TypeVal->get(); + Value* Val = (yyvsp[-2].ValueVal); + const Type* Ty = (yyvsp[0].TypeVal)->get(); if (!Val->getType()->isFirstClassType()) GEN_ERROR("cast from a non-primitive type: '" + Val->getType()->getDescription() + "'!"); if (!Ty->isFirstClassType()) GEN_ERROR("cast to a non-primitive type: '" + Ty->getDescription() +"'!"); - yyval.InstVal = CastInst::create(yyvsp[-3].CastOpVal, yyvsp[-2].ValueVal, yyvsp[0].TypeVal->get()); - delete yyvsp[0].TypeVal; + (yyval.InstVal) = CastInst::create((yyvsp[-3].CastOpVal), (yyvsp[-2].ValueVal), (yyvsp[0].TypeVal)->get()); + delete (yyvsp[0].TypeVal); ;} break; - case 280: -#line 2439 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 272: +#line 2419 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) + if ((yyvsp[-4].ValueVal)->getType() != Type::BoolTy) GEN_ERROR("select condition must be boolean!"); - if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) + if ((yyvsp[-2].ValueVal)->getType() != (yyvsp[0].ValueVal)->getType()) GEN_ERROR("select value types should match!"); - yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new SelectInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 281: -#line 2447 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 273: +#line 2427 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); - delete yyvsp[0].TypeVal; + (yyval.InstVal) = new VAArgInst((yyvsp[-2].ValueVal), *(yyvsp[0].TypeVal)); + delete (yyvsp[0].TypeVal); CHECK_FOR_ERROR ;} break; - case 282: -#line 2452 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 274: +#line 2432 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!ExtractElementInst::isValidOperands(yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + if (!ExtractElementInst::isValidOperands((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid extractelement operands!"); - yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ExtractElementInst((yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 283: -#line 2458 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 275: +#line 2438 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!InsertElementInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + if (!InsertElementInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid insertelement operands!"); - yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new InsertElementInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 284: -#line 2464 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 276: +#line 2444 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!ShuffleVectorInst::isValidOperands(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal)) + if (!ShuffleVectorInst::isValidOperands((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal))) GEN_ERROR("Invalid shufflevector operands!"); - yyval.InstVal = new ShuffleVectorInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + (yyval.InstVal) = new ShuffleVectorInst((yyvsp[-4].ValueVal), (yyvsp[-2].ValueVal), (yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 285: -#line 2470 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 277: +#line 2450 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const Type *Ty = yyvsp[0].PHIList->front().first->getType(); + const Type *Ty = (yyvsp[0].PHIList)->front().first->getType(); if (!Ty->isFirstClassType()) GEN_ERROR("PHI node operands must be of first class type!"); - yyval.InstVal = new PHINode(Ty); - ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size()); - while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) { - if (yyvsp[0].PHIList->front().first->getType() != Ty) + (yyval.InstVal) = new PHINode(Ty); + ((PHINode*)(yyval.InstVal))->reserveOperandSpace((yyvsp[0].PHIList)->size()); + while ((yyvsp[0].PHIList)->begin() != (yyvsp[0].PHIList)->end()) { + if ((yyvsp[0].PHIList)->front().first->getType() != Ty) GEN_ERROR("All elements of a PHI node must be of the same type!"); - cast(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second); - yyvsp[0].PHIList->pop_front(); + cast((yyval.InstVal))->addIncoming((yyvsp[0].PHIList)->front().first, (yyvsp[0].PHIList)->front().second); + (yyvsp[0].PHIList)->pop_front(); } - delete yyvsp[0].PHIList; // Free the list... + delete (yyvsp[0].PHIList); // Free the list... CHECK_FOR_ERROR ;} break; - case 286: -#line 2485 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 278: +#line 2465 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy = 0; const FunctionType *Ty = 0; - if (!(PFTy = dyn_cast(yyvsp[-4].TypeVal->get())) || + if (!(PFTy = dyn_cast((yyvsp[-4].TypeVal)->get())) || !(Ty = dyn_cast(PFTy->getElementType()))) { // Pull out the types of all of the arguments... std::vector ParamTypes; - if (yyvsp[-1].ValueList) { - for (std::vector::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end(); + if ((yyvsp[-1].ValueList)) { + for (std::vector::iterator I = (yyvsp[-1].ValueList)->begin(), E = (yyvsp[-1].ValueList)->end(); I != E; ++I) ParamTypes.push_back((*I)->getType()); } @@ -5094,31 +5151,31 @@ yyreduce: bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; if (isVarArg) ParamTypes.pop_back(); - if (!(*yyvsp[-4].TypeVal)->isFirstClassType() && *yyvsp[-4].TypeVal != Type::VoidTy) + if (!(*(yyvsp[-4].TypeVal))->isFirstClassType() && *(yyvsp[-4].TypeVal) != Type::VoidTy) GEN_ERROR("LLVM functions cannot return aggregate types!"); - Ty = FunctionType::get(yyvsp[-4].TypeVal->get(), ParamTypes, isVarArg); + Ty = FunctionType::get((yyvsp[-4].TypeVal)->get(), ParamTypes, isVarArg); PFTy = PointerType::get(Ty); } - Value *V = getVal(PFTy, yyvsp[-3].ValIDVal); // Get the function we're calling... + Value *V = getVal(PFTy, (yyvsp[-3].ValIDVal)); // Get the function we're calling... CHECK_FOR_ERROR // Create the call node... - if (!yyvsp[-1].ValueList) { // Has no arguments? + if (!(yyvsp[-1].ValueList)) { // Has no arguments? // Make sure no arguments is a good thing! if (Ty->getNumParams() != 0) GEN_ERROR("No arguments passed to a function that " "expects arguments!"); - yyval.InstVal = new CallInst(V, std::vector()); + (yyval.InstVal) = new CallInst(V, std::vector()); } else { // Has arguments? // Loop through FunctionType's arguments and ensure they are specified // correctly! // FunctionType::param_iterator I = Ty->param_begin(); FunctionType::param_iterator E = Ty->param_end(); - std::vector::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end(); + std::vector::iterator ArgI = (yyvsp[-1].ValueList)->begin(), ArgE = (yyvsp[-1].ValueList)->end(); for (; ArgI != ArgE && I != E; ++ArgI, ++I) if ((*ArgI)->getType() != *I) @@ -5128,162 +5185,163 @@ yyreduce: if (I != E || (ArgI != ArgE && !Ty->isVarArg())) GEN_ERROR("Invalid number of parameters detected!"); - yyval.InstVal = new CallInst(V, *yyvsp[-1].ValueList); + (yyval.InstVal) = new CallInst(V, *(yyvsp[-1].ValueList)); } - cast(yyval.InstVal)->setTailCall(yyvsp[-6].BoolVal); - cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); - delete yyvsp[-4].TypeVal; - delete yyvsp[-1].ValueList; + cast((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal)); + cast((yyval.InstVal))->setCallingConv((yyvsp[-5].UIntVal)); + delete (yyvsp[-4].TypeVal); + delete (yyvsp[-1].ValueList); CHECK_FOR_ERROR ;} break; - case 287: -#line 2544 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 279: +#line 2524 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.InstVal = yyvsp[0].InstVal; + (yyval.InstVal) = (yyvsp[0].InstVal); CHECK_FOR_ERROR ;} break; - case 288: -#line 2551 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 280: +#line 2531 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValueList = yyvsp[0].ValueList; + (yyval.ValueList) = (yyvsp[0].ValueList); CHECK_FOR_ERROR ;} break; - case 289: -#line 2554 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 281: +#line 2534 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.ValueList = new std::vector(); + (yyval.ValueList) = new std::vector(); CHECK_FOR_ERROR ;} break; - case 290: -#line 2559 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 282: +#line 2539 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = true; + (yyval.BoolVal) = true; CHECK_FOR_ERROR ;} break; - case 291: -#line 2563 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 283: +#line 2543 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.BoolVal = false; + (yyval.BoolVal) = false; CHECK_FOR_ERROR ;} break; - case 292: -#line 2570 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 284: +#line 2550 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; + (yyval.InstVal) = new MallocInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 293: -#line 2575 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 285: +#line 2555 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; + (yyval.InstVal) = new MallocInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); ;} break; - case 294: -#line 2581 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 286: +#line 2561 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); - delete yyvsp[-1].TypeVal; + (yyval.InstVal) = new AllocaInst(*(yyvsp[-1].TypeVal), 0, (yyvsp[0].UIntVal)); + delete (yyvsp[-1].TypeVal); CHECK_FOR_ERROR ;} break; - case 295: -#line 2586 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 287: +#line 2566 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - Value* tmpVal = getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal); + Value* tmpVal = getVal((yyvsp[-2].PrimType), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, tmpVal, yyvsp[0].UIntVal); - delete yyvsp[-4].TypeVal; + (yyval.InstVal) = new AllocaInst(*(yyvsp[-4].TypeVal), tmpVal, (yyvsp[0].UIntVal)); + delete (yyvsp[-4].TypeVal); ;} break; - case 296: -#line 2592 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 288: +#line 2572 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!isa(yyvsp[0].ValueVal->getType())) + if (!isa((yyvsp[0].ValueVal)->getType())) GEN_ERROR("Trying to free nonpointer type " + - yyvsp[0].ValueVal->getType()->getDescription() + "!"); - yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); + (yyvsp[0].ValueVal)->getType()->getDescription() + "!"); + (yyval.InstVal) = new FreeInst((yyvsp[0].ValueVal)); CHECK_FOR_ERROR ;} break; - case 297: -#line 2600 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 289: +#line 2580 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!isa(yyvsp[-1].TypeVal->get())) + if (!isa((yyvsp[-1].TypeVal)->get())) GEN_ERROR("Can't load from nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - if (!cast(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType()) + (*(yyvsp[-1].TypeVal))->getDescription()); + if (!cast((yyvsp[-1].TypeVal)->get())->getElementType()->isFirstClassType()) GEN_ERROR("Can't load from pointer of non-first-class type: " + - (*yyvsp[-1].TypeVal)->getDescription()); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + (*(yyvsp[-1].TypeVal))->getDescription()); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new LoadInst(tmpVal, "", yyvsp[-3].BoolVal); - delete yyvsp[-1].TypeVal; + (yyval.InstVal) = new LoadInst(tmpVal, "", (yyvsp[-3].BoolVal)); + delete (yyvsp[-1].TypeVal); ;} break; - case 298: -#line 2612 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 290: +#line 2592 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); + const PointerType *PT = dyn_cast((yyvsp[-1].TypeVal)->get()); if (!PT) GEN_ERROR("Can't store to a nonpointer type: " + - (*yyvsp[-1].TypeVal)->getDescription()); + (*(yyvsp[-1].TypeVal))->getDescription()); const Type *ElTy = PT->getElementType(); - if (ElTy != yyvsp[-3].ValueVal->getType()) - GEN_ERROR("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() + + if (ElTy != (yyvsp[-3].ValueVal)->getType()) + GEN_ERROR("Can't store '" + (yyvsp[-3].ValueVal)->getType()->getDescription() + "' into space of type '" + ElTy->getDescription() + "'!"); - Value* tmpVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); + Value* tmpVal = getVal(*(yyvsp[-1].TypeVal), (yyvsp[0].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, tmpVal, yyvsp[-5].BoolVal); - delete yyvsp[-1].TypeVal; + (yyval.InstVal) = new StoreInst((yyvsp[-3].ValueVal), tmpVal, (yyvsp[-5].BoolVal)); + delete (yyvsp[-1].TypeVal); ;} break; - case 299: -#line 2627 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" + case 291: +#line 2607 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" { - if (!isa(yyvsp[-2].TypeVal->get())) + if (!isa((yyvsp[-2].TypeVal)->get())) GEN_ERROR("getelementptr insn requires pointer operand!"); - if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, *yyvsp[0].ValueList, true)) + if (!GetElementPtrInst::getIndexedType(*(yyvsp[-2].TypeVal), *(yyvsp[0].ValueList), true)) GEN_ERROR("Invalid getelementptr indices for type '" + - (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); - Value* tmpVal = getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal); + (*(yyvsp[-2].TypeVal))->getDescription()+ "'!"); + Value* tmpVal = getVal(*(yyvsp[-2].TypeVal), (yyvsp[-1].ValIDVal)); CHECK_FOR_ERROR - yyval.InstVal = new GetElementPtrInst(tmpVal, *yyvsp[0].ValueList); - delete yyvsp[-2].TypeVal; - delete yyvsp[0].ValueList; + (yyval.InstVal) = new GetElementPtrInst(tmpVal, *(yyvsp[0].ValueList)); + delete (yyvsp[-2].TypeVal); + delete (yyvsp[0].ValueList); ;} break; + default: break; } -/* Line 1000 of yacc.c. */ -#line 5287 "llvmAsmParser.tab.c" +/* Line 1126 of yacc.c. */ +#line 5345 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -5322,12 +5380,36 @@ yyerrlab: if (YYPACT_NINF < yyn && yyn < YYLAST) { - YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); - const char* yyprefix; - char *yymsg; + 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; @@ -5335,81 +5417,91 @@ yyerrlab: /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 0; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); - yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); - yycount += 1; - if (yycount == 5) + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { - yysize = 0; + 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; } - yysize += (sizeof ("syntax error, unexpected ") - + yystrlen (yytname[yytype])); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) - { - char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); - if (yycount < 5) + 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)) { - yyprefix = ", expecting "; - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - yyp = yystpcpy (yyp, yyprefix); - yyp = yystpcpy (yyp, yytname[yyx]); - yyprefix = " or "; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else - yyerror ("syntax error; also virtual memory exhausted"); + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } } else #endif /* YYERROR_VERBOSE */ - yyerror ("syntax error"); + yyerror (YY_("syntax error")); } if (yyerrstatus == 3) { - /* If just tried and failed to reuse lookahead token after an + /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { - /* If at end of input, pop the error token, - then the rest of the stack, then return failure. */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - for (;;) - { - YYPOPSTACK; - if (yyssp == yyss) - YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[*yyssp], yyvsp); - } + YYABORT; } else { - YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); - yydestruct (yytoken, &yylval); + yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; - } } - /* Else will try to reuse lookahead token after shifting the error + /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; @@ -5419,14 +5511,13 @@ yyerrlab: `---------------------------------------------------*/ yyerrorlab: -#ifdef __GNUC__ - /* Pacify GCC when the user code never invokes YYERROR and the label - yyerrorlab therefore never appears in user code. */ + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ if (0) goto yyerrorlab; -#endif - yyvsp -= yylen; +yyvsp -= yylen; yyssp -= yylen; yystate = *yyssp; goto yyerrlab1; @@ -5456,8 +5547,8 @@ yyerrlab1: if (yyssp == yyss) YYABORT; - YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); - yydestruct (yystos[yystate], yyvsp); + + yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK; yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -5466,11 +5557,12 @@ yyerrlab1: if (yyn == YYFINAL) YYACCEPT; - YYDPRINTF ((stderr, "Shifting error token, ")); - *++yyvsp = yylval; + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yystate = yyn; goto yynewstate; @@ -5490,16 +5582,25 @@ yyabortlab: goto yyreturn; #ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); @@ -5508,7 +5609,7 @@ yyreturn: } -#line 2642 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 2622 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" void llvm::GenerateError(const std::string &message, int LineNo) { diff --git a/lib/AsmParser/llvmAsmParser.h.cvs b/lib/AsmParser/llvmAsmParser.h.cvs index 24c92b5c2b2..18325753e02 100644 --- a/lib/AsmParser/llvmAsmParser.h.cvs +++ b/lib/AsmParser/llvmAsmParser.h.cvs @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 1.875c. */ +/* A Bison parser, made by GNU Bison 2.1. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 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 @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + 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. @@ -116,63 +116,58 @@ AND = 342, OR = 343, XOR = 344, - SETLE = 345, - SETGE = 346, - SETLT = 347, - SETGT = 348, - SETEQ = 349, - SETNE = 350, - ICMP = 351, - FCMP = 352, - EQ = 353, - NE = 354, - SLT = 355, - SGT = 356, - SLE = 357, - SGE = 358, - ULT = 359, - UGT = 360, - ULE = 361, - UGE = 362, - OEQ = 363, - ONE = 364, - OLT = 365, - OGT = 366, - OLE = 367, - OGE = 368, - ORD = 369, - UNO = 370, - UEQ = 371, - UNE = 372, - MALLOC = 373, - ALLOCA = 374, - FREE = 375, - LOAD = 376, - STORE = 377, - GETELEMENTPTR = 378, - TRUNC = 379, - ZEXT = 380, - SEXT = 381, - FPTRUNC = 382, - FPEXT = 383, - BITCAST = 384, - UITOFP = 385, - SITOFP = 386, - FPTOUI = 387, - FPTOSI = 388, - INTTOPTR = 389, - PTRTOINT = 390, - PHI_TOK = 391, - SELECT = 392, - SHL = 393, - LSHR = 394, - ASHR = 395, - VAARG = 396, - EXTRACTELEMENT = 397, - INSERTELEMENT = 398, - SHUFFLEVECTOR = 399 + ICMP = 345, + FCMP = 346, + EQ = 347, + NE = 348, + SLT = 349, + SGT = 350, + SLE = 351, + SGE = 352, + ULT = 353, + UGT = 354, + ULE = 355, + UGE = 356, + OEQ = 357, + ONE = 358, + OLT = 359, + OGT = 360, + OLE = 361, + OGE = 362, + ORD = 363, + UNO = 364, + UEQ = 365, + UNE = 366, + MALLOC = 367, + ALLOCA = 368, + FREE = 369, + LOAD = 370, + STORE = 371, + GETELEMENTPTR = 372, + TRUNC = 373, + ZEXT = 374, + SEXT = 375, + FPTRUNC = 376, + FPEXT = 377, + BITCAST = 378, + UITOFP = 379, + SITOFP = 380, + FPTOUI = 381, + FPTOSI = 382, + INTTOPTR = 383, + PTRTOINT = 384, + PHI_TOK = 385, + SELECT = 386, + SHL = 387, + LSHR = 388, + ASHR = 389, + VAARG = 390, + EXTRACTELEMENT = 391, + INSERTELEMENT = 392, + SHUFFLEVECTOR = 393 }; #endif +/* Tokens. */ #define ESINT64VAL 258 #define EUINT64VAL 259 #define SINTVAL 260 @@ -260,67 +255,61 @@ #define AND 342 #define OR 343 #define XOR 344 -#define SETLE 345 -#define SETGE 346 -#define SETLT 347 -#define SETGT 348 -#define SETEQ 349 -#define SETNE 350 -#define ICMP 351 -#define FCMP 352 -#define EQ 353 -#define NE 354 -#define SLT 355 -#define SGT 356 -#define SLE 357 -#define SGE 358 -#define ULT 359 -#define UGT 360 -#define ULE 361 -#define UGE 362 -#define OEQ 363 -#define ONE 364 -#define OLT 365 -#define OGT 366 -#define OLE 367 -#define OGE 368 -#define ORD 369 -#define UNO 370 -#define UEQ 371 -#define UNE 372 -#define MALLOC 373 -#define ALLOCA 374 -#define FREE 375 -#define LOAD 376 -#define STORE 377 -#define GETELEMENTPTR 378 -#define TRUNC 379 -#define ZEXT 380 -#define SEXT 381 -#define FPTRUNC 382 -#define FPEXT 383 -#define BITCAST 384 -#define UITOFP 385 -#define SITOFP 386 -#define FPTOUI 387 -#define FPTOSI 388 -#define INTTOPTR 389 -#define PTRTOINT 390 -#define PHI_TOK 391 -#define SELECT 392 -#define SHL 393 -#define LSHR 394 -#define ASHR 395 -#define VAARG 396 -#define EXTRACTELEMENT 397 -#define INSERTELEMENT 398 -#define SHUFFLEVECTOR 399 +#define ICMP 345 +#define FCMP 346 +#define EQ 347 +#define NE 348 +#define SLT 349 +#define SGT 350 +#define SLE 351 +#define SGE 352 +#define ULT 353 +#define UGT 354 +#define ULE 355 +#define UGE 356 +#define OEQ 357 +#define ONE 358 +#define OLT 359 +#define OGT 360 +#define OLE 361 +#define OGE 362 +#define ORD 363 +#define UNO 364 +#define UEQ 365 +#define UNE 366 +#define MALLOC 367 +#define ALLOCA 368 +#define FREE 369 +#define LOAD 370 +#define STORE 371 +#define GETELEMENTPTR 372 +#define TRUNC 373 +#define ZEXT 374 +#define SEXT 375 +#define FPTRUNC 376 +#define FPEXT 377 +#define BITCAST 378 +#define UITOFP 379 +#define SITOFP 380 +#define FPTOUI 381 +#define FPTOSI 382 +#define INTTOPTR 383 +#define PTRTOINT 384 +#define PHI_TOK 385 +#define SELECT 386 +#define SHL 387 +#define LSHR 388 +#define ASHR 389 +#define VAARG 390 +#define EXTRACTELEMENT 391 +#define INSERTELEMENT 392 +#define SHUFFLEVECTOR 393 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 855 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y" +#line 855 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y" typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; @@ -363,8 +352,8 @@ typedef union YYSTYPE { llvm::ICmpInst::Predicate IPredicate; llvm::FCmpInst::Predicate FPredicate; } YYSTYPE; -/* Line 1275 of yacc.c. */ -#line 368 "llvmAsmParser.tab.h" +/* Line 1447 of yacc.c. */ +#line 357 "llvmAsmParser.tab.h" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 41fcb28ba84..fa87821da36 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -958,9 +958,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { %token RET BR SWITCH INVOKE UNWIND UNREACHABLE // Binary Operators -%type ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories +%type ArithmeticOps LogicalOps // Binops Subcatagories %token ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR -%token SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators %token ICMP FCMP %type IPredicates %type FPredicates @@ -999,7 +998,6 @@ INTVAL : UINTVAL { // ArithmeticOps: ADD | SUB | MUL | UDIV | SDIV | FDIV | UREM | SREM | FREM; LogicalOps : AND | OR | XOR; -SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; CastOps : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | BITCAST | UITOFP | SITOFP | FPTOUI | FPTOSI | INTTOPTR | PTRTOINT; ShiftOps : SHL | LSHR | ASHR; @@ -1574,12 +1572,6 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' { $$ = ConstantExpr::get($1, $3, $5); CHECK_FOR_ERROR } - | SetCondOps '(' ConstVal ',' ConstVal ')' { - if ($3->getType() != $5->getType()) - GEN_ERROR("setcc operand types must match!"); - $$ = ConstantExpr::get($1, $3, $5); - CHECK_FOR_ERROR - } | ICMP IPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) GEN_ERROR("icmp operand types must match!"); @@ -2369,20 +2361,6 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { GEN_ERROR("binary operator returned null!"); delete $2; } - | SetCondOps Types ValueRef ',' ValueRef { - if(isa((*$2).get())) { - GEN_ERROR( - "PackedTypes currently not supported in setcc instructions!"); - } - Value* tmpVal1 = getVal(*$2, $3); - CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*$2, $5); - CHECK_FOR_ERROR - $$ = new SetCondInst($1, tmpVal1, tmpVal2); - if ($$ == 0) - GEN_ERROR("binary operator returned null!"); - delete $2; - } | ICMP IPredicates Types ValueRef ',' ValueRef { if (isa((*$3).get())) GEN_ERROR("Packed types not supported by icmp instruction"); diff --git a/lib/AsmParser/llvmAsmParser.y.cvs b/lib/AsmParser/llvmAsmParser.y.cvs index 05fc57d82c8..fa87821da36 100644 --- a/lib/AsmParser/llvmAsmParser.y.cvs +++ b/lib/AsmParser/llvmAsmParser.y.cvs @@ -926,7 +926,6 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { // EUINT64VAL - A positive number within uns. long long range %token EUINT64VAL -%type EINT64VAL %token SINTVAL // Signed 32 bit ints... %token UINTVAL // Unsigned 32 bit ints... @@ -959,9 +958,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { %token RET BR SWITCH INVOKE UNWIND UNREACHABLE // Binary Operators -%type ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories +%type ArithmeticOps LogicalOps // Binops Subcatagories %token ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR -%token SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators %token ICMP FCMP %type IPredicates %type FPredicates @@ -995,21 +993,11 @@ INTVAL : UINTVAL { CHECK_FOR_ERROR }; - -EINT64VAL : ESINT64VAL; // These have same type and can't cause problems... -EINT64VAL : EUINT64VAL { - if ($1 > (uint64_t)INT64_MAX) // Outside of my range! - GEN_ERROR("Value too large for type!"); - $$ = (int64_t)$1; - CHECK_FOR_ERROR -}; - // Operations that are notably excluded from this list include: // RET, BR, & SWITCH because they end basic blocks and are treated specially. // ArithmeticOps: ADD | SUB | MUL | UDIV | SDIV | FDIV | UREM | SREM | FREM; LogicalOps : AND | OR | XOR; -SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; CastOps : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | BITCAST | UITOFP | SITOFP | FPTOUI | FPTOSI | INTTOPTR | PTRTOINT; ShiftOps : SHL | LSHR | ASHR; @@ -1486,7 +1474,13 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr delete $1; CHECK_FOR_ERROR } - | SIntType EINT64VAL { // integral constants + | SIntType ESINT64VAL { // integral constants + if (!ConstantInt::isValueValidForType($1, $2)) + GEN_ERROR("Constant value doesn't fit in type!"); + $$ = ConstantInt::get($1, $2); + CHECK_FOR_ERROR + } + | SIntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type!"); $$ = ConstantInt::get($1, $2); @@ -1498,6 +1492,12 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } + | UIntType ESINT64VAL { + if (!ConstantInt::isValueValidForType($1, $2)) + GEN_ERROR("Constant value doesn't fit in type!"); + $$ = ConstantInt::get($1, $2); + CHECK_FOR_ERROR + } | BOOL TRUETOK { // Boolean constants $$ = ConstantBool::getTrue(); CHECK_FOR_ERROR @@ -1572,12 +1572,6 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' { $$ = ConstantExpr::get($1, $3, $5); CHECK_FOR_ERROR } - | SetCondOps '(' ConstVal ',' ConstVal ')' { - if ($3->getType() != $5->getType()) - GEN_ERROR("setcc operand types must match!"); - $$ = ConstantExpr::get($1, $3, $5); - CHECK_FOR_ERROR - } | ICMP IPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) GEN_ERROR("icmp operand types must match!"); @@ -2367,20 +2361,6 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { GEN_ERROR("binary operator returned null!"); delete $2; } - | SetCondOps Types ValueRef ',' ValueRef { - if(isa((*$2).get())) { - GEN_ERROR( - "PackedTypes currently not supported in setcc instructions!"); - } - Value* tmpVal1 = getVal(*$2, $3); - CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*$2, $5); - CHECK_FOR_ERROR - $$ = new SetCondInst($1, tmpVal1, tmpVal2); - if ($$ == 0) - GEN_ERROR("binary operator returned null!"); - delete $2; - } | ICMP IPredicates Types ValueRef ',' ValueRef { if (isa((*$3).get())) GEN_ERROR("Packed types not supported by icmp instruction"); diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp index 6db44c4f5ff..d6c79ad19ba 100644 --- a/lib/CodeGen/IntrinsicLowering.cpp +++ b/lib/CodeGen/IntrinsicLowering.cpp @@ -432,8 +432,8 @@ void IntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { Value *L = CI->getOperand(1); Value *R = CI->getOperand(2); - Value *LIsNan = new SetCondInst(Instruction::SetNE, L, L, "LIsNan", CI); - Value *RIsNan = new SetCondInst(Instruction::SetNE, R, R, "RIsNan", CI); + Value *LIsNan = new FCmpInst(FCmpInst::FCMP_ONE, L, L, "LIsNan", CI); + Value *RIsNan = new FCmpInst(FCmpInst::FCMP_ONE, R, R, "RIsNan", CI); CI->replaceAllUsesWith( BinaryOperator::create(Instruction::Or, LIsNan, RIsNan, "isunordered", CI)); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 37d7eeb1a94..911f326ee03 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -541,20 +541,6 @@ public: void visitAShr(User &I) { visitShift(I, ISD::SRA); } void visitICmp(User &I); void visitFCmp(User &I); - void visitSetCC(User &I, ISD::CondCode SignedOpc, ISD::CondCode UnsignedOpc, - ISD::CondCode FPOpc); - void visitSetEQ(User &I) { visitSetCC(I, ISD::SETEQ, ISD::SETEQ, - ISD::SETOEQ); } - void visitSetNE(User &I) { visitSetCC(I, ISD::SETNE, ISD::SETNE, - ISD::SETUNE); } - void visitSetLE(User &I) { visitSetCC(I, ISD::SETLE, ISD::SETULE, - ISD::SETOLE); } - void visitSetGE(User &I) { visitSetCC(I, ISD::SETGE, ISD::SETUGE, - ISD::SETOGE); } - void visitSetLT(User &I) { visitSetCC(I, ISD::SETLT, ISD::SETULT, - ISD::SETOLT); } - void visitSetGT(User &I) { visitSetCC(I, ISD::SETGT, ISD::SETUGT, - ISD::SETOGT); } // Visit the conversion instructions void visitTrunc(User &I); void visitZExt(User &I); @@ -851,9 +837,10 @@ void SelectionDAGLowering::FindMergedConditions(Value *Cond, MachineBasicBlock *CurBB, unsigned Opc) { // If this node is not part of the or/and tree, emit it as a branch. - BinaryOperator *BOp = dyn_cast(Cond); + Instruction *BOp = dyn_cast(Cond); - if (!BOp || (unsigned)BOp->getOpcode() != Opc || !BOp->hasOneUse() || + if (!BOp || !(isa(BOp) || isa(BOp)) || + (unsigned)BOp->getOpcode() != Opc || !BOp->hasOneUse() || BOp->getParent() != CurBB->getBasicBlock() || !InBlock(BOp->getOperand(0), CurBB->getBasicBlock()) || !InBlock(BOp->getOperand(1), CurBB->getBasicBlock())) { @@ -875,61 +862,60 @@ void SelectionDAGLowering::FindMergedConditions(Value *Cond, } - // If the leaf of the tree is a setcond inst, merge the condition into the - // caseblock. - if (BOp && isa(BOp) && - // The operands of the setcc have to be in this block. We don't know + // If the leaf of the tree is a comparison, merge the condition into + // the caseblock. + if ((isa(Cond) || isa(Cond)) && + // The operands of the cmp have to be in this block. We don't know // how to export them from some other block. If this is the first block // of the sequence, no exporting is needed. (CurBB == CurMBB || (isExportableFromCurrentBlock(BOp->getOperand(0), BB) && isExportableFromCurrentBlock(BOp->getOperand(1), BB)))) { - ISD::CondCode SignCond, UnsCond, FPCond, Condition; - switch (BOp->getOpcode()) { - default: assert(0 && "Unknown setcc opcode!"); - case Instruction::SetEQ: - SignCond = ISD::SETEQ; - UnsCond = ISD::SETEQ; - FPCond = ISD::SETOEQ; - break; - case Instruction::SetNE: - SignCond = ISD::SETNE; - UnsCond = ISD::SETNE; - FPCond = ISD::SETUNE; - break; - case Instruction::SetLE: - SignCond = ISD::SETLE; - UnsCond = ISD::SETULE; - FPCond = ISD::SETOLE; - break; - case Instruction::SetGE: - SignCond = ISD::SETGE; - UnsCond = ISD::SETUGE; - FPCond = ISD::SETOGE; - break; - case Instruction::SetLT: - SignCond = ISD::SETLT; - UnsCond = ISD::SETULT; - FPCond = ISD::SETOLT; - break; - case Instruction::SetGT: - SignCond = ISD::SETGT; - UnsCond = ISD::SETUGT; - FPCond = ISD::SETOGT; - break; + BOp = cast(Cond); + ISD::CondCode Condition; + if (ICmpInst *IC = dyn_cast(Cond)) { + switch (IC->getPredicate()) { + default: assert(0 && "Unknown icmp predicate opcode!"); + case ICmpInst::ICMP_EQ: Condition = ISD::SETEQ; break; + case ICmpInst::ICMP_NE: Condition = ISD::SETNE; break; + case ICmpInst::ICMP_SLE: Condition = ISD::SETLE; break; + case ICmpInst::ICMP_ULE: Condition = ISD::SETULE; break; + case ICmpInst::ICMP_SGE: Condition = ISD::SETGE; break; + case ICmpInst::ICMP_UGE: Condition = ISD::SETUGE; break; + case ICmpInst::ICMP_SLT: Condition = ISD::SETLT; break; + case ICmpInst::ICMP_ULT: Condition = ISD::SETULT; break; + case ICmpInst::ICMP_SGT: Condition = ISD::SETGT; break; + case ICmpInst::ICMP_UGT: Condition = ISD::SETUGT; break; + } + } else if (FCmpInst *FC = dyn_cast(Cond)) { + ISD::CondCode FPC, FOC; + switch (FC->getPredicate()) { + default: assert(0 && "Unknown fcmp predicate opcode!"); + case FCmpInst::FCMP_FALSE: FOC = FPC = ISD::SETFALSE; break; + case FCmpInst::FCMP_OEQ: FOC = ISD::SETEQ; FPC = ISD::SETOEQ; break; + case FCmpInst::FCMP_OGT: FOC = ISD::SETGT; FPC = ISD::SETOGT; break; + case FCmpInst::FCMP_OGE: FOC = ISD::SETGE; FPC = ISD::SETOGE; break; + case FCmpInst::FCMP_OLT: FOC = ISD::SETLT; FPC = ISD::SETOLT; break; + case FCmpInst::FCMP_OLE: FOC = ISD::SETLE; FPC = ISD::SETOLE; break; + case FCmpInst::FCMP_ONE: FOC = ISD::SETNE; FPC = ISD::SETONE; break; + case FCmpInst::FCMP_ORD: FOC = ISD::SETEQ; FPC = ISD::SETO; break; + case FCmpInst::FCMP_UNO: FOC = ISD::SETNE; FPC = ISD::SETUO; break; + case FCmpInst::FCMP_UEQ: FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break; + case FCmpInst::FCMP_UGT: FOC = ISD::SETGT; FPC = ISD::SETUGT; break; + case FCmpInst::FCMP_UGE: FOC = ISD::SETGE; FPC = ISD::SETUGE; break; + case FCmpInst::FCMP_ULT: FOC = ISD::SETLT; FPC = ISD::SETULT; break; + case FCmpInst::FCMP_ULE: FOC = ISD::SETLE; FPC = ISD::SETULE; break; + case FCmpInst::FCMP_UNE: FOC = ISD::SETNE; FPC = ISD::SETUNE; break; + case FCmpInst::FCMP_TRUE: FOC = FPC = ISD::SETTRUE; break; + } + if (FiniteOnlyFPMath()) + Condition = FOC; + else + Condition = FPC; + } else { + assert(0 && "Unknown compare instruction"); } - const Type *OpType = BOp->getOperand(0)->getType(); - if (const PackedType *PTy = dyn_cast(OpType)) - OpType = PTy->getElementType(); - - if (!FiniteOnlyFPMath() && OpType->isFloatingPoint()) - Condition = FPCond; - else if (OpType->isUnsigned()) - Condition = UnsCond; - else - Condition = SignCond; - SelectionDAGISel::CaseBlock CB(Condition, BOp->getOperand(0), BOp->getOperand(1), TBB, FBB, CurBB); SwitchCases.push_back(CB); @@ -1462,11 +1448,15 @@ void SelectionDAGLowering::visitShift(User &I, unsigned Opcode) { } void SelectionDAGLowering::visitICmp(User &I) { - ICmpInst *IC = cast(&I); - SDOperand Op1 = getValue(IC->getOperand(0)); - SDOperand Op2 = getValue(IC->getOperand(1)); + ICmpInst::Predicate predicate = ICmpInst::BAD_ICMP_PREDICATE; + if (ICmpInst *IC = dyn_cast(&I)) + predicate = IC->getPredicate(); + else if (ConstantExpr *IC = dyn_cast(&I)) + predicate = ICmpInst::Predicate(IC->getPredicate()); + SDOperand Op1 = getValue(I.getOperand(0)); + SDOperand Op2 = getValue(I.getOperand(1)); ISD::CondCode Opcode; - switch (IC->getPredicate()) { + switch (predicate) { case ICmpInst::ICMP_EQ : Opcode = ISD::SETEQ; break; case ICmpInst::ICMP_NE : Opcode = ISD::SETNE; break; case ICmpInst::ICMP_UGT : Opcode = ISD::SETUGT; break; @@ -1486,46 +1476,41 @@ void SelectionDAGLowering::visitICmp(User &I) { } void SelectionDAGLowering::visitFCmp(User &I) { - FCmpInst *FC = cast(&I); - SDOperand Op1 = getValue(FC->getOperand(0)); - SDOperand Op2 = getValue(FC->getOperand(1)); - ISD::CondCode Opcode; - switch (FC->getPredicate()) { - case FCmpInst::FCMP_FALSE : Opcode = ISD::SETFALSE; - case FCmpInst::FCMP_OEQ : Opcode = ISD::SETOEQ; - case FCmpInst::FCMP_OGT : Opcode = ISD::SETOGT; - case FCmpInst::FCMP_OGE : Opcode = ISD::SETOGE; - case FCmpInst::FCMP_OLT : Opcode = ISD::SETOLT; - case FCmpInst::FCMP_OLE : Opcode = ISD::SETOLE; - case FCmpInst::FCMP_ONE : Opcode = ISD::SETONE; - case FCmpInst::FCMP_ORD : Opcode = ISD::SETO; - case FCmpInst::FCMP_UNO : Opcode = ISD::SETUO; - case FCmpInst::FCMP_UEQ : Opcode = ISD::SETUEQ; - case FCmpInst::FCMP_UGT : Opcode = ISD::SETUGT; - case FCmpInst::FCMP_UGE : Opcode = ISD::SETUGE; - case FCmpInst::FCMP_ULT : Opcode = ISD::SETULT; - case FCmpInst::FCMP_ULE : Opcode = ISD::SETULE; - case FCmpInst::FCMP_UNE : Opcode = ISD::SETUNE; - case FCmpInst::FCMP_TRUE : Opcode = ISD::SETTRUE; + FCmpInst::Predicate predicate = FCmpInst::BAD_FCMP_PREDICATE; + if (FCmpInst *FC = dyn_cast(&I)) + predicate = FC->getPredicate(); + else if (ConstantExpr *FC = dyn_cast(&I)) + predicate = FCmpInst::Predicate(FC->getPredicate()); + SDOperand Op1 = getValue(I.getOperand(0)); + SDOperand Op2 = getValue(I.getOperand(1)); + ISD::CondCode Condition, FOC, FPC; + switch (predicate) { + case FCmpInst::FCMP_FALSE: FOC = FPC = ISD::SETFALSE; break; + case FCmpInst::FCMP_OEQ: FOC = ISD::SETEQ; FPC = ISD::SETOEQ; break; + case FCmpInst::FCMP_OGT: FOC = ISD::SETGT; FPC = ISD::SETOGT; break; + case FCmpInst::FCMP_OGE: FOC = ISD::SETGE; FPC = ISD::SETOGE; break; + case FCmpInst::FCMP_OLT: FOC = ISD::SETLT; FPC = ISD::SETOLT; break; + case FCmpInst::FCMP_OLE: FOC = ISD::SETLE; FPC = ISD::SETOLE; break; + case FCmpInst::FCMP_ONE: FOC = ISD::SETNE; FPC = ISD::SETONE; break; + case FCmpInst::FCMP_ORD: FOC = ISD::SETEQ; FPC = ISD::SETO; break; + case FCmpInst::FCMP_UNO: FOC = ISD::SETNE; FPC = ISD::SETUO; break; + case FCmpInst::FCMP_UEQ: FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break; + case FCmpInst::FCMP_UGT: FOC = ISD::SETGT; FPC = ISD::SETUGT; break; + case FCmpInst::FCMP_UGE: FOC = ISD::SETGE; FPC = ISD::SETUGE; break; + case FCmpInst::FCMP_ULT: FOC = ISD::SETLT; FPC = ISD::SETULT; break; + case FCmpInst::FCMP_ULE: FOC = ISD::SETLE; FPC = ISD::SETULE; break; + case FCmpInst::FCMP_UNE: FOC = ISD::SETNE; FPC = ISD::SETUNE; break; + case FCmpInst::FCMP_TRUE: FOC = FPC = ISD::SETTRUE; break; default: assert(!"Invalid FCmp predicate value"); - Opcode = ISD::SETFALSE; + FOC = FPC = ISD::SETFALSE; break; } - setValue(&I, DAG.getSetCC(MVT::i1, Op1, Op2, Opcode)); -} - -void SelectionDAGLowering::visitSetCC(User &I,ISD::CondCode SignedOpcode, - ISD::CondCode UnsignedOpcode, - ISD::CondCode FPOpcode) { - SDOperand Op1 = getValue(I.getOperand(0)); - SDOperand Op2 = getValue(I.getOperand(1)); - ISD::CondCode Opcode = SignedOpcode; - if (!FiniteOnlyFPMath() && I.getOperand(0)->getType()->isFloatingPoint()) - Opcode = FPOpcode; - else if (I.getOperand(0)->getType()->isUnsigned()) - Opcode = UnsignedOpcode; - setValue(&I, DAG.getSetCC(MVT::i1, Op1, Op2, Opcode)); + if (FiniteOnlyFPMath()) + Condition = FOC; + else + Condition = FPC; + setValue(&I, DAG.getSetCC(MVT::i1, Op1, Op2, Condition)); } void SelectionDAGLowering::visitSelect(User &I) { diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 346b6159524..3ca5682c059 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -55,18 +55,8 @@ static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2, const Type *Ty); static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2, const Type *Ty); -static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); -static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); -static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); -static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); -static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); -static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty); +static GenericValue executeCmpInst(unsigned predicate, GenericValue Src1, + GenericValue Src2, const Type *Ty); static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2, const Type *Ty); static GenericValue executeLShrInst(GenericValue Src1, GenericValue Src2, @@ -144,30 +134,12 @@ GenericValue Interpreter::getConstantExprValue (ConstantExpr *CE, return executeXorInst(getOperandValue(CE->getOperand(0), SF), getOperandValue(CE->getOperand(1), SF), CE->getOperand(0)->getType()); - case Instruction::SetEQ: - return executeSetEQInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); - case Instruction::SetNE: - return executeSetNEInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); - case Instruction::SetLE: - return executeSetLEInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); - case Instruction::SetGE: - return executeSetGEInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); - case Instruction::SetLT: - return executeSetLTInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); - case Instruction::SetGT: - return executeSetGTInst(getOperandValue(CE->getOperand(0), SF), - getOperandValue(CE->getOperand(1), SF), - CE->getOperand(0)->getType()); + case Instruction::FCmp: + case Instruction::ICmp: + return executeCmpInst(CE->getPredicate(), + getOperandValue(CE->getOperand(0), SF), + getOperandValue(CE->getOperand(1), SF), + CE->getOperand(0)->getType()); case Instruction::Shl: return executeShlInst(getOperandValue(CE->getOperand(0), SF), getOperandValue(CE->getOperand(1), SF), @@ -434,33 +406,227 @@ static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2, return Dest; } -#define IMPLEMENT_SETCC(OP, TY) \ - case Type::TY##TyID: Dest.BoolVal = Src1.TY##Val OP Src2.TY##Val; break +#define IMPLEMENT_CMP(OP, TY1, TY2) \ + case Type::TY1##TyID: Dest.BoolVal = Src1.TY2##Val OP Src2.TY2##Val; break // Handle pointers specially because they must be compared with only as much // width as the host has. We _do not_ want to be comparing 64 bit values when // running on a 32-bit target, otherwise the upper 32 bits might mess up // comparisons if they contain garbage. -#define IMPLEMENT_POINTERSETCC(OP) \ +#define IMPLEMENT_POINTERCMP(OP) \ case Type::PointerTyID: \ Dest.BoolVal = (void*)(intptr_t)Src1.PointerVal OP \ (void*)(intptr_t)Src2.PointerVal; break -static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeICMP_EQ(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(==, UByte, UByte); + IMPLEMENT_CMP(==, SByte, SByte); + IMPLEMENT_CMP(==, UShort, UShort); + IMPLEMENT_CMP(==, Short, Short); + IMPLEMENT_CMP(==, UInt, UInt); + IMPLEMENT_CMP(==, Int, Int); + IMPLEMENT_CMP(==, ULong, ULong); + IMPLEMENT_CMP(==, Long, Long); + IMPLEMENT_POINTERCMP(==); + default: + cerr << "Unhandled type for ICMP_EQ predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_NE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(!=, UByte, UByte); + IMPLEMENT_CMP(!=, SByte, SByte); + IMPLEMENT_CMP(!=, UShort,UShort); + IMPLEMENT_CMP(!=, Short, Short); + IMPLEMENT_CMP(!=, UInt, UInt); + IMPLEMENT_CMP(!=, Int, Int); + IMPLEMENT_CMP(!=, ULong, ULong); + IMPLEMENT_CMP(!=, Long, Long); + IMPLEMENT_POINTERCMP(!=); + default: + cerr << "Unhandled type for ICMP_NE predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_ULT(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(<, SByte, UByte); + IMPLEMENT_CMP(<, Short, UShort); + IMPLEMENT_CMP(<, Int, UInt); + IMPLEMENT_CMP(<, Long, ULong); + IMPLEMENT_CMP(<, UByte, UByte); + IMPLEMENT_CMP(<, UShort, UShort); + IMPLEMENT_CMP(<, UInt, UInt); + IMPLEMENT_CMP(<, ULong, ULong); + IMPLEMENT_POINTERCMP(<); + default: + cerr << "Unhandled type for ICMP_ULT predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_SLT(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(<, SByte, SByte); + IMPLEMENT_CMP(<, Short, Short); + IMPLEMENT_CMP(<, Int, Int); + IMPLEMENT_CMP(<, Long, Long); + IMPLEMENT_CMP(<, UByte, SByte); + IMPLEMENT_CMP(<, UShort, Short); + IMPLEMENT_CMP(<, UInt, Int); + IMPLEMENT_CMP(<, ULong, Long); + IMPLEMENT_POINTERCMP(<); + default: + cerr << "Unhandled type for ICMP_SLT predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_UGT(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(>, SByte, UByte); + IMPLEMENT_CMP(>, Short, UShort); + IMPLEMENT_CMP(>, Int, UInt); + IMPLEMENT_CMP(>, Long, ULong); + IMPLEMENT_CMP(>, UByte, UByte); + IMPLEMENT_CMP(>, UShort, UShort); + IMPLEMENT_CMP(>, UInt, UInt); + IMPLEMENT_CMP(>, ULong, ULong); + IMPLEMENT_POINTERCMP(>); + default: + cerr << "Unhandled type for ICMP_UGT predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_SGT(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(>, SByte, SByte); + IMPLEMENT_CMP(>, Short, Short); + IMPLEMENT_CMP(>, Int, Int); + IMPLEMENT_CMP(>, Long, Long); + IMPLEMENT_CMP(>, UByte, SByte); + IMPLEMENT_CMP(>, UShort, Short); + IMPLEMENT_CMP(>, UInt, Int); + IMPLEMENT_CMP(>, ULong, Long); + IMPLEMENT_POINTERCMP(>); + default: + cerr << "Unhandled type for ICMP_SGT predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_ULE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(<=, SByte, UByte); + IMPLEMENT_CMP(<=, Short, UShort); + IMPLEMENT_CMP(<=, Int, UInt); + IMPLEMENT_CMP(<=, Long, ULong); + IMPLEMENT_CMP(<=, UByte, UByte); + IMPLEMENT_CMP(<=, UShort, UShort); + IMPLEMENT_CMP(<=, UInt, UInt); + IMPLEMENT_CMP(<=, ULong, ULong); + IMPLEMENT_POINTERCMP(<=); + default: + cerr << "Unhandled type for ICMP_ULE predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_SLE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(<=, SByte, SByte); + IMPLEMENT_CMP(<=, Short, Short); + IMPLEMENT_CMP(<=, Int, Int); + IMPLEMENT_CMP(<=, Long, Long); + IMPLEMENT_CMP(<=, UByte, SByte); + IMPLEMENT_CMP(<=, UShort, Short); + IMPLEMENT_CMP(<=, UInt, Int); + IMPLEMENT_CMP(<=, ULong, Long); + IMPLEMENT_POINTERCMP(<=); + default: + cerr << "Unhandled type for ICMP_SLE predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_UGE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(>=, SByte, UByte); + IMPLEMENT_CMP(>=, Short, UShort); + IMPLEMENT_CMP(>=, Int, UInt); + IMPLEMENT_CMP(>=, Long, ULong); + IMPLEMENT_CMP(>=, UByte, UByte); + IMPLEMENT_CMP(>=, UShort, UShort); + IMPLEMENT_CMP(>=, UInt, UInt); + IMPLEMENT_CMP(>=, ULong, ULong); + IMPLEMENT_POINTERCMP(>=); + default: + cerr << "Unhandled type for ICMP_UGE predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +static GenericValue executeICMP_SGE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { + GenericValue Dest; + switch (Ty->getTypeID()) { + IMPLEMENT_CMP(>=, SByte, SByte); + IMPLEMENT_CMP(>=, Short, Short); + IMPLEMENT_CMP(>=, Int, Int); + IMPLEMENT_CMP(>=, Long, Long); + IMPLEMENT_CMP(>=, UByte, SByte); + IMPLEMENT_CMP(>=, UShort, Short); + IMPLEMENT_CMP(>=, UInt, Int); + IMPLEMENT_CMP(>=, ULong, Long); + IMPLEMENT_POINTERCMP(>=); + default: + cerr << "Unhandled type for ICMP_SGE predicate: " << *Ty << "\n"; + abort(); + } + return Dest; +} + +#define IMPLEMENT_SETCC(OP, TY) \ + case Type::TY##TyID: Dest.BoolVal = Src1.TY##Val OP Src2.TY##Val; break + +static GenericValue executeFCMP_EQ(GenericValue Src1, GenericValue Src2, + const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(==, UByte); - IMPLEMENT_SETCC(==, SByte); - IMPLEMENT_SETCC(==, UShort); - IMPLEMENT_SETCC(==, Short); - IMPLEMENT_SETCC(==, UInt); - IMPLEMENT_SETCC(==, Int); - IMPLEMENT_SETCC(==, ULong); - IMPLEMENT_SETCC(==, Long); IMPLEMENT_SETCC(==, Float); IMPLEMENT_SETCC(==, Double); - IMPLEMENT_POINTERSETCC(==); default: cerr << "Unhandled type for SetEQ instruction: " << *Ty << "\n"; abort(); @@ -468,21 +634,12 @@ static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, return Dest; } -static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeFCMP_NE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(!=, UByte); - IMPLEMENT_SETCC(!=, SByte); - IMPLEMENT_SETCC(!=, UShort); - IMPLEMENT_SETCC(!=, Short); - IMPLEMENT_SETCC(!=, UInt); - IMPLEMENT_SETCC(!=, Int); - IMPLEMENT_SETCC(!=, ULong); - IMPLEMENT_SETCC(!=, Long); IMPLEMENT_SETCC(!=, Float); IMPLEMENT_SETCC(!=, Double); - IMPLEMENT_POINTERSETCC(!=); default: cerr << "Unhandled type for SetNE instruction: " << *Ty << "\n"; @@ -491,21 +648,12 @@ static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, return Dest; } -static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeFCMP_LE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(<=, UByte); - IMPLEMENT_SETCC(<=, SByte); - IMPLEMENT_SETCC(<=, UShort); - IMPLEMENT_SETCC(<=, Short); - IMPLEMENT_SETCC(<=, UInt); - IMPLEMENT_SETCC(<=, Int); - IMPLEMENT_SETCC(<=, ULong); - IMPLEMENT_SETCC(<=, Long); IMPLEMENT_SETCC(<=, Float); IMPLEMENT_SETCC(<=, Double); - IMPLEMENT_POINTERSETCC(<=); default: cerr << "Unhandled type for SetLE instruction: " << *Ty << "\n"; abort(); @@ -513,21 +661,12 @@ static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, return Dest; } -static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeFCMP_GE(GenericValue Src1, GenericValue Src2, + const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(>=, UByte); - IMPLEMENT_SETCC(>=, SByte); - IMPLEMENT_SETCC(>=, UShort); - IMPLEMENT_SETCC(>=, Short); - IMPLEMENT_SETCC(>=, UInt); - IMPLEMENT_SETCC(>=, Int); - IMPLEMENT_SETCC(>=, ULong); - IMPLEMENT_SETCC(>=, Long); IMPLEMENT_SETCC(>=, Float); IMPLEMENT_SETCC(>=, Double); - IMPLEMENT_POINTERSETCC(>=); default: cerr << "Unhandled type for SetGE instruction: " << *Ty << "\n"; abort(); @@ -535,21 +674,12 @@ static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, return Dest; } -static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, - const Type *Ty) { +static GenericValue executeFCMP_LT(GenericValue Src1, GenericValue Src2, + const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(<, UByte); - IMPLEMENT_SETCC(<, SByte); - IMPLEMENT_SETCC(<, UShort); - IMPLEMENT_SETCC(<, Short); - IMPLEMENT_SETCC(<, UInt); - IMPLEMENT_SETCC(<, Int); - IMPLEMENT_SETCC(<, ULong); - IMPLEMENT_SETCC(<, Long); IMPLEMENT_SETCC(<, Float); IMPLEMENT_SETCC(<, Double); - IMPLEMENT_POINTERSETCC(<); default: cerr << "Unhandled type for SetLT instruction: " << *Ty << "\n"; abort(); @@ -557,21 +687,12 @@ static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, return Dest; } -static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, +static GenericValue executeFCMP_GT(GenericValue Src1, GenericValue Src2, const Type *Ty) { GenericValue Dest; switch (Ty->getTypeID()) { - IMPLEMENT_SETCC(>, UByte); - IMPLEMENT_SETCC(>, SByte); - IMPLEMENT_SETCC(>, UShort); - IMPLEMENT_SETCC(>, Short); - IMPLEMENT_SETCC(>, UInt); - IMPLEMENT_SETCC(>, Int); - IMPLEMENT_SETCC(>, ULong); - IMPLEMENT_SETCC(>, Long); IMPLEMENT_SETCC(>, Float); IMPLEMENT_SETCC(>, Double); - IMPLEMENT_POINTERSETCC(>); default: cerr << "Unhandled type for SetGT instruction: " << *Ty << "\n"; abort(); @@ -579,6 +700,108 @@ static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, return Dest; } +void Interpreter::visitFCmpInst(FCmpInst &I) { + ExecutionContext &SF = ECStack.back(); + const Type *Ty = I.getOperand(0)->getType(); + GenericValue Src1 = getOperandValue(I.getOperand(0), SF); + GenericValue Src2 = getOperandValue(I.getOperand(1), SF); + GenericValue R; // Result + + switch (I.getPredicate()) { + case FCmpInst::FCMP_FALSE: R.BoolVal = false; + case FCmpInst::FCMP_ORD: R = executeFCMP_EQ(Src1, Src2, Ty); break; ///??? + case FCmpInst::FCMP_UNO: R = executeFCMP_NE(Src1, Src2, Ty); break; ///??? + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_UEQ: R = executeFCMP_EQ(Src1, Src2, Ty); break; + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: R = executeFCMP_NE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OLT: + case FCmpInst::FCMP_ULT: R = executeFCMP_LT(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_UGT: R = executeFCMP_GT(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ULE: R = executeFCMP_LE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OGE: + case FCmpInst::FCMP_UGE: R = executeFCMP_GE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_TRUE: R.BoolVal = true; + default: + cerr << "Don't know how to handle this FCmp predicate!\n-->" << I; + abort(); + } + + SetValue(&I, R, SF); +} + +void Interpreter::visitICmpInst(ICmpInst &I) { + ExecutionContext &SF = ECStack.back(); + const Type *Ty = I.getOperand(0)->getType(); + GenericValue Src1 = getOperandValue(I.getOperand(0), SF); + GenericValue Src2 = getOperandValue(I.getOperand(1), SF); + GenericValue R; // Result + + switch (I.getPredicate()) { + case ICmpInst::ICMP_EQ: R = executeICMP_EQ(Src1, Src2, Ty); break; + case ICmpInst::ICMP_NE: R = executeICMP_NE(Src1, Src2, Ty); break; + case ICmpInst::ICMP_ULT: R = executeICMP_ULT(Src1, Src2, Ty); break; + case ICmpInst::ICMP_SLT: R = executeICMP_SLT(Src1, Src2, Ty); break; + case ICmpInst::ICMP_UGT: R = executeICMP_UGT(Src1, Src2, Ty); break; + case ICmpInst::ICMP_SGT: R = executeICMP_SGT(Src1, Src2, Ty); break; + case ICmpInst::ICMP_ULE: R = executeICMP_ULE(Src1, Src2, Ty); break; + case ICmpInst::ICMP_SLE: R = executeICMP_SLE(Src1, Src2, Ty); break; + case ICmpInst::ICMP_UGE: R = executeICMP_UGE(Src1, Src2, Ty); break; + case ICmpInst::ICMP_SGE: R = executeICMP_SGE(Src1, Src2, Ty); break; + default: + cerr << "Don't know how to handle this ICmp predicate!\n-->" << I; + abort(); + } + + SetValue(&I, R, SF); +} + +static GenericValue executeCmpInst(unsigned predicate, GenericValue Src1, + GenericValue Src2, const Type *Ty) { + GenericValue Result; + switch (predicate) { + case ICmpInst::ICMP_EQ: return executeICMP_EQ(Src1, Src2, Ty); + case ICmpInst::ICMP_NE: return executeICMP_NE(Src1, Src2, Ty); + case ICmpInst::ICMP_UGT: return executeICMP_UGT(Src1, Src2, Ty); + case ICmpInst::ICMP_SGT: return executeICMP_SGT(Src1, Src2, Ty); + case ICmpInst::ICMP_ULT: return executeICMP_ULT(Src1, Src2, Ty); + case ICmpInst::ICMP_SLT: return executeICMP_SLT(Src1, Src2, Ty); + case ICmpInst::ICMP_UGE: return executeICMP_UGE(Src1, Src2, Ty); + case ICmpInst::ICMP_SGE: return executeICMP_SGE(Src1, Src2, Ty); + case ICmpInst::ICMP_ULE: return executeICMP_ULE(Src1, Src2, Ty); + case ICmpInst::ICMP_SLE: return executeICMP_SLE(Src1, Src2, Ty); + case FCmpInst::FCMP_ORD: return executeFCMP_EQ(Src1, Src2, Ty); break; + case FCmpInst::FCMP_UNO: return executeFCMP_NE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_UEQ: return executeFCMP_EQ(Src1, Src2, Ty); break; + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: return executeFCMP_NE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OLT: + case FCmpInst::FCMP_ULT: return executeFCMP_LT(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_UGT: return executeFCMP_GT(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ULE: return executeFCMP_LE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_OGE: + case FCmpInst::FCMP_UGE: return executeFCMP_GE(Src1, Src2, Ty); break; + case FCmpInst::FCMP_FALSE: { + GenericValue Result; + Result.BoolVal = false; + return Result; + } + case FCmpInst::FCMP_TRUE: { + GenericValue Result; + Result.BoolVal = true; + return Result; + } + default: + cerr << "Unhandled Cmp predicate\n"; + abort(); + } +} + void Interpreter::visitBinaryOperator(BinaryOperator &I) { ExecutionContext &SF = ECStack.back(); const Type *Ty = I.getOperand(0)->getType(); @@ -599,12 +822,6 @@ void Interpreter::visitBinaryOperator(BinaryOperator &I) { case Instruction::And: R = executeAndInst (Src1, Src2, Ty); break; case Instruction::Or: R = executeOrInst (Src1, Src2, Ty); break; case Instruction::Xor: R = executeXorInst (Src1, Src2, Ty); break; - case Instruction::SetEQ: R = executeSetEQInst(Src1, Src2, Ty); break; - case Instruction::SetNE: R = executeSetNEInst(Src1, Src2, Ty); break; - case Instruction::SetLE: R = executeSetLEInst(Src1, Src2, Ty); break; - case Instruction::SetGE: R = executeSetGEInst(Src1, Src2, Ty); break; - case Instruction::SetLT: R = executeSetLTInst(Src1, Src2, Ty); break; - case Instruction::SetGT: R = executeSetGTInst(Src1, Src2, Ty); break; default: cerr << "Don't know how to handle this binary operator!\n-->" << I; abort(); @@ -732,8 +949,8 @@ void Interpreter::visitSwitchInst(SwitchInst &I) { // Check to see if any of the cases match... BasicBlock *Dest = 0; for (unsigned i = 2, e = I.getNumOperands(); i != e; i += 2) - if (executeSetEQInst(CondVal, - getOperandValue(I.getOperand(i), SF), ElTy).BoolVal) { + if (executeICMP_EQ(CondVal, + getOperandValue(I.getOperand(i), SF), ElTy).BoolVal) { Dest = cast(I.getOperand(i+1)); break; } diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index 58d0ab414b8..559c7dc5057 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -136,6 +136,8 @@ public: void visitSwitchInst(SwitchInst &I); void visitBinaryOperator(BinaryOperator &I); + void visitICmpInst(ICmpInst &I); + void visitFCmpInst(FCmpInst &I); void visitAllocationInst(AllocationInst &I); void visitFreeInst(FreeInst &I); void visitLoadInst(LoadInst &I); diff --git a/lib/Support/ConstantRange.cpp b/lib/Support/ConstantRange.cpp index 762d5c358ad..69d85c2e38e 100644 --- a/lib/Support/ConstantRange.cpp +++ b/lib/Support/ConstantRange.cpp @@ -24,56 +24,43 @@ #include "llvm/Support/ConstantRange.h" #include "llvm/Constants.h" #include "llvm/Instruction.h" +#include "llvm/Instructions.h" #include "llvm/Type.h" #include "llvm/Support/Streams.h" #include using namespace llvm; -static ConstantIntegral *getMaxValue(const Type *Ty) { - switch (Ty->getTypeID()) { - case Type::BoolTyID: return ConstantBool::getTrue(); - case Type::SByteTyID: - case Type::ShortTyID: - case Type::IntTyID: - case Type::LongTyID: { - // Calculate 011111111111111... - unsigned TypeBits = Ty->getPrimitiveSize()*8; - int64_t Val = INT64_MAX; // All ones - Val >>= 64-TypeBits; // Shift out unwanted 1 bits... - return ConstantInt::get(Ty, Val); - } - - case Type::UByteTyID: - case Type::UShortTyID: - case Type::UIntTyID: - case Type::ULongTyID: return ConstantInt::getAllOnesValue(Ty); - - default: return 0; +static ConstantIntegral *getMaxValue(const Type *Ty, bool isSigned = false) { + if (Ty == Type::BoolTy) + return ConstantBool::getTrue(); + if (Ty->isInteger()) { + if (isSigned) { + // Calculate 011111111111111... + unsigned TypeBits = Ty->getPrimitiveSize()*8; + int64_t Val = INT64_MAX; // All ones + Val >>= 64-TypeBits; // Shift out unwanted 1 bits... + return ConstantInt::get(Ty, Val); + } + return ConstantInt::getAllOnesValue(Ty); } + return 0; } // Static constructor to create the minimum constant for an integral type... -static ConstantIntegral *getMinValue(const Type *Ty) { - switch (Ty->getTypeID()) { - case Type::BoolTyID: return ConstantBool::getFalse(); - case Type::SByteTyID: - case Type::ShortTyID: - case Type::IntTyID: - case Type::LongTyID: { - // Calculate 1111111111000000000000 - unsigned TypeBits = Ty->getPrimitiveSize()*8; - int64_t Val = -1; // All ones - Val <<= TypeBits-1; // Shift over to the right spot - return ConstantInt::get(Ty, Val); - } - - case Type::UByteTyID: - case Type::UShortTyID: - case Type::UIntTyID: - case Type::ULongTyID: return ConstantInt::get(Ty, 0); - - default: return 0; +static ConstantIntegral *getMinValue(const Type *Ty, bool isSigned = false) { + if (Ty == Type::BoolTy) + return ConstantBool::getFalse(); + if (Ty->isInteger()) { + if (isSigned) { + // Calculate 1111111111000000000000 + unsigned TypeBits = Ty->getPrimitiveSize()*8; + int64_t Val = -1; // All ones + Val <<= TypeBits-1; // Shift over to the right spot + return ConstantInt::get(Ty, Val); + } + return ConstantInt::get(Ty, 0); } + return 0; } static ConstantIntegral *Next(ConstantIntegral *CI) { if (ConstantBool *CB = dyn_cast(CI)) @@ -84,25 +71,30 @@ static ConstantIntegral *Next(ConstantIntegral *CI) { return cast(Result); } -static bool LT(ConstantIntegral *A, ConstantIntegral *B) { - Constant *C = ConstantExpr::getSetLT(A, B); +static bool LT(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + Constant *C = ConstantExpr::getICmp( + (isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT), A, B); assert(isa(C) && "Constant folding of integrals not impl??"); return cast(C)->getValue(); } -static bool LTE(ConstantIntegral *A, ConstantIntegral *B) { - Constant *C = ConstantExpr::getSetLE(A, B); +static bool LTE(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + Constant *C = ConstantExpr::getICmp( + (isSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE), A, B); assert(isa(C) && "Constant folding of integrals not impl??"); return cast(C)->getValue(); } -static bool GT(ConstantIntegral *A, ConstantIntegral *B) { return LT(B, A); } +static bool GT(ConstantIntegral *A, ConstantIntegral *B, bool isSigned) { + return LT(B, A, isSigned); } -static ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B) { - return LT(A, B) ? A : B; +static ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B, + bool isSigned) { + return LT(A, B, isSigned) ? A : B; } -static ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B) { - return GT(A, B) ? A : B; +static ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B, + bool isSigned) { + return GT(A, B, isSigned) ? A : B; } /// Initialize a full (the default) or empty set for the specified type. @@ -118,47 +110,62 @@ ConstantRange::ConstantRange(const Type *Ty, bool Full) { /// Initialize a range to hold the single specified value. /// -ConstantRange::ConstantRange(Constant *V) - : Lower(cast(V)), Upper(Next(cast(V))) { -} +ConstantRange::ConstantRange(Constant *V) + : Lower(cast(V)), Upper(Next(cast(V))) { } /// Initialize a range of values explicitly... this will assert out if /// Lower==Upper and Lower != Min or Max for its type (or if the two constants /// have different types) /// -ConstantRange::ConstantRange(Constant *L, Constant *U) +ConstantRange::ConstantRange(Constant *L, Constant *U) : Lower(cast(L)), Upper(cast(U)) { assert(Lower->getType() == Upper->getType() && "Incompatible types for ConstantRange!"); // Make sure that if L & U are equal that they are either Min or Max... assert((L != U || (L == getMaxValue(L->getType()) || - L == getMinValue(L->getType()))) && - "Lower == Upper, but they aren't min or max for type!"); + L == getMinValue(L->getType()))) + && "Lower == Upper, but they aren't min or max for type!"); } /// Initialize a set of values that all satisfy the condition with C. /// -ConstantRange::ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C) { - switch (SetCCOpcode) { - default: assert(0 && "Invalid SetCC opcode to ConstantRange ctor!"); - case Instruction::SetEQ: Lower = C; Upper = Next(C); return; - case Instruction::SetNE: Upper = C; Lower = Next(C); return; - case Instruction::SetLT: +ConstantRange::ConstantRange(unsigned short ICmpOpcode, ConstantIntegral *C) { + switch (ICmpOpcode) { + default: assert(0 && "Invalid ICmp opcode to ConstantRange ctor!"); + case ICmpInst::ICMP_EQ: Lower = C; Upper = Next(C); return; + case ICmpInst::ICMP_NE: Upper = C; Lower = Next(C); return; + case ICmpInst::ICMP_ULT: Lower = getMinValue(C->getType()); Upper = C; return; - case Instruction::SetGT: + case ICmpInst::ICMP_SLT: + Lower = getMinValue(C->getType(), true); + Upper = C; + return; + case ICmpInst::ICMP_UGT: + Lower = Next(C); + Upper = getMinValue(C->getType()); // Min = Next(Max) + return; + case ICmpInst::ICMP_SGT: Lower = Next(C); - Upper = getMinValue(C->getType()); // Min = Next(Max) + Upper = getMinValue(C->getType(), true); // Min = Next(Max) return; - case Instruction::SetLE: + case ICmpInst::ICMP_ULE: Lower = getMinValue(C->getType()); Upper = Next(C); return; - case Instruction::SetGE: + case ICmpInst::ICMP_SLE: + Lower = getMinValue(C->getType(), true); + Upper = Next(C); + return; + case ICmpInst::ICMP_UGE: + Lower = C; + Upper = getMinValue(C->getType()); // Min = Next(Max) + return; + case ICmpInst::ICMP_SGE: Lower = C; - Upper = getMinValue(C->getType()); // Min = Next(Max) + Upper = getMinValue(C->getType(), true); // Min = Next(Max) return; } } @@ -182,11 +189,10 @@ bool ConstantRange::isEmptySet() const { /// isWrappedSet - Return true if this set wraps around the top of the range, /// for example: [100, 8) /// -bool ConstantRange::isWrappedSet() const { - return GT(Lower, Upper); +bool ConstantRange::isWrappedSet(bool isSigned) const { + return GT(Lower, Upper, isSigned); } - /// getSingleElement - If this set contains a single element, return it, /// otherwise return null. ConstantIntegral *ConstantRange::getSingleElement() const { @@ -212,19 +218,17 @@ uint64_t ConstantRange::getSetSize() const { /// contains - Return true if the specified value is in the set. /// -bool ConstantRange::contains(ConstantInt *Val) const { +bool ConstantRange::contains(ConstantInt *Val, bool isSigned) const { if (Lower == Upper) { if (isFullSet()) return true; return false; } - if (!isWrappedSet()) - return LTE(Lower, Val) && LT(Val, Upper); - return LTE(Lower, Val) || LT(Val, Upper); + if (!isWrappedSet(isSigned)) + return LTE(Lower, Val, isSigned) && LT(Val, Upper, isSigned); + return LTE(Lower, Val, isSigned) || LT(Val, Upper, isSigned); } - - /// subtract - Subtract the specified constant from the endpoints of this /// constant range. ConstantRange ConstantRange::subtract(ConstantInt *CI) const { @@ -241,15 +245,16 @@ ConstantRange ConstantRange::subtract(ConstantInt *CI) const { // it is known that LHS is wrapped and RHS isn't. // static ConstantRange intersect1Wrapped(const ConstantRange &LHS, - const ConstantRange &RHS) { - assert(LHS.isWrappedSet() && !RHS.isWrappedSet()); + const ConstantRange &RHS, + bool isSigned) { + assert(LHS.isWrappedSet(isSigned) && !RHS.isWrappedSet(isSigned)); // Check to see if we overlap on the Left side of RHS... // - if (LT(RHS.getLower(), LHS.getUpper())) { + if (LT(RHS.getLower(), LHS.getUpper(), isSigned)) { // We do overlap on the left side of RHS, see if we overlap on the right of // RHS... - if (GT(RHS.getUpper(), LHS.getLower())) { + if (GT(RHS.getUpper(), LHS.getLower(), isSigned)) { // Ok, the result overlaps on both the left and right sides. See if the // resultant interval will be smaller if we wrap or not... // @@ -262,11 +267,10 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, // No overlap on the right, just on the left. return ConstantRange(RHS.getLower(), LHS.getUpper()); } - } else { // We don't overlap on the left side of RHS, see if we overlap on the right // of RHS... - if (GT(RHS.getUpper(), LHS.getLower())) { + if (GT(RHS.getUpper(), LHS.getLower(), isSigned)) { // Simple overlap... return ConstantRange(LHS.getLower(), RHS.getUpper()); } else { @@ -279,30 +283,31 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, /// intersect - Return the range that results from the intersection of this /// range with another range. /// -ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { +ConstantRange ConstantRange::intersectWith(const ConstantRange &CR, + bool isSigned) const { assert(getType() == CR.getType() && "ConstantRange types don't agree!"); // Handle common special cases if (isEmptySet() || CR.isFullSet()) return *this; if (isFullSet() || CR.isEmptySet()) return CR; - if (!isWrappedSet()) { - if (!CR.isWrappedSet()) { - ConstantIntegral *L = Max(Lower, CR.Lower); - ConstantIntegral *U = Min(Upper, CR.Upper); + if (!isWrappedSet(isSigned)) { + if (!CR.isWrappedSet(isSigned)) { + ConstantIntegral *L = Max(Lower, CR.Lower, isSigned); + ConstantIntegral *U = Min(Upper, CR.Upper, isSigned); - if (LT(L, U)) // If range isn't empty... + if (LT(L, U, isSigned)) // If range isn't empty... return ConstantRange(L, U); else return ConstantRange(getType(), false); // Otherwise, return empty set } else - return intersect1Wrapped(CR, *this); + return intersect1Wrapped(CR, *this, isSigned); } else { // We know "this" is wrapped... - if (!CR.isWrappedSet()) - return intersect1Wrapped(*this, CR); + if (!CR.isWrappedSet(isSigned)) + return intersect1Wrapped(*this, CR, isSigned); else { // Both ranges are wrapped... - ConstantIntegral *L = Max(Lower, CR.Lower); - ConstantIntegral *U = Min(Upper, CR.Upper); + ConstantIntegral *L = Max(Lower, CR.Lower, isSigned); + ConstantIntegral *U = Min(Upper, CR.Upper, isSigned); return ConstantRange(L, U); } } @@ -315,7 +320,8 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { /// 15), which includes 9, 10, and 11, which were not included in either set /// before. /// -ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const { +ConstantRange ConstantRange::unionWith(const ConstantRange &CR, + bool isSigned) const { assert(getType() == CR.getType() && "ConstantRange types don't agree!"); assert(0 && "Range union not implemented yet!"); @@ -325,7 +331,7 @@ ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const { /// zeroExtend - Return a new range in the specified integer type, which must /// be strictly larger than the current type. The returned range will -/// correspond to the possible range of values if the source range had been +/// correspond to the possible range of values as if the source range had been /// zero extended. ConstantRange ConstantRange::zeroExtend(const Type *Ty) const { assert(getLower()->getType()->getPrimitiveSize() < Ty->getPrimitiveSize() && @@ -346,7 +352,7 @@ ConstantRange ConstantRange::zeroExtend(const Type *Ty) const { /// truncate - Return a new range in the specified integer type, which must be /// strictly smaller than the current type. The returned range will -/// correspond to the possible range of values if the source range had been +/// correspond to the possible range of values as if the source range had been /// truncated to the specified type. ConstantRange ConstantRange::truncate(const Type *Ty) const { assert(getLower()->getType()->getPrimitiveSize() > Ty->getPrimitiveSize() && @@ -360,7 +366,6 @@ ConstantRange ConstantRange::truncate(const Type *Ty) const { ConstantExpr::getTrunc(getUpper(), Ty)); } - /// print - Print out the bounds to a stream... /// void ConstantRange::print(std::ostream &OS) const { diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 13fd574e0cd..af56e26f9ea 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -116,6 +116,9 @@ namespace { std::ostream &printType(std::ostream &Out, const Type *Ty, const std::string &VariableName = "", bool IgnoreName = false); + std::ostream &printPrimitiveType(std::ostream &Out, const Type *Ty, + bool isSigned, + const std::string &NameSoFar = ""); void printStructReturnPointerFunctionType(std::ostream &Out, const PointerType *Ty); @@ -124,6 +127,7 @@ namespace { void writeOperandRaw(Value *Operand); void writeOperandInternal(Value *Operand); void writeOperandWithCast(Value* Operand, unsigned Opcode); + void writeOperandWithCast(Value* Operand, ICmpInst::Predicate predicate); bool writeInstructionCast(const Instruction &I); private : @@ -154,9 +158,10 @@ namespace { // printed and an extra copy of the expr is not emitted. // static bool isInlinableInst(const Instruction &I) { - // Always inline setcc instructions, even if they are shared by multiple + // Always inline cmp instructions, even if they are shared by multiple // expressions. GCC generates horrible code if we don't. - if (isa(I)) return true; + if (isa(I)) + return true; // Must be an expression, must be used exactly once. If it is dead, we // emit it inline where it would go. @@ -211,6 +216,8 @@ namespace { void visitPHINode(PHINode &I); void visitBinaryOperator(Instruction &I); + void visitICmpInst(ICmpInst &I); + void visitFCmpInst(FCmpInst &I); void visitCastInst (CastInst &I); void visitSelectInst(SelectInst &I); @@ -351,6 +358,32 @@ void CWriter::printStructReturnPointerFunctionType(std::ostream &Out, printType(Out, RetTy, tstr); } +std::ostream & +CWriter::printPrimitiveType(std::ostream &Out, const Type *Ty, bool isSigned, + const std::string &NameSoFar) { + assert(Ty->isPrimitiveType() && "Invalid type for printPrimitiveType"); + switch (Ty->getTypeID()) { + case Type::VoidTyID: return Out << "void " << NameSoFar; + case Type::BoolTyID: return Out << "bool " << NameSoFar; + case Type::UByteTyID: + case Type::SByteTyID: + return Out << (isSigned?"signed":"unsigned") << " char " << NameSoFar; + case Type::UShortTyID: + case Type::ShortTyID: + return Out << (isSigned?"signed":"unsigned") << " short " << NameSoFar; + case Type::UIntTyID: + case Type::IntTyID: + return Out << (isSigned?"signed":"unsigned") << " int " << NameSoFar; + case Type::ULongTyID: + case Type::LongTyID: + return Out << (isSigned?"signed":"unsigned") << " long long " << NameSoFar; + case Type::FloatTyID: return Out << "float " << NameSoFar; + case Type::DoubleTyID: return Out << "double " << NameSoFar; + default : + cerr << "Unknown primitive type: " << *Ty << "\n"; + abort(); + } +} // Pass the Type* and the variable name and this prints out the variable // declaration. @@ -358,24 +391,13 @@ void CWriter::printStructReturnPointerFunctionType(std::ostream &Out, std::ostream &CWriter::printType(std::ostream &Out, const Type *Ty, const std::string &NameSoFar, bool IgnoreName) { - if (Ty->isPrimitiveType()) - switch (Ty->getTypeID()) { - case Type::VoidTyID: return Out << "void " << NameSoFar; - case Type::BoolTyID: return Out << "bool " << NameSoFar; - case Type::UByteTyID: return Out << "unsigned char " << NameSoFar; - case Type::SByteTyID: return Out << "signed char " << NameSoFar; - case Type::UShortTyID: return Out << "unsigned short " << NameSoFar; - case Type::ShortTyID: return Out << "short " << NameSoFar; - case Type::UIntTyID: return Out << "unsigned " << NameSoFar; - case Type::IntTyID: return Out << "int " << NameSoFar; - case Type::ULongTyID: return Out << "unsigned long long " << NameSoFar; - case Type::LongTyID: return Out << "signed long long " << NameSoFar; - case Type::FloatTyID: return Out << "float " << NameSoFar; - case Type::DoubleTyID: return Out << "double " << NameSoFar; - default : - cerr << "Unknown primitive type: " << *Ty << "\n"; - abort(); - } + if (Ty->isPrimitiveType()) { + // FIXME:Signedness. When integer types are signless, this should just + // always pass "false" for the sign of the primitive type. The instructions + // will figure out how the value is to be interpreted. + printPrimitiveType(Out, Ty, true, NameSoFar); + return Out; + } // Check to see if the type is named. if (!IgnoreName || isa(Ty)) { @@ -578,41 +600,66 @@ static bool isFPCSafeToPrint(const ConstantFP *CFP) { /// Print out the casting for a cast operation. This does the double casting /// necessary for conversion to the destination type, if necessary. -/// @returns true if a closing paren is necessary /// @brief Print a cast void CWriter::printCast(unsigned opc, const Type *SrcTy, const Type *DstTy) { - Out << '('; - printType(Out, DstTy); - Out << ')'; + // Print the destination type cast switch (opc) { case Instruction::UIToFP: + case Instruction::SIToFP: + case Instruction::IntToPtr: + case Instruction::Trunc: + case Instruction::BitCast: + case Instruction::FPExt: + case Instruction::FPTrunc: // For these the DstTy sign doesn't matter + Out << '('; + printType(Out, DstTy); + Out << ')'; + break; case Instruction::ZExt: - if (SrcTy->isSigned()) { - Out << '('; - printType(Out, SrcTy->getUnsignedVersion()); - Out << ')'; - } + case Instruction::PtrToInt: + case Instruction::FPToUI: // For these, make sure we get an unsigned dest + Out << '('; + printPrimitiveType(Out, DstTy, false); + Out << ')'; + break; + case Instruction::SExt: + case Instruction::FPToSI: // For these, make sure we get a signed dest + Out << '('; + printPrimitiveType(Out, DstTy, true); + Out << ')'; + break; + default: + assert(0 && "Invalid cast opcode"); + } + + // Print the source type cast + switch (opc) { + case Instruction::UIToFP: + case Instruction::ZExt: + Out << '('; + printPrimitiveType(Out, SrcTy, false); + Out << ')'; break; case Instruction::SIToFP: case Instruction::SExt: - if (SrcTy->isUnsigned()) { - Out << '('; - printType(Out, SrcTy->getSignedVersion()); - Out << ')'; - } + Out << '('; + printPrimitiveType(Out, SrcTy, true); + Out << ')'; break; case Instruction::IntToPtr: case Instruction::PtrToInt: - // Avoid "cast to pointer from integer of different size" warnings - Out << "(unsigned long)"; - break; + // Avoid "cast to pointer from integer of different size" warnings + Out << "(unsigned long)"; + break; case Instruction::Trunc: case Instruction::BitCast: case Instruction::FPExt: case Instruction::FPTrunc: case Instruction::FPToSI: case Instruction::FPToUI: + break; // These don't need a source cast. default: + assert(0 && "Invalid cast opcode"); break; } } @@ -679,12 +726,8 @@ void CWriter::printConstant(Constant *CPV) { case Instruction::And: case Instruction::Or: case Instruction::Xor: - case Instruction::SetEQ: - case Instruction::SetNE: - case Instruction::SetLT: - case Instruction::SetLE: - case Instruction::SetGT: - case Instruction::SetGE: + case Instruction::ICmp: + case Instruction::FCmp: case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: @@ -705,15 +748,43 @@ void CWriter::printConstant(Constant *CPV) { case Instruction::And: Out << " & "; break; case Instruction::Or: Out << " | "; break; case Instruction::Xor: Out << " ^ "; break; - case Instruction::SetEQ: Out << " == "; break; - case Instruction::SetNE: Out << " != "; break; - case Instruction::SetLT: Out << " < "; break; - case Instruction::SetLE: Out << " <= "; break; - case Instruction::SetGT: Out << " > "; break; - case Instruction::SetGE: Out << " >= "; break; case Instruction::Shl: Out << " << "; break; case Instruction::LShr: case Instruction::AShr: Out << " >> "; break; + case Instruction::ICmp: + switch (CE->getPredicate()) { + case ICmpInst::ICMP_EQ: Out << " == "; break; + case ICmpInst::ICMP_NE: Out << " != "; break; + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_ULT: Out << " < "; break; + case ICmpInst::ICMP_SLE: + case ICmpInst::ICMP_ULE: Out << " <= "; break; + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_UGT: Out << " > "; break; + case ICmpInst::ICMP_SGE: + case ICmpInst::ICMP_UGE: Out << " >= "; break; + default: assert(0 && "Illegal ICmp predicate"); + } + break; + case Instruction::FCmp: + switch (CE->getPredicate()) { + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_UEQ: + case FCmpInst::FCMP_OEQ: Out << " == "; break; + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_UNE: + case FCmpInst::FCMP_ONE: Out << " != "; break; + case FCmpInst::FCMP_OLT: + case FCmpInst::FCMP_ULT: Out << " < "; break; + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ULE: Out << " <= "; break; + case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_UGT: Out << " > "; break; + case FCmpInst::FCMP_OGE: + case FCmpInst::FCMP_UGE: Out << " >= "; break; + default: assert(0 && "Illegal FCmp predicate"); + } + break; default: assert(0 && "Illegal opcode here!"); } printConstantWithCast(CE->getOperand(1), CE->getOpcode()); @@ -730,7 +801,7 @@ void CWriter::printConstant(Constant *CPV) { } } else if (isa(CPV) && CPV->getType()->isFirstClassType()) { Out << "(("; - printType(Out, CPV->getType()); + printType(Out, CPV->getType()); // sign doesn't matter Out << ")/*UNDEF*/0)"; return; } @@ -740,9 +811,23 @@ void CWriter::printConstant(Constant *CPV) { Out << (cast(CPV)->getValue() ? '1' : '0'); break; case Type::SByteTyID: + case Type::UByteTyID: + Out << "((char)" << cast(CPV)->getSExtValue() << ")"; + break; case Type::ShortTyID: - Out << cast(CPV)->getSExtValue(); + case Type::UShortTyID: + Out << "((short)" << cast(CPV)->getSExtValue() << ")"; break; + case Type::IntTyID: + case Type::UIntTyID: + Out << "((int)" << cast(CPV)->getSExtValue() << ")"; + break; + case Type::LongTyID: + case Type::ULongTyID: + Out << "((long long)" << cast(CPV)->getSExtValue() << "ll)"; + break; + +#if 0 case Type::IntTyID: if ((int)cast(CPV)->getSExtValue() == (int)0x80000000) Out << "((int)0x80000000U)"; // Handle MININT specially to avoid warning @@ -767,6 +852,7 @@ void CWriter::printConstant(Constant *CPV) { case Type::ULongTyID: Out << cast(CPV)->getZExtValue() << "ull"; break; +#endif case Type::FloatTyID: case Type::DoubleTyID: { @@ -890,7 +976,7 @@ void CWriter::printConstant(Constant *CPV) { case Type::PointerTyID: if (isa(CPV)) { Out << "(("; - printType(Out, CPV->getType()); + printType(Out, CPV->getType()); // sign doesn't matter Out << ")/*NULL*/0)"; break; } else if (GlobalValue *GV = dyn_cast(CPV)) { @@ -910,17 +996,20 @@ void CWriter::printConstant(Constant *CPV) { bool CWriter::printConstExprCast(const ConstantExpr* CE) { bool NeedsExplicitCast = false; const Type *Ty = CE->getOperand(0)->getType(); + bool TypeIsSigned = false; switch (CE->getOpcode()) { case Instruction::LShr: case Instruction::URem: - case Instruction::UDiv: - NeedsExplicitCast = Ty->isSigned(); break; + case Instruction::UDiv: NeedsExplicitCast = true; break; case Instruction::AShr: case Instruction::SRem: - case Instruction::SDiv: - NeedsExplicitCast = Ty->isUnsigned(); break; - case Instruction::ZExt: + case Instruction::SDiv: NeedsExplicitCast = true; TypeIsSigned = true; break; case Instruction::SExt: + Ty = CE->getType(); + NeedsExplicitCast = true; + TypeIsSigned = true; + break; + case Instruction::ZExt: case Instruction::Trunc: case Instruction::FPTrunc: case Instruction::FPExt: @@ -938,7 +1027,10 @@ bool CWriter::printConstExprCast(const ConstantExpr* CE) { } if (NeedsExplicitCast) { Out << "(("; - printType(Out, Ty); + if (Ty->isPrimitiveType()) + printPrimitiveType(Out, Ty, TypeIsSigned); + else + printType(Out, Ty); Out << ")("; } return NeedsExplicitCast; @@ -954,6 +1046,7 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { // Indicate whether to do the cast or not. bool shouldCast = false; + bool typeIsSigned = false; // Based on the Opcode for which this Constant is being written, determine // the new type to which the operand should be casted by setting the value @@ -966,20 +1059,13 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { case Instruction::LShr: case Instruction::UDiv: case Instruction::URem: - // For UDiv/URem get correct type - if (OpTy->isSigned()) { - OpTy = OpTy->getUnsignedVersion(); - shouldCast = true; - } + shouldCast = true; break; case Instruction::AShr: case Instruction::SDiv: case Instruction::SRem: - // For SDiv/SRem get correct type - if (OpTy->isUnsigned()) { - OpTy = OpTy->getSignedVersion(); - shouldCast = true; - } + shouldCast = true; + typeIsSigned = true; break; } @@ -987,13 +1073,12 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { // operand. if (shouldCast) { Out << "(("; - printType(Out, OpTy); + printPrimitiveType(Out, OpTy, typeIsSigned); Out << ")"; printConstant(CPV); Out << ")"; } else - writeOperand(CPV); - + printConstant(CPV); } void CWriter::writeOperandInternal(Value *Operand) { @@ -1038,40 +1123,25 @@ void CWriter::writeOperand(Value *Operand) { // This function takes care of detecting that case and printing the cast // for the Instruction. bool CWriter::writeInstructionCast(const Instruction &I) { - bool NeedsExplicitCast = false; const Type *Ty = I.getOperand(0)->getType(); switch (I.getOpcode()) { case Instruction::LShr: case Instruction::URem: case Instruction::UDiv: - NeedsExplicitCast = Ty->isSigned(); break; + Out << "(("; + printPrimitiveType(Out, Ty, false); + Out << ")("; + return true; case Instruction::AShr: case Instruction::SRem: case Instruction::SDiv: - NeedsExplicitCast = Ty->isUnsigned(); break; - case Instruction::ZExt: - case Instruction::SExt: - case Instruction::Trunc: - case Instruction::FPTrunc: - case Instruction::FPExt: - case Instruction::UIToFP: - case Instruction::SIToFP: - case Instruction::FPToUI: - case Instruction::FPToSI: - case Instruction::PtrToInt: - case Instruction::IntToPtr: - case Instruction::BitCast: - Ty = I.getType(); - NeedsExplicitCast = true; - break; - default: break; - } - if (NeedsExplicitCast) { Out << "(("; - printType(Out, Ty); + printPrimitiveType(Out, Ty, true); Out << ")("; + return true; + default: break; } - return NeedsExplicitCast; + return false; } // Write the operand with a cast to another type based on the Opcode being used. @@ -1085,6 +1155,9 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { // Indicate whether to do the cast or not. bool shouldCast = false; + // Indicate whether the cast should be to a signed type or not. + bool castIsSigned = false; + // Based on the Opcode for which this Operand is being written, determine // the new type to which the operand should be casted by setting the value // of OpTy. If we change OpTy, also set shouldCast to true. @@ -1094,20 +1167,15 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { break; case Instruction::LShr: case Instruction::UDiv: - case Instruction::URem: - // For UDiv to have unsigned operands - if (OpTy->isSigned()) { - OpTy = OpTy->getUnsignedVersion(); - shouldCast = true; - } + case Instruction::URem: // Cast to unsigned first + shouldCast = true; + castIsSigned = false; break; case Instruction::AShr: case Instruction::SDiv: - case Instruction::SRem: - if (OpTy->isUnsigned()) { - OpTy = OpTy->getSignedVersion(); - shouldCast = true; - } + case Instruction::SRem: // Cast to signed first + shouldCast = true; + castIsSigned = true; break; } @@ -1115,13 +1183,62 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { // operand. if (shouldCast) { Out << "(("; - printType(Out, OpTy); + printPrimitiveType(Out, OpTy, castIsSigned); Out << ")"; writeOperand(Operand); Out << ")"; } else writeOperand(Operand); +} + +// Write the operand with a cast to another type based on the icmp predicate +// being used. +void CWriter::writeOperandWithCast(Value* Operand, ICmpInst::Predicate predicate) { + + // Extract the operand's type, we'll need it. + const Type* OpTy = Operand->getType(); + + // Indicate whether to do the cast or not. + bool shouldCast = false; + + // Indicate whether the cast should be to a signed type or not. + bool castIsSigned = false; + + // Based on the Opcode for which this Operand is being written, determine + // the new type to which the operand should be casted by setting the value + // of OpTy. If we change OpTy, also set shouldCast to true. + switch (predicate) { + default: + // for eq and ne, it doesn't matter + break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_ULE: + shouldCast = true; + break; + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_SGE: + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_SLE: + shouldCast = true; + castIsSigned = true; + break; + } + // Write out the casted operand if we should, otherwise just write the + // operand. + if (shouldCast) { + Out << "(("; + if (OpTy->isPrimitiveType()) + printPrimitiveType(Out, OpTy, castIsSigned); + else + printType(Out, OpTy); + Out << ")"; + writeOperand(Operand); + Out << ")"; + } else + writeOperand(Operand); } // generateCompilerSpecificCode - This is where we add conditional compilation @@ -1725,7 +1842,7 @@ void CWriter::printFunction(Function &F) { PrintedVar = true; } // We need a temporary for the BitCast to use so it can pluck a value out - // of a uniont to do the BitCast. This is separate from the need for a + // of a union to do the BitCast. This is separate from the need for a // variable to hold the result of the BitCast. if (isFPIntBitCast(*I)) { Out << " llvmBitCastUnion " << Mang->getValueName(&*I) @@ -1992,12 +2109,6 @@ void CWriter::visitBinaryOperator(Instruction &I) { case Instruction::And: Out << " & "; break; case Instruction::Or: Out << " | "; break; case Instruction::Xor: Out << " ^ "; break; - case Instruction::SetEQ: Out << " == "; break; - case Instruction::SetNE: Out << " != "; break; - case Instruction::SetLE: Out << " <= "; break; - case Instruction::SetGE: Out << " >= "; break; - case Instruction::SetLT: Out << " < "; break; - case Instruction::SetGT: Out << " > "; break; case Instruction::Shl : Out << " << "; break; case Instruction::LShr: case Instruction::AShr: Out << " >> "; break; @@ -2014,6 +2125,70 @@ void CWriter::visitBinaryOperator(Instruction &I) { } } +void CWriter::visitICmpInst(ICmpInst &I) { + // We must cast the results of icmp which might be promoted. + bool needsCast = false; + + // Write out the cast of the instruction's value back to the proper type + // if necessary. + bool NeedsClosingParens = writeInstructionCast(I); + + // Certain icmp predicate require the operand to be forced to a specific type + // so we use writeOperandWithCast here instead of writeOperand. Similarly + // below for operand 1 + writeOperandWithCast(I.getOperand(0), I.getPredicate()); + + switch (I.getPredicate()) { + case ICmpInst::ICMP_EQ: Out << " == "; break; + case ICmpInst::ICMP_NE: Out << " != "; break; + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: Out << " <= "; break; + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: Out << " >= "; break; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: Out << " < "; break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: Out << " > "; break; + default: cerr << "Invalid icmp predicate!" << I; abort(); + } + + writeOperandWithCast(I.getOperand(1), I.getPredicate()); + if (NeedsClosingParens) + Out << "))"; + + if (needsCast) { + Out << "))"; + } +} + +void CWriter::visitFCmpInst(FCmpInst &I) { + // Write the first operand + writeOperand(I.getOperand(0)); + + // Write the predicate + switch (I.getPredicate()) { + case FCmpInst::FCMP_FALSE: Out << " 0 "; break; + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_UEQ: Out << " == "; break; + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: Out << " != "; break; + case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_OLE: Out << " <= "; break; + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_OGE: Out << " >= "; break; + case FCmpInst::FCMP_ULT: + case FCmpInst::FCMP_OLT: Out << " < "; break; + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_OGT: Out << " > "; break; + case FCmpInst::FCMP_TRUE: Out << " 1 "; break; + default: cerr << "Invalid fcmp predicate!" << I; abort(); + } + // Write the second operand + writeOperand(I.getOperand(1)); +} + static const char * getFloatBitCastField(const Type *Ty) { switch (Ty->getTypeID()) { default: assert(0 && "Invalid Type"); diff --git a/lib/Target/CBackend/Makefile b/lib/Target/CBackend/Makefile index 052a4eb3ff4..fea24941500 100644 --- a/lib/Target/CBackend/Makefile +++ b/lib/Target/CBackend/Makefile @@ -11,4 +11,4 @@ LEVEL = ../../.. LIBRARYNAME = LLVMCBackend include $(LEVEL)/Makefile.common -CompileCommonOpts := $(CompileCommonOpts) -Wno-format +CompileCommonOpts += -Wno-format diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 13fd574e0cd..af56e26f9ea 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -116,6 +116,9 @@ namespace { std::ostream &printType(std::ostream &Out, const Type *Ty, const std::string &VariableName = "", bool IgnoreName = false); + std::ostream &printPrimitiveType(std::ostream &Out, const Type *Ty, + bool isSigned, + const std::string &NameSoFar = ""); void printStructReturnPointerFunctionType(std::ostream &Out, const PointerType *Ty); @@ -124,6 +127,7 @@ namespace { void writeOperandRaw(Value *Operand); void writeOperandInternal(Value *Operand); void writeOperandWithCast(Value* Operand, unsigned Opcode); + void writeOperandWithCast(Value* Operand, ICmpInst::Predicate predicate); bool writeInstructionCast(const Instruction &I); private : @@ -154,9 +158,10 @@ namespace { // printed and an extra copy of the expr is not emitted. // static bool isInlinableInst(const Instruction &I) { - // Always inline setcc instructions, even if they are shared by multiple + // Always inline cmp instructions, even if they are shared by multiple // expressions. GCC generates horrible code if we don't. - if (isa(I)) return true; + if (isa(I)) + return true; // Must be an expression, must be used exactly once. If it is dead, we // emit it inline where it would go. @@ -211,6 +216,8 @@ namespace { void visitPHINode(PHINode &I); void visitBinaryOperator(Instruction &I); + void visitICmpInst(ICmpInst &I); + void visitFCmpInst(FCmpInst &I); void visitCastInst (CastInst &I); void visitSelectInst(SelectInst &I); @@ -351,6 +358,32 @@ void CWriter::printStructReturnPointerFunctionType(std::ostream &Out, printType(Out, RetTy, tstr); } +std::ostream & +CWriter::printPrimitiveType(std::ostream &Out, const Type *Ty, bool isSigned, + const std::string &NameSoFar) { + assert(Ty->isPrimitiveType() && "Invalid type for printPrimitiveType"); + switch (Ty->getTypeID()) { + case Type::VoidTyID: return Out << "void " << NameSoFar; + case Type::BoolTyID: return Out << "bool " << NameSoFar; + case Type::UByteTyID: + case Type::SByteTyID: + return Out << (isSigned?"signed":"unsigned") << " char " << NameSoFar; + case Type::UShortTyID: + case Type::ShortTyID: + return Out << (isSigned?"signed":"unsigned") << " short " << NameSoFar; + case Type::UIntTyID: + case Type::IntTyID: + return Out << (isSigned?"signed":"unsigned") << " int " << NameSoFar; + case Type::ULongTyID: + case Type::LongTyID: + return Out << (isSigned?"signed":"unsigned") << " long long " << NameSoFar; + case Type::FloatTyID: return Out << "float " << NameSoFar; + case Type::DoubleTyID: return Out << "double " << NameSoFar; + default : + cerr << "Unknown primitive type: " << *Ty << "\n"; + abort(); + } +} // Pass the Type* and the variable name and this prints out the variable // declaration. @@ -358,24 +391,13 @@ void CWriter::printStructReturnPointerFunctionType(std::ostream &Out, std::ostream &CWriter::printType(std::ostream &Out, const Type *Ty, const std::string &NameSoFar, bool IgnoreName) { - if (Ty->isPrimitiveType()) - switch (Ty->getTypeID()) { - case Type::VoidTyID: return Out << "void " << NameSoFar; - case Type::BoolTyID: return Out << "bool " << NameSoFar; - case Type::UByteTyID: return Out << "unsigned char " << NameSoFar; - case Type::SByteTyID: return Out << "signed char " << NameSoFar; - case Type::UShortTyID: return Out << "unsigned short " << NameSoFar; - case Type::ShortTyID: return Out << "short " << NameSoFar; - case Type::UIntTyID: return Out << "unsigned " << NameSoFar; - case Type::IntTyID: return Out << "int " << NameSoFar; - case Type::ULongTyID: return Out << "unsigned long long " << NameSoFar; - case Type::LongTyID: return Out << "signed long long " << NameSoFar; - case Type::FloatTyID: return Out << "float " << NameSoFar; - case Type::DoubleTyID: return Out << "double " << NameSoFar; - default : - cerr << "Unknown primitive type: " << *Ty << "\n"; - abort(); - } + if (Ty->isPrimitiveType()) { + // FIXME:Signedness. When integer types are signless, this should just + // always pass "false" for the sign of the primitive type. The instructions + // will figure out how the value is to be interpreted. + printPrimitiveType(Out, Ty, true, NameSoFar); + return Out; + } // Check to see if the type is named. if (!IgnoreName || isa(Ty)) { @@ -578,41 +600,66 @@ static bool isFPCSafeToPrint(const ConstantFP *CFP) { /// Print out the casting for a cast operation. This does the double casting /// necessary for conversion to the destination type, if necessary. -/// @returns true if a closing paren is necessary /// @brief Print a cast void CWriter::printCast(unsigned opc, const Type *SrcTy, const Type *DstTy) { - Out << '('; - printType(Out, DstTy); - Out << ')'; + // Print the destination type cast switch (opc) { case Instruction::UIToFP: + case Instruction::SIToFP: + case Instruction::IntToPtr: + case Instruction::Trunc: + case Instruction::BitCast: + case Instruction::FPExt: + case Instruction::FPTrunc: // For these the DstTy sign doesn't matter + Out << '('; + printType(Out, DstTy); + Out << ')'; + break; case Instruction::ZExt: - if (SrcTy->isSigned()) { - Out << '('; - printType(Out, SrcTy->getUnsignedVersion()); - Out << ')'; - } + case Instruction::PtrToInt: + case Instruction::FPToUI: // For these, make sure we get an unsigned dest + Out << '('; + printPrimitiveType(Out, DstTy, false); + Out << ')'; + break; + case Instruction::SExt: + case Instruction::FPToSI: // For these, make sure we get a signed dest + Out << '('; + printPrimitiveType(Out, DstTy, true); + Out << ')'; + break; + default: + assert(0 && "Invalid cast opcode"); + } + + // Print the source type cast + switch (opc) { + case Instruction::UIToFP: + case Instruction::ZExt: + Out << '('; + printPrimitiveType(Out, SrcTy, false); + Out << ')'; break; case Instruction::SIToFP: case Instruction::SExt: - if (SrcTy->isUnsigned()) { - Out << '('; - printType(Out, SrcTy->getSignedVersion()); - Out << ')'; - } + Out << '('; + printPrimitiveType(Out, SrcTy, true); + Out << ')'; break; case Instruction::IntToPtr: case Instruction::PtrToInt: - // Avoid "cast to pointer from integer of different size" warnings - Out << "(unsigned long)"; - break; + // Avoid "cast to pointer from integer of different size" warnings + Out << "(unsigned long)"; + break; case Instruction::Trunc: case Instruction::BitCast: case Instruction::FPExt: case Instruction::FPTrunc: case Instruction::FPToSI: case Instruction::FPToUI: + break; // These don't need a source cast. default: + assert(0 && "Invalid cast opcode"); break; } } @@ -679,12 +726,8 @@ void CWriter::printConstant(Constant *CPV) { case Instruction::And: case Instruction::Or: case Instruction::Xor: - case Instruction::SetEQ: - case Instruction::SetNE: - case Instruction::SetLT: - case Instruction::SetLE: - case Instruction::SetGT: - case Instruction::SetGE: + case Instruction::ICmp: + case Instruction::FCmp: case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: @@ -705,15 +748,43 @@ void CWriter::printConstant(Constant *CPV) { case Instruction::And: Out << " & "; break; case Instruction::Or: Out << " | "; break; case Instruction::Xor: Out << " ^ "; break; - case Instruction::SetEQ: Out << " == "; break; - case Instruction::SetNE: Out << " != "; break; - case Instruction::SetLT: Out << " < "; break; - case Instruction::SetLE: Out << " <= "; break; - case Instruction::SetGT: Out << " > "; break; - case Instruction::SetGE: Out << " >= "; break; case Instruction::Shl: Out << " << "; break; case Instruction::LShr: case Instruction::AShr: Out << " >> "; break; + case Instruction::ICmp: + switch (CE->getPredicate()) { + case ICmpInst::ICMP_EQ: Out << " == "; break; + case ICmpInst::ICMP_NE: Out << " != "; break; + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_ULT: Out << " < "; break; + case ICmpInst::ICMP_SLE: + case ICmpInst::ICMP_ULE: Out << " <= "; break; + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_UGT: Out << " > "; break; + case ICmpInst::ICMP_SGE: + case ICmpInst::ICMP_UGE: Out << " >= "; break; + default: assert(0 && "Illegal ICmp predicate"); + } + break; + case Instruction::FCmp: + switch (CE->getPredicate()) { + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_UEQ: + case FCmpInst::FCMP_OEQ: Out << " == "; break; + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_UNE: + case FCmpInst::FCMP_ONE: Out << " != "; break; + case FCmpInst::FCMP_OLT: + case FCmpInst::FCMP_ULT: Out << " < "; break; + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ULE: Out << " <= "; break; + case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_UGT: Out << " > "; break; + case FCmpInst::FCMP_OGE: + case FCmpInst::FCMP_UGE: Out << " >= "; break; + default: assert(0 && "Illegal FCmp predicate"); + } + break; default: assert(0 && "Illegal opcode here!"); } printConstantWithCast(CE->getOperand(1), CE->getOpcode()); @@ -730,7 +801,7 @@ void CWriter::printConstant(Constant *CPV) { } } else if (isa(CPV) && CPV->getType()->isFirstClassType()) { Out << "(("; - printType(Out, CPV->getType()); + printType(Out, CPV->getType()); // sign doesn't matter Out << ")/*UNDEF*/0)"; return; } @@ -740,9 +811,23 @@ void CWriter::printConstant(Constant *CPV) { Out << (cast(CPV)->getValue() ? '1' : '0'); break; case Type::SByteTyID: + case Type::UByteTyID: + Out << "((char)" << cast(CPV)->getSExtValue() << ")"; + break; case Type::ShortTyID: - Out << cast(CPV)->getSExtValue(); + case Type::UShortTyID: + Out << "((short)" << cast(CPV)->getSExtValue() << ")"; break; + case Type::IntTyID: + case Type::UIntTyID: + Out << "((int)" << cast(CPV)->getSExtValue() << ")"; + break; + case Type::LongTyID: + case Type::ULongTyID: + Out << "((long long)" << cast(CPV)->getSExtValue() << "ll)"; + break; + +#if 0 case Type::IntTyID: if ((int)cast(CPV)->getSExtValue() == (int)0x80000000) Out << "((int)0x80000000U)"; // Handle MININT specially to avoid warning @@ -767,6 +852,7 @@ void CWriter::printConstant(Constant *CPV) { case Type::ULongTyID: Out << cast(CPV)->getZExtValue() << "ull"; break; +#endif case Type::FloatTyID: case Type::DoubleTyID: { @@ -890,7 +976,7 @@ void CWriter::printConstant(Constant *CPV) { case Type::PointerTyID: if (isa(CPV)) { Out << "(("; - printType(Out, CPV->getType()); + printType(Out, CPV->getType()); // sign doesn't matter Out << ")/*NULL*/0)"; break; } else if (GlobalValue *GV = dyn_cast(CPV)) { @@ -910,17 +996,20 @@ void CWriter::printConstant(Constant *CPV) { bool CWriter::printConstExprCast(const ConstantExpr* CE) { bool NeedsExplicitCast = false; const Type *Ty = CE->getOperand(0)->getType(); + bool TypeIsSigned = false; switch (CE->getOpcode()) { case Instruction::LShr: case Instruction::URem: - case Instruction::UDiv: - NeedsExplicitCast = Ty->isSigned(); break; + case Instruction::UDiv: NeedsExplicitCast = true; break; case Instruction::AShr: case Instruction::SRem: - case Instruction::SDiv: - NeedsExplicitCast = Ty->isUnsigned(); break; - case Instruction::ZExt: + case Instruction::SDiv: NeedsExplicitCast = true; TypeIsSigned = true; break; case Instruction::SExt: + Ty = CE->getType(); + NeedsExplicitCast = true; + TypeIsSigned = true; + break; + case Instruction::ZExt: case Instruction::Trunc: case Instruction::FPTrunc: case Instruction::FPExt: @@ -938,7 +1027,10 @@ bool CWriter::printConstExprCast(const ConstantExpr* CE) { } if (NeedsExplicitCast) { Out << "(("; - printType(Out, Ty); + if (Ty->isPrimitiveType()) + printPrimitiveType(Out, Ty, TypeIsSigned); + else + printType(Out, Ty); Out << ")("; } return NeedsExplicitCast; @@ -954,6 +1046,7 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { // Indicate whether to do the cast or not. bool shouldCast = false; + bool typeIsSigned = false; // Based on the Opcode for which this Constant is being written, determine // the new type to which the operand should be casted by setting the value @@ -966,20 +1059,13 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { case Instruction::LShr: case Instruction::UDiv: case Instruction::URem: - // For UDiv/URem get correct type - if (OpTy->isSigned()) { - OpTy = OpTy->getUnsignedVersion(); - shouldCast = true; - } + shouldCast = true; break; case Instruction::AShr: case Instruction::SDiv: case Instruction::SRem: - // For SDiv/SRem get correct type - if (OpTy->isUnsigned()) { - OpTy = OpTy->getSignedVersion(); - shouldCast = true; - } + shouldCast = true; + typeIsSigned = true; break; } @@ -987,13 +1073,12 @@ void CWriter::printConstantWithCast(Constant* CPV, unsigned Opcode) { // operand. if (shouldCast) { Out << "(("; - printType(Out, OpTy); + printPrimitiveType(Out, OpTy, typeIsSigned); Out << ")"; printConstant(CPV); Out << ")"; } else - writeOperand(CPV); - + printConstant(CPV); } void CWriter::writeOperandInternal(Value *Operand) { @@ -1038,40 +1123,25 @@ void CWriter::writeOperand(Value *Operand) { // This function takes care of detecting that case and printing the cast // for the Instruction. bool CWriter::writeInstructionCast(const Instruction &I) { - bool NeedsExplicitCast = false; const Type *Ty = I.getOperand(0)->getType(); switch (I.getOpcode()) { case Instruction::LShr: case Instruction::URem: case Instruction::UDiv: - NeedsExplicitCast = Ty->isSigned(); break; + Out << "(("; + printPrimitiveType(Out, Ty, false); + Out << ")("; + return true; case Instruction::AShr: case Instruction::SRem: case Instruction::SDiv: - NeedsExplicitCast = Ty->isUnsigned(); break; - case Instruction::ZExt: - case Instruction::SExt: - case Instruction::Trunc: - case Instruction::FPTrunc: - case Instruction::FPExt: - case Instruction::UIToFP: - case Instruction::SIToFP: - case Instruction::FPToUI: - case Instruction::FPToSI: - case Instruction::PtrToInt: - case Instruction::IntToPtr: - case Instruction::BitCast: - Ty = I.getType(); - NeedsExplicitCast = true; - break; - default: break; - } - if (NeedsExplicitCast) { Out << "(("; - printType(Out, Ty); + printPrimitiveType(Out, Ty, true); Out << ")("; + return true; + default: break; } - return NeedsExplicitCast; + return false; } // Write the operand with a cast to another type based on the Opcode being used. @@ -1085,6 +1155,9 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { // Indicate whether to do the cast or not. bool shouldCast = false; + // Indicate whether the cast should be to a signed type or not. + bool castIsSigned = false; + // Based on the Opcode for which this Operand is being written, determine // the new type to which the operand should be casted by setting the value // of OpTy. If we change OpTy, also set shouldCast to true. @@ -1094,20 +1167,15 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { break; case Instruction::LShr: case Instruction::UDiv: - case Instruction::URem: - // For UDiv to have unsigned operands - if (OpTy->isSigned()) { - OpTy = OpTy->getUnsignedVersion(); - shouldCast = true; - } + case Instruction::URem: // Cast to unsigned first + shouldCast = true; + castIsSigned = false; break; case Instruction::AShr: case Instruction::SDiv: - case Instruction::SRem: - if (OpTy->isUnsigned()) { - OpTy = OpTy->getSignedVersion(); - shouldCast = true; - } + case Instruction::SRem: // Cast to signed first + shouldCast = true; + castIsSigned = true; break; } @@ -1115,13 +1183,62 @@ void CWriter::writeOperandWithCast(Value* Operand, unsigned Opcode) { // operand. if (shouldCast) { Out << "(("; - printType(Out, OpTy); + printPrimitiveType(Out, OpTy, castIsSigned); Out << ")"; writeOperand(Operand); Out << ")"; } else writeOperand(Operand); +} + +// Write the operand with a cast to another type based on the icmp predicate +// being used. +void CWriter::writeOperandWithCast(Value* Operand, ICmpInst::Predicate predicate) { + + // Extract the operand's type, we'll need it. + const Type* OpTy = Operand->getType(); + + // Indicate whether to do the cast or not. + bool shouldCast = false; + + // Indicate whether the cast should be to a signed type or not. + bool castIsSigned = false; + + // Based on the Opcode for which this Operand is being written, determine + // the new type to which the operand should be casted by setting the value + // of OpTy. If we change OpTy, also set shouldCast to true. + switch (predicate) { + default: + // for eq and ne, it doesn't matter + break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_ULE: + shouldCast = true; + break; + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_SGE: + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_SLE: + shouldCast = true; + castIsSigned = true; + break; + } + // Write out the casted operand if we should, otherwise just write the + // operand. + if (shouldCast) { + Out << "(("; + if (OpTy->isPrimitiveType()) + printPrimitiveType(Out, OpTy, castIsSigned); + else + printType(Out, OpTy); + Out << ")"; + writeOperand(Operand); + Out << ")"; + } else + writeOperand(Operand); } // generateCompilerSpecificCode - This is where we add conditional compilation @@ -1725,7 +1842,7 @@ void CWriter::printFunction(Function &F) { PrintedVar = true; } // We need a temporary for the BitCast to use so it can pluck a value out - // of a uniont to do the BitCast. This is separate from the need for a + // of a union to do the BitCast. This is separate from the need for a // variable to hold the result of the BitCast. if (isFPIntBitCast(*I)) { Out << " llvmBitCastUnion " << Mang->getValueName(&*I) @@ -1992,12 +2109,6 @@ void CWriter::visitBinaryOperator(Instruction &I) { case Instruction::And: Out << " & "; break; case Instruction::Or: Out << " | "; break; case Instruction::Xor: Out << " ^ "; break; - case Instruction::SetEQ: Out << " == "; break; - case Instruction::SetNE: Out << " != "; break; - case Instruction::SetLE: Out << " <= "; break; - case Instruction::SetGE: Out << " >= "; break; - case Instruction::SetLT: Out << " < "; break; - case Instruction::SetGT: Out << " > "; break; case Instruction::Shl : Out << " << "; break; case Instruction::LShr: case Instruction::AShr: Out << " >> "; break; @@ -2014,6 +2125,70 @@ void CWriter::visitBinaryOperator(Instruction &I) { } } +void CWriter::visitICmpInst(ICmpInst &I) { + // We must cast the results of icmp which might be promoted. + bool needsCast = false; + + // Write out the cast of the instruction's value back to the proper type + // if necessary. + bool NeedsClosingParens = writeInstructionCast(I); + + // Certain icmp predicate require the operand to be forced to a specific type + // so we use writeOperandWithCast here instead of writeOperand. Similarly + // below for operand 1 + writeOperandWithCast(I.getOperand(0), I.getPredicate()); + + switch (I.getPredicate()) { + case ICmpInst::ICMP_EQ: Out << " == "; break; + case ICmpInst::ICMP_NE: Out << " != "; break; + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: Out << " <= "; break; + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: Out << " >= "; break; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: Out << " < "; break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: Out << " > "; break; + default: cerr << "Invalid icmp predicate!" << I; abort(); + } + + writeOperandWithCast(I.getOperand(1), I.getPredicate()); + if (NeedsClosingParens) + Out << "))"; + + if (needsCast) { + Out << "))"; + } +} + +void CWriter::visitFCmpInst(FCmpInst &I) { + // Write the first operand + writeOperand(I.getOperand(0)); + + // Write the predicate + switch (I.getPredicate()) { + case FCmpInst::FCMP_FALSE: Out << " 0 "; break; + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_UEQ: Out << " == "; break; + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: Out << " != "; break; + case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_OLE: Out << " <= "; break; + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_OGE: Out << " >= "; break; + case FCmpInst::FCMP_ULT: + case FCmpInst::FCMP_OLT: Out << " < "; break; + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_OGT: Out << " > "; break; + case FCmpInst::FCMP_TRUE: Out << " 1 "; break; + default: cerr << "Invalid fcmp predicate!" << I; abort(); + } + // Write the second operand + writeOperand(I.getOperand(1)); +} + static const char * getFloatBitCastField(const Type *Ty) { switch (Ty->getTypeID()) { default: assert(0 && "Invalid Type"); diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 9738573a8d5..9ea0a91daf5 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -324,7 +324,7 @@ unsigned short read_16_be(const unsigned char *adr) { //===---------------------------------------------------------------------===// -instcombine should handle this transform: - setcc (sdiv X / C1 ), C2 + icmp pred (sdiv X / C1 ), C2 when X, C1, and C2 are unsigned. Similarly for udiv and signed operands. Currently InstCombine avoids this transform but will do it when the signs of diff --git a/lib/Transforms/ExprTypeConvert.cpp b/lib/Transforms/ExprTypeConvert.cpp index d59fb4db143..5f6b6aebf91 100644 --- a/lib/Transforms/ExprTypeConvert.cpp +++ b/lib/Transforms/ExprTypeConvert.cpp @@ -463,10 +463,13 @@ static bool OperandConvertibleToType(User *U, Value *V, const Type *Ty, return ValueConvertibleToType(I, Ty, CTMap, TD) && ExpressionConvertibleToType(OtherOp, Ty, CTMap, TD); } - case Instruction::SetEQ: - case Instruction::SetNE: { - Value *OtherOp = I->getOperand((V == I->getOperand(0)) ? 1 : 0); - return ExpressionConvertibleToType(OtherOp, Ty, CTMap, TD); + case Instruction::ICmp: { + if (cast(I)->getPredicate() == ICmpInst::ICMP_EQ || + cast(I)->getPredicate() == ICmpInst::ICMP_NE) { + Value *OtherOp = I->getOperand((V == I->getOperand(0)) ? 1 : 0); + return ExpressionConvertibleToType(OtherOp, Ty, CTMap, TD); + } + return false; } case Instruction::LShr: case Instruction::AShr: @@ -717,9 +720,7 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal, } case Instruction::Add: - case Instruction::Sub: - case Instruction::SetEQ: - case Instruction::SetNE: { + case Instruction::Sub: { Res = BinaryOperator::create(cast(I)->getOpcode(), Dummy, Dummy, Name); VMC.ExprMap[I] = Res; // Add node to expression eagerly @@ -731,6 +732,19 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal, Res->setOperand(OtherIdx, NewOther); break; } + case Instruction::ICmp: { + ICmpInst::Predicate pred = cast(I)->getPredicate(); + if (pred == ICmpInst::ICMP_EQ || pred == ICmpInst::ICMP_NE) { + Res = new ICmpInst(pred, Dummy, Dummy, Name); + VMC.ExprMap[I] = Res; // Add node to expression eagerly + unsigned OtherIdx = (OldVal == I->getOperand(0)) ? 1 : 0; + Value *OtherOp = I->getOperand(OtherIdx); + Res->setOperand(!OtherIdx, NewVal); + Value *NewOther = ConvertExpressionToType(OtherOp, NewTy, VMC, TD); + Res->setOperand(OtherIdx, NewOther); + } + break; + } case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 425bcc588bd..808a7f805d2 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -238,7 +238,7 @@ static bool AnalyzeGlobal(Value *V, GlobalStatus &GS, if (AnalyzeGlobal(I, GS, PHIUsers)) return true; GS.isNotSuitableForSRA = true; GS.HasPHIUser = true; - } else if (isa(I)) { + } else if (isa(I)) { GS.isNotSuitableForSRA = true; } else if (isa(I) || isa(I)) { if (I->getOperand(1) == V) @@ -507,7 +507,7 @@ static bool AllUsesOfValueWillTrapIfNull(Value *V) { if (!AllUsesOfValueWillTrapIfNull(CI)) return false; } else if (GetElementPtrInst *GEPI = dyn_cast(*UI)) { if (!AllUsesOfValueWillTrapIfNull(GEPI)) return false; - } else if (isa(*UI) && + } else if (isa(*UI) && isa(UI->getOperand(1))) { // Ignore setcc X, null } else { @@ -720,29 +720,33 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV, if (LoadInst *LI = dyn_cast(GV->use_back())) { while (!LI->use_empty()) { Use &LoadUse = LI->use_begin().getUse(); - if (!isa(LoadUse.getUser())) + if (!isa(LoadUse.getUser())) LoadUse = RepValue; else { - // Replace the setcc X, 0 with a use of the bool value. - SetCondInst *SCI = cast(LoadUse.getUser()); - Value *LV = new LoadInst(InitBool, InitBool->getName()+".val", SCI); + ICmpInst *CI = cast(LoadUse.getUser()); + // Replace the cmp X, 0 with a use of the bool value. + Value *LV = new LoadInst(InitBool, InitBool->getName()+".val", CI); InitBoolUsed = true; - switch (SCI->getOpcode()) { - default: assert(0 && "Unknown opcode!"); - case Instruction::SetLT: + switch (CI->getPredicate()) { + default: assert(0 && "Unknown ICmp Predicate!"); + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: LV = ConstantBool::getFalse(); // X < null -> always false break; - case Instruction::SetEQ: - case Instruction::SetLE: - LV = BinaryOperator::createNot(LV, "notinit", SCI); + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: + case ICmpInst::ICMP_EQ: + LV = BinaryOperator::createNot(LV, "notinit", CI); break; - case Instruction::SetNE: - case Instruction::SetGE: - case Instruction::SetGT: + case ICmpInst::ICMP_NE: + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: break; // no change. } - SCI->replaceAllUsesWith(LV); - SCI->eraseFromParent(); + CI->replaceAllUsesWith(LV); + CI->eraseFromParent(); } } LI->eraseFromParent(); @@ -783,7 +787,7 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV, static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal(Instruction *V, GlobalVariable *GV) { for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI) - if (isa(*UI) || isa(*UI)) { + if (isa(*UI) || isa(*UI)) { // Fine, ignore. } else if (StoreInst *SI = dyn_cast(*UI)) { if (SI->getOperand(0) == V && SI->getOperand(1) != GV) @@ -832,8 +836,8 @@ static bool GlobalLoadUsesSimpleEnoughForHeapSRA(GlobalVariable *GV) { for (Value::use_iterator UI = LI->use_begin(), E = LI->use_end(); UI != E; ++UI) { // Comparison against null is ok. - if (SetCondInst *SCI = dyn_cast(*UI)) { - if (!isa(SCI->getOperand(1))) + if (ICmpInst *ICI = dyn_cast(*UI)) { + if (!isa(ICI->getOperand(1))) return false; continue; } @@ -865,7 +869,7 @@ static void RewriteUsesOfLoadForHeapSRoA(LoadInst *Ptr, Instruction *User = Ptr->use_back(); // If this is a comparison against null, handle it. - if (SetCondInst *SCI = dyn_cast(User)) { + if (ICmpInst *SCI = dyn_cast(User)) { assert(isa(SCI->getOperand(1))); // If we have a setcc of the loaded pointer, we can use a setcc of any // field. @@ -877,9 +881,9 @@ static void RewriteUsesOfLoadForHeapSRoA(LoadInst *Ptr, NPtr = InsertedLoadsForPtr.back(); } - Value *New = new SetCondInst(SCI->getOpcode(), NPtr, - Constant::getNullValue(NPtr->getType()), - SCI->getName(), SCI); + Value *New = new ICmpInst(SCI->getPredicate(), NPtr, + Constant::getNullValue(NPtr->getType()), + SCI->getName(), SCI); SCI->replaceAllUsesWith(New); SCI->eraseFromParent(); continue; @@ -959,7 +963,7 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, MallocInst *MI){ // } Value *RunningOr = 0; for (unsigned i = 0, e = FieldMallocs.size(); i != e; ++i) { - Value *Cond = new SetCondInst(Instruction::SetEQ, FieldMallocs[i], + Value *Cond = new ICmpInst(ICmpInst::ICMP_EQ, FieldMallocs[i], Constant::getNullValue(FieldMallocs[i]->getType()), "isnull", MI); if (!RunningOr) @@ -986,9 +990,9 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, MallocInst *MI){ // pointer, because some may be null while others are not. for (unsigned i = 0, e = FieldGlobals.size(); i != e; ++i) { Value *GVVal = new LoadInst(FieldGlobals[i], "tmp", NullPtrBlock); - Value *Cmp = new SetCondInst(Instruction::SetNE, GVVal, - Constant::getNullValue(GVVal->getType()), - "tmp", NullPtrBlock); + Value *Cmp = new ICmpInst(ICmpInst::ICMP_NE, GVVal, + Constant::getNullValue(GVVal->getType()), + "tmp", NullPtrBlock); BasicBlock *FreeBlock = new BasicBlock("free_it", OrigBB->getParent()); BasicBlock *NextBlock = new BasicBlock("next", OrigBB->getParent()); new BranchInst(FreeBlock, NextBlock, Cmp, NullPtrBlock); @@ -1710,6 +1714,10 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal, InstResult = ConstantExpr::get(SI->getOpcode(), getVal(Values, SI->getOperand(0)), getVal(Values, SI->getOperand(1))); + } else if (CmpInst *CI = dyn_cast(CurInst)) { + InstResult = ConstantExpr::getCompare(CI->getPredicate(), + getVal(Values, CI->getOperand(0)), + getVal(Values, CI->getOperand(1))); } else if (CastInst *CI = dyn_cast(CurInst)) { InstResult = ConstantExpr::getCast(CI->getOpcode(), getVal(Values, CI->getOperand(0)), diff --git a/lib/Transforms/IPO/SimplifyLibCalls.cpp b/lib/Transforms/IPO/SimplifyLibCalls.cpp index 7cc1a5bccb5..b4e840641b5 100644 --- a/lib/Transforms/IPO/SimplifyLibCalls.cpp +++ b/lib/Transforms/IPO/SimplifyLibCalls.cpp @@ -887,8 +887,8 @@ struct StrLenOptimization : public LibCallOptimization { // Does the call to strlen have exactly one use? if (ci->hasOneUse()) - // Is that single use a binary operator? - if (BinaryOperator* bop = dyn_cast(ci->use_back())) + // Is that single use a icmp operator? + if (ICmpInst* bop = dyn_cast(ci->use_back())) // Is it compared against a constant integer? if (ConstantInt* CI = dyn_cast(bop->getOperand(1))) { @@ -897,15 +897,15 @@ struct StrLenOptimization : public LibCallOptimization { // If its compared against length 0 with == or != if (val == 0 && - (bop->getOpcode() == Instruction::SetEQ || - bop->getOpcode() == Instruction::SetNE)) + (bop->getPredicate() == ICmpInst::ICMP_EQ || + bop->getPredicate() == ICmpInst::ICMP_NE)) { // strlen(x) != 0 -> *x != 0 // strlen(x) == 0 -> *x == 0 LoadInst* load = new LoadInst(str,str->getName()+".first",ci); - BinaryOperator* rbop = BinaryOperator::create(bop->getOpcode(), - load, ConstantInt::get(Type::SByteTy,0), - bop->getName()+".strlen", ci); + ICmpInst* rbop = new ICmpInst(bop->getPredicate(), load, + ConstantInt::get(Type::SByteTy,0), + bop->getName()+".strlen", ci); bop->replaceAllUsesWith(rbop); bop->eraseFromParent(); ci->eraseFromParent(); @@ -933,10 +933,11 @@ static bool IsOnlyUsedInEqualsZeroComparison(Instruction *I) { for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) { Instruction *User = cast(*UI); - if (User->getOpcode() == Instruction::SetNE || - User->getOpcode() == Instruction::SetEQ) { - if (isa(User->getOperand(1)) && - cast(User->getOperand(1))->isNullValue()) + if (ICmpInst *IC = dyn_cast(User)) { + if ((IC->getPredicate() == ICmpInst::ICMP_NE || + IC->getPredicate() == ICmpInst::ICMP_EQ) && + isa(IC->getOperand(1)) && + cast(IC->getOperand(1))->isNullValue()) continue; } else if (CastInst *CI = dyn_cast(User)) if (CI->getType() == Type::BoolTy) @@ -1739,7 +1740,7 @@ public: BinaryOperator* sub_inst = BinaryOperator::createSub(cast, ConstantInt::get(Type::UIntTy,0x30), ci->getOperand(1)->getName()+".sub",ci); - SetCondInst* setcond_inst = new SetCondInst(Instruction::SetLE,sub_inst, + ICmpInst* setcond_inst = new ICmpInst(ICmpInst::ICMP_ULE,sub_inst, ConstantInt::get(Type::UIntTy,9), ci->getOperand(1)->getName()+".cmp",ci); CastInst* c2 = new ZExtInst(setcond_inst, Type::IntTy, @@ -1764,12 +1765,9 @@ public: virtual bool OptimizeCall(CallInst *CI, SimplifyLibCalls &SLC) { // isascii(c) -> (unsigned)c < 128 Value *V = CI->getOperand(1); - if (V->getType()->isSigned()) - V = new BitCastInst(V, V->getType()->getUnsignedVersion(), V->getName(), - CI); - Value *Cmp = BinaryOperator::createSetLT(V, ConstantInt::get(V->getType(), - 128), - V->getName()+".isascii", CI); + Value *Cmp = new ICmpInst(ICmpInst::ICMP_ULT, V, + ConstantInt::get(V->getType(), 128), + V->getName()+".isascii", CI); if (Cmp->getType() != CI->getType()) Cmp = new BitCastInst(Cmp, CI->getType(), Cmp->getName(), CI); CI->replaceAllUsesWith(Cmp); @@ -1872,9 +1870,9 @@ public: "tmp", TheCall); V2 = BinaryOperator::createAdd(V2, ConstantInt::get(Type::IntTy, 1), "tmp", TheCall); - Value *Cond = - BinaryOperator::createSetEQ(V, Constant::getNullValue(V->getType()), - "tmp", TheCall); + Value *Cond = new ICmpInst(ICmpInst::ICMP_EQ, V, + Constant::getNullValue(V->getType()), "tmp", + TheCall); V2 = new SelectInst(Cond, ConstantInt::get(Type::IntTy, 0), V2, TheCall->getName(), TheCall); TheCall->replaceAllUsesWith(V2); diff --git a/lib/Transforms/Instrumentation/RSProfiling.cpp b/lib/Transforms/Instrumentation/RSProfiling.cpp index ab570e4591d..b18d66befbb 100644 --- a/lib/Transforms/Instrumentation/RSProfiling.cpp +++ b/lib/Transforms/Instrumentation/RSProfiling.cpp @@ -197,9 +197,9 @@ void GlobalRandomCounter::ProcessChoicePoint(BasicBlock* bb) { //decrement counter LoadInst* l = new LoadInst(Counter, "counter", t); - SetCondInst* s = new SetCondInst(Instruction::SetEQ, l, - ConstantInt::get(T, 0), - "countercc", t); + ICmpInst* s = new ICmpInst(ICmpInst::ICMP_EQ, l, ConstantInt::get(T, 0), + "countercc", t); + Value* nv = BinaryOperator::createSub(l, ConstantInt::get(T, 1), "counternew", t); new StoreInst(nv, Counter, t); @@ -270,9 +270,9 @@ void GlobalRandomCounterOpt::ProcessChoicePoint(BasicBlock* bb) { //decrement counter LoadInst* l = new LoadInst(AI, "counter", t); - SetCondInst* s = new SetCondInst(Instruction::SetEQ, l, - ConstantInt::get(T, 0), - "countercc", t); + ICmpInst* s = new ICmpInst(ICmpInst::ICMP_EQ, l, ConstantInt::get(T, 0), + "countercc", t); + Value* nv = BinaryOperator::createSub(l, ConstantInt::get(T, 1), "counternew", t); new StoreInst(nv, AI, t); @@ -305,9 +305,10 @@ void CycleCounter::ProcessChoicePoint(BasicBlock* bb) { BinaryOperator::createAnd(c, ConstantInt::get(Type::ULongTy, rm), "mrdcc", t); - SetCondInst* s = new SetCondInst(Instruction::SetEQ, b, - ConstantInt::get(Type::ULongTy, 0), - "mrdccc", t); + ICmpInst *s = new ICmpInst(ICmpInst::ICMP_EQ, b, + ConstantInt::get(Type::ULongTy, 0), + "mrdccc", t); + t->setCondition(s); } diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp index 9930d1bdf88..f0d39155a34 100644 --- a/lib/Transforms/LevelRaise.cpp +++ b/lib/Transforms/LevelRaise.cpp @@ -393,9 +393,6 @@ bool RPR::PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { return false; } - - - bool RPR::DoRaisePass(Function &F) { bool Changed = false; for (Function::iterator BB = F.begin(), BBE = F.end(); BB != BBE; ++BB) diff --git a/lib/Transforms/Scalar/CorrelatedExprs.cpp b/lib/Transforms/Scalar/CorrelatedExprs.cpp index 7ab999f9638..8d369f2870e 100644 --- a/lib/Transforms/Scalar/CorrelatedExprs.cpp +++ b/lib/Transforms/Scalar/CorrelatedExprs.cpp @@ -45,36 +45,36 @@ #include using namespace llvm; -STATISTIC(NumSetCCRemoved, "Number of setcc instruction eliminated"); +STATISTIC(NumCmpRemoved, "Number of cmp instruction eliminated"); STATISTIC(NumOperandsCann, "Number of operands canonicalized"); STATISTIC(BranchRevectors, "Number of branches revectored"); namespace { class ValueInfo; class Relation { - Value *Val; // Relation to what value? - Instruction::BinaryOps Rel; // SetCC relation, or Add if no information + Value *Val; // Relation to what value? + unsigned Rel; // SetCC or ICmp relation, or Add if no information public: Relation(Value *V) : Val(V), Rel(Instruction::Add) {} bool operator<(const Relation &R) const { return Val < R.Val; } Value *getValue() const { return Val; } - Instruction::BinaryOps getRelation() const { return Rel; } + unsigned getRelation() const { return Rel; } // contradicts - Return true if the relationship specified by the operand // contradicts already known information. // - bool contradicts(Instruction::BinaryOps Rel, const ValueInfo &VI) const; + bool contradicts(unsigned Rel, const ValueInfo &VI) const; // incorporate - Incorporate information in the argument into this relation // entry. This assumes that the information doesn't contradict itself. If // any new information is gained, true is returned, otherwise false is // returned to indicate that nothing was updated. // - bool incorporate(Instruction::BinaryOps Rel, ValueInfo &VI); + bool incorporate(unsigned Rel, ValueInfo &VI); // KnownResult - Whether or not this condition determines the result of a - // setcc in the program. False & True are intentionally 0 & 1 so we can - // convert to bool by casting after checking for unknown. + // setcc or icmp in the program. False & True are intentionally 0 & 1 + // so we can convert to bool by casting after checking for unknown. // enum KnownResult { KnownFalse = 0, KnownTrue = 1, Unknown = 2 }; @@ -82,7 +82,7 @@ namespace { // the specified relationship is true or false, return that. If we cannot // determine the result required, return Unknown. // - KnownResult getImpliedResult(Instruction::BinaryOps Rel) const; + KnownResult getImpliedResult(unsigned Rel) const; // print - Output this relation to the specified stream void print(std::ostream &OS) const; @@ -269,19 +269,16 @@ namespace { void PropagateBranchInfo(BranchInst *BI); void PropagateSwitchInfo(SwitchInst *SI); void PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI); - void PropagateRelation(Instruction::BinaryOps Opcode, Value *Op0, + void PropagateRelation(unsigned Opcode, Value *Op0, Value *Op1, RegionInfo &RI); void UpdateUsersOfValue(Value *V, RegionInfo &RI); void IncorporateInstruction(Instruction *Inst, RegionInfo &RI); void ComputeReplacements(RegionInfo &RI); - - // getSetCCResult - Given a setcc instruction, determine if the result is + // getCmpResult - Given a icmp instruction, determine if the result is // determined by facts we already know about the region under analysis. - // Return KnownTrue, KnownFalse, or Unknown based on what we can determine. - // - Relation::KnownResult getSetCCResult(SetCondInst *SC, const RegionInfo &RI); - + // Return KnownTrue, KnownFalse, or UnKnown based on what we can determine. + Relation::KnownResult getCmpResult(CmpInst *ICI, const RegionInfo &RI); bool SimplifyBasicBlock(BasicBlock &BB, const RegionInfo &RI); bool SimplifyInstruction(Instruction *Inst, const RegionInfo &RI); @@ -448,12 +445,12 @@ bool CEE::ForwardCorrelatedEdgeDestination(TerminatorInst *TI, unsigned SuccNo, return false; // We can only forward the branch over the block if the block ends with a - // setcc we can determine the outcome for. + // cmp we can determine the outcome for. // // FIXME: we can make this more generic. Code below already handles more // generic case. - SetCondInst *SCI = dyn_cast(BI->getCondition()); - if (SCI == 0) return false; + if (!isa(BI->getCondition())) + return false; // Make a new RegionInfo structure so that we can simulate the effect of the // PHI nodes in the block we are skipping over... @@ -472,10 +469,10 @@ bool CEE::ForwardCorrelatedEdgeDestination(TerminatorInst *TI, unsigned SuccNo, int OpNum = PN->getBasicBlockIndex(BB); assert(OpNum != -1 && "PHI doesn't have incoming edge for predecessor!?"); PropagateEquality(PN, PN->getIncomingValue(OpNum), NewRI); - } else if (SetCondInst *SCI = dyn_cast(I)) { - Relation::KnownResult Res = getSetCCResult(SCI, NewRI); + } else if (CmpInst *CI = dyn_cast(I)) { + Relation::KnownResult Res = getCmpResult(CI, NewRI); if (Res == Relation::Unknown) return false; - PropagateEquality(SCI, ConstantBool::get(Res), NewRI); + PropagateEquality(CI, ConstantBool::get(Res), NewRI); } else { assert(isa(*I) && "Unexpected instruction type!"); } @@ -827,7 +824,8 @@ void CEE::PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI) { Relation &KnownRelation = VI.getRelation(Op1); // If we already know they're equal, don't reprocess... - if (KnownRelation.getRelation() == Instruction::SetEQ) + if (KnownRelation.getRelation() == FCmpInst::FCMP_OEQ || + KnownRelation.getRelation() == ICmpInst::ICMP_EQ) return; // If this is boolean, check to see if one of the operands is a constant. If @@ -863,32 +861,55 @@ void CEE::PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI) { PropagateEquality(BinaryOperator::getNotArgument(BOp), ConstantBool::get(!CB->getValue()), RI); - // If we know the value of a SetCC instruction, propagate the information + // If we know the value of a FCmp instruction, propagate the information // about the relation into this region as well. // - if (SetCondInst *SCI = dyn_cast(Inst)) { + if (FCmpInst *FCI = dyn_cast(Inst)) { if (CB->getValue()) { // If we know the condition is true... // Propagate info about the LHS to the RHS & RHS to LHS - PropagateRelation(SCI->getOpcode(), SCI->getOperand(0), - SCI->getOperand(1), RI); - PropagateRelation(SCI->getSwappedCondition(), - SCI->getOperand(1), SCI->getOperand(0), RI); + PropagateRelation(FCI->getPredicate(), FCI->getOperand(0), + FCI->getOperand(1), RI); + PropagateRelation(FCI->getSwappedPredicate(), + FCI->getOperand(1), FCI->getOperand(0), RI); } else { // If we know the condition is false... // We know the opposite of the condition is true... - Instruction::BinaryOps C = SCI->getInverseCondition(); + FCmpInst::Predicate C = FCI->getInversePredicate(); - PropagateRelation(C, SCI->getOperand(0), SCI->getOperand(1), RI); - PropagateRelation(SetCondInst::getSwappedCondition(C), - SCI->getOperand(1), SCI->getOperand(0), RI); + PropagateRelation(C, FCI->getOperand(0), FCI->getOperand(1), RI); + PropagateRelation(FCmpInst::getSwappedPredicate(C), + FCI->getOperand(1), FCI->getOperand(0), RI); + } + } + + // If we know the value of a ICmp instruction, propagate the information + // about the relation into this region as well. + // + if (ICmpInst *ICI = dyn_cast(Inst)) { + if (CB->getValue()) { // If we know the condition is true... + // Propagate info about the LHS to the RHS & RHS to LHS + PropagateRelation(ICI->getPredicate(), ICI->getOperand(0), + ICI->getOperand(1), RI); + PropagateRelation(ICI->getSwappedPredicate(), ICI->getOperand(1), + ICI->getOperand(1), RI); + + } else { // If we know the condition is false ... + // We know the opposite of the condition is true... + ICmpInst::Predicate C = ICI->getInversePredicate(); + + PropagateRelation(C, ICI->getOperand(0), ICI->getOperand(1), RI); + PropagateRelation(ICmpInst::getSwappedPredicate(C), + ICI->getOperand(1), ICI->getOperand(0), RI); } } } } // Propagate information about Op0 to Op1 & visa versa - PropagateRelation(Instruction::SetEQ, Op0, Op1, RI); - PropagateRelation(Instruction::SetEQ, Op1, Op0, RI); + PropagateRelation(ICmpInst::ICMP_EQ, Op0, Op1, RI); + PropagateRelation(ICmpInst::ICMP_EQ, Op1, Op0, RI); + PropagateRelation(FCmpInst::FCMP_OEQ, Op0, Op1, RI); + PropagateRelation(FCmpInst::FCMP_OEQ, Op1, Op0, RI); } @@ -896,7 +917,7 @@ void CEE::PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI) { // blocks in the specified region. Propagate the information about Op0 and // anything derived from it into this region. // -void CEE::PropagateRelation(Instruction::BinaryOps Opcode, Value *Op0, +void CEE::PropagateRelation(unsigned Opcode, Value *Op0, Value *Op1, RegionInfo &RI) { assert(Op0->getType() == Op1->getType() && "Equal types expected!"); @@ -921,7 +942,10 @@ void CEE::PropagateRelation(Instruction::BinaryOps Opcode, Value *Op0, if (Op1R.contradicts(Opcode, VI)) { Op1R.contradicts(Opcode, VI); cerr << "Contradiction found for opcode: " - << Instruction::getOpcodeName(Opcode) << "\n"; + << ((isa(Op0)||isa(Op1)) ? + Instruction::getOpcodeName(Instruction::ICmp) : + Instruction::getOpcodeName(Opcode)) + << "\n"; Op1R.print(*cerr.stream()); return; } @@ -964,11 +988,11 @@ void CEE::UpdateUsersOfValue(Value *V, RegionInfo &RI) { // value produced by this instruction // void CEE::IncorporateInstruction(Instruction *Inst, RegionInfo &RI) { - if (SetCondInst *SCI = dyn_cast(Inst)) { + if (CmpInst *CI = dyn_cast(Inst)) { // See if we can figure out a result for this instruction... - Relation::KnownResult Result = getSetCCResult(SCI, RI); + Relation::KnownResult Result = getCmpResult(CI, RI); if (Result != Relation::Unknown) { - PropagateEquality(SCI, ConstantBool::get(Result != 0), RI); + PropagateEquality(CI, ConstantBool::get(Result != 0), RI); } } } @@ -1002,7 +1026,14 @@ void CEE::ComputeReplacements(RegionInfo &RI) { // Loop over the relationships known about Op0. const std::vector &Relationships = VI.getRelationships(); for (unsigned i = 0, e = Relationships.size(); i != e; ++i) - if (Relationships[i].getRelation() == Instruction::SetEQ) { + if (Relationships[i].getRelation() == FCmpInst::FCMP_OEQ) { + unsigned R = getRank(Relationships[i].getValue()); + if (R < MinRank) { + MinRank = R; + Replacement = Relationships[i].getValue(); + } + } + else if (Relationships[i].getRelation() == ICmpInst::ICMP_EQ) { unsigned R = getRank(Relationships[i].getValue()); if (R < MinRank) { MinRank = R; @@ -1028,16 +1059,17 @@ bool CEE::SimplifyBasicBlock(BasicBlock &BB, const RegionInfo &RI) { // Convert instruction arguments to canonical forms... Changed |= SimplifyInstruction(Inst, RI); - if (SetCondInst *SCI = dyn_cast(Inst)) { + if (CmpInst *CI = dyn_cast(Inst)) { // Try to simplify a setcc instruction based on inherited information - Relation::KnownResult Result = getSetCCResult(SCI, RI); + Relation::KnownResult Result = getCmpResult(CI, RI); if (Result != Relation::Unknown) { - DOUT << "Replacing setcc with " << Result << " constant: " << *SCI; + DEBUG(cerr << "Replacing icmp with " << Result + << " constant: " << *CI); - SCI->replaceAllUsesWith(ConstantBool::get((bool)Result)); + CI->replaceAllUsesWith(ConstantBool::get((bool)Result)); // The instruction is now dead, remove it from the program. - SCI->getParent()->getInstList().erase(SCI); - ++NumSetCCRemoved; + CI->getParent()->getInstList().erase(CI); + ++NumCmpRemoved; Changed = true; } } @@ -1069,33 +1101,35 @@ bool CEE::SimplifyInstruction(Instruction *I, const RegionInfo &RI) { return Changed; } - -// getSetCCResult - Try to simplify a setcc instruction based on information -// inherited from a dominating setcc instruction. V is one of the operands to -// the setcc instruction, and VI is the set of information known about it. We +// getCmpResult - Try to simplify a cmp instruction based on information +// inherited from a dominating icmp instruction. V is one of the operands to +// the icmp instruction, and VI is the set of information known about it. We // take two cases into consideration here. If the comparison is against a // constant value, we can use the constant range to see if the comparison is // possible to succeed. If it is not a comparison against a constant, we check // to see if there is a known relationship between the two values. If so, we // may be able to eliminate the check. // -Relation::KnownResult CEE::getSetCCResult(SetCondInst *SCI, - const RegionInfo &RI) { - Value *Op0 = SCI->getOperand(0), *Op1 = SCI->getOperand(1); - Instruction::BinaryOps Opcode = SCI->getOpcode(); +Relation::KnownResult CEE::getCmpResult(CmpInst *CI, + const RegionInfo &RI) { + Value *Op0 = CI->getOperand(0), *Op1 = CI->getOperand(1); + unsigned short predicate = CI->getPredicate(); if (isa(Op0)) { if (isa(Op1)) { - if (Constant *Result = ConstantFoldInstruction(SCI)) { - // Wow, this is easy, directly eliminate the SetCondInst. - DOUT << "Replacing setcc with constant fold: " << *SCI; + if (Constant *Result = ConstantFoldInstruction(CI)) { + // Wow, this is easy, directly eliminate the ICmpInst. + DEBUG(cerr << "Replacing cmp with constant fold: " << *CI); return cast(Result)->getValue() ? Relation::KnownTrue : Relation::KnownFalse; } } else { // We want to swap this instruction so that operand #0 is the constant. std::swap(Op0, Op1); - Opcode = SCI->getSwappedCondition(); + if (isa(CI)) + predicate = cast(CI)->getSwappedPredicate(); + else + predicate = cast(CI)->getSwappedPredicate(); } } @@ -1107,12 +1141,13 @@ Relation::KnownResult CEE::getSetCCResult(SetCondInst *SCI, // At this point, we know that if we have a constant argument that it is in // Op1. Check to see if we know anything about comparing value with a - // constant, and if we can use this info to fold the setcc. + // constant, and if we can use this info to fold the icmp. // if (ConstantIntegral *C = dyn_cast(Op1)) { // Check to see if we already know the result of this comparison... - ConstantRange R = ConstantRange(Opcode, C); - ConstantRange Int = R.intersectWith(Op0VI->getBounds()); + ConstantRange R = ConstantRange(predicate, C); + ConstantRange Int = R.intersectWith(Op0VI->getBounds(), + ICmpInst::isSignedPredicate(ICmpInst::Predicate(predicate))); // If the intersection of the two ranges is empty, then the condition // could never be true! @@ -1134,7 +1169,7 @@ Relation::KnownResult CEE::getSetCCResult(SetCondInst *SCI, // // Do we have value information about Op0 and a relation to Op1? if (const Relation *Op2R = Op0VI->requestRelation(Op1)) - Result = Op2R->getImpliedResult(Opcode); + Result = Op2R->getImpliedResult(predicate); } } return Result; @@ -1147,7 +1182,7 @@ Relation::KnownResult CEE::getSetCCResult(SetCondInst *SCI, // contradicts - Return true if the relationship specified by the operand // contradicts already known information. // -bool Relation::contradicts(Instruction::BinaryOps Op, +bool Relation::contradicts(unsigned Op, const ValueInfo &VI) const { assert (Op != Instruction::Add && "Invalid relation argument!"); @@ -1155,24 +1190,48 @@ bool Relation::contradicts(Instruction::BinaryOps Op, // does not contradict properties known about the bounds of the constant. // if (ConstantIntegral *C = dyn_cast(Val)) - if (ConstantRange(Op, C).intersectWith(VI.getBounds()).isEmptySet()) - return true; + if (Op >= ICmpInst::FIRST_ICMP_PREDICATE && + Op <= ICmpInst::LAST_ICMP_PREDICATE) + if (ConstantRange(Op, C).intersectWith(VI.getBounds(), + ICmpInst::isSignedPredicate(ICmpInst::Predicate(Op))).isEmptySet()) + return true; switch (Rel) { default: assert(0 && "Unknown Relationship code!"); case Instruction::Add: return false; // Nothing known, nothing contradicts - case Instruction::SetEQ: - return Op == Instruction::SetLT || Op == Instruction::SetGT || - Op == Instruction::SetNE; - case Instruction::SetNE: return Op == Instruction::SetEQ; - case Instruction::SetLE: return Op == Instruction::SetGT; - case Instruction::SetGE: return Op == Instruction::SetLT; - case Instruction::SetLT: - return Op == Instruction::SetEQ || Op == Instruction::SetGT || - Op == Instruction::SetGE; - case Instruction::SetGT: - return Op == Instruction::SetEQ || Op == Instruction::SetLT || - Op == Instruction::SetLE; + case ICmpInst::ICMP_EQ: + return Op == ICmpInst::ICMP_ULT || Op == ICmpInst::ICMP_SLT || + Op == ICmpInst::ICMP_UGT || Op == ICmpInst::ICMP_SGT || + Op == ICmpInst::ICMP_NE; + case ICmpInst::ICMP_NE: return Op == ICmpInst::ICMP_EQ; + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: return Op == ICmpInst::ICMP_UGT || + Op == ICmpInst::ICMP_SGT; + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: return Op == ICmpInst::ICMP_ULT || + Op == ICmpInst::ICMP_SLT; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + return Op == ICmpInst::ICMP_EQ || Op == ICmpInst::ICMP_UGT || + Op == ICmpInst::ICMP_SGT || Op == ICmpInst::ICMP_UGE || + Op == ICmpInst::ICMP_SGE; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + return Op == ICmpInst::ICMP_EQ || Op == ICmpInst::ICMP_ULT || + Op == ICmpInst::ICMP_SLT || Op == ICmpInst::ICMP_ULE || + Op == ICmpInst::ICMP_SLE; + case FCmpInst::FCMP_OEQ: + return Op == FCmpInst::FCMP_OLT || Op == FCmpInst::FCMP_OGT || + Op == FCmpInst::FCMP_ONE; + case FCmpInst::FCMP_ONE: return Op == FCmpInst::FCMP_OEQ; + case FCmpInst::FCMP_OLE: return Op == FCmpInst::FCMP_OGT; + case FCmpInst::FCMP_OGE: return Op == FCmpInst::FCMP_OLT; + case FCmpInst::FCMP_OLT: + return Op == FCmpInst::FCMP_OEQ || Op == FCmpInst::FCMP_OGT || + Op == FCmpInst::FCMP_OGE; + case FCmpInst::FCMP_OGT: + return Op == FCmpInst::FCMP_OEQ || Op == FCmpInst::FCMP_OLT || + Op == FCmpInst::FCMP_OLE; } } @@ -1181,7 +1240,7 @@ bool Relation::contradicts(Instruction::BinaryOps Op, // new information is gained, true is returned, otherwise false is returned to // indicate that nothing was updated. // -bool Relation::incorporate(Instruction::BinaryOps Op, ValueInfo &VI) { +bool Relation::incorporate(unsigned Op, ValueInfo &VI) { assert(!contradicts(Op, VI) && "Cannot incorporate contradictory information!"); @@ -1189,30 +1248,64 @@ bool Relation::incorporate(Instruction::BinaryOps Op, ValueInfo &VI) { // range that is possible for the value to have... // if (ConstantIntegral *C = dyn_cast(Val)) - VI.getBounds() = ConstantRange(Op, C).intersectWith(VI.getBounds()); + if (Op >= ICmpInst::FIRST_ICMP_PREDICATE && + Op <= ICmpInst::LAST_ICMP_PREDICATE) + VI.getBounds() = ConstantRange(Op, C).intersectWith(VI.getBounds(), + ICmpInst::isSignedPredicate(ICmpInst::Predicate(Op))); switch (Rel) { default: assert(0 && "Unknown prior value!"); case Instruction::Add: Rel = Op; return true; - case Instruction::SetEQ: return false; // Nothing is more precise - case Instruction::SetNE: return false; // Nothing is more precise - case Instruction::SetLT: return false; // Nothing is more precise - case Instruction::SetGT: return false; // Nothing is more precise - case Instruction::SetLE: - if (Op == Instruction::SetEQ || Op == Instruction::SetLT) { + case ICmpInst::ICMP_EQ: + case ICmpInst::ICMP_NE: + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: return false; // Nothing is more precise + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: + if (Op == ICmpInst::ICMP_EQ || Op == ICmpInst::ICMP_ULT || + Op == ICmpInst::ICMP_SLT) { Rel = Op; return true; - } else if (Op == Instruction::SetNE) { - Rel = Instruction::SetLT; + } else if (Op == ICmpInst::ICMP_NE) { + Rel = Rel == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_ULT : + ICmpInst::ICMP_SLT; return true; } return false; - case Instruction::SetGE: return Op == Instruction::SetLT; - if (Op == Instruction::SetEQ || Op == Instruction::SetGT) { + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + if (Op == ICmpInst::ICMP_EQ || ICmpInst::ICMP_UGT || + Op == ICmpInst::ICMP_SGT) { Rel = Op; return true; - } else if (Op == Instruction::SetNE) { - Rel = Instruction::SetGT; + } else if (Op == ICmpInst::ICMP_NE) { + Rel = Rel == ICmpInst::ICMP_UGE ? ICmpInst::ICMP_UGT : + ICmpInst::ICMP_SGT; + return true; + } + return false; + case FCmpInst::FCMP_OEQ: return false; // Nothing is more precise + case FCmpInst::FCMP_ONE: return false; // Nothing is more precise + case FCmpInst::FCMP_OLT: return false; // Nothing is more precise + case FCmpInst::FCMP_OGT: return false; // Nothing is more precise + case FCmpInst::FCMP_OLE: + if (Op == FCmpInst::FCMP_OEQ || Op == FCmpInst::FCMP_OLT) { + Rel = Op; + return true; + } else if (Op == FCmpInst::FCMP_ONE) { + Rel = FCmpInst::FCMP_OLT; + return true; + } + return false; + case FCmpInst::FCMP_OGE: + return Op == FCmpInst::FCMP_OLT; + if (Op == FCmpInst::FCMP_OEQ || Op == FCmpInst::FCMP_OGT) { + Rel = Op; + return true; + } else if (Op == FCmpInst::FCMP_ONE) { + Rel = FCmpInst::FCMP_OGT; return true; } return false; @@ -1224,28 +1317,67 @@ bool Relation::incorporate(Instruction::BinaryOps Op, ValueInfo &VI) { // determine the result required, return Unknown. // Relation::KnownResult -Relation::getImpliedResult(Instruction::BinaryOps Op) const { +Relation::getImpliedResult(unsigned Op) const { if (Rel == Op) return KnownTrue; - if (Rel == SetCondInst::getInverseCondition(Op)) return KnownFalse; + if (Op >= ICmpInst::FIRST_ICMP_PREDICATE && + Op <= ICmpInst::LAST_ICMP_PREDICATE) { + if (Rel == unsigned(ICmpInst::getInversePredicate(ICmpInst::Predicate(Op)))) + return KnownFalse; + } else if (Op <= FCmpInst::LAST_FCMP_PREDICATE) { + if (Rel == unsigned(FCmpInst::getInversePredicate(FCmpInst::Predicate(Op)))) + return KnownFalse; + } switch (Rel) { default: assert(0 && "Unknown prior value!"); - case Instruction::SetEQ: - if (Op == Instruction::SetLE || Op == Instruction::SetGE) return KnownTrue; - if (Op == Instruction::SetLT || Op == Instruction::SetGT) return KnownFalse; + case ICmpInst::ICMP_EQ: + if (Op == ICmpInst::ICMP_ULE || Op == ICmpInst::ICMP_SLE || + Op == ICmpInst::ICMP_UGE || Op == ICmpInst::ICMP_SGE) return KnownTrue; + if (Op == ICmpInst::ICMP_ULT || Op == ICmpInst::ICMP_SLT || + Op == ICmpInst::ICMP_UGT || Op == ICmpInst::ICMP_SGT) return KnownFalse; + break; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + if (Op == ICmpInst::ICMP_ULE || Op == ICmpInst::ICMP_SLE || + Op == ICmpInst::ICMP_NE) return KnownTrue; + if (Op == ICmpInst::ICMP_EQ) return KnownFalse; + break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + if (Op == ICmpInst::ICMP_UGE || Op == ICmpInst::ICMP_SGE || + Op == ICmpInst::ICMP_NE) return KnownTrue; + if (Op == ICmpInst::ICMP_EQ) return KnownFalse; + break; + case FCmpInst::FCMP_OEQ: + if (Op == FCmpInst::FCMP_OLE || Op == FCmpInst::FCMP_OGE) return KnownTrue; + if (Op == FCmpInst::FCMP_OLT || Op == FCmpInst::FCMP_OGT) return KnownFalse; break; - case Instruction::SetLT: - if (Op == Instruction::SetNE || Op == Instruction::SetLE) return KnownTrue; - if (Op == Instruction::SetEQ) return KnownFalse; + case FCmpInst::FCMP_OLT: + if (Op == FCmpInst::FCMP_ONE || Op == FCmpInst::FCMP_OLE) return KnownTrue; + if (Op == FCmpInst::FCMP_OEQ) return KnownFalse; break; - case Instruction::SetGT: - if (Op == Instruction::SetNE || Op == Instruction::SetGE) return KnownTrue; - if (Op == Instruction::SetEQ) return KnownFalse; + case FCmpInst::FCMP_OGT: + if (Op == FCmpInst::FCMP_ONE || Op == FCmpInst::FCMP_OGE) return KnownTrue; + if (Op == FCmpInst::FCMP_OEQ) return KnownFalse; break; - case Instruction::SetNE: - case Instruction::SetLE: - case Instruction::SetGE: - case Instruction::Add: + case ICmpInst::ICMP_NE: + case ICmpInst::ICMP_SLE: + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_OGE: + case FCmpInst::FCMP_FALSE: + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_UEQ: + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_ULT: + case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_UNE: + case FCmpInst::FCMP_TRUE: break; } return Unknown; @@ -1298,12 +1430,30 @@ void Relation::print(std::ostream &OS) const { OS << " is "; switch (Rel) { default: OS << "*UNKNOWN*"; break; - case Instruction::SetEQ: OS << "== "; break; - case Instruction::SetNE: OS << "!= "; break; - case Instruction::SetLT: OS << "< "; break; - case Instruction::SetGT: OS << "> "; break; - case Instruction::SetLE: OS << "<= "; break; - case Instruction::SetGE: OS << ">= "; break; + case ICmpInst::ICMP_EQ: + case FCmpInst::FCMP_ORD: + case FCmpInst::FCMP_UEQ: + case FCmpInst::FCMP_OEQ: OS << "== "; break; + case ICmpInst::ICMP_NE: + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_UNE: + case FCmpInst::FCMP_ONE: OS << "!= "; break; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + case FCmpInst::FCMP_ULT: + case FCmpInst::FCMP_OLT: OS << "< "; break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_OGT: OS << "> "; break; + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: + case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_OLE: OS << "<= "; break; + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_OGE: OS << ">= "; break; } WriteAsOperand(OS, Val); diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 91759dc9b58..fac17d1c8cb 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -271,14 +271,14 @@ Instruction *IndVarSimplify::LinearFunctionTestReplace(Loop *L, Value *ExitCnt = RW.expandCodeFor(TripCount, Preheader->getTerminator(), IndVar->getType()); - // Insert a new setne or seteq instruction before the branch. - Instruction::BinaryOps Opcode; + // Insert a new icmp_ne or icmp_eq instruction before the branch. + ICmpInst::Predicate Opcode; if (L->contains(BI->getSuccessor(0))) - Opcode = Instruction::SetNE; + Opcode = ICmpInst::ICMP_NE; else - Opcode = Instruction::SetEQ; + Opcode = ICmpInst::ICMP_EQ; - Value *Cond = new SetCondInst(Opcode, IndVar, ExitCnt, "exitcond", BI); + Value *Cond = new ICmpInst(Opcode, IndVar, ExitCnt, "exitcond", BI); BI->setCondition(Cond); ++NumLFTR; Changed = true; diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 8b6f3703b05..205dfef84a8 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -24,8 +24,8 @@ // 1. If a binary operator has a constant operand, it is moved to the RHS // 2. Bitwise operators with constant operands are always grouped so that // shifts are performed first, then or's, then and's, then xor's. -// 3. SetCC instructions are converted from <,>,<=,>= to ==,!= if possible -// 4. All SetCC instructions on boolean values are replaced with logical ops +// 3. Compare instructions are converted from <,>,<=,>= to ==,!= if possible +// 4. All cmp instructions on boolean values are replaced with logical ops // 5. add X, X is represented as (X*2) => (X << 1) // 6. Multiplies with a power-of-two constant argument are transformed into // shifts. @@ -143,11 +143,12 @@ namespace { Instruction *visitAnd(BinaryOperator &I); Instruction *visitOr (BinaryOperator &I); Instruction *visitXor(BinaryOperator &I); - Instruction *visitSetCondInst(SetCondInst &I); - Instruction *visitSetCondInstWithCastAndCast(SetCondInst &SCI); + Instruction *visitFCmpInst(FCmpInst &I); + Instruction *visitICmpInst(ICmpInst &I); + Instruction *visitICmpInstWithCastAndCast(ICmpInst &ICI); - Instruction *FoldGEPSetCC(User *GEPLHS, Value *RHS, - Instruction::BinaryOps Cond, Instruction &I); + Instruction *FoldGEPICmp(User *GEPLHS, Value *RHS, + ICmpInst::Predicate Cond, Instruction &I); Instruction *visitShiftInst(ShiftInst &I); Instruction *FoldShiftByConstant(Value *Op0, ConstantInt *Op1, ShiftInst &I); @@ -274,10 +275,14 @@ namespace { Value *V, const Type *DestTy, Instruction *InsertBefore); - // SimplifyCommutative - This performs a few simplifications for commutative - // operators. + /// SimplifyCommutative - This performs a few simplifications for + /// commutative operators. bool SimplifyCommutative(BinaryOperator &I); + /// SimplifyCompare - This reorders the operands of a CmpInst to get them in + /// most-complex to least-complex order. + bool SimplifyCompare(CmpInst &I); + bool SimplifyDemandedBits(Value *V, uint64_t Mask, uint64_t &KnownZero, uint64_t &KnownOne, unsigned Depth = 0); @@ -303,7 +308,7 @@ namespace { Value *FoldLogicalPlusAnd(Value *LHS, Value *RHS, ConstantIntegral *Mask, bool isSub, Instruction &I); Instruction *InsertRangeTest(Value *V, Constant *Lo, Constant *Hi, - bool Inside, Instruction &IB); + bool isSigned, bool Inside, Instruction &IB); Instruction *PromoteCastOfAllocation(CastInst &CI, AllocationInst &AI); Instruction *MatchBSwap(BinaryOperator &I); @@ -381,7 +386,8 @@ isEliminableCastPair( /// ValueRequiresCast - Return true if the cast from "V to Ty" actually results /// in any code being generated. It does not require codegen if V is simple /// enough or if the cast can be folded into other casts. -static bool ValueRequiresCast(const Value *V, const Type *Ty, TargetData *TD) { +static bool ValueRequiresCast(Instruction::CastOps opcode, const Value *V, + const Type *Ty, TargetData *TD) { if (V->getType() == Ty || isa(V)) return false; // If this is a noop cast, it isn't real codegen. @@ -390,8 +396,7 @@ static bool ValueRequiresCast(const Value *V, const Type *Ty, TargetData *TD) { // If this is another cast that can be eliminated, it isn't codegen either. if (const CastInst *CI = dyn_cast(V)) - if (isEliminableCastPair(CI, CastInst::getCastOpcode( - V, V->getType()->isSigned(), Ty, Ty->isSigned()), Ty, TD)) + if (isEliminableCastPair(CI, opcode, Ty, TD)) return false; return true; } @@ -456,6 +461,17 @@ bool InstCombiner::SimplifyCommutative(BinaryOperator &I) { return Changed; } +/// SimplifyCompare - For a CmpInst this function just orders the operands +/// so that theyare listed from right (least complex) to left (most complex). +/// This puts constants before unary operators before binary operators. +bool InstCombiner::SimplifyCompare(CmpInst &I) { + if (getComplexity(I.getOperand(0)) >= getComplexity(I.getOperand(1))) + return false; + I.swapOperands(); + // Compare instructions are not associative so there's nothing else we can do. + return true; +} + // dyn_castNegVal - Given a 'sub' instruction, return the RHS of the instruction // if the LHS is a constant zero (which is the 'negate' form). // @@ -1451,13 +1467,24 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, uint64_t DemandedElts, return MadeChange ? I : 0; } -// isTrueWhenEqual - Return true if the specified setcondinst instruction is -// true when both operands are equal... -// -static bool isTrueWhenEqual(Instruction &I) { - return I.getOpcode() == Instruction::SetEQ || - I.getOpcode() == Instruction::SetGE || - I.getOpcode() == Instruction::SetLE; +/// @returns true if the specified compare instruction is +/// true when both operands are equal... +/// @brief Determine if the ICmpInst returns true if both operands are equal +static bool isTrueWhenEqual(ICmpInst &ICI) { + ICmpInst::Predicate pred = ICI.getPredicate(); + return pred == ICmpInst::ICMP_EQ || pred == ICmpInst::ICMP_UGE || + pred == ICmpInst::ICMP_SGE || pred == ICmpInst::ICMP_ULE || + pred == ICmpInst::ICMP_SLE; +} + +/// @returns true if the specified compare instruction is +/// true when both operands are equal... +/// @brief Determine if the FCmpInst returns true if both operands are equal +static bool isTrueWhenEqual(FCmpInst &FCI) { + FCmpInst::Predicate pred = FCI.getPredicate(); + return pred == FCmpInst::FCMP_OEQ || pred == FCmpInst::FCMP_UEQ || + pred == FCmpInst::FCMP_OGE || pred == FCmpInst::FCMP_UGE || + pred == FCmpInst::FCMP_OLE || pred == FCmpInst::FCMP_ULE; } /// AssociativeOpt - Perform an optimization on an associative operator. This @@ -1593,6 +1620,9 @@ static Value *FoldOperationIntoSelectOperand(Instruction &I, Value *SO, Instruction *New; if (BinaryOperator *BO = dyn_cast(&I)) New = BinaryOperator::create(BO->getOpcode(), Op0, Op1,SO->getName()+".op"); + else if (CmpInst *CI = dyn_cast(&I)) + New = CmpInst::create(CI->getOpcode(), CI->getPredicate(), Op0, Op1, + SO->getName()+".cmp"); else if (ShiftInst *SI = dyn_cast(&I)) New = new ShiftInst(SI->getOpcode(), Op0, Op1, SO->getName()+".sh"); else { @@ -1671,13 +1701,21 @@ Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I) { for (unsigned i = 0; i != NumPHIValues; ++i) { Value *InV; if (Constant *InC = dyn_cast(PN->getIncomingValue(i))) { - InV = ConstantExpr::get(I.getOpcode(), InC, C); + if (CmpInst *CI = dyn_cast(&I)) + InV = ConstantExpr::getCompare(CI->getPredicate(), InC, C); + else + InV = ConstantExpr::get(I.getOpcode(), InC, C); } else { assert(PN->getIncomingBlock(i) == NonConstBB); if (BinaryOperator *BO = dyn_cast(&I)) InV = BinaryOperator::create(BO->getOpcode(), PN->getIncomingValue(i), C, "phitmp", NonConstBB->getTerminator()); + else if (CmpInst *CI = dyn_cast(&I)) + InV = CmpInst::create(CI->getOpcode(), + CI->getPredicate(), + PN->getIncomingValue(i), C, "phitmp", + NonConstBB->getTerminator()); else if (ShiftInst *SI = dyn_cast(&I)) InV = new ShiftInst(SI->getOpcode(), PN->getIncomingValue(i), C, "phitmp", @@ -2077,25 +2115,27 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { return 0; } -/// isSignBitCheck - Given an exploded setcc instruction, return true if it is +/// isSignBitCheck - Given an exploded icmp instruction, return true if it /// really just returns true if the most significant (sign) bit is set. -static bool isSignBitCheck(unsigned Opcode, Value *LHS, ConstantInt *RHS) { - if (RHS->getType()->isSigned()) { - // True if source is LHS < 0 or LHS <= -1 - return Opcode == Instruction::SetLT && RHS->isNullValue() || - Opcode == Instruction::SetLE && RHS->isAllOnesValue(); - } else { - ConstantInt *RHSC = cast(RHS); - // True if source is LHS > 127 or LHS >= 128, where the constants depend on - // the size of the integer type. - if (Opcode == Instruction::SetGE) - return RHSC->getZExtValue() == - 1ULL << (RHS->getType()->getPrimitiveSizeInBits()-1); - if (Opcode == Instruction::SetGT) - return RHSC->getZExtValue() == +static bool isSignBitCheck(ICmpInst::Predicate pred, ConstantInt *RHS) { + switch (pred) { + case ICmpInst::ICMP_SLT: + // True if LHS s< RHS and RHS == 0 + return RHS->isNullValue(); + case ICmpInst::ICMP_SLE: + // True if LHS s<= RHS and RHS == -1 + return RHS->isAllOnesValue(); + case ICmpInst::ICMP_UGE: + // True if LHS u>= RHS and RHS == high-bit-mask (2^7, 2^15, 2^31, etc) + return RHS->getZExtValue() == (1ULL << + (RHS->getType()->getPrimitiveSizeInBits()-1)); + case ICmpInst::ICMP_UGT: + // True if LHS u> RHS and RHS == high-bit-mask - 1 + return RHS->getZExtValue() == (1ULL << (RHS->getType()->getPrimitiveSizeInBits()-1))-1; + default: + return false; } - return false; } Instruction *InstCombiner::visitMul(BinaryOperator &I) { @@ -2179,14 +2219,14 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { if (CI->getOperand(0)->getType() == Type::BoolTy) BoolCast = CI; if (BoolCast) { - if (SetCondInst *SCI = dyn_cast(BoolCast->getOperand(0))) { + if (ICmpInst *SCI = dyn_cast(BoolCast->getOperand(0))) { Value *SCIOp0 = SCI->getOperand(0), *SCIOp1 = SCI->getOperand(1); const Type *SCOpTy = SCIOp0->getType(); - // If the setcc is true iff the sign bit of X is set, then convert this + // If the icmp is true iff the sign bit of X is set, then convert this // multiply into a shift/and combination. if (isa(SCIOp1) && - isSignBitCheck(SCI->getOpcode(), SCIOp0, cast(SCIOp1))) { + isSignBitCheck(SCI->getPredicate(), cast(SCIOp1))) { // Shift the X value right to turn it into "all signbits". Constant *Amt = ConstantInt::get(Type::UByteTy, SCOpTy->getPrimitiveSizeInBits()-1); @@ -2613,27 +2653,27 @@ Instruction *InstCombiner::visitFRem(BinaryOperator &I) { } // isMaxValueMinusOne - return true if this is Max-1 -static bool isMaxValueMinusOne(const ConstantInt *C) { - if (C->getType()->isUnsigned()) - return C->getZExtValue() == C->getType()->getIntegralTypeMask()-1; - - // Calculate 0111111111..11111 - unsigned TypeBits = C->getType()->getPrimitiveSizeInBits(); - int64_t Val = INT64_MAX; // All ones - Val >>= 64-TypeBits; // Shift out unwanted 1 bits... - return C->getSExtValue() == Val-1; +static bool isMaxValueMinusOne(const ConstantInt *C, bool isSigned) { + if (isSigned) { + // Calculate 0111111111..11111 + unsigned TypeBits = C->getType()->getPrimitiveSizeInBits(); + int64_t Val = INT64_MAX; // All ones + Val >>= 64-TypeBits; // Shift out unwanted 1 bits... + return C->getSExtValue() == Val-1; + } + return C->getZExtValue() == C->getType()->getIntegralTypeMask()-1; } // isMinValuePlusOne - return true if this is Min+1 -static bool isMinValuePlusOne(const ConstantInt *C) { - if (C->getType()->isUnsigned()) - return C->getZExtValue() == 1; - - // Calculate 1111111111000000000000 - unsigned TypeBits = C->getType()->getPrimitiveSizeInBits(); - int64_t Val = -1; // All ones - Val <<= TypeBits-1; // Shift over to the right spot - return C->getSExtValue() == Val+1; +static bool isMinValuePlusOne(const ConstantInt *C, bool isSigned) { + if (isSigned) { + // Calculate 1111111111000000000000 + unsigned TypeBits = C->getType()->getPrimitiveSizeInBits(); + int64_t Val = -1; // All ones + Val <<= TypeBits-1; // Shift over to the right spot + return C->getSExtValue() == Val+1; + } + return C->getZExtValue() == 1; // unsigned } // isOneBitSet - Return true if there is exactly one bit set in the specified @@ -2669,71 +2709,116 @@ static bool isHighOnes(const ConstantInt *CI) { return U && V && (U & V) == 0; } - -/// getSetCondCode - Encode a setcc opcode into a three bit mask. These bits +/// getICmpCode - Encode a icmp predicate into a three bit mask. These bits /// are carefully arranged to allow folding of expressions such as: /// /// (A < B) | (A > B) --> (A != B) /// -/// Bit value '4' represents that the comparison is true if A > B, bit value '2' -/// represents that the comparison is true if A == B, and bit value '1' is true -/// if A < B. +/// Note that this is only valid if the first and second predicates have the +/// same sign. Is illegal to do: (A u< B) | (A s> B) +/// +/// Three bits are used to represent the condition, as follows: +/// 0 A > B +/// 1 A == B +/// 2 A < B /// -static unsigned getSetCondCode(const SetCondInst *SCI) { - switch (SCI->getOpcode()) { +/// <=> Value Definition +/// 000 0 Always false +/// 001 1 A > B +/// 010 2 A == B +/// 011 3 A >= B +/// 100 4 A < B +/// 101 5 A != B +/// 110 6 A <= B +/// 111 7 Always true +/// +static unsigned getICmpCode(const ICmpInst *ICI) { + switch (ICI->getPredicate()) { // False -> 0 - case Instruction::SetGT: return 1; - case Instruction::SetEQ: return 2; - case Instruction::SetGE: return 3; - case Instruction::SetLT: return 4; - case Instruction::SetNE: return 5; - case Instruction::SetLE: return 6; + case ICmpInst::ICMP_UGT: return 1; // 001 + case ICmpInst::ICMP_SGT: return 1; // 001 + case ICmpInst::ICMP_EQ: return 2; // 010 + case ICmpInst::ICMP_UGE: return 3; // 011 + case ICmpInst::ICMP_SGE: return 3; // 011 + case ICmpInst::ICMP_ULT: return 4; // 100 + case ICmpInst::ICMP_SLT: return 4; // 100 + case ICmpInst::ICMP_NE: return 5; // 101 + case ICmpInst::ICMP_ULE: return 6; // 110 + case ICmpInst::ICMP_SLE: return 6; // 110 // True -> 7 default: - assert(0 && "Invalid SetCC opcode!"); + assert(0 && "Invalid ICmp predicate!"); return 0; } } -/// getSetCCValue - This is the complement of getSetCondCode, which turns an -/// opcode and two operands into either a constant true or false, or a brand new -/// SetCC instruction. -static Value *getSetCCValue(unsigned Opcode, Value *LHS, Value *RHS) { - switch (Opcode) { - case 0: return ConstantBool::getFalse(); - case 1: return new SetCondInst(Instruction::SetGT, LHS, RHS); - case 2: return new SetCondInst(Instruction::SetEQ, LHS, RHS); - case 3: return new SetCondInst(Instruction::SetGE, LHS, RHS); - case 4: return new SetCondInst(Instruction::SetLT, LHS, RHS); - case 5: return new SetCondInst(Instruction::SetNE, LHS, RHS); - case 6: return new SetCondInst(Instruction::SetLE, LHS, RHS); - case 7: return ConstantBool::getTrue(); - default: assert(0 && "Illegal SetCCCode!"); return 0; +/// getICmpValue - This is the complement of getICmpCode, which turns an +/// opcode and two operands into either a constant true or false, or a brand +/// new /// ICmp instruction. The sign is passed in to determine which kind +/// of predicate to use in new icmp instructions. +static Value *getICmpValue(bool sign, unsigned code, Value *LHS, Value *RHS) { + switch (code) { + default: assert(0 && "Illegal ICmp code!"); + case 0: return ConstantBool::getFalse(); + case 1: + if (sign) + return new ICmpInst(ICmpInst::ICMP_SGT, LHS, RHS); + else + return new ICmpInst(ICmpInst::ICMP_UGT, LHS, RHS); + case 2: return new ICmpInst(ICmpInst::ICMP_EQ, LHS, RHS); + case 3: + if (sign) + return new ICmpInst(ICmpInst::ICMP_SGE, LHS, RHS); + else + return new ICmpInst(ICmpInst::ICMP_UGE, LHS, RHS); + case 4: + if (sign) + return new ICmpInst(ICmpInst::ICMP_SLT, LHS, RHS); + else + return new ICmpInst(ICmpInst::ICMP_ULT, LHS, RHS); + case 5: return new ICmpInst(ICmpInst::ICMP_NE, LHS, RHS); + case 6: + if (sign) + return new ICmpInst(ICmpInst::ICMP_SLE, LHS, RHS); + else + return new ICmpInst(ICmpInst::ICMP_ULE, LHS, RHS); + case 7: return ConstantBool::getTrue(); } } -// FoldSetCCLogical - Implements (setcc1 A, B) & (setcc2 A, B) --> (setcc3 A, B) -namespace { -struct FoldSetCCLogical { +static bool PredicatesFoldable(ICmpInst::Predicate p1, ICmpInst::Predicate p2) { + return (ICmpInst::isSignedPredicate(p1) == ICmpInst::isSignedPredicate(p2)) || + (ICmpInst::isSignedPredicate(p1) && + (p2 == ICmpInst::ICMP_EQ || p2 == ICmpInst::ICMP_NE)) || + (ICmpInst::isSignedPredicate(p2) && + (p1 == ICmpInst::ICMP_EQ || p1 == ICmpInst::ICMP_NE)); +} + +namespace { +// FoldICmpLogical - Implements (icmp1 A, B) & (icmp2 A, B) --> (icmp3 A, B) +struct FoldICmpLogical { InstCombiner &IC; Value *LHS, *RHS; - FoldSetCCLogical(InstCombiner &ic, SetCondInst *SCI) - : IC(ic), LHS(SCI->getOperand(0)), RHS(SCI->getOperand(1)) {} + ICmpInst::Predicate pred; + FoldICmpLogical(InstCombiner &ic, ICmpInst *ICI) + : IC(ic), LHS(ICI->getOperand(0)), RHS(ICI->getOperand(1)), + pred(ICI->getPredicate()) {} bool shouldApply(Value *V) const { - if (SetCondInst *SCI = dyn_cast(V)) - return (SCI->getOperand(0) == LHS && SCI->getOperand(1) == RHS || - SCI->getOperand(0) == RHS && SCI->getOperand(1) == LHS); + if (ICmpInst *ICI = dyn_cast(V)) + if (PredicatesFoldable(pred, ICI->getPredicate())) + return (ICI->getOperand(0) == LHS && ICI->getOperand(1) == RHS || + ICI->getOperand(0) == RHS && ICI->getOperand(1) == LHS); return false; } - Instruction *apply(BinaryOperator &Log) const { - SetCondInst *SCI = cast(Log.getOperand(0)); - if (SCI->getOperand(0) != LHS) { - assert(SCI->getOperand(1) == LHS); - SCI->swapOperands(); // Swap the LHS and RHS of the SetCC + Instruction *apply(Instruction &Log) const { + ICmpInst *ICI = cast(Log.getOperand(0)); + if (ICI->getOperand(0) != LHS) { + assert(ICI->getOperand(1) == LHS); + ICI->swapOperands(); // Swap the LHS and RHS of the ICmp } - unsigned LHSCode = getSetCondCode(SCI); - unsigned RHSCode = getSetCondCode(cast(Log.getOperand(1))); + unsigned LHSCode = getICmpCode(ICI); + unsigned RHSCode = getICmpCode(cast(Log.getOperand(1))); unsigned Code; switch (Log.getOpcode()) { case Instruction::And: Code = LHSCode & RHSCode; break; @@ -2742,7 +2827,7 @@ struct FoldSetCCLogical { default: assert(0 && "Illegal logical opcode!"); return 0; } - Value *RV = getSetCCValue(Code, LHS, RHS); + Value *RV = getICmpValue(ICmpInst::isSignedPredicate(pred), Code, LHS, RHS); if (Instruction *I = dyn_cast(RV)) return I; // Otherwise, it's a constant boolean value... @@ -2882,48 +2967,52 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op, /// InsertRangeTest - Emit a computation of: (V >= Lo && V < Hi) if Inside is /// true, otherwise (V < Lo || V >= Hi). In pratice, we emit the more efficient -/// (V-Lo) (ConstantExpr::getSetLE(Lo, Hi))->getValue() && + bool isSigned, bool Inside, + Instruction &IB) { + assert(cast(ConstantExpr::getICmp((isSigned ? + ICmpInst::ICMP_SLE:ICmpInst::ICMP_ULE), Lo, Hi))->getValue() && "Lo is not <= Hi in range emission code!"); + if (Inside) { if (Lo == Hi) // Trivially false. - return new SetCondInst(Instruction::SetNE, V, V); - if (cast(Lo)->isMinValue(Lo->getType()->isSigned())) - return new SetCondInst(Instruction::SetLT, V, Hi); + return new ICmpInst(ICmpInst::ICMP_NE, V, V); - Constant *AddCST = ConstantExpr::getNeg(Lo); - Instruction *Add = BinaryOperator::createAdd(V, AddCST,V->getName()+".off"); + // V >= Min && V < Hi --> V < Hi + if (cast(Lo)->isMinValue(isSigned)) { + ICmpInst::Predicate pred = (isSigned ? + ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT); + return new ICmpInst(pred, V, Hi); + } + + // Emit V-Lo getName()+".off"); InsertNewInstBefore(Add, IB); - // Convert to unsigned for the comparison. - const Type *UnsType = Add->getType()->getUnsignedVersion(); - Value *OffsetVal = InsertCastBefore(Instruction::BitCast, Add, UnsType, IB); - AddCST = ConstantExpr::getAdd(AddCST, Hi); - AddCST = ConstantExpr::getBitCast(AddCST, UnsType); - return new SetCondInst(Instruction::SetLT, OffsetVal, AddCST); + Constant *UpperBound = ConstantExpr::getAdd(NegLo, Hi); + return new ICmpInst(ICmpInst::ICMP_ULT, Add, UpperBound); } if (Lo == Hi) // Trivially true. - return new SetCondInst(Instruction::SetEQ, V, V); + return new ICmpInst(ICmpInst::ICMP_EQ, V, V); + // V < Min || V >= Hi ->'V > Hi-1' Hi = SubOne(cast(Hi)); + if (cast(Lo)->isMinValue(isSigned)) { + ICmpInst::Predicate pred = (isSigned ? + ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT); + return new ICmpInst(pred, V, Hi); + } - // V < 0 || V >= Hi ->'V > Hi-1' - if (cast(Lo)->isMinValue(Lo->getType()->isSigned())) - return new SetCondInst(Instruction::SetGT, V, Hi); - - // Emit X-Lo > Hi-Lo-1 - Constant *AddCST = ConstantExpr::getNeg(Lo); - Instruction *Add = BinaryOperator::createAdd(V, AddCST, V->getName()+".off"); + // Emit V-Lo > Hi-1-Lo + Constant *NegLo = ConstantExpr::getNeg(Lo); + Instruction *Add = BinaryOperator::createAdd(V, NegLo, V->getName()+".off"); InsertNewInstBefore(Add, IB); - // Convert to unsigned for the comparison. - const Type *UnsType = Add->getType()->getUnsignedVersion(); - Value *OffsetVal = InsertCastBefore(Instruction::BitCast, Add, UnsType, IB); - AddCST = ConstantExpr::getAdd(AddCST, Hi); - AddCST = ConstantExpr::getBitCast(AddCST, UnsType); - return new SetCondInst(Instruction::SetGT, OffsetVal, AddCST); + Constant *LowerBound = ConstantExpr::getAdd(NegLo, Hi); + return new ICmpInst(ICmpInst::ICMP_UGT, Add, LowerBound); } // isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s with @@ -3163,62 +3252,72 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { } } - - if (SetCondInst *RHS = dyn_cast(Op1)) { - // (setcc1 A, B) & (setcc2 A, B) --> (setcc3 A, B) - if (Instruction *R = AssociativeOpt(I, FoldSetCCLogical(*this, RHS))) + if (ICmpInst *RHS = dyn_cast(Op1)) { + // (icmp1 A, B) & (icmp2 A, B) --> (icmp3 A, B) + if (Instruction *R = AssociativeOpt(I, FoldICmpLogical(*this, RHS))) return R; Value *LHSVal, *RHSVal; ConstantInt *LHSCst, *RHSCst; - Instruction::BinaryOps LHSCC, RHSCC; - if (match(Op0, m_SetCond(LHSCC, m_Value(LHSVal), m_ConstantInt(LHSCst)))) - if (match(RHS, m_SetCond(RHSCC, m_Value(RHSVal), m_ConstantInt(RHSCst)))) - if (LHSVal == RHSVal && // Found (X setcc C1) & (X setcc C2) - // Set[GL]E X, CST is folded to Set[GL]T elsewhere. - LHSCC != Instruction::SetGE && LHSCC != Instruction::SetLE && - RHSCC != Instruction::SetGE && RHSCC != Instruction::SetLE) { + ICmpInst::Predicate LHSCC, RHSCC; + if (match(Op0, m_ICmp(LHSCC, m_Value(LHSVal), m_ConstantInt(LHSCst)))) + if (match(RHS, m_ICmp(RHSCC, m_Value(RHSVal), m_ConstantInt(RHSCst)))) + if (LHSVal == RHSVal && // Found (X icmp C1) & (X icmp C2) + // ICMP_[GL]E X, CST is folded to ICMP_[GL]T elsewhere. + LHSCC != ICmpInst::ICMP_UGE && LHSCC != ICmpInst::ICMP_ULE && + RHSCC != ICmpInst::ICMP_UGE && RHSCC != ICmpInst::ICMP_ULE && + LHSCC != ICmpInst::ICMP_SGE && LHSCC != ICmpInst::ICMP_SLE && + RHSCC != ICmpInst::ICMP_SGE && RHSCC != ICmpInst::ICMP_SLE) { // Ensure that the larger constant is on the RHS. - Constant *Cmp = ConstantExpr::getSetGT(LHSCst, RHSCst); - SetCondInst *LHS = cast(Op0); + ICmpInst::Predicate GT = ICmpInst::isSignedPredicate(LHSCC) ? + ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; + Constant *Cmp = ConstantExpr::getICmp(GT, LHSCst, RHSCst); + ICmpInst *LHS = cast(Op0); if (cast(Cmp)->getValue()) { std::swap(LHS, RHS); std::swap(LHSCst, RHSCst); std::swap(LHSCC, RHSCC); } - // At this point, we know we have have two setcc instructions + // At this point, we know we have have two icmp instructions // comparing a value against two constants and and'ing the result // together. Because of the above check, we know that we only have - // SetEQ, SetNE, SetLT, and SetGT here. We also know (from the - // FoldSetCCLogical check above), that the two constants are not - // equal. + // icmp eq, icmp ne, icmp [su]lt, and icmp [SU]gt here. We also know + // (from the FoldICmpLogical check above), that the two constants + // are not equal and that the larger constant is on the RHS assert(LHSCst != RHSCst && "Compares not folded above?"); switch (LHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: + case ICmpInst::ICMP_EQ: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X == 13 & X == 15) -> false - case Instruction::SetGT: // (X == 13 & X > 15) -> false + case ICmpInst::ICMP_EQ: // (X == 13 & X == 15) -> false + case ICmpInst::ICMP_UGT: // (X == 13 & X > 15) -> false + case ICmpInst::ICMP_SGT: // (X == 13 & X > 15) -> false return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - case Instruction::SetNE: // (X == 13 & X != 15) -> X == 13 - case Instruction::SetLT: // (X == 13 & X < 15) -> X == 13 + case ICmpInst::ICMP_NE: // (X == 13 & X != 15) -> X == 13 + case ICmpInst::ICMP_ULT: // (X == 13 & X < 15) -> X == 13 + case ICmpInst::ICMP_SLT: // (X == 13 & X < 15) -> X == 13 return ReplaceInstUsesWith(I, LHS); } - case Instruction::SetNE: + case ICmpInst::ICMP_NE: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetLT: - if (LHSCst == SubOne(RHSCst)) // (X != 13 & X < 14) -> X < 13 - return new SetCondInst(Instruction::SetLT, LHSVal, LHSCst); - break; // (X != 13 & X < 15) -> no change - case Instruction::SetEQ: // (X != 13 & X == 15) -> X == 15 - case Instruction::SetGT: // (X != 13 & X > 15) -> X > 15 + case ICmpInst::ICMP_ULT: + if (LHSCst == SubOne(RHSCst)) // (X != 13 & X u< 14) -> X < 13 + return new ICmpInst(ICmpInst::ICMP_ULT, LHSVal, LHSCst); + break; // (X != 13 & X u< 15) -> no change + case ICmpInst::ICMP_SLT: + if (LHSCst == SubOne(RHSCst)) // (X != 13 & X s< 14) -> X < 13 + return new ICmpInst(ICmpInst::ICMP_SLT, LHSVal, LHSCst); + break; // (X != 13 & X s< 15) -> no change + case ICmpInst::ICMP_EQ: // (X != 13 & X == 15) -> X == 15 + case ICmpInst::ICMP_UGT: // (X != 13 & X u> 15) -> X u> 15 + case ICmpInst::ICMP_SGT: // (X != 13 & X s> 15) -> X s> 15 return ReplaceInstUsesWith(I, RHS); - case Instruction::SetNE: - if (LHSCst == SubOne(RHSCst)) {// (X != 13 & X != 14) -> X-13 >u 1 + case ICmpInst::ICMP_NE: + if (LHSCst == SubOne(RHSCst)){// (X != 13 & X != 14) -> X-13 >u 1 Constant *AddCST = ConstantExpr::getNeg(LHSCst); Instruction *Add = BinaryOperator::createAdd(LHSVal, AddCST, LHSVal->getName()+".off"); @@ -3228,35 +3327,81 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { UnsType, I); AddCST = ConstantExpr::getSub(RHSCst, LHSCst); AddCST = ConstantExpr::getBitCast(AddCST, UnsType); - return new SetCondInst(Instruction::SetGT, OffsetVal, AddCST); + return new ICmpInst(ICmpInst::ICMP_UGT, OffsetVal, AddCST); } break; // (X != 13 & X != 15) -> no change } break; - case Instruction::SetLT: + case ICmpInst::ICMP_ULT: + switch (RHSCC) { + default: assert(0 && "Unknown integer condition code!"); + case ICmpInst::ICMP_EQ: // (X u< 13 & X == 15) -> false + case ICmpInst::ICMP_UGT: // (X u< 13 & X u> 15) -> false + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + case ICmpInst::ICMP_SGT: // (X u< 13 & X s> 15) -> no change + break; + case ICmpInst::ICMP_NE: // (X u< 13 & X != 15) -> X u< 13 + case ICmpInst::ICMP_ULT: // (X u< 13 & X u< 15) -> X u< 13 + return ReplaceInstUsesWith(I, LHS); + case ICmpInst::ICMP_SLT: // (X u< 13 & X s< 15) -> no change + break; + } + break; + case ICmpInst::ICMP_SLT: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X < 13 & X == 15) -> false - case Instruction::SetGT: // (X < 13 & X > 15) -> false + case ICmpInst::ICMP_EQ: // (X s< 13 & X == 15) -> false + case ICmpInst::ICMP_SGT: // (X s< 13 & X s> 15) -> false return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - case Instruction::SetNE: // (X < 13 & X != 15) -> X < 13 - case Instruction::SetLT: // (X < 13 & X < 15) -> X < 13 + case ICmpInst::ICMP_UGT: // (X s< 13 & X u> 15) -> no change + break; + case ICmpInst::ICMP_NE: // (X s< 13 & X != 15) -> X < 13 + case ICmpInst::ICMP_SLT: // (X s< 13 & X s< 15) -> X < 13 + return ReplaceInstUsesWith(I, LHS); + case ICmpInst::ICMP_ULT: // (X s< 13 & X u< 15) -> no change + break; + } + break; + case ICmpInst::ICMP_UGT: + switch (RHSCC) { + default: assert(0 && "Unknown integer condition code!"); + case ICmpInst::ICMP_EQ: // (X u> 13 & X == 15) -> X > 13 return ReplaceInstUsesWith(I, LHS); + case ICmpInst::ICMP_UGT: // (X u> 13 & X u> 15) -> X u> 15 + return ReplaceInstUsesWith(I, RHS); + case ICmpInst::ICMP_SGT: // (X u> 13 & X s> 15) -> no change + break; + case ICmpInst::ICMP_NE: + if (RHSCst == AddOne(LHSCst)) // (X u> 13 & X != 14) -> X u> 14 + return new ICmpInst(LHSCC, LHSVal, RHSCst); + break; // (X u> 13 & X != 15) -> no change + case ICmpInst::ICMP_ULT: // (X u> 13 & X u< 15) ->(X-14) 13 & X s< 15) -> no change + break; } - case Instruction::SetGT: + break; + case ICmpInst::ICMP_SGT: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X > 13 & X == 15) -> X > 13 + case ICmpInst::ICMP_EQ: // (X s> 13 & X == 15) -> X s> 13 return ReplaceInstUsesWith(I, LHS); - case Instruction::SetGT: // (X > 13 & X > 15) -> X > 15 + case ICmpInst::ICMP_SGT: // (X s> 13 & X s> 15) -> X s> 15 return ReplaceInstUsesWith(I, RHS); - case Instruction::SetNE: - if (RHSCst == AddOne(LHSCst)) // (X > 13 & X != 14) -> X > 14 - return new SetCondInst(Instruction::SetGT, LHSVal, RHSCst); - break; // (X > 13 & X != 15) -> no change - case Instruction::SetLT: // (X > 13 & X < 15) -> (X-14) 13 & X u> 15) -> no change + break; + case ICmpInst::ICMP_NE: + if (RHSCst == AddOne(LHSCst)) // (X s> 13 & X != 14) -> X s> 14 + return new ICmpInst(LHSCC, LHSVal, RHSCst); + break; // (X s> 13 & X != 15) -> no change + case ICmpInst::ICMP_SLT: // (X s> 13 & X s< 15) ->(X-14) s< 1 + return InsertRangeTest(LHSVal, AddOne(LHSCst), RHSCst, true, + true, I); + case ICmpInst::ICMP_ULT: // (X s> 13 & X u< 15) -> no change + break; } + break; } } } @@ -3268,8 +3413,10 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { const Type *SrcTy = Op0C->getOperand(0)->getType(); if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() && // Only do this if the casts both really cause code to be generated. - ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) && - ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) { + ValueRequiresCast(Op0C->getOpcode(), Op0C->getOperand(0), + I.getType(), TD) && + ValueRequiresCast(Op1C->getOpcode(), Op1C->getOperand(0), + I.getType(), TD)) { Instruction *NewOp = BinaryOperator::createAnd(Op0C->getOperand(0), Op1C->getOperand(0), I.getName()); @@ -3570,97 +3717,142 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { } } - // (setcc1 A, B) | (setcc2 A, B) --> (setcc3 A, B) - if (SetCondInst *RHS = dyn_cast(I.getOperand(1))) { - if (Instruction *R = AssociativeOpt(I, FoldSetCCLogical(*this, RHS))) + // (icmp1 A, B) | (icmp2 A, B) --> (icmp3 A, B) + if (ICmpInst *RHS = dyn_cast(I.getOperand(1))) { + if (Instruction *R = AssociativeOpt(I, FoldICmpLogical(*this, RHS))) return R; Value *LHSVal, *RHSVal; ConstantInt *LHSCst, *RHSCst; - Instruction::BinaryOps LHSCC, RHSCC; - if (match(Op0, m_SetCond(LHSCC, m_Value(LHSVal), m_ConstantInt(LHSCst)))) - if (match(RHS, m_SetCond(RHSCC, m_Value(RHSVal), m_ConstantInt(RHSCst)))) - if (LHSVal == RHSVal && // Found (X setcc C1) | (X setcc C2) - // Set[GL]E X, CST is folded to Set[GL]T elsewhere. - LHSCC != Instruction::SetGE && LHSCC != Instruction::SetLE && - RHSCC != Instruction::SetGE && RHSCC != Instruction::SetLE) { + ICmpInst::Predicate LHSCC, RHSCC; + if (match(Op0, m_ICmp(LHSCC, m_Value(LHSVal), m_ConstantInt(LHSCst)))) + if (match(RHS, m_ICmp(RHSCC, m_Value(RHSVal), m_ConstantInt(RHSCst)))) + if (LHSVal == RHSVal && // Found (X icmp C1) | (X icmp C2) + // icmp [us][gl]e x, cst is folded to icmp [us][gl]t elsewhere. + LHSCC != ICmpInst::ICMP_UGE && LHSCC != ICmpInst::ICMP_ULE && + RHSCC != ICmpInst::ICMP_UGE && RHSCC != ICmpInst::ICMP_ULE && + LHSCC != ICmpInst::ICMP_SGE && LHSCC != ICmpInst::ICMP_SLE && + RHSCC != ICmpInst::ICMP_SGE && RHSCC != ICmpInst::ICMP_SLE) { // Ensure that the larger constant is on the RHS. - Constant *Cmp = ConstantExpr::getSetGT(LHSCst, RHSCst); - SetCondInst *LHS = cast(Op0); + ICmpInst::Predicate GT = ICmpInst::isSignedPredicate(LHSCC) ? + ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; + Constant *Cmp = ConstantExpr::getICmp(GT, LHSCst, RHSCst); + ICmpInst *LHS = cast(Op0); if (cast(Cmp)->getValue()) { std::swap(LHS, RHS); std::swap(LHSCst, RHSCst); std::swap(LHSCC, RHSCC); } - // At this point, we know we have have two setcc instructions + // At this point, we know we have have two icmp instructions // comparing a value against two constants and or'ing the result // together. Because of the above check, we know that we only have - // SetEQ, SetNE, SetLT, and SetGT here. We also know (from the - // FoldSetCCLogical check above), that the two constants are not + // ICMP_EQ, ICMP_NE, ICMP_LT, and ICMP_GT here. We also know (from the + // FoldICmpLogical check above), that the two constants are not // equal. assert(LHSCst != RHSCst && "Compares not folded above?"); switch (LHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: + case ICmpInst::ICMP_EQ: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: + case ICmpInst::ICMP_EQ: if (LHSCst == SubOne(RHSCst)) {// (X == 13 | X == 14) -> X-13 getName()+".off"); InsertNewInstBefore(Add, I); - const Type *UnsType = Add->getType()->getUnsignedVersion(); - Value *OffsetVal = InsertCastBefore(Instruction::BitCast, Add, - UnsType, I); AddCST = ConstantExpr::getSub(AddOne(RHSCst), LHSCst); - AddCST = ConstantExpr::getBitCast(AddCST, UnsType); - return new SetCondInst(Instruction::SetLT, OffsetVal, AddCST); + return new ICmpInst(ICmpInst::ICMP_ULT, Add, AddCST); } - break; // (X == 13 | X == 15) -> no change - - case Instruction::SetGT: // (X == 13 | X > 14) -> no change + break; // (X == 13 | X == 15) -> no change + case ICmpInst::ICMP_UGT: // (X == 13 | X u> 14) -> no change + case ICmpInst::ICMP_SGT: // (X == 13 | X s> 14) -> no change break; - case Instruction::SetNE: // (X == 13 | X != 15) -> X != 15 - case Instruction::SetLT: // (X == 13 | X < 15) -> X < 15 + case ICmpInst::ICMP_NE: // (X == 13 | X != 15) -> X != 15 + case ICmpInst::ICMP_ULT: // (X == 13 | X u< 15) -> X u< 15 + case ICmpInst::ICMP_SLT: // (X == 13 | X s< 15) -> X s< 15 return ReplaceInstUsesWith(I, RHS); } break; - case Instruction::SetNE: + case ICmpInst::ICMP_NE: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X != 13 | X == 15) -> X != 13 - case Instruction::SetGT: // (X != 13 | X > 15) -> X != 13 + case ICmpInst::ICMP_EQ: // (X != 13 | X == 15) -> X != 13 + case ICmpInst::ICMP_UGT: // (X != 13 | X u> 15) -> X != 13 + case ICmpInst::ICMP_SGT: // (X != 13 | X s> 15) -> X != 13 return ReplaceInstUsesWith(I, LHS); - case Instruction::SetNE: // (X != 13 | X != 15) -> true - case Instruction::SetLT: // (X != 13 | X < 15) -> true + case ICmpInst::ICMP_NE: // (X != 13 | X != 15) -> true + case ICmpInst::ICMP_ULT: // (X != 13 | X u< 15) -> true + case ICmpInst::ICMP_SLT: // (X != 13 | X s< 15) -> true return ReplaceInstUsesWith(I, ConstantBool::getTrue()); } break; - case Instruction::SetLT: + case ICmpInst::ICMP_ULT: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X < 13 | X == 14) -> no change + case ICmpInst::ICMP_EQ: // (X u< 13 | X == 14) -> no change + break; + case ICmpInst::ICMP_UGT: // (X u< 13 | X u> 15) ->(X-13) u> 2 + return InsertRangeTest(LHSVal, LHSCst, AddOne(RHSCst), false, + false, I); + case ICmpInst::ICMP_SGT: // (X u< 13 | X s> 15) -> no change break; - case Instruction::SetGT: // (X < 13 | X > 15) -> (X-13) > 2 - return InsertRangeTest(LHSVal, LHSCst, AddOne(RHSCst), false, I); - case Instruction::SetNE: // (X < 13 | X != 15) -> X != 15 - case Instruction::SetLT: // (X < 13 | X < 15) -> X < 15 + case ICmpInst::ICMP_NE: // (X u< 13 | X != 15) -> X != 15 + case ICmpInst::ICMP_ULT: // (X u< 13 | X u< 15) -> X u< 15 return ReplaceInstUsesWith(I, RHS); + case ICmpInst::ICMP_SLT: // (X u< 13 | X s< 15) -> no change + break; } break; - case Instruction::SetGT: + case ICmpInst::ICMP_SLT: switch (RHSCC) { default: assert(0 && "Unknown integer condition code!"); - case Instruction::SetEQ: // (X > 13 | X == 15) -> X > 13 - case Instruction::SetGT: // (X > 13 | X > 15) -> X > 13 + case ICmpInst::ICMP_EQ: // (X s< 13 | X == 14) -> no change + break; + case ICmpInst::ICMP_SGT: // (X s< 13 | X s> 15) ->(X-13) s> 2 + return InsertRangeTest(LHSVal, LHSCst, AddOne(RHSCst), true, + false, I); + case ICmpInst::ICMP_UGT: // (X s< 13 | X u> 15) -> no change + break; + case ICmpInst::ICMP_NE: // (X s< 13 | X != 15) -> X != 15 + case ICmpInst::ICMP_SLT: // (X s< 13 | X s< 15) -> X s< 15 + return ReplaceInstUsesWith(I, RHS); + case ICmpInst::ICMP_ULT: // (X s< 13 | X u< 15) -> no change + break; + } + break; + case ICmpInst::ICMP_UGT: + switch (RHSCC) { + default: assert(0 && "Unknown integer condition code!"); + case ICmpInst::ICMP_EQ: // (X u> 13 | X == 15) -> X u> 13 + case ICmpInst::ICMP_UGT: // (X u> 13 | X u> 15) -> X u> 13 + return ReplaceInstUsesWith(I, LHS); + case ICmpInst::ICMP_SGT: // (X u> 13 | X s> 15) -> no change + break; + case ICmpInst::ICMP_NE: // (X u> 13 | X != 15) -> true + case ICmpInst::ICMP_ULT: // (X u> 13 | X u< 15) -> true + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + case ICmpInst::ICMP_SLT: // (X u> 13 | X s< 15) -> no change + break; + } + break; + case ICmpInst::ICMP_SGT: + switch (RHSCC) { + default: assert(0 && "Unknown integer condition code!"); + case ICmpInst::ICMP_EQ: // (X s> 13 | X == 15) -> X > 13 + case ICmpInst::ICMP_SGT: // (X s> 13 | X s> 15) -> X > 13 return ReplaceInstUsesWith(I, LHS); - case Instruction::SetNE: // (X > 13 | X != 15) -> true - case Instruction::SetLT: // (X > 13 | X < 15) -> true + case ICmpInst::ICMP_UGT: // (X s> 13 | X u> 15) -> no change + break; + case ICmpInst::ICMP_NE: // (X s> 13 | X != 15) -> true + case ICmpInst::ICMP_SLT: // (X s> 13 | X s< 15) -> true return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + case ICmpInst::ICMP_ULT: // (X s> 13 | X u< 15) -> no change + break; } + break; } } } @@ -3672,8 +3864,10 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { const Type *SrcTy = Op0C->getOperand(0)->getType(); if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() && // Only do this if the casts both really cause code to be generated. - ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) && - ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) { + ValueRequiresCast(Op0C->getOpcode(), Op0C->getOperand(0), + I.getType(), TD) && + ValueRequiresCast(Op1C->getOpcode(), Op1C->getOperand(0), + I.getType(), TD)) { Instruction *NewOp = BinaryOperator::createOr(Op0C->getOperand(0), Op1C->getOperand(0), I.getName()); @@ -3719,13 +3913,13 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { return &I; if (ConstantIntegral *RHS = dyn_cast(Op1)) { - if (BinaryOperator *Op0I = dyn_cast(Op0)) { - // xor (setcc A, B), true = not (setcc A, B) = setncc A, B - if (SetCondInst *SCI = dyn_cast(Op0I)) - if (RHS == ConstantBool::getTrue() && SCI->hasOneUse()) - return new SetCondInst(SCI->getInverseCondition(), - SCI->getOperand(0), SCI->getOperand(1)); + // xor (icmp A, B), true = not (icmp A, B) = !icmp A, B + if (ICmpInst *ICI = dyn_cast(Op0)) + if (RHS == ConstantBool::getTrue() && ICI->hasOneUse()) + return new ICmpInst(ICI->getInversePredicate(), + ICI->getOperand(0), ICI->getOperand(1)); + if (BinaryOperator *Op0I = dyn_cast(Op0)) { // ~(c-X) == X-c-1 == X+(-c-1) if (Op0I->getOpcode() == Instruction::Sub && RHS->isAllOnesValue()) if (Constant *Op0I0C = dyn_cast(Op0I->getOperand(0))) { @@ -3842,9 +4036,9 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { } } - // (setcc1 A, B) ^ (setcc2 A, B) --> (setcc3 A, B) - if (SetCondInst *RHS = dyn_cast(I.getOperand(1))) - if (Instruction *R = AssociativeOpt(I, FoldSetCCLogical(*this, RHS))) + // (icmp1 A, B) ^ (icmp2 A, B) --> (icmp3 A, B) + if (ICmpInst *RHS = dyn_cast(I.getOperand(1))) + if (Instruction *R = AssociativeOpt(I, FoldICmpLogical(*this, RHS))) return R; // fold (xor (cast A), (cast B)) -> (cast (xor A, B)) @@ -3854,8 +4048,10 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { const Type *SrcTy = Op0C->getOperand(0)->getType(); if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() && // Only do this if the casts both really cause code to be generated. - ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) && - ValueRequiresCast(Op1C->getOperand(0), I.getType(), TD)) { + ValueRequiresCast(Op0C->getOpcode(), Op0C->getOperand(0), + I.getType(), TD) && + ValueRequiresCast(Op1C->getOpcode(), Op1C->getOperand(0), + I.getType(), TD)) { Instruction *NewOp = BinaryOperator::createXor(Op0C->getOperand(0), Op1C->getOperand(0), I.getName()); @@ -3909,9 +4105,8 @@ static bool AddWithOverflow(ConstantInt *&Result, ConstantInt *In1, static Value *EmitGEPOffset(User *GEP, Instruction &I, InstCombiner &IC) { TargetData &TD = IC.getTargetData(); gep_type_iterator GTI = gep_type_begin(GEP); - const Type *UIntPtrTy = TD.getIntPtrType(); - const Type *SIntPtrTy = UIntPtrTy->getSignedVersion(); - Value *Result = Constant::getNullValue(SIntPtrTy); + const Type *IntPtrTy = TD.getIntPtrType(); + Value *Result = Constant::getNullValue(IntPtrTy); // Build a mask for high order bits. uint64_t PtrSizeMask = ~0ULL >> (64-TD.getPointerSize()*8); @@ -3919,10 +4114,10 @@ static Value *EmitGEPOffset(User *GEP, Instruction &I, InstCombiner &IC) { for (unsigned i = 1, e = GEP->getNumOperands(); i != e; ++i, ++GTI) { Value *Op = GEP->getOperand(i); uint64_t Size = TD.getTypeSize(GTI.getIndexedType()) & PtrSizeMask; - Constant *Scale = ConstantInt::get(SIntPtrTy, Size); + Constant *Scale = ConstantInt::get(IntPtrTy, Size); if (Constant *OpC = dyn_cast(Op)) { if (!OpC->isNullValue()) { - OpC = ConstantExpr::getIntegerCast(OpC, SIntPtrTy, true /*SExt*/); + OpC = ConstantExpr::getIntegerCast(OpC, IntPtrTy, true /*SExt*/); Scale = ConstantExpr::getMul(OpC, Scale); if (Constant *RC = dyn_cast(Result)) Result = ConstantExpr::getAdd(RC, Scale); @@ -3935,7 +4130,7 @@ static Value *EmitGEPOffset(User *GEP, Instruction &I, InstCombiner &IC) { } } else { // Convert to correct type. - Op = IC.InsertNewInstBefore(CastInst::createSExtOrBitCast(Op, SIntPtrTy, + Op = IC.InsertNewInstBefore(CastInst::createSExtOrBitCast(Op, IntPtrTy, Op->getName()+".c"), I); if (Size != 1) // We'll let instcombine(mul) convert this to a shl if possible. @@ -3950,11 +4145,11 @@ static Value *EmitGEPOffset(User *GEP, Instruction &I, InstCombiner &IC) { return Result; } -/// FoldGEPSetCC - Fold comparisons between a GEP instruction and something +/// FoldGEPICmp - Fold comparisons between a GEP instruction and something /// else. At this point we know that the GEP is on the LHS of the comparison. -Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, - Instruction::BinaryOps Cond, - Instruction &I) { +Instruction *InstCombiner::FoldGEPICmp(User *GEPLHS, Value *RHS, + ICmpInst::Predicate Cond, + Instruction &I) { assert(dyn_castGetElementPtr(GEPLHS) && "LHS is not a getelementptr!"); if (CastInst *CI = dyn_cast(RHS)) @@ -3964,9 +4159,9 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, Value *PtrBase = GEPLHS->getOperand(0); if (PtrBase == RHS) { // As an optimization, we don't actually have to compute the actual value of - // OFFSET if this is a seteq or setne comparison, just return whether each - // index is zero or not. - if (Cond == Instruction::SetEQ || Cond == Instruction::SetNE) { + // OFFSET if this is a icmp_eq or icmp_ne comparison, just return whether + // each index is zero or not. + if (Cond == ICmpInst::ICMP_EQ || Cond == ICmpInst::ICMP_NE) { Instruction *InVal = 0; gep_type_iterator GTI = gep_type_begin(GEPLHS); for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i, ++GTI) { @@ -3980,19 +4175,19 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, EmitIt = false; // This is indexing into a zero sized array? } else if (isa(C)) return ReplaceInstUsesWith(I, // No comparison is needed here. - ConstantBool::get(Cond == Instruction::SetNE)); + ConstantBool::get(Cond == ICmpInst::ICMP_NE)); } if (EmitIt) { Instruction *Comp = - new SetCondInst(Cond, GEPLHS->getOperand(i), + new ICmpInst(Cond, GEPLHS->getOperand(i), Constant::getNullValue(GEPLHS->getOperand(i)->getType())); if (InVal == 0) InVal = Comp; else { InVal = InsertNewInstBefore(InVal, I); InsertNewInstBefore(Comp, I); - if (Cond == Instruction::SetNE) // True if any are unequal + if (Cond == ICmpInst::ICMP_NE) // True if any are unequal InVal = BinaryOperator::createOr(InVal, Comp); else // True if all are equal InVal = BinaryOperator::createAnd(InVal, Comp); @@ -4003,17 +4198,17 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, if (InVal) return InVal; else - ReplaceInstUsesWith(I, // No comparison is needed here, all indexes = 0 - ConstantBool::get(Cond == Instruction::SetEQ)); + // No comparison is needed here, all indexes = 0 + ReplaceInstUsesWith(I, ConstantBool::get(Cond == ICmpInst::ICMP_EQ)); } - // Only lower this if the setcc is the only user of the GEP or if we expect + // Only lower this if the icmp is the only user of the GEP or if we expect // the result to fold to a constant! if (isa(GEPLHS) || GEPLHS->hasOneUse()) { // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0). Value *Offset = EmitGEPOffset(GEPLHS, I, *this); - return new SetCondInst(Cond, Offset, - Constant::getNullValue(Offset->getType())); + return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Offset, + Constant::getNullValue(Offset->getType())); } } else if (User *GEPRHS = dyn_castGetElementPtr(RHS)) { // If the base pointers are different, but the indices are the same, just @@ -4031,8 +4226,8 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, // If all indices are the same, just compare the base pointers. if (IndicesTheSame) - return new SetCondInst(Cond, GEPLHS->getOperand(0), - GEPRHS->getOperand(0)); + return new ICmpInst(ICmpInst::getSignedPredicate(Cond), + GEPLHS->getOperand(0), GEPRHS->getOperand(0)); // Otherwise, the base pointers are different and the indices are // different, bail out. @@ -4048,8 +4243,8 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, break; } if (AllZeros) - return FoldGEPSetCC(GEPRHS, GEPLHS->getOperand(0), - SetCondInst::getSwappedCondition(Cond), I); + return FoldGEPICmp(GEPRHS, GEPLHS->getOperand(0), + ICmpInst::getSwappedPredicate(Cond), I); // If the other GEP has all zero indices, recurse. AllZeros = true; @@ -4060,7 +4255,7 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, break; } if (AllZeros) - return FoldGEPSetCC(GEPLHS, GEPRHS->getOperand(0), Cond, I); + return FoldGEPICmp(GEPLHS, GEPRHS->getOperand(0), Cond, I); if (GEPLHS->getNumOperands() == GEPRHS->getNumOperands()) { // If the GEPs only differ by one index, compare it. @@ -4081,49 +4276,103 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS, if (NumDifferences == 0) // SAME GEP? return ReplaceInstUsesWith(I, // No comparison is needed here. - ConstantBool::get(Cond == Instruction::SetEQ)); + ConstantBool::get(Cond == ICmpInst::ICMP_EQ)); else if (NumDifferences == 1) { Value *LHSV = GEPLHS->getOperand(DiffOperand); Value *RHSV = GEPRHS->getOperand(DiffOperand); - - // Convert the operands to signed values to make sure to perform a - // signed comparison. - const Type *NewTy = LHSV->getType()->getSignedVersion(); - if (LHSV->getType() != NewTy) - LHSV = InsertCastBefore(Instruction::BitCast, LHSV, NewTy, I); - if (RHSV->getType() != NewTy) - RHSV = InsertCastBefore(Instruction::BitCast, RHSV, NewTy, I); - return new SetCondInst(Cond, LHSV, RHSV); + if (LHSV->getType() != RHSV->getType()) + // Doesn't matter which one we bitconvert here. + LHSV = InsertCastBefore(Instruction::BitCast, LHSV, RHSV->getType(), + I); + // Make sure we do a signed comparison here. + return new ICmpInst(ICmpInst::getSignedPredicate(Cond), LHSV, RHSV); } } - // Only lower this if the setcc is the only user of the GEP or if we expect + // Only lower this if the icmp is the only user of the GEP or if we expect // the result to fold to a constant! if ((isa(GEPLHS) || GEPLHS->hasOneUse()) && (isa(GEPRHS) || GEPRHS->hasOneUse())) { // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2) Value *L = EmitGEPOffset(GEPLHS, I, *this); Value *R = EmitGEPOffset(GEPRHS, I, *this); - return new SetCondInst(Cond, L, R); + return new ICmpInst(ICmpInst::getSignedPredicate(Cond), L, R); } } return 0; } +Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) { + bool Changed = SimplifyCompare(I); + Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); -Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { - bool Changed = SimplifyCommutative(I); + // fcmp pred X, X + if (Op0 == Op1) + return ReplaceInstUsesWith(I, ConstantBool::get(isTrueWhenEqual(I))); + + if (isa(Op1)) // fcmp pred X, undef -> undef + return ReplaceInstUsesWith(I, UndefValue::get(Type::BoolTy)); + + // Handle fcmp with constant RHS + if (Constant *RHSC = dyn_cast(Op1)) { + if (Instruction *LHSI = dyn_cast(Op0)) + switch (LHSI->getOpcode()) { + case Instruction::PHI: + if (Instruction *NV = FoldOpIntoPhi(I)) + return NV; + break; + case Instruction::Select: + // If either operand of the select is a constant, we can fold the + // comparison into the select arms, which will cause one to be + // constant folded and the select turned into a bitwise or. + Value *Op1 = 0, *Op2 = 0; + if (LHSI->hasOneUse()) { + if (Constant *C = dyn_cast(LHSI->getOperand(1))) { + // Fold the known value into the constant operand. + Op1 = ConstantExpr::getCompare(I.getPredicate(), C, RHSC); + // Insert a new FCmp of the other select operand. + Op2 = InsertNewInstBefore(new FCmpInst(I.getPredicate(), + LHSI->getOperand(2), RHSC, + I.getName()), I); + } else if (Constant *C = dyn_cast(LHSI->getOperand(2))) { + // Fold the known value into the constant operand. + Op2 = ConstantExpr::getCompare(I.getPredicate(), C, RHSC); + // Insert a new FCmp of the other select operand. + Op1 = InsertNewInstBefore(new FCmpInst(I.getPredicate(), + LHSI->getOperand(1), RHSC, + I.getName()), I); + } + } + + if (Op1) + return new SelectInst(LHSI->getOperand(0), Op1, Op2); + break; + } + } + + return Changed ? &I : 0; +} + +Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { + bool Changed = SimplifyCompare(I); Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); const Type *Ty = Op0->getType(); - // setcc X, X + // icmp X, X if (Op0 == Op1) return ReplaceInstUsesWith(I, ConstantBool::get(isTrueWhenEqual(I))); - if (isa(Op1)) // X setcc undef -> undef + if (isa(Op1)) // X icmp undef -> undef return ReplaceInstUsesWith(I, UndefValue::get(Type::BoolTy)); - // setcc , - Global/Stack value + // icmp of GlobalValues can never equal each other as long as they aren't + // external weak linkage type. + if (GlobalValue *GV0 = dyn_cast(Op0)) + if (GlobalValue *GV1 = dyn_cast(Op1)) + if (!GV0->hasExternalWeakLinkage() || !GV1->hasExternalWeakLinkage()) + return ReplaceInstUsesWith(I, ConstantBool::get(!isTrueWhenEqual(I))); + + // icmp , - Global/Stack value // addresses never equal each other! We already know that Op0 != Op1. if ((isa(Op0) || isa(Op0) || isa(Op0)) && @@ -4131,30 +4380,34 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { isa(Op1))) return ReplaceInstUsesWith(I, ConstantBool::get(!isTrueWhenEqual(I))); - // setcc's with boolean values can always be turned into bitwise operations + // icmp's with boolean values can always be turned into bitwise operations if (Ty == Type::BoolTy) { - switch (I.getOpcode()) { - default: assert(0 && "Invalid setcc instruction!"); - case Instruction::SetEQ: { // seteq bool %A, %B -> ~(A^B) + switch (I.getPredicate()) { + default: assert(0 && "Invalid icmp instruction!"); + case ICmpInst::ICMP_EQ: { // icmp eq bool %A, %B -> ~(A^B) Instruction *Xor = BinaryOperator::createXor(Op0, Op1, I.getName()+"tmp"); InsertNewInstBefore(Xor, I); return BinaryOperator::createNot(Xor); } - case Instruction::SetNE: + case ICmpInst::ICMP_NE: // icmp eq bool %A, %B -> A^B return BinaryOperator::createXor(Op0, Op1); - case Instruction::SetGT: - std::swap(Op0, Op1); // Change setgt -> setlt + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + std::swap(Op0, Op1); // Change icmp gt -> icmp lt // FALL THROUGH - case Instruction::SetLT: { // setlt bool A, B -> ~X & Y + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: { // icmp lt bool A, B -> ~X & Y Instruction *Not = BinaryOperator::createNot(Op0, I.getName()+"tmp"); InsertNewInstBefore(Not, I); return BinaryOperator::createAnd(Not, Op1); } - case Instruction::SetGE: - std::swap(Op0, Op1); // Change setge -> setle + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + std::swap(Op0, Op1); // Change icmp ge -> icmp le // FALL THROUGH - case Instruction::SetLE: { // setle bool %A, %B -> ~A | B + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: { // icmp le bool %A, %B -> ~A | B Instruction *Not = BinaryOperator::createNot(Op0, I.getName()+"tmp"); InsertNewInstBefore(Not, I); return BinaryOperator::createOr(Not, Op1); @@ -4165,50 +4418,93 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // See if we are doing a comparison between a constant and an instruction that // can be folded into the comparison. if (ConstantInt *CI = dyn_cast(Op1)) { - // Check to see if we are comparing against the minimum or maximum value... - if (CI->isMinValue(CI->getType()->isSigned())) { - if (I.getOpcode() == Instruction::SetLT) // A < MIN -> FALSE + switch (I.getPredicate()) { + default: break; + case ICmpInst::ICMP_ULT: // A FALSE + if (CI->isMinValue(false)) return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - if (I.getOpcode() == Instruction::SetGE) // A >= MIN -> TRUE - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (I.getOpcode() == Instruction::SetLE) // A <= MIN -> A == MIN - return BinaryOperator::createSetEQ(Op0, Op1); - if (I.getOpcode() == Instruction::SetGT) // A > MIN -> A != MIN - return BinaryOperator::createSetNE(Op0, Op1); + if (CI->isMaxValue(false)) // A A != MAX + return new ICmpInst(ICmpInst::ICMP_NE, Op0,Op1); + if (isMinValuePlusOne(CI,false)) // A A == MIN + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, SubOne(CI)); + break; - } else if (CI->isMaxValue(CI->getType()->isSigned())) { - if (I.getOpcode() == Instruction::SetGT) // A > MAX -> FALSE + case ICmpInst::ICMP_SLT: + if (CI->isMinValue(true)) // A FALSE return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - if (I.getOpcode() == Instruction::SetLE) // A <= MAX -> TRUE + if (CI->isMaxValue(true)) // A A != MAX + return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1); + if (isMinValuePlusOne(CI,true)) // A A == MIN + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, SubOne(CI)); + break; + + case ICmpInst::ICMP_UGT: + if (CI->isMaxValue(false)) // A >u MAX -> FALSE + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + if (CI->isMinValue(false)) // A >u MIN -> A != MIN + return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1); + if (isMaxValueMinusOne(CI, false)) // A >u MAX-1 -> A == MAX + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, AddOne(CI)); + break; + + case ICmpInst::ICMP_SGT: + if (CI->isMaxValue(true)) // A >s MAX -> FALSE + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + if (CI->isMinValue(true)) // A >s MIN -> A != MIN + return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1); + if (isMaxValueMinusOne(CI, true)) // A >s MAX-1 -> A == MAX + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, AddOne(CI)); + break; + + case ICmpInst::ICMP_ULE: + if (CI->isMaxValue(false)) // A <=u MAX -> TRUE + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (CI->isMinValue(false)) // A <=u MIN -> A == MIN + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1); + if (isMaxValueMinusOne(CI,false)) // A <=u MAX-1 -> A != MAX + return new ICmpInst(ICmpInst::ICMP_NE, Op0, AddOne(CI)); + break; + + case ICmpInst::ICMP_SLE: + if (CI->isMaxValue(true)) // A <=s MAX -> TRUE + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (CI->isMinValue(true)) // A <=s MIN -> A == MIN + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1); + if (isMaxValueMinusOne(CI,true)) // A <=s MAX-1 -> A != MAX + return new ICmpInst(ICmpInst::ICMP_NE, Op0, AddOne(CI)); + break; + + case ICmpInst::ICMP_UGE: + if (CI->isMinValue(false)) // A >=u MIN -> TRUE + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (CI->isMaxValue(false)) // A >=u MAX -> A == MAX + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1); + if (isMinValuePlusOne(CI,false)) // A >=u MIN-1 -> A != MIN + return new ICmpInst(ICmpInst::ICMP_NE, Op0, SubOne(CI)); + break; + + case ICmpInst::ICMP_SGE: + if (CI->isMinValue(true)) // A >=s MIN -> TRUE return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (I.getOpcode() == Instruction::SetGE) // A >= MAX -> A == MAX - return BinaryOperator::createSetEQ(Op0, Op1); - if (I.getOpcode() == Instruction::SetLT) // A < MAX -> A != MAX - return BinaryOperator::createSetNE(Op0, Op1); - - // Comparing against a value really close to min or max? - } else if (isMinValuePlusOne(CI)) { - if (I.getOpcode() == Instruction::SetLT) // A < MIN+1 -> A == MIN - return BinaryOperator::createSetEQ(Op0, SubOne(CI)); - if (I.getOpcode() == Instruction::SetGE) // A >= MIN-1 -> A != MIN - return BinaryOperator::createSetNE(Op0, SubOne(CI)); - - } else if (isMaxValueMinusOne(CI)) { - if (I.getOpcode() == Instruction::SetGT) // A > MAX-1 -> A == MAX - return BinaryOperator::createSetEQ(Op0, AddOne(CI)); - if (I.getOpcode() == Instruction::SetLE) // A <= MAX-1 -> A != MAX - return BinaryOperator::createSetNE(Op0, AddOne(CI)); - } - - // If we still have a setle or setge instruction, turn it into the - // appropriate setlt or setgt instruction. Since the border cases have + if (CI->isMaxValue(true)) // A >=s MAX -> A == MAX + return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1); + if (isMinValuePlusOne(CI,true)) // A >=s MIN-1 -> A != MIN + return new ICmpInst(ICmpInst::ICMP_NE, Op0, SubOne(CI)); + break; + } + + // If we still have a icmp le or icmp ge instruction, turn it into the + // appropriate icmp lt or icmp gt instruction. Since the border cases have // already been handled above, this requires little checking. // - if (I.getOpcode() == Instruction::SetLE) - return BinaryOperator::createSetLT(Op0, AddOne(CI)); - if (I.getOpcode() == Instruction::SetGE) - return BinaryOperator::createSetGT(Op0, SubOne(CI)); - + if (I.getPredicate() == ICmpInst::ICMP_ULE) + return new ICmpInst(ICmpInst::ICMP_ULT, Op0, AddOne(CI)); + if (I.getPredicate() == ICmpInst::ICMP_SLE) + return new ICmpInst(ICmpInst::ICMP_SLT, Op0, AddOne(CI)); + if (I.getPredicate() == ICmpInst::ICMP_UGE) + return new ICmpInst( ICmpInst::ICMP_UGT, Op0, SubOne(CI)); + if (I.getPredicate() == ICmpInst::ICMP_SGE) + return new ICmpInst(ICmpInst::ICMP_SGT, Op0, SubOne(CI)); // See if we can fold the comparison based on bits known to be zero or one // in the input. @@ -4220,68 +4516,59 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // Given the known and unknown bits, compute a range that the LHS could be // in. if (KnownOne | KnownZero) { - if (Ty->isUnsigned()) { // Unsigned comparison. - uint64_t Min, Max; - uint64_t RHSVal = CI->getZExtValue(); - ComputeUnsignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, - Min, Max); - switch (I.getOpcode()) { // LE/GE have been folded already. - default: assert(0 && "Unknown setcc opcode!"); - case Instruction::SetEQ: - if (Max < RHSVal || Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - case Instruction::SetNE: - if (Max < RHSVal || Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - break; - case Instruction::SetLT: - if (Max < RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - case Instruction::SetGT: - if (Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (Max < RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - } - } else { // Signed comparison. - int64_t Min, Max; - int64_t RHSVal = CI->getSExtValue(); - ComputeSignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, - Min, Max); - switch (I.getOpcode()) { // LE/GE have been folded already. - default: assert(0 && "Unknown setcc opcode!"); - case Instruction::SetEQ: - if (Max < RHSVal || Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - case Instruction::SetNE: - if (Max < RHSVal || Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - break; - case Instruction::SetLT: - if (Max < RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - case Instruction::SetGT: - if (Min > RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getTrue()); - if (Max < RHSVal) - return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - break; - } + // Compute the Min, Max and RHS values based on the known bits. For the + // EQ and NE we use unsigned values. + uint64_t UMin, UMax, URHSVal; + int64_t SMin, SMax, SRHSVal; + if (ICmpInst::isSignedPredicate(I.getPredicate())) { + SRHSVal = CI->getSExtValue(); + ComputeSignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, SMin, + SMax); + } else { + URHSVal = CI->getZExtValue(); + ComputeUnsignedMinMaxValuesFromKnownBits(Ty, KnownZero, KnownOne, UMin, + UMax); + } + switch (I.getPredicate()) { // LE/GE have been folded already. + default: assert(0 && "Unknown icmp opcode!"); + case ICmpInst::ICMP_EQ: + if (UMax < URHSVal || UMin > URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + break; + case ICmpInst::ICMP_NE: + if (UMax < URHSVal || UMin > URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + break; + case ICmpInst::ICMP_ULT: + if (UMax < URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (UMin > URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + break; + case ICmpInst::ICMP_UGT: + if (UMin > URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (UMax < URHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + break; + case ICmpInst::ICMP_SLT: + if (SMax < SRHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (SMin > SRHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + break; + case ICmpInst::ICMP_SGT: + if (SMin > SRHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getTrue()); + if (SMax < SRHSVal) + return ReplaceInstUsesWith(I, ConstantBool::getFalse()); + break; } } - // Since the RHS is a constantInt (CI), if the left hand side is an + // Since the RHS is a ConstantInt (CI), if the left hand side is an // instruction, see if that instruction also has constants so that the - // instruction can be folded into the setcc + // instruction can be folded into the icmp if (Instruction *LHSI = dyn_cast(Op0)) switch (LHSI->getOpcode()) { case Instruction::And: @@ -4289,7 +4576,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { LHSI->getOperand(0)->hasOneUse()) { ConstantInt *AndCST = cast(LHSI->getOperand(1)); - // If an operand is an AND of a truncating cast, we can widen the + // If the LHS is an AND of a truncating cast, we can widen the // and/compare to be the input width without changing the value // produced, eliminating a cast. if (CastInst *Cast = dyn_cast(LHSI->getOperand(0))) { @@ -4318,7 +4605,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { BinaryOperator::createAnd(Cast->getOperand(0), NewCST, LHSI->getName()); InsertNewInstBefore(NewAnd, I); - return new SetCondInst(I.getOpcode(), NewAnd, NewCI); + return new ICmpInst(I.getPredicate(), NewAnd, NewCI); } } @@ -4372,9 +4659,9 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // If we shifted bits out, the fold is not going to work out. // As a special case, check to see if this means that the // result is always true or false now. - if (I.getOpcode() == Instruction::SetEQ) + if (I.getPredicate() == ICmpInst::ICMP_EQ) return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - if (I.getOpcode() == Instruction::SetNE) + if (I.getPredicate() == ICmpInst::ICMP_NE) return ReplaceInstUsesWith(I, ConstantBool::getTrue()); } else { I.setOperand(1, NewCst); @@ -4438,7 +4725,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { } break; - case Instruction::Shl: // (setcc (shl X, ShAmt), CI) + case Instruction::Shl: // (icmp pred (shl X, ShAmt), CI) if (ConstantInt *ShAmt = dyn_cast(LHSI->getOperand(1))) { if (I.isEquality()) { unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits(); @@ -4454,8 +4741,8 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { Constant *Comp = ConstantExpr::getShl(ConstantExpr::getLShr(CI, ShAmt), ShAmt); if (Comp != CI) {// Comparing against a bit that we know is zero. - bool IsSetNE = I.getOpcode() == Instruction::SetNE; - Constant *Cst = ConstantBool::get(IsSetNE); + bool IsICMP_NE = I.getPredicate() == ICmpInst::ICMP_NE; + Constant *Cst = ConstantBool::get(IsICMP_NE); return ReplaceInstUsesWith(I, Cst); } @@ -4477,14 +4764,14 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { BinaryOperator::createAnd(LHSI->getOperand(0), Mask, LHSI->getName()+".mask"); Value *And = InsertNewInstBefore(AndI, I); - return new SetCondInst(I.getOpcode(), And, + return new ICmpInst(I.getPredicate(), And, ConstantExpr::getLShr(CI, ShAmt)); } } } break; - case Instruction::LShr: // (setcc (shr X, ShAmt), CI) + case Instruction::LShr: // (icmp pred (shr X, ShAmt), CI) case Instruction::AShr: if (ConstantInt *ShAmt = dyn_cast(LHSI->getOperand(1))) { if (I.isEquality()) { @@ -4506,8 +4793,8 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { ShAmt); if (Comp != CI) {// Comparing against a bit that we know is zero. - bool IsSetNE = I.getOpcode() == Instruction::SetNE; - Constant *Cst = ConstantBool::get(IsSetNE); + bool IsICMP_NE = I.getPredicate() == ICmpInst::ICMP_NE; + Constant *Cst = ConstantBool::get(IsICMP_NE); return ReplaceInstUsesWith(I, Cst); } @@ -4530,7 +4817,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { BinaryOperator::createAnd(LHSI->getOperand(0), Mask, LHSI->getName()+".mask"); Value *And = InsertNewInstBefore(AndI, I); - return new SetCondInst(I.getOpcode(), And, + return new ICmpInst(I.getPredicate(), And, ConstantExpr::getShl(CI, ShAmt)); } } @@ -4539,7 +4826,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { case Instruction::SDiv: case Instruction::UDiv: - // Fold: setcc ([us]div X, C1), C2 -> range test + // Fold: icmp pred ([us]div X, C1), C2 -> range test // Fold this div into the comparison, producing a range check. // Determine, based on the divide type, what the range is being // checked. If there is an overflow on the low or high side, remember @@ -4554,11 +4841,8 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // (x /u C1) getType(); - unsigned DivOpCode = LHSI->getOpcode(); - if (I.isEquality() && - ((DivOpCode == Instruction::SDiv && DivRHSTy->isUnsigned()) || - (DivOpCode == Instruction::UDiv && DivRHSTy->isSigned()))) + bool DivIsSigned = LHSI->getOpcode() == Instruction::SDiv; + if (!I.isEquality() && DivIsSigned != I.isSignedPredicate()) break; // Initialize the variables that will indicate the nature of the @@ -4577,16 +4861,15 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // not equal to the divide. Make sure we do the same kind of divide // as in the LHS instruction that we're folding. bool ProdOV = !DivRHS->isNullValue() && - (DivOpCode == Instruction::SDiv ? - ConstantExpr::getSDiv(Prod, DivRHS) : + (DivIsSigned ? ConstantExpr::getSDiv(Prod, DivRHS) : ConstantExpr::getUDiv(Prod, DivRHS)) != CI; - // Get the SetCC opcode - Instruction::BinaryOps Opcode = I.getOpcode(); + // Get the ICmp opcode + ICmpInst::Predicate predicate = I.getPredicate(); if (DivRHS->isNullValue()) { // Don't hack on divide by zeros! - } else if (DivOpCode == Instruction::UDiv) { // udiv + } else if (!DivIsSigned) { // udiv LoBound = Prod; LoOverflow = ProdOV; HiOverflow = ProdOV || AddWithOverflow(HiBound, LoBound, DivRHS); @@ -4624,48 +4907,59 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { } // Dividing by a negate swaps the condition. - Opcode = SetCondInst::getSwappedCondition(Opcode); + predicate = ICmpInst::getSwappedPredicate(predicate); } if (LoBound) { Value *X = LHSI->getOperand(0); - switch (Opcode) { - default: assert(0 && "Unhandled setcc opcode!"); - case Instruction::SetEQ: + switch (predicate) { + default: assert(0 && "Unhandled icmp opcode!"); + case ICmpInst::ICMP_EQ: if (LoOverflow && HiOverflow) return ReplaceInstUsesWith(I, ConstantBool::getFalse()); else if (HiOverflow) - return new SetCondInst(Instruction::SetGE, X, LoBound); + return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : + ICmpInst::ICMP_UGE, X, LoBound); else if (LoOverflow) - return new SetCondInst(Instruction::SetLT, X, HiBound); + return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : + ICmpInst::ICMP_ULT, X, HiBound); else - return InsertRangeTest(X, LoBound, HiBound, true, I); - case Instruction::SetNE: + return InsertRangeTest(X, LoBound, HiBound, DivIsSigned, + true, I); + case ICmpInst::ICMP_NE: if (LoOverflow && HiOverflow) return ReplaceInstUsesWith(I, ConstantBool::getTrue()); else if (HiOverflow) - return new SetCondInst(Instruction::SetLT, X, LoBound); + return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : + ICmpInst::ICMP_ULT, X, LoBound); else if (LoOverflow) - return new SetCondInst(Instruction::SetGE, X, HiBound); + return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : + ICmpInst::ICMP_UGE, X, HiBound); else - return InsertRangeTest(X, LoBound, HiBound, false, I); - case Instruction::SetLT: + return InsertRangeTest(X, LoBound, HiBound, DivIsSigned, + false, I); + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: if (LoOverflow) return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - return new SetCondInst(Instruction::SetLT, X, LoBound); - case Instruction::SetGT: + return new ICmpInst(predicate, X, LoBound); + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: if (HiOverflow) return ReplaceInstUsesWith(I, ConstantBool::getFalse()); - return new SetCondInst(Instruction::SetGE, X, HiBound); + if (predicate == ICmpInst::ICMP_UGT) + return new ICmpInst(ICmpInst::ICMP_UGE, X, HiBound); + else + return new ICmpInst(ICmpInst::ICMP_SGE, X, HiBound); } } } break; } - // Simplify seteq and setne instructions with integer constant RHS. + // Simplify icmp_eq and icmp_ne instructions with integer constant RHS. if (I.isEquality()) { - bool isSetNE = I.getOpcode() == Instruction::SetNE; + bool isICMP_NE = I.getPredicate() == ICmpInst::ICMP_NE; // If the first operand is (add|sub|and|or|xor|rem) with a constant, and // the second operand is a constant, simplify a bit. @@ -4679,8 +4973,8 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { if (V > 1 && isPowerOf2_64(V)) { Value *NewRem = InsertNewInstBefore(BinaryOperator::createURem( BO->getOperand(0), BO->getOperand(1), BO->getName()), I); - return BinaryOperator::create(I.getOpcode(), NewRem, - Constant::getNullValue(BO->getType())); + return new ICmpInst(I.getPredicate(), NewRem, + Constant::getNullValue(BO->getType())); } } break; @@ -4688,22 +4982,22 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // Replace ((add A, B) != C) with (A != C-B) if B & C are constants. if (ConstantInt *BOp1C = dyn_cast(BO->getOperand(1))) { if (BO->hasOneUse()) - return new SetCondInst(I.getOpcode(), BO->getOperand(0), - ConstantExpr::getSub(CI, BOp1C)); + return new ICmpInst(I.getPredicate(), BO->getOperand(0), + ConstantExpr::getSub(CI, BOp1C)); } else if (CI->isNullValue()) { // Replace ((add A, B) != 0) with (A != -B) if A or B is // efficiently invertible, or if the add has just this one use. Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1); if (Value *NegVal = dyn_castNegVal(BOp1)) - return new SetCondInst(I.getOpcode(), BOp0, NegVal); + return new ICmpInst(I.getPredicate(), BOp0, NegVal); else if (Value *NegVal = dyn_castNegVal(BOp0)) - return new SetCondInst(I.getOpcode(), NegVal, BOp1); + return new ICmpInst(I.getPredicate(), NegVal, BOp1); else if (BO->hasOneUse()) { Instruction *Neg = BinaryOperator::createNeg(BOp1, BO->getName()); BO->setName(""); InsertNewInstBefore(Neg, I); - return new SetCondInst(I.getOpcode(), BOp0, Neg); + return new ICmpInst(I.getPredicate(), BOp0, Neg); } } break; @@ -4711,15 +5005,15 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // For the xor case, we can xor two constants together, eliminating // the explicit xor. if (Constant *BOC = dyn_cast(BO->getOperand(1))) - return BinaryOperator::create(I.getOpcode(), BO->getOperand(0), - ConstantExpr::getXor(CI, BOC)); + return new ICmpInst(I.getPredicate(), BO->getOperand(0), + ConstantExpr::getXor(CI, BOC)); // FALLTHROUGH case Instruction::Sub: // Replace (([sub|xor] A, B) != 0) with (A != B) if (CI->isNullValue()) - return new SetCondInst(I.getOpcode(), BO->getOperand(0), - BO->getOperand(1)); + return new ICmpInst(I.getPredicate(), BO->getOperand(0), + BO->getOperand(1)); break; case Instruction::Or: @@ -4728,7 +5022,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { if (Constant *BOC = dyn_cast(BO->getOperand(1))) { Constant *NotCI = ConstantExpr::getNot(CI); if (!ConstantExpr::getAnd(BOC, NotCI)->isNullValue()) - return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE)); + return ReplaceInstUsesWith(I, ConstantBool::get(isICMP_NE)); } break; @@ -4738,16 +5032,15 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // comparison can never succeed! if (!ConstantExpr::getAnd(CI, ConstantExpr::getNot(BOC))->isNullValue()) - return ReplaceInstUsesWith(I, ConstantBool::get(isSetNE)); + return ReplaceInstUsesWith(I, ConstantBool::get(isICMP_NE)); // If we have ((X & C) == C), turn it into ((X & C) != 0). if (CI == BOC && isOneBitSet(CI)) - return new SetCondInst(isSetNE ? Instruction::SetEQ : - Instruction::SetNE, Op0, - Constant::getNullValue(CI->getType())); + return new ICmpInst(isICMP_NE ? ICmpInst::ICMP_EQ : + ICmpInst::ICMP_NE, Op0, + Constant::getNullValue(CI->getType())); - // Replace (and X, (1 << size(X)-1) != 0) with x < 0, converting X - // to be a signed value as appropriate. + // Replace (and X, (1 << size(X)-1) != 0) with x s< 0 if (isSignBit(BOC)) { Value *X = BO->getOperand(0); // If 'X' is not signed, insert a cast now... @@ -4755,25 +5048,19 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { const Type *DestTy = BOC->getType()->getSignedVersion(); X = InsertCastBefore(Instruction::BitCast, X, DestTy, I); } - return new SetCondInst(isSetNE ? Instruction::SetLT : - Instruction::SetGE, X, - Constant::getNullValue(X->getType())); + Constant *Zero = Constant::getNullValue(X->getType()); + ICmpInst::Predicate pred = isICMP_NE ? + ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE; + return new ICmpInst(pred, X, Zero); } // ((X & ~7) == 0) --> X < 8 if (CI->isNullValue() && isHighOnes(BOC)) { Value *X = BO->getOperand(0); Constant *NegX = ConstantExpr::getNeg(BOC); - - // If 'X' is signed, insert a cast now. - if (NegX->getType()->isSigned()) { - const Type *DestTy = NegX->getType()->getUnsignedVersion(); - X = InsertCastBefore(Instruction::BitCast, X, DestTy, I); - NegX = ConstantExpr::getBitCast(NegX, DestTy); - } - - return new SetCondInst(isSetNE ? Instruction::SetGE : - Instruction::SetLT, X, NegX); + ICmpInst::Predicate pred = isICMP_NE ? + ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT; + return new ICmpInst(pred, X, NegX); } } @@ -4783,19 +5070,22 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { // Handle set{eq|ne} , intcst. switch (II->getIntrinsicID()) { default: break; - case Intrinsic::bswap_i16: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + case Intrinsic::bswap_i16: + // icmp eq (bswap(x)), c -> icmp eq (x,bswap(c)) WorkList.push_back(II); // Dead? I.setOperand(0, II->getOperand(1)); I.setOperand(1, ConstantInt::get(Type::UShortTy, ByteSwap_16(CI->getZExtValue()))); return &I; - case Intrinsic::bswap_i32: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + case Intrinsic::bswap_i32: + // icmp eq (bswap(x)), c -> icmp eq (x,bswap(c)) WorkList.push_back(II); // Dead? I.setOperand(0, II->getOperand(1)); I.setOperand(1, ConstantInt::get(Type::UIntTy, ByteSwap_32(CI->getZExtValue()))); return &I; - case Intrinsic::bswap_i64: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + case Intrinsic::bswap_i64: + // icmp eq (bswap(x)), c -> icmp eq (x,bswap(c)) WorkList.push_back(II); // Dead? I.setOperand(0, II->getOperand(1)); I.setOperand(1, ConstantInt::get(Type::ULongTy, @@ -4803,53 +5093,47 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { return &I; } } - } else { // Not a SetEQ/SetNE - // If the LHS is a cast from an integral value of the same size, + } else { // Not a ICMP_EQ/ICMP_NE + // If the LHS is a cast from an integral value of the same size, then + // since we know the RHS is a constant, try to simlify. if (CastInst *Cast = dyn_cast(Op0)) { Value *CastOp = Cast->getOperand(0); const Type *SrcTy = CastOp->getType(); unsigned SrcTySize = SrcTy->getPrimitiveSizeInBits(); - if (SrcTy != Cast->getType() && SrcTy->isInteger() && + if (SrcTy->isInteger() && SrcTySize == Cast->getType()->getPrimitiveSizeInBits()) { - assert((SrcTy->isSigned() ^ Cast->getType()->isSigned()) && - "Source and destination signednesses should differ!"); - if (Cast->getType()->isSigned()) { - // If this is a signed comparison, check for comparisons in the - // vicinity of zero. - if (I.getOpcode() == Instruction::SetLT && CI->isNullValue()) - // X < 0 => x > 127 - return BinaryOperator::createSetGT(CastOp, - ConstantInt::get(SrcTy, (1ULL << (SrcTySize-1))-1)); - else if (I.getOpcode() == Instruction::SetGT && - cast(CI)->getSExtValue() == -1) - // X > -1 => x < 128 - return BinaryOperator::createSetLT(CastOp, - ConstantInt::get(SrcTy, 1ULL << (SrcTySize-1))); - } else { - ConstantInt *CUI = cast(CI); - if (I.getOpcode() == Instruction::SetLT && - CUI->getZExtValue() == 1ULL << (SrcTySize-1)) - // X < 128 => X > -1 - return BinaryOperator::createSetGT(CastOp, - ConstantInt::get(SrcTy, -1)); - else if (I.getOpcode() == Instruction::SetGT && - CUI->getZExtValue() == (1ULL << (SrcTySize-1))-1) - // X > 127 => X < 0 - return BinaryOperator::createSetLT(CastOp, - Constant::getNullValue(SrcTy)); + // If this is an unsigned comparison, try to make the comparison use + // smaller constant values. + switch (I.getPredicate()) { + default: break; + case ICmpInst::ICMP_ULT: { // X u< 128 => X s> -1 + ConstantInt *CUI = cast(CI); + if (CUI->getZExtValue() == 1ULL << (SrcTySize-1)) + return new ICmpInst(ICmpInst::ICMP_SGT, CastOp, + ConstantInt::get(SrcTy, -1)); + break; + } + case ICmpInst::ICMP_UGT: { // X u> 127 => X s< 0 + ConstantInt *CUI = cast(CI); + if (CUI->getZExtValue() == (1ULL << (SrcTySize-1))-1) + return new ICmpInst(ICmpInst::ICMP_SLT, CastOp, + Constant::getNullValue(SrcTy)); + break; + } } + } } } } - // Handle setcc with constant RHS's that can be integer, FP or pointer. + // Handle icmp with constant RHS if (Constant *RHSC = dyn_cast(Op1)) { if (Instruction *LHSI = dyn_cast(Op0)) switch (LHSI->getOpcode()) { case Instruction::GetElementPtr: if (RHSC->isNullValue()) { - // Transform setcc GEP P, int 0, int 0, int 0, null -> setcc P, null + // icmp pred GEP (P, int 0, int 0, int 0), null -> icmp pred P, null bool isAllZeros = true; for (unsigned i = 1, e = LHSI->getNumOperands(); i != e; ++i) if (!isa(LHSI->getOperand(i)) || @@ -4858,7 +5142,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { break; } if (isAllZeros) - return new SetCondInst(I.getOpcode(), LHSI->getOperand(0), + return new ICmpInst(I.getPredicate(), LHSI->getOperand(0), Constant::getNullValue(LHSI->getOperand(0)->getType())); } break; @@ -4875,18 +5159,18 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { if (LHSI->hasOneUse()) { if (Constant *C = dyn_cast(LHSI->getOperand(1))) { // Fold the known value into the constant operand. - Op1 = ConstantExpr::get(I.getOpcode(), C, RHSC); - // Insert a new SetCC of the other select operand. - Op2 = InsertNewInstBefore(new SetCondInst(I.getOpcode(), - LHSI->getOperand(2), RHSC, - I.getName()), I); + Op1 = ConstantExpr::getICmp(I.getPredicate(), C, RHSC); + // Insert a new ICmp of the other select operand. + Op2 = InsertNewInstBefore(new ICmpInst(I.getPredicate(), + LHSI->getOperand(2), RHSC, + I.getName()), I); } else if (Constant *C = dyn_cast(LHSI->getOperand(2))) { // Fold the known value into the constant operand. - Op2 = ConstantExpr::get(I.getOpcode(), C, RHSC); - // Insert a new SetCC of the other select operand. - Op1 = InsertNewInstBefore(new SetCondInst(I.getOpcode(), - LHSI->getOperand(1), RHSC, - I.getName()), I); + Op2 = ConstantExpr::getICmp(I.getPredicate(), C, RHSC); + // Insert a new ICmp of the other select operand. + Op1 = InsertNewInstBefore(new ICmpInst(I.getPredicate(), + LHSI->getOperand(1), RHSC, + I.getName()), I); } } @@ -4896,16 +5180,16 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { } } - // If we can optimize a 'setcc GEP, P' or 'setcc P, GEP', do so now. + // If we can optimize a 'icmp GEP, P' or 'icmp P, GEP', do so now. if (User *GEP = dyn_castGetElementPtr(Op0)) - if (Instruction *NI = FoldGEPSetCC(GEP, Op1, I.getOpcode(), I)) + if (Instruction *NI = FoldGEPICmp(GEP, Op1, I.getPredicate(), I)) return NI; if (User *GEP = dyn_castGetElementPtr(Op1)) - if (Instruction *NI = FoldGEPSetCC(GEP, Op0, - SetCondInst::getSwappedCondition(I.getOpcode()), I)) + if (Instruction *NI = FoldGEPICmp(GEP, Op0, + ICmpInst::getSwappedPredicate(I.getPredicate()), I)) return NI; - // Test to see if the operands of the setcc are casted versions of other + // Test to see if the operands of the icmp are casted versions of other // values. If the cast can be stripped off both arguments, we do so now. if (CastInst *CI = dyn_cast(Op0)) { Value *CastOp0 = CI->getOperand(0); @@ -4928,20 +5212,20 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { if (Constant *Op1C = dyn_cast(Op1)) { Op1 = ConstantExpr::getBitCast(Op1C, Op0->getType()); } else { - // Otherwise, cast the RHS right before the setcc + // Otherwise, cast the RHS right before the icmp Op1 = InsertCastBefore(Instruction::BitCast, Op1, Op0->getType(), I); } - return BinaryOperator::create(I.getOpcode(), Op0, Op1); + return new ICmpInst(I.getPredicate(), Op0, Op1); } - // Handle the special case of: setcc (cast bool to X), + // Handle the special case of: icmp (cast bool to X), // This comes up when you have code like // int X = A < B; // if (X) ... // For generality, we handle any zero-extension of any operand comparison // with a constant or another cast from the same type. if (isa(Op1) || isa(Op1)) - if (Instruction *R = visitSetCondInstWithCastAndCast(I)) + if (Instruction *R = visitICmpInstWithCastAndCast(I)) return R; } @@ -4951,22 +5235,22 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { (A == Op1 || B == Op1)) { // (A^B) == A -> B == 0 Value *OtherVal = A == Op1 ? B : A; - return BinaryOperator::create(I.getOpcode(), OtherVal, - Constant::getNullValue(A->getType())); + return new ICmpInst(I.getPredicate(), OtherVal, + Constant::getNullValue(A->getType())); } else if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) { // A == (A^B) -> B == 0 Value *OtherVal = A == Op0 ? B : A; - return BinaryOperator::create(I.getOpcode(), OtherVal, - Constant::getNullValue(A->getType())); + return new ICmpInst(I.getPredicate(), OtherVal, + Constant::getNullValue(A->getType())); } else if (match(Op0, m_Sub(m_Value(A), m_Value(B))) && A == Op1) { // (A-B) == A -> B == 0 - return BinaryOperator::create(I.getOpcode(), B, - Constant::getNullValue(B->getType())); + return new ICmpInst(I.getPredicate(), B, + Constant::getNullValue(B->getType())); } else if (match(Op1, m_Sub(m_Value(A), m_Value(B))) && A == Op0) { // A == (A-B) -> B == 0 - return BinaryOperator::create(I.getOpcode(), B, - Constant::getNullValue(B->getType())); + return new ICmpInst(I.getPredicate(), B, + Constant::getNullValue(B->getType())); } Value *C, *D; @@ -4998,116 +5282,113 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { return Changed ? &I : 0; } -// visitSetCondInstWithCastAndCast - Handle setcond (cast x to y), (cast/cst). +// visitICmpInstWithCastAndCast - Handle icmp (cast x to y), (cast/cst). // We only handle extending casts so far. // -Instruction *InstCombiner::visitSetCondInstWithCastAndCast(SetCondInst &SCI) { - const CastInst *LHSCI = cast(SCI.getOperand(0)); +Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) { + const CastInst *LHSCI = cast(ICI.getOperand(0)); Value *LHSCIOp = LHSCI->getOperand(0); const Type *SrcTy = LHSCIOp->getType(); - const Type *DestTy = SCI.getOperand(0)->getType(); + const Type *DestTy = LHSCI->getType(); Value *RHSCIOp; - if (!DestTy->isIntegral() || !SrcTy->isIntegral()) + // We only handle extension cast instructions, so far. Enforce this. + if (LHSCI->getOpcode() != Instruction::ZExt && + LHSCI->getOpcode() != Instruction::SExt) return 0; - unsigned SrcBits = SrcTy->getPrimitiveSizeInBits(); - unsigned DestBits = DestTy->getPrimitiveSizeInBits(); - if (SrcBits >= DestBits) return 0; // Only handle extending cast. + bool isSignedExt = LHSCI->getOpcode() == Instruction::SExt; + bool isSignedCmp = ICI.isSignedPredicate(); - // Is this a sign or zero extension? - bool isSignSrc = SrcTy->isSigned(); - bool isSignDest = DestTy->isSigned(); - - if (CastInst *CI = dyn_cast(SCI.getOperand(1))) { + if (CastInst *CI = dyn_cast(ICI.getOperand(1))) { // Not an extension from the same type? RHSCIOp = CI->getOperand(0); - if (RHSCIOp->getType() != LHSCIOp->getType()) return 0; - } else if (ConstantInt *CI = dyn_cast(SCI.getOperand(1))) { - // Compute the constant that would happen if we truncated to SrcTy then - // reextended to DestTy. - Constant *Res1 = ConstantExpr::getTrunc(CI, SrcTy); - Constant *Res2 = ConstantExpr::getCast(LHSCI->getOpcode(), Res1, DestTy); - - if (Res2 == CI) { - // Make sure that src sign and dest sign match. For example, - // - // %A = cast short %X to uint - // %B = setgt uint %A, 1330 - // - // It is incorrect to transform this into - // - // %B = setgt short %X, 1330 - // - // because %A may have negative value. - // However, it is OK if SrcTy is bool (See cast-set.ll testcase) - // OR operation is EQ/NE. - if (isSignSrc == isSignDest || SrcTy == Type::BoolTy || SCI.isEquality()) - RHSCIOp = Res1; - else - return 0; - } else { - // If the value cannot be represented in the shorter type, we cannot emit - // a simple comparison. - if (SCI.getOpcode() == Instruction::SetEQ) - return ReplaceInstUsesWith(SCI, ConstantBool::getFalse()); - if (SCI.getOpcode() == Instruction::SetNE) - return ReplaceInstUsesWith(SCI, ConstantBool::getTrue()); - - // Evaluate the comparison for LT. - Value *Result; - if (DestTy->isSigned()) { - // We're performing a signed comparison. - if (isSignSrc) { - // Signed extend and signed comparison. - if (cast(CI)->getSExtValue() < 0)// X < (small) --> false - Result = ConstantBool::getFalse(); - else - Result = ConstantBool::getTrue(); // X < (large) --> true - } else { - // Unsigned extend and signed comparison. - if (cast(CI)->getSExtValue() < 0) - Result = ConstantBool::getFalse(); - else - Result = ConstantBool::getTrue(); - } - } else { - // We're performing an unsigned comparison. - if (!isSignSrc) { - // Unsigned extend & compare -> always true. - Result = ConstantBool::getTrue(); - } else { - // We're performing an unsigned comp with a sign extended value. - // This is true if the input is >= 0. [aka >s -1] - Constant *NegOne = ConstantIntegral::getAllOnesValue(SrcTy); - Result = InsertNewInstBefore(BinaryOperator::createSetGT(LHSCIOp, - NegOne, SCI.getName()), SCI); - } - } + if (RHSCIOp->getType() != LHSCIOp->getType()) + return 0; + else + // Okay, just insert a compare of the reduced operands now! + return new ICmpInst(ICI.getPredicate(), LHSCIOp, RHSCIOp); + } - // Finally, return the value computed. - if (SCI.getOpcode() == Instruction::SetLT) { - return ReplaceInstUsesWith(SCI, Result); - } else { - assert(SCI.getOpcode()==Instruction::SetGT &&"SetCC should be folded!"); - if (Constant *CI = dyn_cast(Result)) - return ReplaceInstUsesWith(SCI, ConstantExpr::getNot(CI)); - else - return BinaryOperator::createNot(Result); - } - } - } else { + // If we aren't dealing with a constant on the RHS, exit early + ConstantInt *CI = dyn_cast(ICI.getOperand(1)); + if (!CI) return 0; + + // Compute the constant that would happen if we truncated to SrcTy then + // reextended to DestTy. + Constant *Res1 = ConstantExpr::getTrunc(CI, SrcTy); + Constant *Res2 = ConstantExpr::getCast(LHSCI->getOpcode(), Res1, DestTy); + + // If the re-extended constant didn't change... + if (Res2 == CI) { + // Make sure that sign of the Cmp and the sign of the Cast are the same. + // For example, we might have: + // %A = sext short %X to uint + // %B = icmp ugt uint %A, 1330 + // It is incorrect to transform this into + // %B = icmp ugt short %X, 1330 + // because %A may have negative value. + // + // However, it is OK if SrcTy is bool (See cast-set.ll testcase) + // OR operation is EQ/NE. + if (isSignedExt == isSignedCmp || SrcTy == Type::BoolTy || ICI.isEquality()) + return new ICmpInst(ICI.getPredicate(), LHSCIOp, Res1); + else + return 0; } - // Okay, just insert a compare of the reduced operands now! - return BinaryOperator::create(SCI.getOpcode(), LHSCIOp, RHSCIOp); + // The re-extended constant changed so the constant cannot be represented + // in the shorter type. Consequently, we cannot emit a simple comparison. + + // First, handle some easy cases. We know the result cannot be equal at this + // point so handle the ICI.isEquality() cases + if (ICI.getPredicate() == ICmpInst::ICMP_EQ) + return ReplaceInstUsesWith(ICI, ConstantBool::getFalse()); + if (ICI.getPredicate() == ICmpInst::ICMP_NE) + return ReplaceInstUsesWith(ICI, ConstantBool::getTrue()); + + // Evaluate the comparison for LT (we invert for GT below). LE and GE cases + // should have been folded away previously and not enter in here. + Value *Result; + if (isSignedCmp) { + // We're performing a signed comparison. + if (cast(CI)->getSExtValue() < 0) + Result = ConstantBool::getFalse(); // X < (small) --> false + else + Result = ConstantBool::getTrue(); // X < (large) --> true + } else { + // We're performing an unsigned comparison. + if (isSignedExt) { + // We're performing an unsigned comp with a sign extended value. + // This is true if the input is >= 0. [aka >s -1] + Constant *NegOne = ConstantIntegral::getAllOnesValue(SrcTy); + Result = InsertNewInstBefore(new ICmpInst(ICmpInst::ICMP_SGT, LHSCIOp, + NegOne, ICI.getName()), ICI); + } else { + // Unsigned extend & unsigned compare -> always true. + Result = ConstantBool::getTrue(); + } + } + + // Finally, return the value computed. + if (ICI.getPredicate() == ICmpInst::ICMP_ULT || + ICI.getPredicate() == ICmpInst::ICMP_SLT) { + return ReplaceInstUsesWith(ICI, Result); + } else { + assert((ICI.getPredicate()==ICmpInst::ICMP_UGT || + ICI.getPredicate()==ICmpInst::ICMP_SGT) && + "ICmp should be folded!"); + if (Constant *CI = dyn_cast(Result)) + return ReplaceInstUsesWith(ICI, ConstantExpr::getNot(CI)); + else + return BinaryOperator::createNot(Result); + } } Instruction *InstCombiner::visitShiftInst(ShiftInst &I) { assert(I.getOperand(1)->getType() == Type::UByteTy); Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); - bool isLeftShift = I.getOpcode() == Instruction::Shl; // shl X, 0 == X and shr X, 0 == X // shl 0, X == 0 and shr 0, X == 0 @@ -5115,17 +5396,17 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) { Op0 == Constant::getNullValue(Op0->getType())) return ReplaceInstUsesWith(I, Op0); - if (isa(Op0)) { // undef >>s X -> undef - if (!isLeftShift && I.getType()->isSigned()) + if (isa(Op0)) { + if (I.getOpcode() == Instruction::AShr) // undef >>s X -> undef return ReplaceInstUsesWith(I, Op0); - else // undef << X -> 0 AND undef >>u X -> 0 + else // undef << X -> 0, undef >>u X -> 0 return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); } if (isa(Op1)) { - if (isLeftShift || I.getType()->isUnsigned())// X << undef, X >>u undef -> 0 + if (I.getOpcode() == Instruction::AShr) // X >>s undef -> X + return ReplaceInstUsesWith(I, Op0); + else // X << undef, X >>u undef -> 0 return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); - else - return ReplaceInstUsesWith(I, Op0); // X >>s undef -> X } // ashr int -1, X = -1 (for any arithmetic shift rights of ~0) @@ -5157,9 +5438,8 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) { Instruction *InstCombiner::FoldShiftByConstant(Value *Op0, ConstantInt *Op1, ShiftInst &I) { - bool isLeftShift = I.getOpcode() == Instruction::Shl; - bool isSignedShift = isLeftShift ? Op0->getType()->isSigned() : - I.getOpcode() == Instruction::AShr; + bool isLeftShift = I.getOpcode() == Instruction::Shl; + bool isSignedShift = I.getOpcode() == Instruction::AShr; bool isUnsignedShift = !isSignedShift; // See if we can simplify any instructions used by the instruction whose sole @@ -5348,10 +5628,8 @@ Instruction *InstCombiner::FoldShiftByConstant(Value *Op0, ConstantInt *Op1, // Find the operands and properties of the input shift. Note that the // signedness of the input shift may differ from the current shift if there // is a noop cast between the two. - bool isShiftOfLeftShift = ShiftOp->getOpcode() == Instruction::Shl; - bool isShiftOfSignedShift = isShiftOfLeftShift ? - ShiftOp->getType()->isSigned() : - ShiftOp->getOpcode() == Instruction::AShr; + bool isShiftOfLeftShift = ShiftOp->getOpcode() == Instruction::Shl; + bool isShiftOfSignedShift = ShiftOp->getOpcode() == Instruction::AShr; bool isShiftOfUnsignedShift = !isShiftOfSignedShift; ConstantInt *ShiftAmt1C = cast(ShiftOp->getOperand(1)); @@ -5781,11 +6059,11 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { // If the source isn't an instruction or has more than one use then we // can't do anything more. - if (!isa(Src) || !Src->hasOneUse()) + Instruction *SrcI = dyn_cast(Src); + if (!SrcI || !Src->hasOneUse()) return 0; // Attempt to propagate the cast into the instruction. - Instruction *SrcI = cast(Src); int NumCastsRemoved = 0; if (CanEvaluateInDifferentType(SrcI, DestTy, NumCastsRemoved)) { // If this cast is a truncate, evaluting in a different type always @@ -5867,8 +6145,8 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { // two casts to be inserted if the sizes are the same. This could // only be converting signedness, which is a noop. if (DestBitSize == SrcBitSize || - !ValueRequiresCast(Op1, DestTy,TD) || - !ValueRequiresCast(Op0, DestTy, TD)) { + !ValueRequiresCast(CI.getOpcode(), Op1, DestTy,TD) || + !ValueRequiresCast(CI.getOpcode(), Op0, DestTy, TD)) { Instruction::CastOps opcode = CI.getOpcode(); Value *Op0c = InsertOperandCastBefore(opcode, Op0, DestTy, SrcI); Value *Op1c = InsertOperandCastBefore(opcode, Op1, DestTy, SrcI); @@ -5881,7 +6159,7 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { if (isa(CI) && SrcBitSize == 1 && SrcI->getOpcode() == Instruction::Xor && Op1 == ConstantBool::getTrue() && - (!Op0->hasOneUse() || !isa(Op0))) { + (!Op0->hasOneUse() || !isa(Op0))) { Value *New = InsertOperandCastBefore(Instruction::ZExt, Op0, DestTy, &CI); return BinaryOperator::createXor(New, ConstantInt::get(CI.getType(), 1)); } @@ -5895,8 +6173,8 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { // Don't insert two casts if they cannot be eliminated. We allow // two casts to be inserted if the sizes are the same. This could // only be converting signedness, which is a noop. - if (!ValueRequiresCast(Op1, DestTy,TD) || - !ValueRequiresCast(Op0, DestTy, TD)) { + if (!ValueRequiresCast(CI.getOpcode(), Op1, DestTy, TD) || + !ValueRequiresCast(CI.getOpcode(), Op0, DestTy, TD)) { Value *Op0c = InsertOperandCastBefore(Instruction::BitCast, Op0, DestTy, SrcI); Value *Op1c = InsertOperandCastBefore(Instruction::BitCast, @@ -5935,10 +6213,9 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { } break; - case Instruction::SetEQ: - case Instruction::SetNE: - // If we are just checking for a seteq of a single bit and casting it - // to an integer. If so, shift the bit to the appropriate place then + case Instruction::ICmp: + // If we are just checking for a icmp eq of a single bit and casting it + // to an integer, then shift the bit to the appropriate place and then // cast to integer to avoid the comparison. if (ConstantInt *Op1C = dyn_cast(Op1)) { uint64_t Op1CV = Op1C->getZExtValue(); @@ -5955,13 +6232,18 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { uint64_t KnownZero, KnownOne; uint64_t TypeMask = Op1->getType()->getIntegralTypeMask(); ComputeMaskedBits(Op0, TypeMask, KnownZero, KnownOne); + + // This only works for EQ and NE + ICmpInst::Predicate pred = cast(SrcI)->getPredicate(); + if (pred != ICmpInst::ICMP_NE && pred != ICmpInst::ICMP_EQ) + break; if (isPowerOf2_64(KnownZero^TypeMask)) { // Exactly 1 possible 1? - bool isSetNE = SrcI->getOpcode() == Instruction::SetNE; + bool isNE = pred == ICmpInst::ICMP_NE; if (Op1CV && (Op1CV != (KnownZero^TypeMask))) { // (X&4) == 2 --> false // (X&4) != 2 --> true - Constant *Res = ConstantBool::get(isSetNE); + Constant *Res = ConstantBool::get(isNE); Res = ConstantExpr::getZExt(Res, CI.getType()); return ReplaceInstUsesWith(CI, Res); } @@ -5977,7 +6259,7 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) { In->getName()+".lobit"), CI); } - if ((Op1CV != 0) == isSetNE) { // Toggle the low bit. + if ((Op1CV != 0) == isNE) { // Toggle the low bit. Constant *One = ConstantInt::get(In->getType(), 1); In = BinaryOperator::createXor(In, One, "tmp"); InsertNewInstBefore(cast(In), CI); @@ -6039,7 +6321,7 @@ Instruction *InstCombiner::visitTrunc(CastInst &CI) { SrcI->getOperand(0), "tmp"), CI); Value *Zero = Constant::getNullValue(V->getType()); - return BinaryOperator::createSetNE(V, Zero); + return new ICmpInst(ICmpInst::ICMP_NE, V, Zero); } } break; @@ -6272,8 +6554,14 @@ Instruction *InstCombiner::FoldSelectOpOp(SelectInst &SI, Instruction *TI, TI->getType()); } - // Only handle binary operators here. - if (!isa(TI) && !isa(TI)) + // Only handle binary, compare and shift operators here. + if (!isa(TI) && !isa(TI) && !isa(TI)) + return 0; + + // If the CmpInst predicates don't match, then the instructions aren't the + // same and we can't continue. + if (isa(TI) && isa(FI) && + (cast(TI)->getPredicate() != cast(FI)->getPredicate())) return 0; // Figure out if the operations have any operands in common. @@ -6387,20 +6675,20 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { return CastInst::create(Instruction::ZExt, NotCond, SI.getType()); } - if (SetCondInst *IC = dyn_cast(SI.getCondition())) { + if (ICmpInst *IC = dyn_cast(SI.getCondition())) { - // (x sra x, 31 - // (x >u 2147483647) ? -1 : 0 -> sra x, 31 + // (x ashr x, 31 + // (x >u 2147483647) ? -1 : 0 -> ashr x, 31 if (TrueValC->isAllOnesValue() && FalseValC->isNullValue()) if (ConstantInt *CmpCst = dyn_cast(IC->getOperand(1))) { bool CanXForm = false; - if (CmpCst->getType()->isSigned()) + if (IC->isSignedPredicate()) CanXForm = CmpCst->isNullValue() && - IC->getOpcode() == Instruction::SetLT; + IC->getPredicate() == ICmpInst::ICMP_SLT; else { unsigned Bits = CmpCst->getType()->getPrimitiveSizeInBits(); CanXForm = (CmpCst->getZExtValue() == ~0ULL >> (64-Bits+1)) && - IC->getOpcode() == Instruction::SetGT; + IC->getPredicate() == ICmpInst::ICMP_UGT; } if (CanXForm) { @@ -6428,7 +6716,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { // If one of the constants is zero (we know they can't both be) and we - // have a setcc instruction with zero, and we have an 'and' with the + // have a fcmp instruction with zero, and we have an 'and' with the // non-constant value, eliminate this whole mess. This corresponds to // cases like this: ((X & 27) ? 27 : 0) if (TrueValC->isNullValue() || FalseValC->isNullValue()) @@ -6441,10 +6729,10 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { ICA->getOperand(1) == FalseValC) && isOneBitSet(cast(ICA->getOperand(1)))) { // Okay, now we know that everything is set up, we just don't - // know whether we have a setne or seteq and whether the true or - // false val is the zero. + // know whether we have a icmp_ne or icmp_eq and whether the + // true or false val is the zero. bool ShouldNotVal = !TrueValC->isNullValue(); - ShouldNotVal ^= IC->getOpcode() == Instruction::SetNE; + ShouldNotVal ^= IC->getPredicate() == ICmpInst::ICMP_NE; Value *V = ICA; if (ShouldNotVal) V = InsertNewInstBefore(BinaryOperator::create( @@ -6455,22 +6743,44 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { } // See if we are selecting two values based on a comparison of the two values. - if (SetCondInst *SCI = dyn_cast(CondVal)) { - if (SCI->getOperand(0) == TrueVal && SCI->getOperand(1) == FalseVal) { + if (FCmpInst *FCI = dyn_cast(CondVal)) { + if (FCI->getOperand(0) == TrueVal && FCI->getOperand(1) == FalseVal) { // Transform (X == Y) ? X : Y -> Y - if (SCI->getOpcode() == Instruction::SetEQ) + if (FCI->getPredicate() == FCmpInst::FCMP_OEQ) return ReplaceInstUsesWith(SI, FalseVal); // Transform (X != Y) ? X : Y -> X - if (SCI->getOpcode() == Instruction::SetNE) + if (FCI->getPredicate() == FCmpInst::FCMP_ONE) return ReplaceInstUsesWith(SI, TrueVal); // NOTE: if we wanted to, this is where to detect MIN/MAX/ABS/etc. - } else if (SCI->getOperand(0) == FalseVal && SCI->getOperand(1) == TrueVal){ + } else if (FCI->getOperand(0) == FalseVal && FCI->getOperand(1) == TrueVal){ // Transform (X == Y) ? Y : X -> X - if (SCI->getOpcode() == Instruction::SetEQ) + if (FCI->getPredicate() == FCmpInst::FCMP_OEQ) return ReplaceInstUsesWith(SI, FalseVal); // Transform (X != Y) ? Y : X -> Y - if (SCI->getOpcode() == Instruction::SetNE) + if (FCI->getPredicate() == FCmpInst::FCMP_ONE) + return ReplaceInstUsesWith(SI, TrueVal); + // NOTE: if we wanted to, this is where to detect MIN/MAX/ABS/etc. + } + } + + // See if we are selecting two values based on a comparison of the two values. + if (ICmpInst *ICI = dyn_cast(CondVal)) { + if (ICI->getOperand(0) == TrueVal && ICI->getOperand(1) == FalseVal) { + // Transform (X == Y) ? X : Y -> Y + if (ICI->getPredicate() == ICmpInst::ICMP_EQ) + return ReplaceInstUsesWith(SI, FalseVal); + // Transform (X != Y) ? X : Y -> X + if (ICI->getPredicate() == ICmpInst::ICMP_NE) + return ReplaceInstUsesWith(SI, TrueVal); + // NOTE: if we wanted to, this is where to detect MIN/MAX/ABS/etc. + + } else if (ICI->getOperand(0) == FalseVal && ICI->getOperand(1) == TrueVal){ + // Transform (X == Y) ? Y : X -> X + if (ICI->getPredicate() == ICmpInst::ICMP_EQ) + return ReplaceInstUsesWith(SI, FalseVal); + // Transform (X != Y) ? Y : X -> Y + if (ICI->getPredicate() == ICmpInst::ICMP_NE) return ReplaceInstUsesWith(SI, TrueVal); // NOTE: if we wanted to, this is where to detect MIN/MAX/ABS/etc. } @@ -7096,7 +7406,7 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) { Instruction *InstCombiner::FoldPHIArgBinOpIntoPHI(PHINode &PN) { Instruction *FirstInst = cast(PN.getIncomingValue(0)); assert(isa(FirstInst) || isa(FirstInst) || - isa(FirstInst)); + isa(FirstInst) || isa(FirstInst)); unsigned Opc = FirstInst->getOpcode(); Value *LHSVal = FirstInst->getOperand(0); Value *RHSVal = FirstInst->getOperand(1); @@ -7109,11 +7419,17 @@ Instruction *InstCombiner::FoldPHIArgBinOpIntoPHI(PHINode &PN) { for (unsigned i = 0; i != PN.getNumIncomingValues(); ++i) { Instruction *I = dyn_cast(PN.getIncomingValue(i)); if (!I || I->getOpcode() != Opc || !I->hasOneUse() || - // Verify type of the LHS matches so we don't fold setcc's of different + // Verify type of the LHS matches so we don't fold cmp's of different // types or GEP's with different index types. I->getOperand(0)->getType() != LHSType || I->getOperand(1)->getType() != RHSType) return 0; + + // If they are CmpInst instructions, check their predicates + if (Opc == Instruction::ICmp || Opc == Instruction::FCmp) + if (cast(I)->getPredicate() != + cast(FirstInst)->getPredicate()) + return 0; // Keep track of which operand needs a phi node. if (I->getOperand(0) != LHSVal) LHSVal = 0; @@ -7161,6 +7477,9 @@ Instruction *InstCombiner::FoldPHIArgBinOpIntoPHI(PHINode &PN) { if (BinaryOperator *BinOp = dyn_cast(FirstInst)) return BinaryOperator::create(BinOp->getOpcode(), LHSVal, RHSVal); + else if (CmpInst *CIOp = dyn_cast(FirstInst)) + return CmpInst::create(CIOp->getOpcode(), CIOp->getPredicate(), LHSVal, + RHSVal); else if (ShiftInst *SI = dyn_cast(FirstInst)) return new ShiftInst(SI->getOpcode(), LHSVal, RHSVal); else { @@ -7198,9 +7517,10 @@ Instruction *InstCombiner::FoldPHIArgOpIntoPHI(PHINode &PN) { bool isVolatile = false; if (isa(FirstInst)) { CastSrcTy = FirstInst->getOperand(0)->getType(); - } else if (isa(FirstInst) || isa(FirstInst)) { - // Can fold binop or shift here if the RHS is a constant, otherwise call - // FoldPHIArgBinOpIntoPHI. + } else if (isa(FirstInst) || isa(FirstInst) || + isa(FirstInst)) { + // Can fold binop, compare or shift here if the RHS is a constant, + // otherwise call FoldPHIArgBinOpIntoPHI. ConstantOp = dyn_cast(FirstInst->getOperand(1)); if (ConstantOp == 0) return FoldPHIArgBinOpIntoPHI(PN); @@ -7224,14 +7544,14 @@ Instruction *InstCombiner::FoldPHIArgOpIntoPHI(PHINode &PN) { for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) { if (!isa(PN.getIncomingValue(i))) return 0; Instruction *I = cast(PN.getIncomingValue(i)); - if (!I->hasOneUse() || I->getOpcode() != FirstInst->getOpcode()) + if (!I->hasOneUse() || !I->isSameOperationAs(FirstInst)) return 0; if (CastSrcTy) { if (I->getOperand(0)->getType() != CastSrcTy) return 0; // Cast operation must match. } else if (LoadInst *LI = dyn_cast(I)) { - // We can't sink the load if the loaded value could be modified between the - // load and the PHI. + // We can't sink the load if the loaded value could be modified between + // the load and the PHI. if (LI->isVolatile() != isVolatile || LI->getParent() != PN.getIncomingBlock(i) || !isSafeToSinkLoad(LI)) @@ -7276,6 +7596,9 @@ Instruction *InstCombiner::FoldPHIArgOpIntoPHI(PHINode &PN) { return new LoadInst(PhiVal, "", isVolatile); else if (BinaryOperator *BinOp = dyn_cast(FirstInst)) return BinaryOperator::create(BinOp->getOpcode(), PhiVal, ConstantOp); + else if (CmpInst *CIOp = dyn_cast(FirstInst)) + return CmpInst::create(CIOp->getOpcode(), CIOp->getPredicate(), + PhiVal, ConstantOp); else return new ShiftInst(cast(FirstInst)->getOpcode(), PhiVal, ConstantOp); @@ -7380,11 +7703,9 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { } } else if (SrcTy->getPrimitiveSize() < DestTy->getPrimitiveSize() && SrcTy->getPrimitiveSize() == 4) { - // We can always eliminate a cast from int to [u]long. We can - // eliminate a cast from uint to [u]long iff the target is a 32-bit - // pointer target. - if (SrcTy->isSigned() || - SrcTy->getPrimitiveSizeInBits() >= TD->getPointerSizeInBits()) { + // We can eliminate a cast from [u]int to [u]long iff the target + // is a 32-bit pointer target. + if (SrcTy->getPrimitiveSizeInBits() >= TD->getPointerSizeInBits()) { MadeChange = true; GEP.setOperand(i, Src); } @@ -7398,8 +7719,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { Value *Op = GEP.getOperand(i); if (Op->getType()->getPrimitiveSize() > TD->getPointerSize()) if (Constant *C = dyn_cast(Op)) { - GEP.setOperand(i, ConstantExpr::getTrunc(C, - TD->getIntPtrType()->getSignedVersion())); + GEP.setOperand(i, ConstantExpr::getTrunc(C, TD->getIntPtrType())); MadeChange = true; } else { Op = InsertCastBefore(Instruction::Trunc, Op, TD->getIntPtrType(), @@ -7407,7 +7727,6 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { GEP.setOperand(i, Op); MadeChange = true; } - // If this is a constant idx, make sure to canonicalize it to be a signed // operand, otherwise CSE and other optimizations are pessimized. if (ConstantInt *CUI = dyn_cast(Op)) @@ -7589,10 +7908,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) { isa(Inst->getOperand(1))) { unsigned ShAmt = cast(Inst->getOperand(1))->getZExtValue(); - if (Inst->getType()->isSigned()) - Scale = ConstantInt::get(Inst->getType(), 1ULL << ShAmt); - else - Scale = ConstantInt::get(Inst->getType(), 1ULL << ShAmt); + Scale = ConstantInt::get(Inst->getType(), 1ULL << ShAmt); NewIdx = Inst->getOperand(0); } else if (Inst->getOpcode() == Instruction::Mul && isa(Inst->getOperand(1))) { @@ -8104,16 +8420,37 @@ Instruction *InstCombiner::visitBranchInst(BranchInst &BI) { return &BI; } - // Cannonicalize setne -> seteq - Instruction::BinaryOps Op; Value *Y; - if (match(&BI, m_Br(m_SetCond(Op, m_Value(X), m_Value(Y)), + // Cannonicalize fcmp_one -> fcmp_oeq + FCmpInst::Predicate FPred; Value *Y; + if (match(&BI, m_Br(m_FCmp(FPred, m_Value(X), m_Value(Y)), + TrueDest, FalseDest))) + if ((FPred == FCmpInst::FCMP_ONE || FPred == FCmpInst::FCMP_OLE || + FPred == FCmpInst::FCMP_OGE) && BI.getCondition()->hasOneUse()) { + FCmpInst *I = cast(BI.getCondition()); + std::string Name = I->getName(); I->setName(""); + FCmpInst::Predicate NewPred = FCmpInst::getInversePredicate(FPred); + Value *NewSCC = new FCmpInst(NewPred, X, Y, Name, I); + // Swap Destinations and condition... + BI.setCondition(NewSCC); + BI.setSuccessor(0, FalseDest); + BI.setSuccessor(1, TrueDest); + removeFromWorkList(I); + I->getParent()->getInstList().erase(I); + WorkList.push_back(cast(NewSCC)); + return &BI; + } + + // Cannonicalize icmp_ne -> icmp_eq + ICmpInst::Predicate IPred; + if (match(&BI, m_Br(m_ICmp(IPred, m_Value(X), m_Value(Y)), TrueDest, FalseDest))) - if ((Op == Instruction::SetNE || Op == Instruction::SetLE || - Op == Instruction::SetGE) && BI.getCondition()->hasOneUse()) { - SetCondInst *I = cast(BI.getCondition()); + if ((IPred == ICmpInst::ICMP_NE || IPred == ICmpInst::ICMP_ULE || + IPred == ICmpInst::ICMP_SLE || IPred == ICmpInst::ICMP_UGE || + IPred == ICmpInst::ICMP_SGE) && BI.getCondition()->hasOneUse()) { + ICmpInst *I = cast(BI.getCondition()); std::string Name = I->getName(); I->setName(""); - Instruction::BinaryOps NewOpcode = SetCondInst::getInverseCondition(Op); - Value *NewSCC = BinaryOperator::create(NewOpcode, X, Y, Name, I); + ICmpInst::Predicate NewPred = ICmpInst::getInversePredicate(IPred); + Value *NewSCC = new ICmpInst(NewPred, X, Y, Name, I); // Swap Destinations and condition... BI.setCondition(NewSCC); BI.setSuccessor(0, FalseDest); @@ -8173,6 +8510,11 @@ static bool CheapToScalarize(Value *V, bool isConstant) { (CheapToScalarize(BO->getOperand(0), isConstant) || CheapToScalarize(BO->getOperand(1), isConstant))) return true; + if (CmpInst *CI = dyn_cast(I)) + if (CI->hasOneUse() && + (CheapToScalarize(CI->getOperand(0), isConstant) || + CheapToScalarize(CI->getOperand(1), isConstant))) + return true; return false; } diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 40f341cdb4d..437f7a62a18 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -385,7 +385,7 @@ bool LICM::canSinkOrHoistInst(Instruction &I) { // Otherwise these instructions are hoistable/sinkable return isa(I) || isa(I) || isa(I) || - isa(I) || isa(I); + isa(I) || isa(I) || isa(I); } /// isNotUsedInLoop - Return true if the only users of this instruction are diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index eb58b9e052c..1908693cc29 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1191,9 +1191,6 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride, void LoopStrengthReduce::OptimizeIndvars(Loop *L) { // TODO: implement optzns here. - - - // Finally, get the terminating condition for the loop if possible. If we // can, we want to change it to use a post-incremented version of its // induction variable, to allow coalescing the live ranges for the IV into @@ -1203,10 +1200,10 @@ void LoopStrengthReduce::OptimizeIndvars(Loop *L) { BasicBlock *LatchBlock = SomePHI->getIncomingBlock(SomePHI->getIncomingBlock(0) == Preheader); BranchInst *TermBr = dyn_cast(LatchBlock->getTerminator()); - if (!TermBr || TermBr->isUnconditional() || - !isa(TermBr->getCondition())) + if (!TermBr || TermBr->isUnconditional() || + !isa(TermBr->getCondition())) return; - SetCondInst *Cond = cast(TermBr->getCondition()); + ICmpInst *Cond = cast(TermBr->getCondition()); // Search IVUsesByStride to find Cond's IVUse if there is one. IVStrideUse *CondUse = 0; @@ -1239,7 +1236,7 @@ void LoopStrengthReduce::OptimizeIndvars(Loop *L) { Cond->moveBefore(TermBr); } else { // Otherwise, clone the terminating condition and insert into the loopend. - Cond = cast(Cond->clone()); + Cond = cast(Cond->clone()); Cond->setName(L->getHeader()->getName() + ".termcond"); LatchBlock->getInstList().insert(TermBr, Cond); @@ -1360,9 +1357,9 @@ void LoopStrengthReduce::runOnLoop(Loop *L) { // FIXME: this needs to eliminate an induction variable even if it's being // compared against some value to decide loop termination. if (PN->hasOneUse()) { - BinaryOperator *BO = dyn_cast(*(PN->use_begin())); - if (BO && BO->hasOneUse()) { - if (PN == *(BO->use_begin())) { + Instruction *BO = dyn_cast(*PN->use_begin()); + if (BO && (isa(BO) || isa(BO))) { + if (BO->hasOneUse() && PN == *(BO->use_begin())) { DeadInsts.insert(BO); // Break the cycle, then delete the PHI. PN->replaceAllUsesWith(UndefValue::get(PN->getType())); diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index e1d4a33e71e..d0b97e0d7f2 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -486,12 +486,11 @@ static void EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val, // Insert a conditional branch on LIC to the two preheaders. The original // code is the true version and the new code is the false version. Value *BranchVal = LIC; - if (!isa(Val)) { - BranchVal = BinaryOperator::createSetEQ(LIC, Val, "tmp", InsertPt); - } else if (Val != ConstantBool::getTrue()) { + if (!isa(Val)) + BranchVal = new ICmpInst(ICmpInst::ICMP_EQ, LIC, Val, "tmp", InsertPt); + else if (Val != ConstantBool::getTrue()) // We want to enter the new loop when the condition is true. std::swap(TrueDest, FalseDest); - } // Insert the new branch. new BranchInst(TrueDest, FalseDest, BranchVal, InsertPt); diff --git a/lib/Transforms/Scalar/LowerPacked.cpp b/lib/Transforms/Scalar/LowerPacked.cpp index 25de5fb24c0..7763921d184 100644 --- a/lib/Transforms/Scalar/LowerPacked.cpp +++ b/lib/Transforms/Scalar/LowerPacked.cpp @@ -54,6 +54,10 @@ public: /// @param BO the binary operator to convert void visitBinaryOperator(BinaryOperator& BO); + /// @brief Lowers packed icmp operations. + /// @param CI the icmp operator to convert + void visitICmpInst(ICmpInst& IC); + /// @brief Lowers packed select instructions. /// @param SELI the select operator to convert void visitSelectInst(SelectInst& SELI); @@ -269,6 +273,35 @@ void LowerPacked::visitBinaryOperator(BinaryOperator& BO) } } +void LowerPacked::visitICmpInst(ICmpInst& IC) +{ + // Make sure both operands are PackedTypes + if (isa(IC.getOperand(0)->getType())) { + std::vector& op0Vals = getValues(IC.getOperand(0)); + std::vector& op1Vals = getValues(IC.getOperand(1)); + std::vector result; + assert((op0Vals.size() == op1Vals.size()) && + "The two packed operand to scalar maps must be equal in size."); + + result.reserve(op0Vals.size()); + + // generate the new binary op and save the result + for (unsigned i = 0; i != op0Vals.size(); ++i) { + result.push_back(CmpInst::create(IC.getOpcode(), + IC.getPredicate(), + op0Vals[i], + op1Vals[i], + IC.getName() + + "." + utostr(i), + &IC)); + } + + setValues(&IC,result); + Changed = true; + instrsToRemove.push_back(&IC); + } +} + void LowerPacked::visitStoreInst(StoreInst& SI) { if (const PackedType* PKT = @@ -376,12 +409,12 @@ void LowerPacked::visitInsertElementInst(InsertElementInst& IE) } } else { for (unsigned i = 0; i != Vals.size(); ++i) { - SetCondInst *setcc = - new SetCondInst(Instruction::SetEQ, Idx, - ConstantInt::get(Type::UIntTy, i), - "setcc", &IE); + ICmpInst *icmp = + new ICmpInst(ICmpInst::ICMP_EQ, Idx, + ConstantInt::get(Type::UIntTy, i), + "icmp", &IE); SelectInst *select = - new SelectInst(setcc, Elt, Vals[i], "select", &IE); + new SelectInst(icmp, Elt, Vals[i], "select", &IE); result.push_back(select); } } diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 8a677c4461c..6578bccff12 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -559,7 +559,8 @@ namespace { void addToWorklist(Instruction *I) { //DOUT << "addToWorklist: " << *I << "\n"; - if (!isa(I) && !isa(I)) return; + if (!isa(I) && !isa(I) && !isa(I)) + return; const Type *Ty = I->getType(); if (Ty == Type::VoidTy || Ty->isFPOrFPVector()) return; @@ -855,102 +856,6 @@ namespace { addEqual(BO, ConstantExpr::get(BO->getOpcode(), CI1, CI2)); switch (BO->getOpcode()) { - case Instruction::SetEQ: - // "seteq int %a, %b" EQ true then %a EQ %b - // "seteq int %a, %b" EQ false then %a NE %b - if (Canonical == ConstantBool::getTrue()) - addEqual(Op0, Op1); - else if (Canonical == ConstantBool::getFalse()) - addNotEqual(Op0, Op1); - - // %a EQ %b then "seteq int %a, %b" EQ true - // %a NE %b then "seteq int %a, %b" EQ false - if (isEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - else if (isNotEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - - break; - case Instruction::SetNE: - // "setne int %a, %b" EQ true then %a NE %b - // "setne int %a, %b" EQ false then %a EQ %b - if (Canonical == ConstantBool::getTrue()) - addNotEqual(Op0, Op1); - else if (Canonical == ConstantBool::getFalse()) - addEqual(Op0, Op1); - - // %a EQ %b then "setne int %a, %b" EQ false - // %a NE %b then "setne int %a, %b" EQ true - if (isEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - else if (isNotEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - - break; - case Instruction::SetLT: - // "setlt int %a, %b" EQ true then %a LT %b - // "setlt int %a, %b" EQ false then %b LE %a - if (Canonical == ConstantBool::getTrue()) - addLess(Op0, Op1); - else if (Canonical == ConstantBool::getFalse()) - addLessEqual(Op1, Op0); - - // %a LT %b then "setlt int %a, %b" EQ true - // %a GE %b then "setlt int %a, %b" EQ false - if (isLess(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - else if (isGreaterEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - - break; - case Instruction::SetLE: - // "setle int %a, %b" EQ true then %a LE %b - // "setle int %a, %b" EQ false then %b LT %a - if (Canonical == ConstantBool::getTrue()) - addLessEqual(Op0, Op1); - else if (Canonical == ConstantBool::getFalse()) - addLess(Op1, Op0); - - // %a LE %b then "setle int %a, %b" EQ true - // %a GT %b then "setle int %a, %b" EQ false - if (isLessEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - else if (isGreater(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - - break; - case Instruction::SetGT: - // "setgt int %a, %b" EQ true then %b LT %a - // "setgt int %a, %b" EQ false then %a LE %b - if (Canonical == ConstantBool::getTrue()) - addLess(Op1, Op0); - else if (Canonical == ConstantBool::getFalse()) - addLessEqual(Op0, Op1); - - // %a GT %b then "setgt int %a, %b" EQ true - // %a LE %b then "setgt int %a, %b" EQ false - if (isGreater(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - else if (isLessEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - - break; - case Instruction::SetGE: - // "setge int %a, %b" EQ true then %b LE %a - // "setge int %a, %b" EQ false then %a LT %b - if (Canonical == ConstantBool::getTrue()) - addLessEqual(Op1, Op0); - else if (Canonical == ConstantBool::getFalse()) - addLess(Op0, Op1); - - // %a GE %b then "setge int %a, %b" EQ true - // %a LT %b then "setlt int %a, %b" EQ false - if (isGreaterEqual(Op0, Op1)) - addEqual(BO, ConstantBool::getTrue()); - else if (isLess(Op0, Op1)) - addEqual(BO, ConstantBool::getFalse()); - - break; case Instruction::And: { // "and int %a, %b" EQ -1 then %a EQ -1 and %b EQ -1 // "and bool %a, %b" EQ true then %a EQ true and %b EQ true @@ -1030,6 +935,250 @@ namespace { break; } } + } else if (FCmpInst *CI = dyn_cast(I)) { + Value *Op0 = cIG.canonicalize(CI->getOperand(0)), + *Op1 = cIG.canonicalize(CI->getOperand(1)); + + ConstantFP *CI1 = dyn_cast(Op0), + *CI2 = dyn_cast(Op1); + + if (CI1 && CI2) + addEqual(CI, ConstantExpr::getFCmp(CI->getPredicate(), CI1, CI2)); + + switch (CI->getPredicate()) { + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_UEQ: + // "eq int %a, %b" EQ true then %a EQ %b + // "eq int %a, %b" EQ false then %a NE %b + if (Canonical == ConstantBool::getTrue()) + addEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addNotEqual(Op0, Op1); + + // %a EQ %b then "eq int %a, %b" EQ true + // %a NE %b then "eq int %a, %b" EQ false + if (isEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isNotEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: + // "ne int %a, %b" EQ true then %a NE %b + // "ne int %a, %b" EQ false then %a EQ %b + if (Canonical == ConstantBool::getTrue()) + addNotEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addEqual(Op0, Op1); + + // %a EQ %b then "ne int %a, %b" EQ false + // %a NE %b then "ne int %a, %b" EQ true + if (isEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + else if (isNotEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + + break; + case FCmpInst::FCMP_ULT: + case FCmpInst::FCMP_OLT: + // "lt int %a, %b" EQ true then %a LT %b + // "lt int %a, %b" EQ false then %b LE %a + if (Canonical == ConstantBool::getTrue()) + addLess(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addLessEqual(Op1, Op0); + + // %a LT %b then "lt int %a, %b" EQ true + // %a GE %b then "lt int %a, %b" EQ false + if (isLess(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isGreaterEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_OLE: + // "le int %a, %b" EQ true then %a LE %b + // "le int %a, %b" EQ false then %b LT %a + if (Canonical == ConstantBool::getTrue()) + addLessEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addLess(Op1, Op0); + + // %a LE %b then "le int %a, %b" EQ true + // %a GT %b then "le int %a, %b" EQ false + if (isLessEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isGreater(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_OGT: + // "gt int %a, %b" EQ true then %b LT %a + // "gt int %a, %b" EQ false then %a LE %b + if (Canonical == ConstantBool::getTrue()) + addLess(Op1, Op0); + else if (Canonical == ConstantBool::getFalse()) + addLessEqual(Op0, Op1); + + // %a GT %b then "gt int %a, %b" EQ true + // %a LE %b then "gt int %a, %b" EQ false + if (isGreater(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isLessEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_OGE: + // "ge int %a, %b" EQ true then %b LE %a + // "ge int %a, %b" EQ false then %a LT %b + if (Canonical == ConstantBool::getTrue()) + addLessEqual(Op1, Op0); + else if (Canonical == ConstantBool::getFalse()) + addLess(Op0, Op1); + + // %a GE %b then "ge int %a, %b" EQ true + // %a LT %b then "lt int %a, %b" EQ false + if (isGreaterEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isLess(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + default: + break; + } + + // "%x = add int %y, %z" and %x EQ %y then %z EQ 0 + // "%x = mul int %y, %z" and %x EQ %y then %z EQ 1 + // 1. Repeat all of the above, with order of operands reversed. + // "%x = fdiv float %y, %z" and %x EQ %y then %z EQ 1 + Value *Known = Op0, *Unknown = Op1; + if (Known != BO) std::swap(Known, Unknown); + } else if (ICmpInst *CI = dyn_cast(I)) { + Value *Op0 = cIG.canonicalize(CI->getOperand(0)), + *Op1 = cIG.canonicalize(CI->getOperand(1)); + + ConstantIntegral *CI1 = dyn_cast(Op0), + *CI2 = dyn_cast(Op1); + + if (CI1 && CI2) + addEqual(CI, ConstantExpr::getICmp(CI->getPredicate(), CI1, CI2)); + + switch (CI->getPredicate()) { + case ICmpInst::ICMP_EQ: + // "eq int %a, %b" EQ true then %a EQ %b + // "eq int %a, %b" EQ false then %a NE %b + if (Canonical == ConstantBool::getTrue()) + addEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addNotEqual(Op0, Op1); + + // %a EQ %b then "eq int %a, %b" EQ true + // %a NE %b then "eq int %a, %b" EQ false + if (isEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isNotEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case ICmpInst::ICMP_NE: + // "ne int %a, %b" EQ true then %a NE %b + // "ne int %a, %b" EQ false then %a EQ %b + if (Canonical == ConstantBool::getTrue()) + addNotEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addEqual(Op0, Op1); + + // %a EQ %b then "ne int %a, %b" EQ false + // %a NE %b then "ne int %a, %b" EQ true + if (isEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + else if (isNotEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + + break; + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + // "lt int %a, %b" EQ true then %a LT %b + // "lt int %a, %b" EQ false then %b LE %a + if (Canonical == ConstantBool::getTrue()) + addLess(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addLessEqual(Op1, Op0); + + // %a LT %b then "lt int %a, %b" EQ true + // %a GE %b then "lt int %a, %b" EQ false + if (isLess(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isGreaterEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: + // "le int %a, %b" EQ true then %a LE %b + // "le int %a, %b" EQ false then %b LT %a + if (Canonical == ConstantBool::getTrue()) + addLessEqual(Op0, Op1); + else if (Canonical == ConstantBool::getFalse()) + addLess(Op1, Op0); + + // %a LE %b then "le int %a, %b" EQ true + // %a GT %b then "le int %a, %b" EQ false + if (isLessEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isGreater(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + // "gt int %a, %b" EQ true then %b LT %a + // "gt int %a, %b" EQ false then %a LE %b + if (Canonical == ConstantBool::getTrue()) + addLess(Op1, Op0); + else if (Canonical == ConstantBool::getFalse()) + addLessEqual(Op0, Op1); + + // %a GT %b then "gt int %a, %b" EQ true + // %a LE %b then "gt int %a, %b" EQ false + if (isGreater(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isLessEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + // "ge int %a, %b" EQ true then %b LE %a + // "ge int %a, %b" EQ false then %a LT %b + if (Canonical == ConstantBool::getTrue()) + addLessEqual(Op1, Op0); + else if (Canonical == ConstantBool::getFalse()) + addLess(Op0, Op1); + + // %a GE %b then "ge int %a, %b" EQ true + // %a LT %b then "lt int %a, %b" EQ false + if (isGreaterEqual(Op0, Op1)) + addEqual(CI, ConstantBool::getTrue()); + else if (isLess(Op0, Op1)) + addEqual(CI, ConstantBool::getFalse()); + + break; + default: + break; + } + + // "%x = add int %y, %z" and %x EQ %y then %z EQ 0 + // "%x = mul int %y, %z" and %x EQ %y then %z EQ 1 + // 1. Repeat all of the above, with order of operands reversed. + // "%x = fdiv float %y, %z" and %x EQ %y then %z EQ 1 + Value *Known = Op0, *Unknown = Op1; + if (Known != BO) std::swap(Known, Unknown); } else if (SelectInst *SI = dyn_cast(I)) { // Given: "%a = select bool %x, int %b, int %c" // %a EQ %b then %x EQ true @@ -1108,6 +1257,7 @@ namespace { void visitStoreInst(StoreInst &SI); void visitBinaryOperator(BinaryOperator &BO); + void visitCmpInst(CmpInst &CI) {} }; // Used by terminator instructions to proceed from the current basic diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index 69805f86bae..dab2d2e3069 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -95,10 +95,11 @@ namespace { FunctionPass *llvm::createReassociatePass() { return new Reassociate(); } void Reassociate::RemoveDeadBinaryOp(Value *V) { - BinaryOperator *BOp = dyn_cast(V); - if (!BOp || !BOp->use_empty()) return; + Instruction *Op = dyn_cast(V); + if (!Op || !isa(Op) || !isa(Op) || !Op->use_empty()) + return; - Value *LHS = BOp->getOperand(0), *RHS = BOp->getOperand(1); + Value *LHS = Op->getOperand(0), *RHS = Op->getOperand(1); RemoveDeadBinaryOp(LHS); RemoveDeadBinaryOp(RHS); } @@ -755,7 +756,7 @@ void Reassociate::ReassociateBB(BasicBlock *BB) { } // Reject cases where it is pointless to do this. - if (!isa(BI) || BI->getType()->isFloatingPoint() || + if (!isa(BI) || BI->getType()->isFloatingPoint() || isa(BI->getType())) continue; // Floating point ops are not associative. diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 7da16157772..9b7d27169f1 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -373,6 +373,7 @@ private: void visitCastInst(CastInst &I); void visitSelectInst(SelectInst &I); void visitBinaryOperator(Instruction &I); + void visitCmpInst(CmpInst &I); void visitShiftInst(ShiftInst &I) { visitBinaryOperator(I); } void visitExtractElementInst(ExtractElementInst &I); void visitInsertElementInst(InsertElementInst &I); @@ -796,6 +797,93 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) { } } +// Handle ICmpInst instruction... +void SCCPSolver::visitCmpInst(CmpInst &I) { + LatticeVal &IV = ValueState[&I]; + if (IV.isOverdefined()) return; + + LatticeVal &V1State = getValueState(I.getOperand(0)); + LatticeVal &V2State = getValueState(I.getOperand(1)); + + if (V1State.isOverdefined() || V2State.isOverdefined()) { + // If both operands are PHI nodes, it is possible that this instruction has + // a constant value, despite the fact that the PHI node doesn't. Check for + // this condition now. + if (PHINode *PN1 = dyn_cast(I.getOperand(0))) + if (PHINode *PN2 = dyn_cast(I.getOperand(1))) + if (PN1->getParent() == PN2->getParent()) { + // Since the two PHI nodes are in the same basic block, they must have + // entries for the same predecessors. Walk the predecessor list, and + // if all of the incoming values are constants, and the result of + // evaluating this expression with all incoming value pairs is the + // same, then this expression is a constant even though the PHI node + // is not a constant! + LatticeVal Result; + for (unsigned i = 0, e = PN1->getNumIncomingValues(); i != e; ++i) { + LatticeVal &In1 = getValueState(PN1->getIncomingValue(i)); + BasicBlock *InBlock = PN1->getIncomingBlock(i); + LatticeVal &In2 = + getValueState(PN2->getIncomingValueForBlock(InBlock)); + + if (In1.isOverdefined() || In2.isOverdefined()) { + Result.markOverdefined(); + break; // Cannot fold this operation over the PHI nodes! + } else if (In1.isConstant() && In2.isConstant()) { + Constant *V = ConstantExpr::getCompare(I.getPredicate(), + In1.getConstant(), + In2.getConstant()); + if (Result.isUndefined()) + Result.markConstant(V); + else if (Result.isConstant() && Result.getConstant() != V) { + Result.markOverdefined(); + break; + } + } + } + + // If we found a constant value here, then we know the instruction is + // constant despite the fact that the PHI nodes are overdefined. + if (Result.isConstant()) { + markConstant(IV, &I, Result.getConstant()); + // Remember that this instruction is virtually using the PHI node + // operands. + UsersOfOverdefinedPHIs.insert(std::make_pair(PN1, &I)); + UsersOfOverdefinedPHIs.insert(std::make_pair(PN2, &I)); + return; + } else if (Result.isUndefined()) { + return; + } + + // Okay, this really is overdefined now. Since we might have + // speculatively thought that this was not overdefined before, and + // added ourselves to the UsersOfOverdefinedPHIs list for the PHIs, + // make sure to clean out any entries that we put there, for + // efficiency. + std::multimap::iterator It, E; + tie(It, E) = UsersOfOverdefinedPHIs.equal_range(PN1); + while (It != E) { + if (It->second == &I) { + UsersOfOverdefinedPHIs.erase(It++); + } else + ++It; + } + tie(It, E) = UsersOfOverdefinedPHIs.equal_range(PN2); + while (It != E) { + if (It->second == &I) { + UsersOfOverdefinedPHIs.erase(It++); + } else + ++It; + } + } + + markOverdefined(IV, &I); + } else if (V1State.isConstant() && V2State.isConstant()) { + markConstant(IV, &I, ConstantExpr::getCompare(I.getPredicate(), + V1State.getConstant(), + V2State.getConstant())); + } +} + void SCCPSolver::visitExtractElementInst(ExtractElementInst &I) { // FIXME : SCCP does not handle vectors properly. markOverdefined(&I); diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index a92592b8166..695d4c31693 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -394,9 +394,9 @@ void SROA::CanonicalizeAllocaUsers(AllocationInst *AI) { assert(NumElements == 2 && "Unhandled case!"); // All users of the GEP must be loads. At each use of the GEP, insert // two loads of the appropriate indexed GEP and select between them. - Value *IsOne = BinaryOperator::createSetNE(I.getOperand(), + Value *IsOne = new ICmpInst(ICmpInst::ICMP_NE, I.getOperand(), Constant::getNullValue(I.getOperand()->getType()), - "isone", GEPI); + "isone", GEPI); // Insert the new GEP instructions, which are properly indexed. std::vector Indices(GEPI->op_begin()+1, GEPI->op_end()); Indices[1] = Constant::getNullValue(Type::IntTy); diff --git a/lib/Transforms/Utils/CloneFunction.cpp b/lib/Transforms/Utils/CloneFunction.cpp index 3aa7397ef94..896c39943c2 100644 --- a/lib/Transforms/Utils/CloneFunction.cpp +++ b/lib/Transforms/Utils/CloneFunction.cpp @@ -278,7 +278,15 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB) { /// mapping its operands through ValueMap if they are available. Constant *PruningFunctionCloner:: ConstantFoldMappedInstruction(const Instruction *I) { - if (isa(I) || isa(I)) { + if (isa(I)) { + if (Constant *Op0 = dyn_cast_or_null(MapValue(I->getOperand(0), + ValueMap))) + if (Constant *Op1 = dyn_cast_or_null(MapValue(I->getOperand(1), + ValueMap))) + return ConstantExpr::getCompare(cast(I)->getPredicate(), Op0, + Op1); + return 0; + } else if (isa(I) || isa(I)) { if (Constant *Op0 = dyn_cast_or_null(MapValue(I->getOperand(0), ValueMap))) if (Constant *Op1 = dyn_cast_or_null(MapValue(I->getOperand(1), @@ -295,7 +303,7 @@ ConstantFoldMappedInstruction(const Instruction *I) { else return 0; // All operands not constant! - return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops); + return ConstantFoldInstOperands(I, Ops); } /// CloneAndPruneFunctionInto - This works exactly like CloneFunctionInto, diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index 366a95c49cd..236ec4b8bea 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -71,6 +71,7 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I) { case 2: Op1 = dyn_cast(I->getOperand(1)); if (Op1 == 0) return 0; // Not a constant?, can't fold + /* FALL THROUGH */ case 1: Op0 = dyn_cast(I->getOperand(0)); if (Op0 == 0) return 0; // Not a constant?, can't fold @@ -79,13 +80,14 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I) { } if (isa(I) || isa(I)) { - if (Constant *Op0 = dyn_cast(I->getOperand(0))) - if (Constant *Op1 = dyn_cast(I->getOperand(1))) - return ConstantExpr::get(I->getOpcode(), Op0, Op1); - return 0; // Operands not constants. + return ConstantExpr::get(I->getOpcode(), Op0, Op1); + } else if (isa(I)) { + return ConstantExpr::getICmp(cast(I)->getPredicate(), Op0, Op1); + } else if (isa(I)) { + return ConstantExpr::getFCmp(cast(I)->getPredicate(), Op0, Op1); } - // Scan the operand list, checking to see if the are all constants, if so, + // Scan the operand list, checking to see if they are all constants, if so, // hand off to ConstantFoldInstOperands. std::vector Ops; for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) @@ -94,7 +96,7 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I) { else return 0; // All operands not constant! - return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops); + return ConstantFoldInstOperands(I, Ops); } /// ConstantFoldInstOperands - Attempt to constant fold an instruction with the @@ -103,9 +105,13 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I) { /// attempting to fold instructions like loads and stores, which have no /// constant expression form. /// -Constant *llvm::ConstantFoldInstOperands(unsigned Opc, const Type *DestTy, +Constant *llvm::ConstantFoldInstOperands(const Instruction* I, const std::vector &Ops) { - if (Opc >= Instruction::BinaryOpsBegin && Opc < Instruction::BinaryOpsEnd) + unsigned Opc = I->getOpcode(); + const Type *DestTy = I->getType(); + + // Handle easy binops first + if (isa(I)) return ConstantExpr::get(Opc, Ops[0], Ops[1]); switch (Opc) { @@ -118,6 +124,10 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opc, const Type *DestTy, } } return 0; + case Instruction::ICmp: + case Instruction::FCmp: + return ConstantExpr::getCompare(cast(I)->getPredicate(), Ops[0], + Ops[1]); case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: @@ -257,8 +267,8 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) { } else if (SI->getNumSuccessors() == 2) { // Otherwise, we can fold this switch into a conditional branch // instruction if it has only one non-default destination. - Value *Cond = new SetCondInst(Instruction::SetEQ, SI->getCondition(), - SI->getSuccessorValue(1), "cond", SI); + Value *Cond = new ICmpInst(ICmpInst::ICMP_EQ, SI->getCondition(), + SI->getSuccessorValue(1), "cond", SI); // Insert the new branch... new BranchInst(SI->getSuccessor(1), SI->getSuccessor(0), Cond, SI); diff --git a/lib/Transforms/Utils/LowerInvoke.cpp b/lib/Transforms/Utils/LowerInvoke.cpp index e4117d5874c..361388c7bf3 100644 --- a/lib/Transforms/Utils/LowerInvoke.cpp +++ b/lib/Transforms/Utils/LowerInvoke.cpp @@ -517,9 +517,9 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { EntryBB->getTerminator()); // Compare the return value to zero. - Value *IsNormal = BinaryOperator::createSetEQ(SJRet, - Constant::getNullValue(SJRet->getType()), - "notunwind", EntryBB->getTerminator()); + Value *IsNormal = new ICmpInst(ICmpInst::ICMP_EQ, SJRet, + Constant::getNullValue(SJRet->getType()), + "notunwind", EntryBB->getTerminator()); // Nuke the uncond branch. EntryBB->getTerminator()->eraseFromParent(); @@ -551,9 +551,9 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { } // Load the JBList, if it's null, then there was no catch! - Value *NotNull = BinaryOperator::createSetNE(BufPtr, - Constant::getNullValue(BufPtr->getType()), - "notnull", UnwindHandler); + Value *NotNull = new ICmpInst(ICmpInst::ICMP_NE, BufPtr, + Constant::getNullValue(BufPtr->getType()), + "notnull", UnwindHandler); new BranchInst(UnwindBlock, TermBlock, NotNull, UnwindHandler); // Create the block to do the longjmp. diff --git a/lib/Transforms/Utils/LowerSwitch.cpp b/lib/Transforms/Utils/LowerSwitch.cpp index 69df51c7921..b2974a98c80 100644 --- a/lib/Transforms/Utils/LowerSwitch.cpp +++ b/lib/Transforms/Utils/LowerSwitch.cpp @@ -143,8 +143,7 @@ BasicBlock* LowerSwitch::switchConvert(CaseItr Begin, CaseItr End, BasicBlock* NewNode = new BasicBlock("NodeBlock"); F->getBasicBlockList().insert(OrigBlock->getNext(), NewNode); - SetCondInst* Comp = new SetCondInst(Instruction::SetLT, Val, Pivot.first, - "Pivot"); + ICmpInst* Comp = new ICmpInst(ICmpInst::ICMP_ULT, Val, Pivot.first, "Pivot"); NewNode->getInstList().push_back(Comp); new BranchInst(LBranch, RBranch, Comp, NewNode); return NewNode; @@ -165,8 +164,8 @@ BasicBlock* LowerSwitch::newLeafBlock(Case& Leaf, Value* Val, F->getBasicBlockList().insert(OrigBlock->getNext(), NewLeaf); // Make the seteq instruction... - SetCondInst* Comp = new SetCondInst(Instruction::SetEQ, Val, - Leaf.first, "SwitchLeaf"); + ICmpInst* Comp = new ICmpInst(ICmpInst::ICMP_EQ, Val, + Leaf.first, "SwitchLeaf"); NewLeaf->getInstList().push_back(Comp); // Make the conditional branch... diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 8d4cb83e173..b44ab09362f 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -369,12 +369,8 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: - case Instruction::SetEQ: - case Instruction::SetNE: - case Instruction::SetLT: - case Instruction::SetGT: - case Instruction::SetLE: - case Instruction::SetGE: + case Instruction::ICmp: + case Instruction::FCmp: break; // These are all cheap and non-trapping instructions. } @@ -390,12 +386,13 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, return true; } -// GatherConstantSetEQs - Given a potentially 'or'd together collection of seteq -// instructions that compare a value against a constant, return the value being -// compared, and stick the constant into the Values vector. +// GatherConstantSetEQs - Given a potentially 'or'd together collection of +// icmp_eq instructions that compare a value against a constant, return the +// value being compared, and stick the constant into the Values vector. static Value *GatherConstantSetEQs(Value *V, std::vector &Values){ if (Instruction *Inst = dyn_cast(V)) - if (Inst->getOpcode() == Instruction::SetEQ) { + if (Inst->getOpcode() == Instruction::ICmp && + cast(Inst)->getPredicate() == ICmpInst::ICMP_EQ) { if (ConstantInt *C = dyn_cast(Inst->getOperand(1))) { Values.push_back(C); return Inst->getOperand(0); @@ -417,7 +414,8 @@ static Value *GatherConstantSetEQs(Value *V, std::vector &Values){ // being compared, and stick the constant into the Values vector. static Value *GatherConstantSetNEs(Value *V, std::vector &Values){ if (Instruction *Inst = dyn_cast(V)) - if (Inst->getOpcode() == Instruction::SetNE) { + if (Inst->getOpcode() == Instruction::ICmp && + cast(Inst)->getPredicate() == ICmpInst::ICMP_NE) { if (ConstantInt *C = dyn_cast(Inst->getOperand(1))) { Values.push_back(C); return Inst->getOperand(0); @@ -503,11 +501,11 @@ static Value *isValueEqualityComparison(TerminatorInst *TI) { } if (BranchInst *BI = dyn_cast(TI)) if (BI->isConditional() && BI->getCondition()->hasOneUse()) - if (SetCondInst *SCI = dyn_cast(BI->getCondition())) - if ((SCI->getOpcode() == Instruction::SetEQ || - SCI->getOpcode() == Instruction::SetNE) && - isa(SCI->getOperand(1))) - return SCI->getOperand(0); + if (ICmpInst *ICI = dyn_cast(BI->getCondition())) + if ((ICI->getPredicate() == ICmpInst::ICMP_EQ || + ICI->getPredicate() == ICmpInst::ICMP_NE) && + isa(ICI->getOperand(1))) + return ICI->getOperand(0); return 0; } @@ -525,11 +523,11 @@ GetValueEqualityComparisonCases(TerminatorInst *TI, } BranchInst *BI = cast(TI); - SetCondInst *SCI = cast(BI->getCondition()); - Cases.push_back(std::make_pair(cast(SCI->getOperand(1)), - BI->getSuccessor(SCI->getOpcode() == - Instruction::SetNE))); - return BI->getSuccessor(SCI->getOpcode() == Instruction::SetEQ); + ICmpInst *ICI = cast(BI->getCondition()); + Cases.push_back(std::make_pair(cast(ICI->getOperand(1)), + BI->getSuccessor(ICI->getPredicate() == + ICmpInst::ICMP_NE))); + return BI->getSuccessor(ICI->getPredicate() == ICmpInst::ICMP_EQ); } @@ -847,8 +845,8 @@ static bool HoistThenElseCodeToIf(BranchInst *BI) { BasicBlock *BB2 = BI->getSuccessor(1); // The false destination Instruction *I1 = BB1->begin(), *I2 = BB2->begin(); - if (I1->getOpcode() != I2->getOpcode() || !I1->isIdenticalTo(I2) || - isa(I1) || isa(I1)) + if (I1->getOpcode() != I2->getOpcode() || isa(I1) || + isa(I1) || !I1->isIdenticalTo(I2)) return false; // If we get here, we can hoist at least one instruction. @@ -1443,8 +1441,9 @@ bool llvm::SimplifyCFG(BasicBlock *BB) { // predecessor and use logical operations to pick the right destination. BasicBlock *TrueDest = BI->getSuccessor(0); BasicBlock *FalseDest = BI->getSuccessor(1); - if (BinaryOperator *Cond = dyn_cast(BI->getCondition())) - if (Cond->getParent() == BB && &BB->front() == Cond && + if (Instruction *Cond = dyn_cast(BI->getCondition())) + if ((isa(Cond) || isa(Cond)) && + Cond->getParent() == BB && &BB->front() == Cond && Cond->getNext() == BI && Cond->hasOneUse() && TrueDest != BB && FalseDest != BB) for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI!=E; ++PI) diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 8af5b895220..a7438fcde81 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -30,517 +30,6 @@ #include using namespace llvm; -namespace { - struct VISIBILITY_HIDDEN ConstRules { - ConstRules() {} - virtual ~ConstRules() {} - - // Binary Operators... - virtual Constant *add(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *sub(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *mul(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *urem(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *srem(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *frem(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *udiv(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *sdiv(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *fdiv(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_and(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_or (const Constant *V1, const Constant *V2) const = 0; - virtual Constant *op_xor(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *shl(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *lshr(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *ashr(const Constant *V1, const Constant *V2) const = 0; - virtual Constant *lessthan(const Constant *V1, const Constant *V2) const =0; - virtual Constant *equalto(const Constant *V1, const Constant *V2) const = 0; - - // ConstRules::get - Return an instance of ConstRules for the specified - // constant operands. - // - static ConstRules &get(const Constant *V1, const Constant *V2); - private: - ConstRules(const ConstRules &); // Do not implement - ConstRules &operator=(const ConstRules &); // Do not implement - }; -} - - -//===----------------------------------------------------------------------===// -// TemplateRules Class -//===----------------------------------------------------------------------===// -// -// TemplateRules - Implement a subclass of ConstRules that provides all -// operations as noops. All other rules classes inherit from this class so -// that if functionality is needed in the future, it can simply be added here -// and to ConstRules without changing anything else... -// -// This class also provides subclasses with typesafe implementations of methods -// so that don't have to do type casting. -// -namespace { -template -class VISIBILITY_HIDDEN TemplateRules : public ConstRules { - - - //===--------------------------------------------------------------------===// - // Redirecting functions that cast to the appropriate types - //===--------------------------------------------------------------------===// - - virtual Constant *add(const Constant *V1, const Constant *V2) const { - return SubClassName::Add((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *sub(const Constant *V1, const Constant *V2) const { - return SubClassName::Sub((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *mul(const Constant *V1, const Constant *V2) const { - return SubClassName::Mul((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *udiv(const Constant *V1, const Constant *V2) const { - return SubClassName::UDiv((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *sdiv(const Constant *V1, const Constant *V2) const { - return SubClassName::SDiv((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *fdiv(const Constant *V1, const Constant *V2) const { - return SubClassName::FDiv((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *urem(const Constant *V1, const Constant *V2) const { - return SubClassName::URem((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *srem(const Constant *V1, const Constant *V2) const { - return SubClassName::SRem((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *frem(const Constant *V1, const Constant *V2) const { - return SubClassName::FRem((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *op_and(const Constant *V1, const Constant *V2) const { - return SubClassName::And((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *op_or(const Constant *V1, const Constant *V2) const { - return SubClassName::Or((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *op_xor(const Constant *V1, const Constant *V2) const { - return SubClassName::Xor((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *shl(const Constant *V1, const Constant *V2) const { - return SubClassName::Shl((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *lshr(const Constant *V1, const Constant *V2) const { - return SubClassName::LShr((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *ashr(const Constant *V1, const Constant *V2) const { - return SubClassName::AShr((const ArgType *)V1, (const ArgType *)V2); - } - - virtual Constant *lessthan(const Constant *V1, const Constant *V2) const { - return SubClassName::LessThan((const ArgType *)V1, (const ArgType *)V2); - } - virtual Constant *equalto(const Constant *V1, const Constant *V2) const { - return SubClassName::EqualTo((const ArgType *)V1, (const ArgType *)V2); - } - - - //===--------------------------------------------------------------------===// - // Default "noop" implementations - //===--------------------------------------------------------------------===// - - static Constant *Add (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *Sub (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *Mul (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *SDiv(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *UDiv(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *FDiv(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *URem(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *SRem(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *FRem(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *And (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *Or (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *Xor (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *Shl (const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *LShr(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *AShr(const ArgType *V1, const ArgType *V2) { return 0; } - static Constant *LessThan(const ArgType *V1, const ArgType *V2) { - return 0; - } - static Constant *EqualTo(const ArgType *V1, const ArgType *V2) { - return 0; - } - -public: - virtual ~TemplateRules() {} -}; -} // end anonymous namespace - - -//===----------------------------------------------------------------------===// -// EmptyRules Class -//===----------------------------------------------------------------------===// -// -// EmptyRules provides a concrete base class of ConstRules that does nothing -// -namespace { -struct VISIBILITY_HIDDEN EmptyRules - : public TemplateRules { - static Constant *EqualTo(const Constant *V1, const Constant *V2) { - if (V1 == V2) return ConstantBool::getTrue(); - return 0; - } -}; -} // end anonymous namespace - - - -//===----------------------------------------------------------------------===// -// BoolRules Class -//===----------------------------------------------------------------------===// -// -// BoolRules provides a concrete base class of ConstRules for the 'bool' type. -// -namespace { -struct VISIBILITY_HIDDEN BoolRules - : public TemplateRules { - - static Constant *LessThan(const ConstantBool *V1, const ConstantBool *V2) { - return ConstantBool::get(V1->getValue() < V2->getValue()); - } - - static Constant *EqualTo(const Constant *V1, const Constant *V2) { - return ConstantBool::get(V1 == V2); - } - - static Constant *And(const ConstantBool *V1, const ConstantBool *V2) { - return ConstantBool::get(V1->getValue() & V2->getValue()); - } - - static Constant *Or(const ConstantBool *V1, const ConstantBool *V2) { - return ConstantBool::get(V1->getValue() | V2->getValue()); - } - - static Constant *Xor(const ConstantBool *V1, const ConstantBool *V2) { - return ConstantBool::get(V1->getValue() ^ V2->getValue()); - } -}; -} // end anonymous namespace - - -//===----------------------------------------------------------------------===// -// NullPointerRules Class -//===----------------------------------------------------------------------===// -// -// NullPointerRules provides a concrete base class of ConstRules for null -// pointers. -// -namespace { -struct VISIBILITY_HIDDEN NullPointerRules - : public TemplateRules { - static Constant *EqualTo(const Constant *V1, const Constant *V2) { - return ConstantBool::getTrue(); // Null pointers are always equal - } -}; -} // end anonymous namespace - -//===----------------------------------------------------------------------===// -// ConstantPackedRules Class -//===----------------------------------------------------------------------===// - -/// DoVectorOp - Given two packed constants and a function pointer, apply the -/// function pointer to each element pair, producing a new ConstantPacked -/// constant. -static Constant *EvalVectorOp(const ConstantPacked *V1, - const ConstantPacked *V2, - Constant *(*FP)(Constant*, Constant*)) { - std::vector Res; - for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) - Res.push_back(FP(const_cast(V1->getOperand(i)), - const_cast(V2->getOperand(i)))); - return ConstantPacked::get(Res); -} - -/// PackedTypeRules provides a concrete base class of ConstRules for -/// ConstantPacked operands. -/// -namespace { -struct VISIBILITY_HIDDEN ConstantPackedRules - : public TemplateRules { - - static Constant *Add(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getAdd); - } - static Constant *Sub(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getSub); - } - static Constant *Mul(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getMul); - } - static Constant *UDiv(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getUDiv); - } - static Constant *SDiv(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getSDiv); - } - static Constant *FDiv(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getFDiv); - } - static Constant *URem(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getURem); - } - static Constant *SRem(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getSRem); - } - static Constant *FRem(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getFRem); - } - static Constant *And(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getAnd); - } - static Constant *Or (const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getOr); - } - static Constant *Xor(const ConstantPacked *V1, const ConstantPacked *V2) { - return EvalVectorOp(V1, V2, ConstantExpr::getXor); - } - static Constant *LessThan(const ConstantPacked *V1, const ConstantPacked *V2){ - return 0; - } - static Constant *EqualTo(const ConstantPacked *V1, const ConstantPacked *V2) { - for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) { - Constant *C = - ConstantExpr::getSetEQ(const_cast(V1->getOperand(i)), - const_cast(V2->getOperand(i))); - if (ConstantBool *CB = dyn_cast(C)) - return CB; - } - // Otherwise, could not decide from any element pairs. - return 0; - } -}; -} // end anonymous namespace - - -//===----------------------------------------------------------------------===// -// GeneralPackedRules Class -//===----------------------------------------------------------------------===// - -/// GeneralPackedRules provides a concrete base class of ConstRules for -/// PackedType operands, where both operands are not ConstantPacked. The usual -/// cause for this is that one operand is a ConstantAggregateZero. -/// -namespace { -struct VISIBILITY_HIDDEN GeneralPackedRules - : public TemplateRules { -}; -} // end anonymous namespace - - -//===----------------------------------------------------------------------===// -// DirectIntRules Class -//===----------------------------------------------------------------------===// -// -// DirectIntRules provides implementations of functions that are valid on -// integer types, but not all types in general. -// -namespace { -template -struct VISIBILITY_HIDDEN DirectIntRules - : public TemplateRules > { - - static Constant *Add(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = (BuiltinType)V1->getZExtValue() + - (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - - static Constant *Sub(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = (BuiltinType)V1->getZExtValue() - - (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - - static Constant *Mul(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = (BuiltinType)V1->getZExtValue() * - (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - - static Constant *LessThan(const ConstantInt *V1, const ConstantInt *V2) { - bool R = (BuiltinType)V1->getZExtValue() < (BuiltinType)V2->getZExtValue(); - return ConstantBool::get(R); - } - - static Constant *EqualTo(const ConstantInt *V1, const ConstantInt *V2) { - bool R = (BuiltinType)V1->getZExtValue() == (BuiltinType)V2->getZExtValue(); - return ConstantBool::get(R); - } - - static Constant *UDiv(const ConstantInt *V1, const ConstantInt *V2) { - if (V2->isNullValue()) // X / 0 - return 0; - BuiltinType R = (BuiltinType)(V1->getZExtValue() / V2->getZExtValue()); - return ConstantInt::get(*Ty, R); - } - - static Constant *SDiv(const ConstantInt *V1, const ConstantInt *V2) { - if (V2->isNullValue()) // X / 0 - return 0; - if (V2->isAllOnesValue() && // MIN_INT / -1 - (BuiltinType)V1->getSExtValue() == -(BuiltinType)V1->getSExtValue()) - return 0; - BuiltinType R = (BuiltinType)(V1->getSExtValue() / V2->getSExtValue()); - return ConstantInt::get(*Ty, R); - } - - static Constant *URem(const ConstantInt *V1, - const ConstantInt *V2) { - if (V2->isNullValue()) return 0; // X / 0 - BuiltinType R = (BuiltinType)(V1->getZExtValue() % V2->getZExtValue()); - return ConstantInt::get(*Ty, R); - } - - static Constant *SRem(const ConstantInt *V1, - const ConstantInt *V2) { - if (V2->isNullValue()) return 0; // X % 0 - if (V2->isAllOnesValue() && // MIN_INT % -1 - (BuiltinType)V1->getSExtValue() == -(BuiltinType)V1->getSExtValue()) - return 0; - BuiltinType R = (BuiltinType)(V1->getSExtValue() % V2->getSExtValue()); - return ConstantInt::get(*Ty, R); - } - - static Constant *And(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = - (BuiltinType)V1->getZExtValue() & (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - static Constant *Or(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = - (BuiltinType)V1->getZExtValue() | (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - static Constant *Xor(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = - (BuiltinType)V1->getZExtValue() ^ (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - - static Constant *Shl(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = - (BuiltinType)V1->getZExtValue() << (BuiltinType)V2->getZExtValue(); - return ConstantInt::get(*Ty, R); - } - - static Constant *LShr(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = BuiltinType(V1->getZExtValue() >> V2->getZExtValue()); - return ConstantInt::get(*Ty, R); - } - - static Constant *AShr(const ConstantInt *V1, const ConstantInt *V2) { - BuiltinType R = BuiltinType(V1->getSExtValue() >> V2->getZExtValue()); - return ConstantInt::get(*Ty, R); - } -}; -} // end anonymous namespace - - -//===----------------------------------------------------------------------===// -// DirectFPRules Class -//===----------------------------------------------------------------------===// -// -/// DirectFPRules provides implementations of functions that are valid on -/// floating point types, but not all types in general. -/// -namespace { -template -struct VISIBILITY_HIDDEN DirectFPRules - : public TemplateRules > { - - static Constant *Add(const ConstantFP *V1, const ConstantFP *V2) { - BuiltinType R = (BuiltinType)V1->getValue() + - (BuiltinType)V2->getValue(); - return ConstantFP::get(*Ty, R); - } - - static Constant *Sub(const ConstantFP *V1, const ConstantFP *V2) { - BuiltinType R = (BuiltinType)V1->getValue() - (BuiltinType)V2->getValue(); - return ConstantFP::get(*Ty, R); - } - - static Constant *Mul(const ConstantFP *V1, const ConstantFP *V2) { - BuiltinType R = (BuiltinType)V1->getValue() * (BuiltinType)V2->getValue(); - return ConstantFP::get(*Ty, R); - } - - static Constant *LessThan(const ConstantFP *V1, const ConstantFP *V2) { - bool R = (BuiltinType)V1->getValue() < (BuiltinType)V2->getValue(); - return ConstantBool::get(R); - } - - static Constant *EqualTo(const ConstantFP *V1, const ConstantFP *V2) { - bool R = (BuiltinType)V1->getValue() == (BuiltinType)V2->getValue(); - return ConstantBool::get(R); - } - - static Constant *FRem(const ConstantFP *V1, const ConstantFP *V2) { - if (V2->isNullValue()) return 0; - BuiltinType Result = std::fmod((BuiltinType)V1->getValue(), - (BuiltinType)V2->getValue()); - return ConstantFP::get(*Ty, Result); - } - static Constant *FDiv(const ConstantFP *V1, const ConstantFP *V2) { - BuiltinType inf = std::numeric_limits::infinity(); - if (V2->isExactlyValue(0.0)) return ConstantFP::get(*Ty, inf); - if (V2->isExactlyValue(-0.0)) return ConstantFP::get(*Ty, -inf); - BuiltinType R = (BuiltinType)V1->getValue() / (BuiltinType)V2->getValue(); - return ConstantFP::get(*Ty, R); - } -}; -} // end anonymous namespace - -static ManagedStatic EmptyR; -static ManagedStatic BoolR; -static ManagedStatic NullPointerR; -static ManagedStatic ConstantPackedR; -static ManagedStatic GeneralPackedR; -static ManagedStatic > SByteR; -static ManagedStatic > UByteR; -static ManagedStatic > ShortR; -static ManagedStatic > UShortR; -static ManagedStatic > IntR; -static ManagedStatic > UIntR; -static ManagedStatic > LongR; -static ManagedStatic > ULongR; -static ManagedStatic > FloatR; -static ManagedStatic > DoubleR; - -/// ConstRules::get - This method returns the constant rules implementation that -/// implements the semantics of the two specified constants. -ConstRules &ConstRules::get(const Constant *V1, const Constant *V2) { - if (isa(V1) || isa(V2) || - isa(V1) || isa(V2) || - isa(V1) || isa(V2)) - return *EmptyR; - - switch (V1->getType()->getTypeID()) { - default: assert(0 && "Unknown value type for constant folding!"); - case Type::BoolTyID: return *BoolR; - case Type::PointerTyID: return *NullPointerR; - case Type::SByteTyID: return *SByteR; - case Type::UByteTyID: return *UByteR; - case Type::ShortTyID: return *ShortR; - case Type::UShortTyID: return *UShortR; - case Type::IntTyID: return *IntR; - case Type::UIntTyID: return *UIntR; - case Type::LongTyID: return *LongR; - case Type::ULongTyID: return *ULongR; - case Type::FloatTyID: return *FloatR; - case Type::DoubleTyID: return *DoubleR; - case Type::PackedTyID: - if (isa(V1) && isa(V2)) - return *ConstantPackedR; - return *GeneralPackedR; // Constant folding rules for ConstantAggregateZero. - } -} - - //===----------------------------------------------------------------------===// // ConstantFold*Instruction Implementations //===----------------------------------------------------------------------===// @@ -919,6 +408,275 @@ Constant *llvm::ConstantFoldShuffleVectorInstruction(const Constant *V1, return 0; } +/// EvalVectorOp - Given two packed constants and a function pointer, apply the +/// function pointer to each element pair, producing a new ConstantPacked +/// constant. +static Constant *EvalVectorOp(const ConstantPacked *V1, + const ConstantPacked *V2, + Constant *(*FP)(Constant*, Constant*)) { + std::vector Res; + for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i) + Res.push_back(FP(const_cast(V1->getOperand(i)), + const_cast(V2->getOperand(i)))); + return ConstantPacked::get(Res); +} + +Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, + const Constant *C1, + const Constant *C2) { + // Handle UndefValue up front + if (isa(C1) || isa(C2)) { + switch (Opcode) { + case Instruction::Add: + case Instruction::Sub: + case Instruction::Xor: + return UndefValue::get(C1->getType()); + case Instruction::Mul: + case Instruction::And: + return Constant::getNullValue(C1->getType()); + case Instruction::UDiv: + case Instruction::SDiv: + case Instruction::FDiv: + case Instruction::URem: + case Instruction::SRem: + case Instruction::FRem: + if (!isa(C2)) // undef / X -> 0 + return Constant::getNullValue(C1->getType()); + return const_cast(C2); // X / undef -> undef + case Instruction::Or: // X | undef -> -1 + return ConstantInt::getAllOnesValue(C1->getType()); + case Instruction::LShr: + if (isa(C2) && isa(C1)) + return const_cast(C1); // undef lshr undef -> undef + return Constant::getNullValue(C1->getType()); // X lshr undef -> 0 + // undef lshr X -> 0 + case Instruction::AShr: + if (!isa(C2)) + return const_cast(C1); // undef ashr X --> undef + else if (isa(C1)) + return const_cast(C1); // undef ashr undef -> undef + else + return const_cast(C1); // X ashr undef --> X + case Instruction::Shl: + // undef << X -> 0 or X << undef -> 0 + return Constant::getNullValue(C1->getType()); + } + } + + if (const ConstantExpr *CE1 = dyn_cast(C1)) { + if (isa(C2)) { + // There are many possible foldings we could do here. We should probably + // at least fold add of a pointer with an integer into the appropriate + // getelementptr. This will improve alias analysis a bit. + } else { + // Just implement a couple of simple identities. + switch (Opcode) { + case Instruction::Add: + if (C2->isNullValue()) return const_cast(C1); // X + 0 == X + break; + case Instruction::Sub: + if (C2->isNullValue()) return const_cast(C1); // X - 0 == X + break; + case Instruction::Mul: + if (C2->isNullValue()) return const_cast(C2); // X * 0 == 0 + if (const ConstantInt *CI = dyn_cast(C2)) + if (CI->getZExtValue() == 1) + return const_cast(C1); // X * 1 == X + break; + case Instruction::UDiv: + case Instruction::SDiv: + if (const ConstantInt *CI = dyn_cast(C2)) + if (CI->getZExtValue() == 1) + return const_cast(C1); // X / 1 == X + break; + case Instruction::URem: + case Instruction::SRem: + if (const ConstantInt *CI = dyn_cast(C2)) + if (CI->getZExtValue() == 1) + return Constant::getNullValue(CI->getType()); // X % 1 == 0 + break; + case Instruction::And: + if (cast(C2)->isAllOnesValue()) + return const_cast(C1); // X & -1 == X + if (C2->isNullValue()) return const_cast(C2); // X & 0 == 0 + if (CE1->isCast() && isa(CE1->getOperand(0))) { + GlobalValue *CPR = cast(CE1->getOperand(0)); + + // Functions are at least 4-byte aligned. If and'ing the address of a + // function with a constant < 4, fold it to zero. + if (const ConstantInt *CI = dyn_cast(C2)) + if (CI->getZExtValue() < 4 && isa(CPR)) + return Constant::getNullValue(CI->getType()); + } + break; + case Instruction::Or: + if (C2->isNullValue()) return const_cast(C1); // X | 0 == X + if (cast(C2)->isAllOnesValue()) + return const_cast(C2); // X | -1 == -1 + break; + case Instruction::Xor: + if (C2->isNullValue()) return const_cast(C1); // X ^ 0 == X + break; + } + } + } else if (isa(C2)) { + // If C2 is a constant expr and C1 isn't, flop them around and fold the + // other way if possible. + switch (Opcode) { + case Instruction::Add: + case Instruction::Mul: + case Instruction::And: + case Instruction::Or: + case Instruction::Xor: + // No change of opcode required. + return ConstantFoldBinaryInstruction(Opcode, C2, C1); + + case Instruction::Shl: + case Instruction::LShr: + case Instruction::AShr: + case Instruction::Sub: + case Instruction::SDiv: + case Instruction::UDiv: + case Instruction::FDiv: + case Instruction::URem: + case Instruction::SRem: + case Instruction::FRem: + default: // These instructions cannot be flopped around. + return 0; + } + } + + // At this point we know neither constant is an UndefValue nor a ConstantExpr + // so look at directly computing the + if (const ConstantBool *CB1 = dyn_cast(C1)) { + if (const ConstantBool *CB2 = dyn_cast(C2)) { + switch (Opcode) { + default: + break; + case Instruction::And: + return ConstantBool::get(CB1->getValue() & CB2->getValue()); + case Instruction::Or: + return ConstantBool::get(CB1->getValue() | CB2->getValue()); + case Instruction::Xor: + return ConstantBool::get(CB1->getValue() ^ CB2->getValue()); + } + } + } else if (const ConstantInt *CI1 = dyn_cast(C1)) { + if (const ConstantInt *CI2 = dyn_cast(C2)) { + uint64_t C1Val = CI1->getZExtValue(); + uint64_t C2Val = CI2->getZExtValue(); + switch (Opcode) { + default: + break; + case Instruction::Add: + return ConstantInt::get(C1->getType(), C1Val + C2Val); + case Instruction::Sub: + return ConstantInt::get(C1->getType(), C1Val - C2Val); + case Instruction::Mul: + return ConstantInt::get(C1->getType(), C1Val * C2Val); + case Instruction::UDiv: + if (CI2->isNullValue()) // X / 0 -> can't fold + return 0; + return ConstantInt::get(C1->getType(), C1Val / C2Val); + case Instruction::SDiv: + if (CI2->isNullValue()) return 0; // X / 0 -> can't fold + if (CI2->isAllOnesValue() && + (((CI1->getType()->getPrimitiveSizeInBits() == 64) && + (CI1->getSExtValue() == INT64_MIN)) || + (CI1->getSExtValue() == -CI1->getSExtValue()))) + return 0; // MIN_INT / -1 -> overflow + return ConstantInt::get(C1->getType(), + CI1->getSExtValue() / CI2->getSExtValue()); + case Instruction::URem: + if (C2->isNullValue()) return 0; // X / 0 -> can't fold + return ConstantInt::get(C1->getType(), C1Val % C2Val); + case Instruction::SRem: + if (CI2->isNullValue()) return 0; // X % 0 -> can't fold + if (CI2->isAllOnesValue() && + (((CI1->getType()->getPrimitiveSizeInBits() == 64) && + (CI1->getSExtValue() == INT64_MIN)) || + (CI1->getSExtValue() == -CI1->getSExtValue()))) + return 0; // MIN_INT % -1 -> overflow + return ConstantInt::get(C1->getType(), + CI1->getSExtValue() % CI2->getSExtValue()); + case Instruction::And: + return ConstantInt::get(C1->getType(), C1Val & C2Val); + case Instruction::Or: + return ConstantInt::get(C1->getType(), C1Val | C2Val); + case Instruction::Xor: + return ConstantInt::get(C1->getType(), C1Val ^ C2Val); + case Instruction::Shl: + return ConstantInt::get(C1->getType(), C1Val << C2Val); + case Instruction::LShr: + return ConstantInt::get(C1->getType(), C1Val >> C2Val); + case Instruction::AShr: + return ConstantInt::get(C1->getType(), + CI1->getSExtValue() >> C2Val); + } + } + } else if (const ConstantFP *CFP1 = dyn_cast(C1)) { + if (const ConstantFP *CFP2 = dyn_cast(C2)) { + double C1Val = CFP1->getValue(); + double C2Val = CFP2->getValue(); + switch (Opcode) { + default: + break; + case Instruction::Add: + return ConstantFP::get(CFP1->getType(), C1Val + C2Val); + case Instruction::Sub: + return ConstantFP::get(CFP1->getType(), C1Val - C2Val); + case Instruction::Mul: + return ConstantFP::get(CFP1->getType(), C1Val * C2Val); + case Instruction::FDiv: + if (CFP2->isExactlyValue(0.0)) + return ConstantFP::get(CFP1->getType(), + std::numeric_limits::infinity()); + if (CFP2->isExactlyValue(-0.0)) + return ConstantFP::get(CFP1->getType(), + -std::numeric_limits::infinity()); + return ConstantFP::get(CFP1->getType(), C1Val / C2Val); + case Instruction::FRem: + if (CFP2->isNullValue()) + return 0; + return ConstantFP::get(CFP1->getType(), std::fmod(C1Val, C2Val)); + } + } + } else if (const ConstantPacked *CP1 = dyn_cast(C1)) { + if (const ConstantPacked *CP2 = dyn_cast(C2)) { + switch (Opcode) { + default: + break; + case Instruction::Add: + return EvalVectorOp(CP1, CP2, ConstantExpr::getAdd); + case Instruction::Sub: + return EvalVectorOp(CP1, CP2, ConstantExpr::getSub); + case Instruction::Mul: + return EvalVectorOp(CP1, CP2, ConstantExpr::getMul); + case Instruction::UDiv: + return EvalVectorOp(CP1, CP2, ConstantExpr::getUDiv); + case Instruction::SDiv: + return EvalVectorOp(CP1, CP2, ConstantExpr::getSDiv); + case Instruction::FDiv: + return EvalVectorOp(CP1, CP2, ConstantExpr::getFDiv); + case Instruction::URem: + return EvalVectorOp(CP1, CP2, ConstantExpr::getURem); + case Instruction::SRem: + return EvalVectorOp(CP1, CP2, ConstantExpr::getSRem); + case Instruction::FRem: + return EvalVectorOp(CP1, CP2, ConstantExpr::getFRem); + case Instruction::And: + return EvalVectorOp(CP1, CP2, ConstantExpr::getAnd); + case Instruction::Or: + return EvalVectorOp(CP1, CP2, ConstantExpr::getOr); + case Instruction::Xor: + return EvalVectorOp(CP1, CP2, ConstantExpr::getXor); + } + } + } + + // We don't know how to fold this + return 0; +} /// isZeroSizedType - This type is zero sized if its an array or structure of /// zero sized types. The only leaf zero sized type is an empty structure. @@ -979,62 +737,126 @@ static int IdxCompare(Constant *C1, Constant *C2, const Type *ElTy) { return 1; } -/// evaluateRelation - This function determines if there is anything we can +/// evaluatFCmpeRelation - This function determines if there is anything we can +/// decide about the two constants provided. This doesn't need to handle simple +/// things like ConstantFP comparisons, but should instead handle ConstantExprs. +/// If we can determine that the two constants have a particular relation to +/// each other, we should return the corresponding FCmpInst predicate, +/// otherwise return FCmpInst::BAD_FCMP_PREDICATE. +/// +/// To simplify this code we canonicalize the relation so that the first +/// operand is always the most "complex" of the two. We consider simple +/// constants (like ConstantFP) to be the simplest, followed by +/// GlobalValues, followed by ConstantExpr's (the most complex). +static FCmpInst::Predicate evaluateFCmpRelation(Constant *V1, Constant *V2) { + assert(V1->getType() == V2->getType() && + "Cannot compare different types of values!"); + if (V1 == V2) return FCmpInst::FCMP_OEQ; + + if (!isa(V1) && !isa(V1)) { + if (!isa(V2) && !isa(V2)) { + // We distilled this down to a simple case, use the standard constant + // folder. + ConstantBool *R = dyn_cast( + ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, V1, V2)); + if (R && R->getValue()) + return FCmpInst::FCMP_OEQ; + R = dyn_cast( + ConstantExpr::getFCmp(FCmpInst::FCMP_OLT, V1, V2)); + if (R && R->getValue()) + return FCmpInst::FCMP_OLT; + R = dyn_cast( + ConstantExpr::getFCmp(FCmpInst::FCMP_OGT, V1, V2)); + if (R && R->getValue()) return FCmpInst::FCMP_OGT; + + // If we couldn't figure it out, bail. + return FCmpInst::BAD_FCMP_PREDICATE; + } + + // If the first operand is simple, swap operands. + FCmpInst::Predicate SwappedPredicate = evaluateFCmpRelation(V2, V1); + if (SwappedPredicate != FCmpInst::BAD_FCMP_PREDICATE) + return FCmpInst::getSwappedPredicate(SwappedPredicate); + + return FCmpInst::BAD_FCMP_PREDICATE; + } + + // Ok, the LHS is known to be a constantexpr. The RHS can be any of a + // constantexpr, a CPR, or a simple constant. + // ConstantExpr *CE1 = cast(V1); + // Constant *CE1Op0 = CE1->getOperand(0); + + // There are MANY other foldings that we could perform here. They will + // probably be added on demand, as they seem needed. + return FCmpInst::BAD_FCMP_PREDICATE; +} + +/// evaluateICmpRelation - This function determines if there is anything we can /// decide about the two constants provided. This doesn't need to handle simple /// things like integer comparisons, but should instead handle ConstantExprs /// and GlobalValues. If we can determine that the two constants have a -/// particular relation to each other, we should return the corresponding SetCC -/// code, otherwise return Instruction::BinaryOpsEnd. +/// particular relation to each other, we should return the corresponding ICmp +/// predicate, otherwise return ICmpInst::BAD_ICMP_PREDICATE. /// /// To simplify this code we canonicalize the relation so that the first /// operand is always the most "complex" of the two. We consider simple /// constants (like ConstantInt) to be the simplest, followed by /// GlobalValues, followed by ConstantExpr's (the most complex). /// -static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { +static ICmpInst::Predicate evaluateICmpRelation(Constant *V1, Constant *V2, + bool isSigned) { assert(V1->getType() == V2->getType() && "Cannot compare different types of values!"); - if (V1 == V2) return Instruction::SetEQ; + if (V1 == V2) return ICmpInst::ICMP_EQ; if (!isa(V1) && !isa(V1)) { if (!isa(V2) && !isa(V2)) { // We distilled this down to a simple case, use the standard constant // folder. - ConstantBool *R = dyn_cast(ConstantExpr::getSetEQ(V1, V2)); - if (R && R->getValue()) return Instruction::SetEQ; - R = dyn_cast(ConstantExpr::getSetLT(V1, V2)); - if (R && R->getValue()) return Instruction::SetLT; - R = dyn_cast(ConstantExpr::getSetGT(V1, V2)); - if (R && R->getValue()) return Instruction::SetGT; + ICmpInst::Predicate pred = ICmpInst::ICMP_EQ; + ConstantBool *R = + dyn_cast(ConstantExpr::getICmp(pred, V1, V2)); + if (R && R->getValue()) + return pred; + pred = isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; + R = dyn_cast(ConstantExpr::getICmp(pred, V1, V2)); + if (R && R->getValue()) + return pred; + pred = isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; + R = dyn_cast(ConstantExpr::getICmp(pred, V1, V2)); + if (R && R->getValue()) + return pred; // If we couldn't figure it out, bail. - return Instruction::BinaryOpsEnd; + return ICmpInst::BAD_ICMP_PREDICATE; } // If the first operand is simple, swap operands. - Instruction::BinaryOps SwappedRelation = evaluateRelation(V2, V1); - if (SwappedRelation != Instruction::BinaryOpsEnd) - return SetCondInst::getSwappedCondition(SwappedRelation); + ICmpInst::Predicate SwappedRelation = + evaluateICmpRelation(V2, V1, isSigned); + if (SwappedRelation != ICmpInst::BAD_ICMP_PREDICATE) + return ICmpInst::getSwappedPredicate(SwappedRelation); } else if (const GlobalValue *CPR1 = dyn_cast(V1)) { if (isa(V2)) { // Swap as necessary. - Instruction::BinaryOps SwappedRelation = evaluateRelation(V2, V1); - if (SwappedRelation != Instruction::BinaryOpsEnd) - return SetCondInst::getSwappedCondition(SwappedRelation); + ICmpInst::Predicate SwappedRelation = + evaluateICmpRelation(V2, V1, isSigned); + if (SwappedRelation != ICmpInst::BAD_ICMP_PREDICATE) + return ICmpInst::getSwappedPredicate(SwappedRelation); else - return Instruction::BinaryOpsEnd; + return ICmpInst::BAD_ICMP_PREDICATE; } // Now we know that the RHS is a GlobalValue or simple constant, // which (since the types must match) means that it's a ConstantPointerNull. if (const GlobalValue *CPR2 = dyn_cast(V2)) { if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage()) - return Instruction::SetNE; + return ICmpInst::ICMP_NE; } else { // GlobalVals can never be null. assert(isa(V2) && "Canonicalization guarantee!"); if (!CPR1->hasExternalWeakLinkage()) - return Instruction::SetNE; + return ICmpInst::ICMP_NE; } } else { // Ok, the LHS is known to be a constantexpr. The RHS can be any of a @@ -1048,30 +870,39 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { case Instruction::FPExt: case Instruction::FPToUI: case Instruction::FPToSI: - break; // We don't do anything with floating point. - case Instruction::ZExt: - case Instruction::SExt: + break; // We can't evaluate floating point casts or truncations. + case Instruction::UIToFP: case Instruction::SIToFP: - case Instruction::PtrToInt: case Instruction::IntToPtr: case Instruction::BitCast: + case Instruction::ZExt: + case Instruction::SExt: + case Instruction::PtrToInt: // If the cast is not actually changing bits, and the second operand is a // null pointer, do the comparison with the pre-casted value. if (V2->isNullValue() && - (isa(CE1->getType()) || CE1->getType()->isIntegral())) - return evaluateRelation(CE1Op0, - Constant::getNullValue(CE1Op0->getType())); + (isa(CE1->getType()) || CE1->getType()->isIntegral())) { + bool isSigned = CE1->getOpcode() == Instruction::ZExt ? false : + (CE1->getOpcode() == Instruction::SExt ? true : + (CE1->getOpcode() == Instruction::PtrToInt ? false : isSigned)); + return evaluateICmpRelation( + CE1Op0, Constant::getNullValue(CE1Op0->getType()), isSigned); + } // If the dest type is a pointer type, and the RHS is a constantexpr cast // from the same type as the src of the LHS, evaluate the inputs. This is - // important for things like "seteq (cast 4 to int*), (cast 5 to int*)", + // important for things like "icmp eq (cast 4 to int*), (cast 5 to int*)", // which happens a lot in compilers with tagged integers. if (ConstantExpr *CE2 = dyn_cast(V2)) - if (isa(CE1->getType()) && CE2->isCast() && + if (CE2->isCast() && isa(CE1->getType()) && CE1->getOperand(0)->getType() == CE2->getOperand(0)->getType() && CE1->getOperand(0)->getType()->isIntegral()) { - return evaluateRelation(CE1->getOperand(0), CE2->getOperand(0)); + bool isSigned = CE1->getOpcode() == Instruction::ZExt ? false : + (CE1->getOpcode() == Instruction::SExt ? true : + (CE1->getOpcode() == Instruction::PtrToInt ? false : isSigned)); + return evaluateICmpRelation(CE1->getOperand(0), CE2->getOperand(0), + isSigned); } break; @@ -1085,20 +916,20 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { if (GV->hasExternalWeakLinkage()) // Weak linkage GVals could be zero or not. We're comparing that // to null pointer so its greater-or-equal - return Instruction::SetGE; + return isSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; else // If its not weak linkage, the GVal must have a non-zero address // so the result is greater-than - return Instruction::SetGT; + return isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; } else if (isa(CE1Op0)) { // If we are indexing from a null pointer, check to see if we have any // non-zero indices. for (unsigned i = 1, e = CE1->getNumOperands(); i != e; ++i) if (!CE1->getOperand(i)->isNullValue()) // Offsetting from null, must not be equal. - return Instruction::SetGT; + return isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; // Only zero indexes from null, must still be zero. - return Instruction::SetEQ; + return ICmpInst::ICMP_EQ; } // Otherwise, we can't really say if the first operand is null or not. } else if (const GlobalValue *CPR2 = dyn_cast(V2)) { @@ -1106,11 +937,11 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { if (CPR2->hasExternalWeakLinkage()) // Weak linkage GVals could be zero or not. We're comparing it to // a null pointer, so its less-or-equal - return Instruction::SetLE; + return isSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE; else // If its not weak linkage, the GVal must have a non-zero address // so the result is less-than - return Instruction::SetLT; + return isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; } else if (const GlobalValue *CPR1 = dyn_cast(CE1Op0)) { if (CPR1 == CPR2) { // If this is a getelementptr of the same global, then it must be @@ -1120,11 +951,11 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { assert(CE1->getNumOperands() == 2 && !CE1->getOperand(1)->isNullValue() && "Suprising getelementptr!"); - return Instruction::SetGT; + return isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; } else { // If they are different globals, we don't know what the value is, // but they can't be equal. - return Instruction::SetNE; + return ICmpInst::ICMP_NE; } } } else { @@ -1140,7 +971,7 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { // obviously to the same or different globals. if (isa(CE1Op0) && isa(CE2Op0)) { if (CE1Op0 != CE2Op0) // Don't know relative ordering, but not equal - return Instruction::SetNE; + return ICmpInst::ICMP_NE; // Ok, we know that both getelementptr instructions are based on the // same global. From this, we can precisely determine the relative // ordering of the resultant pointers. @@ -1152,9 +983,9 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { ++i, ++GTI) switch (IdxCompare(CE1->getOperand(i), CE2->getOperand(i), GTI.getIndexedType())) { - case -1: return Instruction::SetLT; - case 1: return Instruction::SetGT; - case -2: return Instruction::BinaryOpsEnd; + case -1: return isSigned ? ICmpInst::ICMP_SLT:ICmpInst::ICMP_ULT; + case 1: return isSigned ? ICmpInst::ICMP_SGT:ICmpInst::ICMP_UGT; + case -2: return ICmpInst::BAD_ICMP_PREDICATE; } // Ok, we ran out of things they have in common. If any leftovers @@ -1162,283 +993,237 @@ static Instruction::BinaryOps evaluateRelation(Constant *V1, Constant *V2) { for (; i < CE1->getNumOperands(); ++i) if (!CE1->getOperand(i)->isNullValue()) if (isa(CE1->getOperand(i))) - return Instruction::SetGT; + return isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT; else - return Instruction::BinaryOpsEnd; // Might be equal. + return ICmpInst::BAD_ICMP_PREDICATE; // Might be equal. for (; i < CE2->getNumOperands(); ++i) if (!CE2->getOperand(i)->isNullValue()) if (isa(CE2->getOperand(i))) - return Instruction::SetLT; + return isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; else - return Instruction::BinaryOpsEnd; // Might be equal. - return Instruction::SetEQ; + return ICmpInst::BAD_ICMP_PREDICATE; // Might be equal. + return ICmpInst::ICMP_EQ; } } } - default: break; } } - return Instruction::BinaryOpsEnd; + return ICmpInst::BAD_ICMP_PREDICATE; } -Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, - const Constant *V1, - const Constant *V2) { - Constant *C = 0; - switch (Opcode) { - default: break; - case Instruction::Add: C = ConstRules::get(V1, V2).add(V1, V2); break; - case Instruction::Sub: C = ConstRules::get(V1, V2).sub(V1, V2); break; - case Instruction::Mul: C = ConstRules::get(V1, V2).mul(V1, V2); break; - case Instruction::UDiv: C = ConstRules::get(V1, V2).udiv(V1, V2); break; - case Instruction::SDiv: C = ConstRules::get(V1, V2).sdiv(V1, V2); break; - case Instruction::FDiv: C = ConstRules::get(V1, V2).fdiv(V1, V2); break; - case Instruction::URem: C = ConstRules::get(V1, V2).urem(V1, V2); break; - case Instruction::SRem: C = ConstRules::get(V1, V2).srem(V1, V2); break; - case Instruction::FRem: C = ConstRules::get(V1, V2).frem(V1, V2); break; - case Instruction::And: C = ConstRules::get(V1, V2).op_and(V1, V2); break; - case Instruction::Or: C = ConstRules::get(V1, V2).op_or (V1, V2); break; - case Instruction::Xor: C = ConstRules::get(V1, V2).op_xor(V1, V2); break; - case Instruction::Shl: C = ConstRules::get(V1, V2).shl(V1, V2); break; - case Instruction::LShr: C = ConstRules::get(V1, V2).lshr(V1, V2); break; - case Instruction::AShr: C = ConstRules::get(V1, V2).ashr(V1, V2); break; - case Instruction::SetEQ: - // SetEQ(null,GV) -> false - if (V1->isNullValue()) { - if (const GlobalValue *GV = dyn_cast(V2)) - if (!GV->hasExternalWeakLinkage()) - return ConstantBool::getFalse(); - // SetEQ(GV,null) -> false - } else if (V2->isNullValue()) { - if (const GlobalValue *GV = dyn_cast(V1)) - if (!GV->hasExternalWeakLinkage()) +Constant *llvm::ConstantFoldCompareInstruction(unsigned short predicate, + Constant *C1, Constant *C2) { + + // Handle some degenerate cases first + if (isa(C1) || isa(C2)) + return UndefValue::get(Type::BoolTy); + + // icmp eq/ne(null,GV) -> false/true + if (C1->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(C2)) + if (!GV->hasExternalWeakLinkage()) // External weak GV can be null + if (predicate == ICmpInst::ICMP_EQ) return ConstantBool::getFalse(); - } - C = ConstRules::get(V1, V2).equalto(V1, V2); - break; - case Instruction::SetLT: C = ConstRules::get(V1, V2).lessthan(V1, V2);break; - case Instruction::SetGT: C = ConstRules::get(V1, V2).lessthan(V2, V1);break; - case Instruction::SetNE: - // SetNE(null,GV) -> true - if (V1->isNullValue()) { - if (const GlobalValue *GV = dyn_cast(V2)) - if (!GV->hasExternalWeakLinkage()) + else if (predicate == ICmpInst::ICMP_NE) return ConstantBool::getTrue(); - // SetNE(GV,null) -> true - } else if (V2->isNullValue()) { - if (const GlobalValue *GV = dyn_cast(V1)) - if (!GV->hasExternalWeakLinkage()) + // icmp eq/ne(GV,null) -> false/true + } else if (C2->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(C1)) + if (!GV->hasExternalWeakLinkage()) // External weak GV can be null + if (predicate == ICmpInst::ICMP_EQ) + return ConstantBool::getFalse(); + else if (predicate == ICmpInst::ICMP_NE) return ConstantBool::getTrue(); - } - // V1 != V2 === !(V1 == V2) - C = ConstRules::get(V1, V2).equalto(V1, V2); - if (C) return ConstantExpr::getNot(C); - break; - case Instruction::SetLE: // V1 <= V2 === !(V2 < V1) - C = ConstRules::get(V1, V2).lessthan(V2, V1); - if (C) return ConstantExpr::getNot(C); - break; - case Instruction::SetGE: // V1 >= V2 === !(V1 < V2) - C = ConstRules::get(V1, V2).lessthan(V1, V2); - if (C) return ConstantExpr::getNot(C); - break; } - // If we successfully folded the expression, return it now. - if (C) return C; - - if (SetCondInst::isComparison(Opcode)) { - if (isa(V1) || isa(V2)) - return UndefValue::get(Type::BoolTy); - switch (evaluateRelation(const_cast(V1), - const_cast(V2))) { - default: assert(0 && "Unknown relational!"); - case Instruction::BinaryOpsEnd: - break; // Couldn't determine anything about these constants. - case Instruction::SetEQ: // We know the constants are equal! - // If we know the constants are equal, we can decide the result of this - // computation precisely. - return ConstantBool::get(Opcode == Instruction::SetEQ || - Opcode == Instruction::SetLE || - Opcode == Instruction::SetGE); - case Instruction::SetLT: - // If we know that V1 < V2, we can decide the result of this computation - // precisely. - return ConstantBool::get(Opcode == Instruction::SetLT || - Opcode == Instruction::SetNE || - Opcode == Instruction::SetLE); - case Instruction::SetGT: - // If we know that V1 > V2, we can decide the result of this computation - // precisely. - return ConstantBool::get(Opcode == Instruction::SetGT || - Opcode == Instruction::SetNE || - Opcode == Instruction::SetGE); - case Instruction::SetLE: - // If we know that V1 <= V2, we can only partially decide this relation. - if (Opcode == Instruction::SetGT) return ConstantBool::getFalse(); - if (Opcode == Instruction::SetLT) return ConstantBool::getTrue(); - break; - - case Instruction::SetGE: - // If we know that V1 >= V2, we can only partially decide this relation. - if (Opcode == Instruction::SetLT) return ConstantBool::getFalse(); - if (Opcode == Instruction::SetGT) return ConstantBool::getTrue(); - break; - - case Instruction::SetNE: - // If we know that V1 != V2, we can only partially decide this relation. - if (Opcode == Instruction::SetEQ) return ConstantBool::getFalse(); - if (Opcode == Instruction::SetNE) return ConstantBool::getTrue(); - break; + if (isa(C1) && isa(C2)) { + bool C1Val = cast(C1)->getValue(); + bool C2Val = cast(C2)->getValue(); + switch (predicate) { + default: assert(0 && "Invalid ICmp Predicate"); return 0; + case ICmpInst::ICMP_EQ: return ConstantBool::get(C1Val == C2Val); + case ICmpInst::ICMP_NE: return ConstantBool::get(C1Val != C2Val); + case ICmpInst::ICMP_ULT:return ConstantBool::get(C1Val < C2Val); + case ICmpInst::ICMP_UGT:return ConstantBool::get(C1Val > C2Val); + case ICmpInst::ICMP_ULE:return ConstantBool::get(C1Val <= C2Val); + case ICmpInst::ICMP_UGE:return ConstantBool::get(C1Val >= C2Val); + case ICmpInst::ICMP_SLT:return ConstantBool::get(C1Val < C2Val); + case ICmpInst::ICMP_SGT:return ConstantBool::get(C1Val > C2Val); + case ICmpInst::ICMP_SLE:return ConstantBool::get(C1Val <= C2Val); + case ICmpInst::ICMP_SGE:return ConstantBool::get(C1Val >= C2Val); } - } - - if (isa(V1) || isa(V2)) { - switch (Opcode) { - case Instruction::Add: - case Instruction::Sub: - case Instruction::Xor: - return UndefValue::get(V1->getType()); - - case Instruction::Mul: - case Instruction::And: - return Constant::getNullValue(V1->getType()); - case Instruction::UDiv: - case Instruction::SDiv: - case Instruction::FDiv: - case Instruction::URem: - case Instruction::SRem: - case Instruction::FRem: - if (!isa(V2)) // undef / X -> 0 - return Constant::getNullValue(V1->getType()); - return const_cast(V2); // X / undef -> undef - case Instruction::Or: // X | undef -> -1 - return ConstantInt::getAllOnesValue(V1->getType()); - case Instruction::LShr: - if (isa(V2) && isa(V1)) - return const_cast(V1); // undef lshr undef -> undef - return Constant::getNullValue(V1->getType()); // X lshr undef -> 0 - // undef lshr X -> 0 - case Instruction::AShr: - if (!isa(V2)) - return const_cast(V1); // undef ashr X --> undef - else if (isa(V1)) - return const_cast(V1); // undef ashr undef -> undef - else - return const_cast(V1); // X ashr undef --> X - case Instruction::Shl: - // undef << X -> 0 or X << undef -> 0 - return Constant::getNullValue(V1->getType()); - } - } - - if (const ConstantExpr *CE1 = dyn_cast(V1)) { - if (isa(V2)) { - // There are many possible foldings we could do here. We should probably - // at least fold add of a pointer with an integer into the appropriate - // getelementptr. This will improve alias analysis a bit. + } else if (isa(C1) && isa(C2)) { + if (ICmpInst::isSignedPredicate(ICmpInst::Predicate(predicate))) { + int64_t V1 = cast(C1)->getSExtValue(); + int64_t V2 = cast(C2)->getSExtValue(); + switch (predicate) { + default: assert(0 && "Invalid ICmp Predicate"); return 0; + case ICmpInst::ICMP_SLT:return ConstantBool::get(V1 < V2); + case ICmpInst::ICMP_SGT:return ConstantBool::get(V1 > V2); + case ICmpInst::ICMP_SLE:return ConstantBool::get(V1 <= V2); + case ICmpInst::ICMP_SGE:return ConstantBool::get(V1 >= V2); + } } else { - // Just implement a couple of simple identities. - switch (Opcode) { - case Instruction::Add: - if (V2->isNullValue()) return const_cast(V1); // X + 0 == X - break; - case Instruction::Sub: - if (V2->isNullValue()) return const_cast(V1); // X - 0 == X - break; - case Instruction::Mul: - if (V2->isNullValue()) return const_cast(V2); // X * 0 == 0 - if (const ConstantInt *CI = dyn_cast(V2)) - if (CI->getZExtValue() == 1) - return const_cast(V1); // X * 1 == X - break; - case Instruction::UDiv: - case Instruction::SDiv: - if (const ConstantInt *CI = dyn_cast(V2)) - if (CI->getZExtValue() == 1) - return const_cast(V1); // X / 1 == X - break; - case Instruction::URem: - case Instruction::SRem: - if (const ConstantInt *CI = dyn_cast(V2)) - if (CI->getZExtValue() == 1) - return Constant::getNullValue(CI->getType()); // X % 1 == 0 - break; - case Instruction::And: - if (cast(V2)->isAllOnesValue()) - return const_cast(V1); // X & -1 == X - if (V2->isNullValue()) return const_cast(V2); // X & 0 == 0 - if (CE1->isCast() && isa(CE1->getOperand(0))) { - GlobalValue *CPR = cast(CE1->getOperand(0)); - - // Functions are at least 4-byte aligned. If and'ing the address of a - // function with a constant < 4, fold it to zero. - if (const ConstantInt *CI = dyn_cast(V2)) - if (CI->getZExtValue() < 4 && isa(CPR)) - return Constant::getNullValue(CI->getType()); + uint64_t V1 = cast(C1)->getZExtValue(); + uint64_t V2 = cast(C2)->getZExtValue(); + switch (predicate) { + default: assert(0 && "Invalid ICmp Predicate"); return 0; + case ICmpInst::ICMP_EQ: return ConstantBool::get(V1 == V2); + case ICmpInst::ICMP_NE: return ConstantBool::get(V1 != V2); + case ICmpInst::ICMP_ULT:return ConstantBool::get(V1 < V2); + case ICmpInst::ICMP_UGT:return ConstantBool::get(V1 > V2); + case ICmpInst::ICMP_ULE:return ConstantBool::get(V1 <= V2); + case ICmpInst::ICMP_UGE:return ConstantBool::get(V1 >= V2); + } + } + } else if (isa(C1) && isa(C2)) { + double C1Val = cast(C1)->getValue(); + double C2Val = cast(C2)->getValue(); + switch (predicate) { + default: assert(0 && "Invalid FCmp Predicate"); return 0; + case FCmpInst::FCMP_FALSE: return ConstantBool::getFalse(); + case FCmpInst::FCMP_TRUE: return ConstantBool::getTrue(); + case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_ORD: break; // Can't fold these + case FCmpInst::FCMP_UEQ: + case FCmpInst::FCMP_OEQ: return ConstantBool::get(C1Val == C2Val); + case FCmpInst::FCMP_ONE: + case FCmpInst::FCMP_UNE: return ConstantBool::get(C1Val != C2Val); + case FCmpInst::FCMP_OLT: + case FCmpInst::FCMP_ULT: return ConstantBool::get(C1Val < C2Val); + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_OGT: return ConstantBool::get(C1Val > C2Val); + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ULE: return ConstantBool::get(C1Val <= C2Val); + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_OGE: return ConstantBool::get(C1Val >= C2Val); + } + } else if (ConstantPacked *CP1 = dyn_cast(C1)) { + if (ConstantPacked *CP2 = dyn_cast(C2)) { + if (predicate == FCmpInst::FCMP_OEQ || predicate == FCmpInst::FCMP_UEQ) { + for (unsigned i = 0, e = CP1->getNumOperands(); i != e; ++i) { + Constant *C= ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, + const_cast(CP1->getOperand(i)), + const_cast(CP2->getOperand(i))); + if (ConstantBool *CB = dyn_cast(C)) + return CB; } - break; - case Instruction::Or: - if (V2->isNullValue()) return const_cast(V1); // X | 0 == X - if (cast(V2)->isAllOnesValue()) - return const_cast(V2); // X | -1 == -1 - break; - case Instruction::Xor: - if (V2->isNullValue()) return const_cast(V1); // X ^ 0 == X - break; + // Otherwise, could not decide from any element pairs. + return 0; + } else if (predicate == ICmpInst::ICMP_EQ) { + for (unsigned i = 0, e = CP1->getNumOperands(); i != e; ++i) { + Constant *C = ConstantExpr::getICmp(ICmpInst::ICMP_EQ, + const_cast(CP1->getOperand(i)), + const_cast(CP2->getOperand(i))); + if (ConstantBool *CB = dyn_cast(C)) + return CB; + } + // Otherwise, could not decide from any element pairs. + return 0; } } + } - } else if (isa(V2)) { - // If V2 is a constant expr and V1 isn't, flop them around and fold the - // other way if possible. - switch (Opcode) { - case Instruction::Add: - case Instruction::Mul: - case Instruction::And: - case Instruction::Or: - case Instruction::Xor: - case Instruction::SetEQ: - case Instruction::SetNE: - // No change of opcode required. - return ConstantFoldBinaryInstruction(Opcode, V2, V1); + // Evaluate the relation between the two constants, per the predicate. + switch (evaluateICmpRelation(const_cast(C1), + const_cast(C2), + CmpInst::isSigned(predicate))) { + default: assert(0 && "Unknown relational!"); + case ICmpInst::BAD_ICMP_PREDICATE: + break; // Couldn't determine anything about these constants. + case ICmpInst::ICMP_EQ: // We know the constants are equal! + // If we know the constants are equal, we can decide the result of this + // computation precisely. + return ConstantBool::get(predicate == ICmpInst::ICMP_EQ || + predicate == ICmpInst::ICMP_ULE || + predicate == ICmpInst::ICMP_SLE || + predicate == ICmpInst::ICMP_UGE || + predicate == ICmpInst::ICMP_SGE); + case ICmpInst::ICMP_ULT: + // If we know that C1 < C2, we can decide the result of this computation + // precisely. + return ConstantBool::get(predicate == ICmpInst::ICMP_ULT || + predicate == ICmpInst::ICMP_NE || + predicate == ICmpInst::ICMP_ULE); + case ICmpInst::ICMP_SLT: + // If we know that C1 < C2, we can decide the result of this computation + // precisely. + return ConstantBool::get(predicate == ICmpInst::ICMP_SLT || + predicate == ICmpInst::ICMP_NE || + predicate == ICmpInst::ICMP_SLE); + case ICmpInst::ICMP_UGT: + // If we know that C1 > C2, we can decide the result of this computation + // precisely. + return ConstantBool::get(predicate == ICmpInst::ICMP_UGT || + predicate == ICmpInst::ICMP_NE || + predicate == ICmpInst::ICMP_UGE); + case ICmpInst::ICMP_SGT: + // If we know that C1 > C2, we can decide the result of this computation + // precisely. + return ConstantBool::get(predicate == ICmpInst::ICMP_SGT || + predicate == ICmpInst::ICMP_NE || + predicate == ICmpInst::ICMP_SGE); + case ICmpInst::ICMP_ULE: + // If we know that C1 <= C2, we can only partially decide this relation. + if (predicate == ICmpInst::ICMP_UGT) return ConstantBool::getFalse(); + if (predicate == ICmpInst::ICMP_ULT) return ConstantBool::getTrue(); + break; + case ICmpInst::ICMP_SLE: + // If we know that C1 <= C2, we can only partially decide this relation. + if (predicate == ICmpInst::ICMP_SGT) return ConstantBool::getFalse(); + if (predicate == ICmpInst::ICMP_SLT) return ConstantBool::getTrue(); + break; - case Instruction::SetLT: - case Instruction::SetGT: - case Instruction::SetLE: - case Instruction::SetGE: - // Change the opcode as necessary to swap the operands. - Opcode = SetCondInst::getSwappedCondition((Instruction::BinaryOps)Opcode); - return ConstantFoldBinaryInstruction(Opcode, V2, V1); + case ICmpInst::ICMP_UGE: + // If we know that C1 >= C2, we can only partially decide this relation. + if (predicate == ICmpInst::ICMP_ULT) return ConstantBool::getFalse(); + if (predicate == ICmpInst::ICMP_UGT) return ConstantBool::getTrue(); + break; + case ICmpInst::ICMP_SGE: + // If we know that C1 >= C2, we can only partially decide this relation. + if (predicate == ICmpInst::ICMP_SLT) return ConstantBool::getFalse(); + if (predicate == ICmpInst::ICMP_SGT) return ConstantBool::getTrue(); + break; - case Instruction::Shl: - case Instruction::LShr: - case Instruction::AShr: - case Instruction::Sub: - case Instruction::SDiv: - case Instruction::UDiv: - case Instruction::FDiv: - case Instruction::URem: - case Instruction::SRem: - case Instruction::FRem: - default: // These instructions cannot be flopped around. + case ICmpInst::ICMP_NE: + // If we know that C1 != C2, we can only partially decide this relation. + if (predicate == ICmpInst::ICMP_EQ) return ConstantBool::getFalse(); + if (predicate == ICmpInst::ICMP_NE) return ConstantBool::getTrue(); + break; + } + + if (!isa(C1) && isa(C2)) { + // If C2 is a constant expr and C1 isn't, flop them around and fold the + // other way if possible. + switch (predicate) { + case ICmpInst::ICMP_EQ: + case ICmpInst::ICMP_NE: + // No change of predicate required. + return ConstantFoldCompareInstruction(predicate, C2, C1); + + case ICmpInst::ICMP_ULT: + case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SLE: + case ICmpInst::ICMP_UGE: + case ICmpInst::ICMP_SGE: + // Change the predicate as necessary to swap the operands. + predicate = ICmpInst::getSwappedPredicate((ICmpInst::Predicate)predicate); + return ConstantFoldCompareInstruction(predicate, C2, C1); + + default: // These predicates cannot be flopped around. break; } } return 0; } -Constant *llvm::ConstantFoldCompare( - unsigned opcode, Constant *C1, Constant *C2, unsigned short predicate) -{ - // Place holder for future folding of ICmp and FCmp instructions - return 0; -} - Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, const std::vector &IdxList) { if (IdxList.size() == 0 || diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index ee3c64cc598..a9e3e5809aa 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -45,8 +45,8 @@ namespace llvm { const Constant *Mask); Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, const Constant *V2); - Constant *ConstantFoldCompare(unsigned opcode, Constant *C1, Constant *C2, - unsigned short predicate); + Constant *ConstantFoldCompareInstruction(unsigned short predicate, + Constant *C1, Constant *C2); Constant *ConstantFoldGetElementPtr(const Constant *C, const std::vector &IdxList); } // End llvm namespace diff --git a/lib/VMCore/ConstantFolding.h b/lib/VMCore/ConstantFolding.h index ee3c64cc598..a9e3e5809aa 100644 --- a/lib/VMCore/ConstantFolding.h +++ b/lib/VMCore/ConstantFolding.h @@ -45,8 +45,8 @@ namespace llvm { const Constant *Mask); Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, const Constant *V2); - Constant *ConstantFoldCompare(unsigned opcode, Constant *C1, Constant *C2, - unsigned short predicate); + Constant *ConstantFoldCompareInstruction(unsigned short predicate, + Constant *C1, Constant *C2); Constant *ConstantFoldGetElementPtr(const Constant *C, const std::vector &IdxList); } // End llvm namespace diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index e7953a90e70..4bfd1dcf8d4 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -265,12 +265,6 @@ ConstantPacked::~ConstantPacked() { delete [] OperandList; } -static bool isSetCC(unsigned Opcode) { - return Opcode == Instruction::SetEQ || Opcode == Instruction::SetNE || - Opcode == Instruction::SetLT || Opcode == Instruction::SetGT || - Opcode == Instruction::SetLE || Opcode == Instruction::SetGE; -} - // We declare several classes private to this file, so use an anonymous // namespace namespace { @@ -290,8 +284,7 @@ class VISIBILITY_HIDDEN BinaryConstantExpr : public ConstantExpr { Use Ops[2]; public: BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2) - : ConstantExpr(isSetCC(Opcode) ? Type::BoolTy : C1->getType(), - Opcode, Ops, 2) { + : ConstantExpr(C1->getType(), Opcode, Ops, 2) { Ops[0].init(C1, this); Ops[1].init(C2, this); } @@ -448,24 +441,6 @@ Constant *ConstantExpr::getOr(Constant *C1, Constant *C2) { Constant *ConstantExpr::getXor(Constant *C1, Constant *C2) { return get(Instruction::Xor, C1, C2); } -Constant *ConstantExpr::getSetEQ(Constant *C1, Constant *C2) { - return get(Instruction::SetEQ, C1, C2); -} -Constant *ConstantExpr::getSetNE(Constant *C1, Constant *C2) { - return get(Instruction::SetNE, C1, C2); -} -Constant *ConstantExpr::getSetLT(Constant *C1, Constant *C2) { - return get(Instruction::SetLT, C1, C2); -} -Constant *ConstantExpr::getSetGT(Constant *C1, Constant *C2) { - return get(Instruction::SetGT, C1, C2); -} -Constant *ConstantExpr::getSetLE(Constant *C1, Constant *C2) { - return get(Instruction::SetLE, C1, C2); -} -Constant *ConstantExpr::getSetGE(Constant *C1, Constant *C2) { - return get(Instruction::SetGE, C1, C2); -} unsigned ConstantExpr::getPredicate() const { assert(getOpcode() == Instruction::FCmp || getOpcode() == Instruction::ICmp); return dynamic_cast(this)->predicate; @@ -582,6 +557,9 @@ getWithOperands(const std::vector &Ops) const { std::vector ActualOps(Ops.begin()+1, Ops.end()); return ConstantExpr::getGetElementPtr(Ops[0], ActualOps); } + case Instruction::ICmp: + case Instruction::FCmp: + return ConstantExpr::getCompare(getPredicate(), Ops[0], Ops[1]); default: assert(getNumOperands() == 2 && "Must be binary operator?"); return ConstantExpr::get(getOpcode(), Ops[0], Ops[1]); @@ -1657,8 +1635,7 @@ Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode, assert(C1->getType() == C2->getType() && "Operand types in binary constant expression should match"); - if (ReqTy == C1->getType() || (Instruction::isComparison(Opcode) && - ReqTy == Type::BoolTy)) + if (ReqTy == C1->getType() || ReqTy == Type::BoolTy) if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2)) return FC; // Fold a few common cases... @@ -1667,11 +1644,23 @@ Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode, return ExprConstants->getOrCreate(ReqTy, Key); } -Constant *ConstantExpr::getCompareTy(unsigned Opcode, unsigned short predicate, +Constant *ConstantExpr::getCompareTy(unsigned short predicate, Constant *C1, Constant *C2) { - if (Opcode == Instruction::ICmp) - return getICmp(predicate, C1, C2); - return getFCmp(predicate, C1, C2); + switch (predicate) { + default: assert(0 && "Invalid CmpInst predicate"); + case FCmpInst::FCMP_FALSE: case FCmpInst::FCMP_OEQ: case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_OGE: case FCmpInst::FCMP_OLT: case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ONE: case FCmpInst::FCMP_ORD: case FCmpInst::FCMP_UNO: + case FCmpInst::FCMP_UEQ: case FCmpInst::FCMP_UGT: case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_ULT: case FCmpInst::FCMP_ULE: case FCmpInst::FCMP_UNE: + case FCmpInst::FCMP_TRUE: + return getFCmp(predicate, C1, C2); + case ICmpInst::ICMP_EQ: case ICmpInst::ICMP_NE: case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: case ICmpInst::ICMP_ULT: case ICmpInst::ICMP_ULE: + case ICmpInst::ICMP_SGT: case ICmpInst::ICMP_SGE: case ICmpInst::ICMP_SLT: + case ICmpInst::ICMP_SLE: + return getICmp(predicate, C1, C2); + } } Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) { @@ -1718,10 +1707,6 @@ Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) { assert((C1->getType()->isIntegral() || isa(C1->getType())) && "Tried to create a logical operation on a non-integral type!"); break; - case Instruction::SetLT: case Instruction::SetGT: case Instruction::SetLE: - case Instruction::SetGE: case Instruction::SetEQ: case Instruction::SetNE: - assert(C1->getType() == C2->getType() && "Op types should be identical!"); - break; case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: @@ -1737,10 +1722,10 @@ Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) { return getTy(C1->getType(), Opcode, C1, C2); } -Constant *ConstantExpr::getCompare(unsigned Opcode, unsigned short pred, +Constant *ConstantExpr::getCompare(unsigned short pred, Constant *C1, Constant *C2) { assert(C1->getType() == C2->getType() && "Op types should be identical!"); - return getCompareTy(Opcode, pred, C1, C2); + return getCompareTy(pred, C1, C2); } Constant *ConstantExpr::getSelectTy(const Type *ReqTy, Constant *C, @@ -1826,7 +1811,7 @@ ConstantExpr::getICmp(unsigned short pred, Constant* LHS, Constant* RHS) { assert(pred >= ICmpInst::FIRST_ICMP_PREDICATE && pred <= ICmpInst::LAST_ICMP_PREDICATE && "Invalid ICmp Predicate"); - if (Constant *FC = ConstantFoldCompare(Instruction::ICmp, LHS, RHS, pred)) + if (Constant *FC = ConstantFoldCompareInstruction(pred, LHS, RHS)) return FC; // Fold a few common cases... // Look up the constant in the table first to ensure uniqueness @@ -1843,7 +1828,7 @@ ConstantExpr::getFCmp(unsigned short pred, Constant* LHS, Constant* RHS) { assert(LHS->getType() == RHS->getType()); assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && "Invalid FCmp Predicate"); - if (Constant *FC = ConstantFoldCompare(Instruction::FCmp, LHS, RHS, pred)) + if (Constant *FC = ConstantFoldCompareInstruction(pred, LHS, RHS)) return FC; // Fold a few common cases... // Look up the constant in the table first to ensure uniqueness diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index d3d2f342ca6..28912699791 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -106,14 +106,6 @@ const char *Instruction::getOpcodeName(unsigned OpCode) { case Or : return "or"; case Xor: return "xor"; - // SetCC operators... - case SetLE: return "setle"; - case SetGE: return "setge"; - case SetLT: return "setlt"; - case SetGT: return "setgt"; - case SetEQ: return "seteq"; - case SetNE: return "setne"; - // Memory instructions... case Malloc: return "malloc"; case Free: return "free"; @@ -176,8 +168,35 @@ bool Instruction::isIdenticalTo(Instruction *I) const { return LI->isVolatile() == cast(I)->isVolatile(); if (const StoreInst *SI = dyn_cast(this)) return SI->isVolatile() == cast(I)->isVolatile(); + if (const CmpInst *CI = dyn_cast(this)) + return CI->getPredicate() == cast(I)->getPredicate(); + if (const CallInst *CI = dyn_cast(this)) + return CI->isTailCall() == cast(I)->isTailCall(); + return true; +} + +// isSameOperationAs +bool Instruction::isSameOperationAs(Instruction *I) const { + if (getOpcode() != I->getOpcode() || getType() != I->getType() || + getNumOperands() != I->getNumOperands()) + return false; + + // We have two instructions of identical opcode and #operands. Check to see + // if all operands are the same type + for (unsigned i = 0, e = getNumOperands(); i != e; ++i) + if (getOperand(i)->getType() != I->getOperand(i)->getType()) + return false; + + // Check special state that is a part of some instructions. + if (const LoadInst *LI = dyn_cast(this)) + return LI->isVolatile() == cast(I)->isVolatile(); + if (const StoreInst *SI = dyn_cast(this)) + return SI->isVolatile() == cast(I)->isVolatile(); + if (const CmpInst *CI = dyn_cast(this)) + return CI->getPredicate() == cast(I)->getPredicate(); if (const CallInst *CI = dyn_cast(this)) return CI->isTailCall() == cast(I)->isTailCall(); + return true; } @@ -213,31 +232,12 @@ bool Instruction::isCommutative(unsigned op) { case And: case Or: case Xor: - case SetEQ: - case SetNE: return true; default: return false; } } -/// isComparison - Return true if the instruction is a Set* instruction: -/// -bool Instruction::isComparison(unsigned op) { - switch (op) { - case SetEQ: - case SetNE: - case SetLT: - case SetGT: - case SetLE: - case SetGE: - return true; - } - return false; -} - - - /// isTrappingInstruction - Return true if the instruction may trap. /// bool Instruction::isTrapping(unsigned op) { diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index cf1e5e91e54..48784099d9c 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -1068,9 +1068,6 @@ void BinaryOperator::init(BinaryOps iType) cast(getType())->getElementType()->isIntegral())) && "Tried to create a logical operation on a non-integral type!"); break; - case SetLT: case SetGT: case SetLE: - case SetGE: case SetEQ: case SetNE: - assert(getType() == Type::BoolTy && "Setcc must return bool!"); default: break; } @@ -1082,15 +1079,7 @@ BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2, Instruction *InsertBefore) { assert(S1->getType() == S2->getType() && "Cannot create binary operator with two operands of differing type!"); - switch (Op) { - // Binary comparison operators... - case SetLT: case SetGT: case SetLE: - case SetGE: case SetEQ: case SetNE: - return new SetCondInst(Op, S1, S2, Name, InsertBefore); - - default: - return new BinaryOperator(Op, S1, S2, S1->getType(), Name, InsertBefore); - } + return new BinaryOperator(Op, S1, S2, S1->getType(), Name, InsertBefore); } BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2, @@ -1210,14 +1199,8 @@ const Value *BinaryOperator::getNotArgument(const Value *BinOp) { // order dependent (SetLT f.e.) the opcode is changed. // bool BinaryOperator::swapOperands() { - if (isCommutative()) - ; // If the instruction is commutative, it is safe to swap the operands - else if (SetCondInst *SCI = dyn_cast(this)) - /// FIXME: SetCC instructions shouldn't all have different opcodes. - setOpcode(SCI->getSwappedCondition()); - else - return true; // Can't commute operands - + if (!isCommutative()) + return true; // Can't commute operands std::swap(Ops[0], Ops[1]); return false; } @@ -1925,58 +1908,6 @@ BitCastInst::BitCastInst( assert(checkCast(getOpcode(), S, Ty) && "Illegal BitCast"); } -//===----------------------------------------------------------------------===// -// SetCondInst Class -//===----------------------------------------------------------------------===// - -SetCondInst::SetCondInst(BinaryOps Opcode, Value *S1, Value *S2, - const std::string &Name, Instruction *InsertBefore) - : BinaryOperator(Opcode, S1, S2, Type::BoolTy, Name, InsertBefore) { - - // Make sure it's a valid type... getInverseCondition will assert out if not. - assert(getInverseCondition(Opcode)); -} - -SetCondInst::SetCondInst(BinaryOps Opcode, Value *S1, Value *S2, - const std::string &Name, BasicBlock *InsertAtEnd) - : BinaryOperator(Opcode, S1, S2, Type::BoolTy, Name, InsertAtEnd) { - - // Make sure it's a valid type... getInverseCondition will assert out if not. - assert(getInverseCondition(Opcode)); -} - -// getInverseCondition - Return the inverse of the current condition opcode. -// For example seteq -> setne, setgt -> setle, setlt -> setge, etc... -// -Instruction::BinaryOps SetCondInst::getInverseCondition(BinaryOps Opcode) { - switch (Opcode) { - default: - assert(0 && "Unknown setcc opcode!"); - case SetEQ: return SetNE; - case SetNE: return SetEQ; - case SetGT: return SetLE; - case SetLT: return SetGE; - case SetGE: return SetLT; - case SetLE: return SetGT; - } -} - -// getSwappedCondition - Return the condition opcode that would be the result -// of exchanging the two operands of the setcc instruction without changing -// the result produced. Thus, seteq->seteq, setle->setge, setlt->setgt, etc. -// -Instruction::BinaryOps SetCondInst::getSwappedCondition(BinaryOps Opcode) { - switch (Opcode) { - default: assert(0 && "Unknown setcc instruction!"); - case SetEQ: case SetNE: return Opcode; - case SetGT: return SetLT; - case SetLT: return SetGT; - case SetGE: return SetLE; - case SetLE: return SetGE; - } -} - - //===----------------------------------------------------------------------===// // CmpInst Classes //===----------------------------------------------------------------------===// @@ -2111,7 +2042,7 @@ ICmpInst::Predicate ICmpInst::getInversePredicate(Predicate pred) { ICmpInst::Predicate ICmpInst::getSwappedPredicate(Predicate pred) { switch (pred) { - default: assert(! "Unknown setcc instruction!"); + default: assert(! "Unknown icmp predicate!"); case ICMP_EQ: case ICMP_NE: return pred; case ICMP_SGT: return ICMP_SLT; @@ -2125,6 +2056,30 @@ ICmpInst::Predicate ICmpInst::getSwappedPredicate(Predicate pred) { } } +ICmpInst::Predicate ICmpInst::getSignedPredicate(Predicate pred) { + switch (pred) { + default: assert(! "Unknown icmp predicate!"); + case ICMP_EQ: case ICMP_NE: + case ICMP_SGT: case ICMP_SLT: case ICMP_SGE: case ICMP_SLE: + return pred; + case ICMP_UGT: return ICMP_SGT; + case ICMP_ULT: return ICMP_SLT; + case ICMP_UGE: return ICMP_SGE; + case ICMP_ULE: return ICMP_SLE; + } +} + +bool ICmpInst::isSignedPredicate(Predicate pred) { + switch (pred) { + default: assert(! "Unknown icmp predicate!"); + case ICMP_SGT: case ICMP_SLT: case ICMP_SGE: case ICMP_SLE: + return true; + case ICMP_EQ: case ICMP_NE: case ICMP_UGT: case ICMP_ULT: + case ICMP_UGE: case ICMP_ULE: + return false; + } +} + FCmpInst::Predicate FCmpInst::getInversePredicate(Predicate pred) { switch (pred) { default: @@ -2150,7 +2105,7 @@ FCmpInst::Predicate FCmpInst::getInversePredicate(Predicate pred) { FCmpInst::Predicate FCmpInst::getSwappedPredicate(Predicate pred) { switch (pred) { - default: assert(!"Unknown setcc instruction!"); + default: assert(!"Unknown fcmp predicate!"); case FCMP_FALSE: case FCMP_TRUE: case FCMP_OEQ: case FCMP_ONE: case FCMP_UEQ: case FCMP_UNE: @@ -2167,6 +2122,40 @@ FCmpInst::Predicate FCmpInst::getSwappedPredicate(Predicate pred) { } } +bool CmpInst::isUnsigned(unsigned short predicate) { + switch (predicate) { + default: return false; + case ICmpInst::ICMP_ULT: case ICmpInst::ICMP_ULE: case ICmpInst::ICMP_UGT: + case ICmpInst::ICMP_UGE: return true; + } +} + +bool CmpInst::isSigned(unsigned short predicate){ + switch (predicate) { + default: return false; + case ICmpInst::ICMP_SLT: case ICmpInst::ICMP_SLE: case ICmpInst::ICMP_SGT: + case ICmpInst::ICMP_SGE: return true; + } +} + +bool CmpInst::isOrdered(unsigned short predicate) { + switch (predicate) { + default: return false; + case FCmpInst::FCMP_OEQ: case FCmpInst::FCMP_ONE: case FCmpInst::FCMP_OGT: + case FCmpInst::FCMP_OLT: case FCmpInst::FCMP_OGE: case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_ORD: return true; + } +} + +bool CmpInst::isUnordered(unsigned short predicate) { + switch (predicate) { + default: return false; + case FCmpInst::FCMP_UEQ: case FCmpInst::FCMP_UNE: case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_ULT: case FCmpInst::FCMP_UGE: case FCmpInst::FCMP_ULE: + case FCmpInst::FCMP_UNO: return true; + } +} + //===----------------------------------------------------------------------===// // SwitchInst Implementation //===----------------------------------------------------------------------===// diff --git a/lib/VMCore/SymbolTable.cpp b/lib/VMCore/SymbolTable.cpp index 06a43a7867a..7ea3377ab91 100644 --- a/lib/VMCore/SymbolTable.cpp +++ b/lib/VMCore/SymbolTable.cpp @@ -230,7 +230,7 @@ void SymbolTable::insertEntry(const std::string &Name, const Type *VTy, } -// insertEntry - Insert a value into the symbol table with the specified +// insertEntry - Insert a type into the symbol table with the specified // name... // void SymbolTable::insert(const std::string& Name, const Type* T) { diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index ea30ca48a7f..70796e53a1d 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -719,10 +719,6 @@ void Verifier::visitBinaryOperator(BinaryOperator &B) { Assert1(B.getType() == B.getOperand(0)->getType(), "Logical operators must have same type for operands and result!", &B); - } else if (isa(B)) { - // Check that setcc instructions return bool - Assert1(B.getType() == Type::BoolTy, - "setcc instructions must return boolean values!", &B); } else { // Arithmetic operators only work on integer or fp values Assert1(B.getType() == B.getOperand(0)->getType(), diff --git a/projects/Stacker/lib/compiler/StackerCompiler.cpp b/projects/Stacker/lib/compiler/StackerCompiler.cpp index 8c83447e88d..2f01fbbb0bf 100644 --- a/projects/Stacker/lib/compiler/StackerCompiler.cpp +++ b/projects/Stacker/lib/compiler/StackerCompiler.cpp @@ -721,7 +721,7 @@ StackerCompiler::handle_if( char* ifTrue, char* ifFalse ) LoadInst* cond = cast( pop_integer(bb) ); // Compare the condition against 0 - SetCondInst* cond_inst = new SetCondInst( Instruction::SetNE, cond, + ICmpInst* cond_inst = new ICmpInst( ICmpInst::ICMP_NE, cond, ConstantInt::get( Type::LongTy, 0) ); bb->getInstList().push_back( cond_inst ); @@ -735,7 +735,7 @@ StackerCompiler::handle_if( char* ifTrue, char* ifFalse ) BasicBlock* false_bb = 0; if ( ifFalse ) false_bb = new BasicBlock((echo?"else":"")); - // Create a branch on the SetCond + // Create a branch on the ICmp BranchInst* br_inst = new BranchInst( true_bb, ( ifFalse ? false_bb : exit_bb ), cond_inst ); bb->getInstList().push_back( br_inst ); @@ -805,8 +805,8 @@ StackerCompiler::handle_while( char* todo ) LoadInst* cond = cast( stack_top(test) ); // Compare the condition against 0 - SetCondInst* cond_inst = new SetCondInst( - Instruction::SetNE, cond, ConstantInt::get( Type::LongTy, 0)); + ICmpInst* cond_inst = new ICmpInst( + ICmpInst::ICMP_NE, cond, ConstantInt::get( Type::LongTy, 0)); test->getInstList().push_back( cond_inst ); // Add the branch instruction @@ -920,8 +920,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("LESS"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetLT, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SLT, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -931,8 +931,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("MORE"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetGT, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SGT, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -942,8 +942,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("LE"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetLE, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SLE, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -953,8 +953,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("GE"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetGE, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SGE, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -964,8 +964,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("NE"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetNE, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_NE, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -975,8 +975,8 @@ StackerCompiler::handle_word( int tkn ) if (echo) bb->setName("EQ"); LoadInst* op1 = cast(pop_integer(bb)); LoadInst* op2 = cast(pop_integer(bb)); - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetEQ, op1, op2 ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_EQ, op1, op2 ); bb->getInstList().push_back( cond_inst ); push_value( bb, cond_inst ); break; @@ -1102,8 +1102,8 @@ StackerCompiler::handle_word( int tkn ) LoadInst* op1 = cast(stack_top(bb)); // Determine if its negative - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetLT, op1, Zero ); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SLT, op1, Zero ); bb->getInstList().push_back( cond_inst ); // Create a block for storing the result @@ -1112,7 +1112,7 @@ StackerCompiler::handle_word( int tkn ) // Create a block for making it a positive value BasicBlock* pos_bb = new BasicBlock((echo?"neg":"")); - // Create the branch on the SetCond + // Create the branch on the ICmp BranchInst* br_inst = new BranchInst( pos_bb, exit_bb, cond_inst ); bb->getInstList().push_back( br_inst ); @@ -1143,11 +1143,11 @@ StackerCompiler::handle_word( int tkn ) LoadInst* op2 = cast(pop_integer(bb)); // Compare them - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetLT, op1, op2); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SLT, op1, op2); bb->getInstList().push_back( cond_inst ); - // Create a branch on the SetCond + // Create a branch on the ICmp BranchInst* br_inst = new BranchInst( op1_block, op2_block, cond_inst ); bb->getInstList().push_back( br_inst ); @@ -1175,8 +1175,8 @@ StackerCompiler::handle_word( int tkn ) LoadInst* op2 = cast(pop_integer(bb)); // Compare them - SetCondInst* cond_inst = - new SetCondInst( Instruction::SetGT, op1, op2); + ICmpInst* cond_inst = + new ICmpInst( ICmpInst::ICMP_SGT, op1, op2); bb->getInstList().push_back( cond_inst ); // Create an exit block @@ -1192,7 +1192,7 @@ StackerCompiler::handle_word( int tkn ) push_value(op2_block, op2); op2_block->getInstList().push_back( new BranchInst( exit_bb ) ); - // Create a banch on the SetCond + // Create a banch on the ICmp BranchInst* br_inst = new BranchInst( op1_block, op2_block, cond_inst ); bb->getInstList().push_back( br_inst ); diff --git a/test/CFrontend/2006-12-14-ordered_expr.c b/test/CFrontend/2006-12-14-ordered_expr.c index 4e7dafe82d0..090b989affc 100644 --- a/test/CFrontend/2006-12-14-ordered_expr.c +++ b/test/CFrontend/2006-12-14-ordered_expr.c @@ -1,5 +1,4 @@ -// RUN: %llvmgcc -O3 -S %s -o - | grep llvm.isunordered && -// RUN: %llvmgcc -O3 -S %s -o - | grep xor +// RUN: %llvmgcc -O3 -S %s -o - | grep 'fcmp ord float %X, %Y' int test2(float X, float Y) { return !__builtin_isunordered(X, Y); diff --git a/test/Transforms/IndVarsSimplify/tripcount_infinite.llx b/test/Transforms/IndVarsSimplify/tripcount_infinite.llx index d20e85532a1..8a7b27c3b29 100644 --- a/test/Transforms/IndVarsSimplify/tripcount_infinite.llx +++ b/test/Transforms/IndVarsSimplify/tripcount_infinite.llx @@ -1,8 +1,8 @@ ; These tests have an infinite trip count. We obviously shouldn't remove the ; loops! :) ; -; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | llvm-dis | grep set | wc -l > %t2 -; RUN: llvm-upgrade < %s | llvm-as | llvm-dis | grep set | wc -l > %t1 +; RUN: llvm-upgrade < %s | llvm-as | opt -indvars -adce -simplifycfg | llvm-dis | grep icmp | wc -l > %t2 +; RUN: llvm-upgrade < %s | llvm-as | llvm-dis | grep icmp | wc -l > %t1 ; RUN: diff %t1 %t2 int %infinite_linear() { ;; test for (i = 1; i != 100; i += 2) diff --git a/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll b/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll index 4881b5558d5..3c2c25c31d1 100644 --- a/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll +++ b/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll @@ -1,4 +1,4 @@ -; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep 'setlt' +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis|grep 'icmp slt' ; ModuleID = 'visible.bc' target datalayout = "e-p:32:32" target endian = little diff --git a/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll b/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll new file mode 100644 index 00000000000..e5ac37b950b --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-10-ICmp-GEP-GEP.ll @@ -0,0 +1,165 @@ +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \ +; RUN: grep -v 'icmp ult int' +; ModuleID = 'good.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" + %struct.edgeBox = type { short, short, short, short, short, short } +%qsz = external global int ; [#uses=12] +%thresh = external global int ; [#uses=2] +%mthresh = external global int ; [#uses=1] + +implementation ; Functions: + +int %qsorte(sbyte* %base, int %n, int %size) { +entry: + %tmp = setgt int %n, 1 ; [#uses=1] + br bool %tmp, label %cond_next, label %return + +cond_next: ; preds = %entry + store int %size, int* %qsz + %tmp3 = shl int %size, ubyte 2 ; [#uses=1] + store int %tmp3, int* %thresh + %tmp4 = load int* %qsz ; [#uses=1] + %tmp5 = mul int %tmp4, 6 ; [#uses=1] + store int %tmp5, int* %mthresh + %tmp6 = load int* %qsz ; [#uses=1] + %tmp8 = mul int %tmp6, %n ; [#uses=1] + %tmp9 = getelementptr sbyte* %base, int %tmp8 ; [#uses=3] + %tmp11 = setgt int %n, 3 ; [#uses=1] + br bool %tmp11, label %cond_true12, label %bb30 + +cond_true12: ; preds = %cond_next + %tmp156 = call int %qste( sbyte* %base, sbyte* %tmp9 ) ; [#uses=0] + %tmp16 = load int* %thresh ; [#uses=1] + %tmp18 = getelementptr sbyte* %base, int %tmp16 ; [#uses=2] + %tmp3117 = load int* %qsz ; [#uses=1] + %tmp3318 = getelementptr sbyte* %base, int %tmp3117 ; [#uses=2] + %tmp3621 = setlt sbyte* %tmp3318, %tmp18 ; [#uses=1] + br bool %tmp3621, label %bb, label %bb37 + +bb: ; preds = %bb30, %cond_true12 + %hi.0.0 = phi sbyte* [ %tmp18, %cond_true12 ], [ %hi.0, %bb30 ] ; [#uses=4] + %j.1.0 = phi sbyte* [ %base, %cond_true12 ], [ %j.1, %bb30 ] ; [#uses=4] + %tmp33.0 = phi sbyte* [ %tmp3318, %cond_true12 ], [ %tmp33, %bb30 ] ; [#uses=6] + %tmp3 = bitcast sbyte* %j.1.0 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp4 = bitcast sbyte* %tmp33.0 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp255 = call int %comparee( %struct.edgeBox* %tmp3, %struct.edgeBox* %tmp4 ) ; [#uses=1] + %tmp26 = setgt int %tmp255, 0 ; [#uses=1] + br bool %tmp26, label %cond_true27, label %bb30 + +cond_true27: ; preds = %bb + br label %bb30 + +bb30: ; preds = %cond_true27, %bb, %cond_next + %hi.0.3 = phi sbyte* [ %hi.0.0, %cond_true27 ], [ %hi.0.0, %bb ], [ undef, %cond_next ] ; [#uses=0] + %j.1.3 = phi sbyte* [ %j.1.0, %cond_true27 ], [ %j.1.0, %bb ], [ undef, %cond_next ] ; [#uses=0] + %tmp33.3 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %tmp33.0, %bb ], [ undef, %cond_next ] ; [#uses=0] + %hi.0 = phi sbyte* [ %tmp9, %cond_next ], [ %hi.0.0, %bb ], [ %hi.0.0, %cond_true27 ] ; [#uses=2] + %lo.1 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %tmp33.0, %bb ], [ %base, %cond_next ] ; [#uses=1] + %j.1 = phi sbyte* [ %tmp33.0, %cond_true27 ], [ %j.1.0, %bb ], [ %base, %cond_next ] ; [#uses=2] + %tmp31 = load int* %qsz ; [#uses=1] + %tmp33 = getelementptr sbyte* %lo.1, int %tmp31 ; [#uses=2] + %tmp36 = setlt sbyte* %tmp33, %hi.0 ; [#uses=1] + br bool %tmp36, label %bb, label %bb37 + +bb37: ; preds = %bb30, %cond_true12 + %j.1.1 = phi sbyte* [ %j.1, %bb30 ], [ %base, %cond_true12 ] ; [#uses=4] + %tmp40 = seteq sbyte* %j.1.1, %base ; [#uses=1] + br bool %tmp40, label %bb115, label %cond_true41 + +cond_true41: ; preds = %bb37 + %tmp43 = load int* %qsz ; [#uses=1] + %tmp45 = getelementptr sbyte* %base, int %tmp43 ; [#uses=2] + %tmp6030 = setlt sbyte* %base, %tmp45 ; [#uses=1] + br bool %tmp6030, label %bb46, label %bb115 + +bb46: ; preds = %bb46, %cond_true41 + %j.2.0 = phi sbyte* [ %j.1.1, %cond_true41 ], [ %tmp52, %bb46 ] ; [#uses=3] + %i.2.0 = phi sbyte* [ %base, %cond_true41 ], [ %tmp56, %bb46 ] ; [#uses=3] + %tmp = load sbyte* %j.2.0 ; [#uses=2] + %tmp49 = load sbyte* %i.2.0 ; [#uses=1] + store sbyte %tmp49, sbyte* %j.2.0 + %tmp52 = getelementptr sbyte* %j.2.0, int 1 ; [#uses=2] + store sbyte %tmp, sbyte* %i.2.0 + %tmp56 = getelementptr sbyte* %i.2.0, int 1 ; [#uses=3] + %tmp60 = setlt sbyte* %tmp56, %tmp45 ; [#uses=1] + br bool %tmp60, label %bb46, label %bb115 + +bb66: ; preds = %bb115, %bb66 + %hi.3 = phi sbyte* [ %tmp118, %bb115 ], [ %tmp70, %bb66 ] ; [#uses=2] + %tmp67 = load int* %qsz ; [#uses=2] + %tmp68 = sub int 0, %tmp67 ; [#uses=1] + %tmp70 = getelementptr sbyte* %hi.3, int %tmp68 ; [#uses=2] + %tmp = bitcast sbyte* %tmp70 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp1 = bitcast sbyte* %tmp118 to %struct.edgeBox* ; <%struct.edgeBox*> [#uses=1] + %tmp732 = call int %comparee( %struct.edgeBox* %tmp, %struct.edgeBox* %tmp1 ) ; [#uses=1] + %tmp74 = setgt int %tmp732, 0 ; [#uses=1] + br bool %tmp74, label %bb66, label %bb75 + +bb75: ; preds = %bb66 + %tmp76 = load int* %qsz ; [#uses=1] + %tmp70.sum = sub int %tmp76, %tmp67 ; [#uses=1] + %tmp78 = getelementptr sbyte* %hi.3, int %tmp70.sum ; [#uses=3] + %tmp81 = seteq sbyte* %tmp78, %tmp118 ; [#uses=1] + br bool %tmp81, label %bb115, label %cond_true82 + +cond_true82: ; preds = %bb75 + %tmp83 = load int* %qsz ; [#uses=1] + %tmp118.sum = add int %tmp116, %tmp83 ; [#uses=1] + %tmp85 = getelementptr sbyte* %min.1, int %tmp118.sum ; [#uses=1] + %tmp10937 = getelementptr sbyte* %tmp85, int -1 ; [#uses=3] + %tmp11239 = setlt sbyte* %tmp10937, %tmp118 ; [#uses=1] + br bool %tmp11239, label %bb115, label %bb86 + +bb86: ; preds = %bb104, %cond_true82 + %tmp109.0 = phi sbyte* [ %tmp10937, %cond_true82 ], [ %tmp109, %bb104 ] ; [#uses=5] + %i.5.2 = phi sbyte* [ %i.5.3, %cond_true82 ], [ %i.5.1, %bb104 ] ; [#uses=0] + %tmp100.2 = phi sbyte* [ %tmp100.3, %cond_true82 ], [ %tmp100.1, %bb104 ] ; [#uses=0] + %tmp88 = load sbyte* %tmp109.0 ; [#uses=2] + %tmp9746 = load int* %qsz ; [#uses=1] + %tmp9847 = sub int 0, %tmp9746 ; [#uses=1] + %tmp10048 = getelementptr sbyte* %tmp109.0, int %tmp9847 ; [#uses=3] + %tmp10350 = setlt sbyte* %tmp10048, %tmp78 ; [#uses=1] + br bool %tmp10350, label %bb104, label %bb91 + +bb91: ; preds = %bb91, %bb86 + %i.5.0 = phi sbyte* [ %tmp109.0, %bb86 ], [ %tmp100.0, %bb91 ] ; [#uses=1] + %tmp100.0 = phi sbyte* [ %tmp10048, %bb86 ], [ %tmp100, %bb91 ] ; [#uses=4] + %tmp93 = load sbyte* %tmp100.0 ; [#uses=1] + store sbyte %tmp93, sbyte* %i.5.0 + %tmp97 = load int* %qsz ; [#uses=1] + %tmp98 = sub int 0, %tmp97 ; [#uses=1] + %tmp100 = getelementptr sbyte* %tmp100.0, int %tmp98 ; [#uses=3] + %tmp103 = setlt sbyte* %tmp100, %tmp78 ; [#uses=1] + br bool %tmp103, label %bb104, label %bb91 + +bb104: ; preds = %bb91, %bb86 + %i.5.1 = phi sbyte* [ %tmp109.0, %bb86 ], [ %tmp100.0, %bb91 ] ; [#uses=4] + %tmp100.1 = phi sbyte* [ %tmp10048, %bb86 ], [ %tmp100, %bb91 ] ; [#uses=3] + store sbyte %tmp88, sbyte* %i.5.1 + %tmp109 = getelementptr sbyte* %tmp109.0, int -1 ; [#uses=3] + %tmp112 = setlt sbyte* %tmp109, %tmp118 ; [#uses=1] + br bool %tmp112, label %bb115, label %bb86 + +bb115: ; preds = %bb104, %cond_true82, %bb75, %bb46, %cond_true41, %bb37 + %tmp109.1 = phi sbyte* [ undef, %bb37 ], [ %tmp109.1, %bb75 ], [ %tmp10937, %cond_true82 ], [ %tmp109, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; [#uses=1] + %i.5.3 = phi sbyte* [ undef, %bb37 ], [ %i.5.3, %bb75 ], [ %i.5.3, %cond_true82 ], [ %i.5.1, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; [#uses=3] + %tmp100.3 = phi sbyte* [ undef, %bb37 ], [ %tmp100.3, %bb75 ], [ %tmp100.3, %cond_true82 ], [ %tmp100.1, %bb104 ], [ undef, %bb46 ], [ undef, %cond_true41 ] ; [#uses=3] + %min.1 = phi sbyte* [ %tmp118, %bb104 ], [ %tmp118, %bb75 ], [ %base, %bb37 ], [ %base, %bb46 ], [ %base, %cond_true41 ], [ %tmp118, %cond_true82 ] ; [#uses=2] + %j.5 = phi sbyte* [ %tmp100.1, %bb104 ], [ %j.5, %bb75 ], [ %tmp52, %bb46 ], [ %j.1.1, %bb37 ], [ %j.1.1, %cond_true41 ], [ %j.5, %cond_true82 ] ; [#uses=2] + %i.4 = phi sbyte* [ %i.5.1, %bb104 ], [ %i.4, %bb75 ], [ %tmp56, %bb46 ], [ undef, %bb37 ], [ %base, %cond_true41 ], [ %i.4, %cond_true82 ] ; [#uses=2] + %c.4 = phi sbyte [ %tmp88, %bb104 ], [ %c.4, %bb75 ], [ %tmp, %bb46 ], [ undef, %bb37 ], [ undef, %cond_true41 ], [ %c.4, %cond_true82 ] ; [#uses=2] + %tmp116 = load int* %qsz ; [#uses=2] + %tmp118 = getelementptr sbyte* %min.1, int %tmp116 ; [#uses=9] + %tmp122 = setlt sbyte* %tmp118, %tmp9 ; [#uses=1] + br bool %tmp122, label %bb66, label %return + +return: ; preds = %bb115, %entry + ret int undef +} + +declare int %qste(sbyte*, sbyte*) + +declare int %comparee(%struct.edgeBox*, %struct.edgeBox*) diff --git a/test/Transforms/InstCombine/2006-12-15-Range-Test.ll b/test/Transforms/InstCombine/2006-12-15-Range-Test.ll new file mode 100644 index 00000000000..f7cf7e890a5 --- /dev/null +++ b/test/Transforms/InstCombine/2006-12-15-Range-Test.ll @@ -0,0 +1,32 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep 'icmp' | wc -l | grep 1 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep 'icmp ugt' | wc -l | grep 1 +; ModuleID = 'bugpoint-tooptimize.bc' +target datalayout = "e-p:32:32" +target endian = little +target pointersize = 32 +target triple = "i686-pc-linux-gnu" +%r = external global [17 x int] ; <[17 x int]*> [#uses=1] + +implementation ; Functions: + +bool %print_pgm_cond_true(int %tmp12.reload, int* %tmp16.out) { +newFuncRoot: + br label %cond_true + +bb27.exitStub: ; preds = %cond_true + store int %tmp16, int* %tmp16.out + ret bool true + +cond_next23.exitStub: ; preds = %cond_true + store int %tmp16, int* %tmp16.out + ret bool false + +cond_true: ; preds = %newFuncRoot + %tmp15 = getelementptr [17 x int]* %r, int 0, int %tmp12.reload ; [#uses=1] + %tmp16 = load int* %tmp15 ; [#uses=4] + %tmp18 = icmp slt int %tmp16, -31 ; [#uses=1] + %tmp21 = icmp sgt int %tmp16, 31 ; [#uses=1] + %bothcond = or bool %tmp18, %tmp21 ; [#uses=1] + br bool %bothcond, label %bb27.exitStub, label %cond_next23.exitStub +} + diff --git a/test/Transforms/InstCombine/JavaCompare.ll b/test/Transforms/InstCombine/JavaCompare.ll index f583fa92d9c..11f706e5662 100644 --- a/test/Transforms/InstCombine/JavaCompare.ll +++ b/test/Transforms/InstCombine/JavaCompare.ll @@ -1,7 +1,7 @@ ; This is the sequence of stuff that the Java front-end expands for a single ; <= comparison. Check to make sure we turn it into a <= (only) -; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v 'setle'| not grep '#uses' +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v 'icmp sle'| not grep '#uses' bool %le(int %A, int %B) { %c1 = setgt int %A, %B; diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index 8c6e37986fe..6cad43bd7dc 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/test/Transforms/InstCombine/cast.ll @@ -93,11 +93,12 @@ bool %test14(sbyte %A) { ret bool %X } -bool %test15(ubyte %A) { - %c = cast ubyte %A to sbyte - %X = setlt sbyte %c, 0 ; setgt %A, 127 - ret bool %X -} +; This just won't occur when there's no difference between ubyte and sbyte +;bool %test15(ubyte %A) { +; %c = cast ubyte %A to sbyte +; %X = setlt sbyte %c, 0 ; setgt %A, 127 +; ret bool %X +;} bool %test16(int* %P) { %c = cast int* %P to bool ;; setne P, null diff --git a/test/Transforms/InstCombine/set.ll b/test/Transforms/InstCombine/set.ll index a9ef2bf5512..ca1ccffe6b4 100644 --- a/test/Transforms/InstCombine/set.ll +++ b/test/Transforms/InstCombine/set.ll @@ -1,7 +1,7 @@ ; This test makes sure that these instructions are properly eliminated. ; ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine -disable-output && -; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep set +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep icmp %X = uninitialized global int diff --git a/test/Transforms/InstCombine/setcc-strength-reduce.ll b/test/Transforms/InstCombine/setcc-strength-reduce.ll index 4c86206397c..d38c6686d0b 100644 --- a/test/Transforms/InstCombine/setcc-strength-reduce.ll +++ b/test/Transforms/InstCombine/setcc-strength-reduce.ll @@ -3,7 +3,7 @@ ; into equivalent setne,eq instructions. ; -; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v seteq | grep -v setne | not grep set +; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v 'icmp eq' | grep -v 'icmp ne' | not grep icmp bool %test1(uint %A) { %B = setge uint %A, 1 ; setne %A, 0 diff --git a/test/Transforms/LoopSimplify/2006-08-11-LoopSimplifyLongTime.ll.bc b/test/Transforms/LoopSimplify/2006-08-11-LoopSimplifyLongTime.ll.bc index bf87a113636d34de0f63df6324559eae277888ad..75c92cf13171fb3c62b1fe576caf12103d9c565a 100644 GIT binary patch literal 165491 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

F(wk?F-}LQ^m$@16r_1!9}T&&5S+7q z+?>XxB^UA(0K|M`PQcBsCQ;G3@Uz~3xX(b zm{L;!Lg5*->{SrFtM&=B;V*2RN`@GS5v&Ddwr$>Q+z8A7H6KyXE*uyURAN*S+6r!* z5v{@PGmqXR8xzI>WH^?D*! zq~opFl_b>?C3Zy*Gd&64XaNB&)QwKo9khVhWq@i8M<+q`h3IFaAPWvM_4fNvTAqN+ z6@+pR3pQ3M9E+7DP~t_4m4r4yC~t}+Yy1^T_V|mOO29#;DcwfmnoG_jaV=qCOy8Uw z4qZ^}V#-9QiwnC<=4~3xh?#PlUEPREV~9RS5AHJQoEb=0%e3{tiw^Vs5wwA<5waGa z3mXS`){J^yN*K$q7cr1^i#Te|#~KcCFeXR)YgmR(fMO9|GQ?&=4ss3M>v7y)I2dJ-U3cqLArQ~lB_Zq=%d zQ7+{y!`Padnp!L4TI}YV+R;a0GTb={R<;>!))$t%%~ISN(QjO?A8jHoYi)cleuOOR zRNN3;W^Ei2mvAfznP{6)pDuquzn&Larf1MovnfaiP96YzAMa_P>@xlpgG<9*$G2NdKowdI@;GpY?EwRPFKaELG+kUA){Bo}BM#H}scdth0#|dffr+-X75qa< zWZYaOcx~NaCpK+}-(;s4+gl#6m=ZpK@6$Zs(wMSFkt?=;-a^9Ra4^hOv&cF9BQnhm z^}52P?` zqyPq7E?SAg6oN3NpKmi9MT8>`7J?2nPF&lP3*}sB)#KtHUKR8r=)z=OmBlSM0g-dA z$FjWwEYX~QdWu@->E+UB5<FN&L>-~eF4uNUD=!7s&H?*y#-ny%fowfUR-<&!=O`DAED_@lldV9A;TFsrej@LcJ1nHSjDQq}<3DV@`s`&QV87s5QUYnC0JFGlIl7AjlM z4O}iPe?B$!S#sF3@p4E`<9YIC#;6<5@?HubsrYpYamJ(et9PZ<623OO>0}+W=bmUz37oFnOQ!b z6WO?Tu79jh)P$!)T^*!4aqkv zAKiQF70I?s<~8o*v+lh$zb<|3;R_Sf6*Xj6va4suqDai*o<;pd%U<{;@!GeY7$ZLI z?1gxDg-+tfWz!_9+a_NP(C1}IR>w9^^UpI6JiI5!l=-5#xn+vv2-9cwe7vht zfqBySGJb5%G)^FU!MV+0-SzNFcx9_v@-&y1J4<|f#c==j8u3|nGfQxpZoD$MARfQC zW_E3_(d@d>^~CQy>Kj{E`j*{Bh`#1u6S`I+$pgfl%R-9>OXeNkD5p+vk)_B|3Q;Fw z*z?8GDv8_Ewv;fdyj9_{PpcGLQGjBSQ$?TEH?j!J$sG|6fzckWJ$(v8wm$K8hANBK zm14JqSg1$mZB%%Lm=7+oZwNiAhA*YBv@DSsOYP<}o<;Fw_7V01<-vve5%zqk*Kbv} zcnQ=N45@F4D7tJFYVI(VaHCR)W#_2JnDr}K%-O)-Dl7z9cureAgyV1Sy)-FMvsC?P zXA|>jt5Ex<4j6lq=QNC}+Qh8FakO>Vz9|jHxn&78IwPyXCzeLZxuwV}we&>@wg8b$ zJ*vhhd-N=TRFz6?FH6q`^6qV}6wTx?Vzy7Kl7gE|s}xGx0wc~w2gs;wfjjaJ3_I-= zipG0I=_%;G;8eGSysO}Lh1g(sv9xL)*u%)W51x?}`la8_nCV9Vsi|z4!S|f*7 zS<*3TLyJ)lVF#jpx7pFUe9)dauh zLfF_DMJ^+_VK^gvIQteG)0TH9x@Wki)#K8zOJuf5Ut(V((#Y(K?Gxndi|pe>kA?QC z<&j15Li>#8%A)RQQOU}>8DcxxZGqh4NgN_tFI5Z{DMAi<(;OU-s0gR9E;V_`*6Xss z6BRY+&OWgsIoz;(|H`y-5q&r>iZL}6Q8D6zPxDM2&Sy`UUuyRlbX&=raTchZCYw(! zrKC@-L=7xd>$;6P7ir)ZVBpXdiQWZb!d!Ngu*8&S=)Un4$u{!bCrFK_PZiZJNL-zZ zRF-UPTcOk}M4A^&F3lv~ygpLUb1~Dw*!WIHc2wcS%wlclq*BoN6-qV3O;AJR6JxM1tC0yz!^=JoZe9z%c>-A7uKBsz8un9)Bd3&K zlJRu*#?7#Dq506+?dA$chdpBY@ivR8E7l98iC*8@z==-K5_>oItx zroK3lYEkiRSMuc|>rV?&J`1jRpNzcOgQt~C$NJ?R7FH_k@m+Xd;ugQT;fdKfy|JTcY?dc%xET+1+<@`D(4=hts_KHS|ei!ucekRS#hcg{iZJzc}_F3pa+}V?M!Yk z+SFnd`mGbP-0>ME7NkMWY+%%t#rCSx-diIX>VaG4D6yx#xs2f0UZ_vIV!8t#3jKW9 z+`0}lfz=&v%D_v|oK;dYpc!DpEg@E1aMavtx6>GtCk&O+_#k@STjM zlq5>v(uaAv{gOjZ<|Nr+ntW-RjlHFKsg_pVGb+9)SgIkwAuCAtZyxDuSun=mdy?HS zocLkEm@jf)=Huz?M@x;>9~SgY#|jdc5=Ru8lj%gg{M2PL?#%ROwVCPDS>Zc9vl^Sr ztKLtiDTYUi*Pd(4w4)SHXXDkAwcU)&8rkoYo7=A}nmPPX*ST;q(nX}1v2ct%Y+Zliq1W83_J$(xVa zWAVuzEB5$&^iN>d6xmg3i~EH+{DFz611pk!L>mvLwx|Q`eabgiml5{I!$f)VMY6N! zhh?z2@a=T(Q0?P+cC;)cI6NL{NuSX8;K2mT2=@Jo*gShj)PWg+yUUz|K50;2({*xK zIq2-jw6b9*`)m9KBD1H@(8cb8W!*>gwaaGrM}028S`bv2!MhAklfTR;a950FyCu~y z9B*fpj$}Pj+%-|1HaN|@7McX{3YO7l(+H8#;4d1UUbMCT9OX(3j~Vf`U+Ah7OD~~w89iY>$X*DRxhM=Iy%t+d2J$MOPCuK^ z<*|oNsXPO-%&^iJa<-p0Q{!8Cfnm~ul8R|%T*UVw)z|=aO-fBZjSI>ho+|v=Lo0pcv zK+jZ*Q~*r~^TLv*o7CSm!~1Dk4D@jDD4?f--Q5|J)7q4djtl!% zjs8&^+1wIhLw(zuPpXtv>=x1i>E%53;GIOE3x*9yXTbtHGOGx(f_6otd}I1&)saD3 z11^~PAiB~m-u`0g73b;prEJOzaHp(dqeuZwsB9Uw!4w*(w=K8CG0IeqA+Jzo z&3il(W>&sCE1MPCazBdQvqEfqu}HFGnNqTn=bevd?V5H~EMIQ#Ti(~dLS7_JthDv5Xmmjy zzs8uewRTG+x77Ilrj+a@J_o~(HCKy%_}HhoD0pw#ElJklCC!<9FNHRhtK2f~?3P@w z-PZ3`(D^n^}xEj!8_Bzh7W&guSe$xf@_7;W^eh?oZ~@ z9$t&jXAM7@8+nd*FL<<9&ha~Ro4+r7y};V$AUWS|`9s&DdG870*h&-wa_N>UJ?FugH}O-4)9770M!+F-JCEF`u7rUtXD6DT-3OtBscJp{|F- zMz7Vbtvx+UZmhp-mwvPYd(~POEzw=@v_>)`W!>|nCku8%$xSv~4)an@qS?lr)AzGX zg=>@B+!DO-oBBulW{-$39VckH#R*H^Qq>bCWD>MUT6&R7c9%+dniV(_L;;~F3JI`W zQp#%SAo&{$ixi{i9*5(PR&uyB=bTwI|H$88kA%k)h?GzMIt zT{aFNhV#dI11#+=0OGO(&@1V@QCX6fMKF%PKY^c=^+;8Z8sBoUg_Hyd=IS&YuPv>s zK63xX+iz5L_UloDj`AnM8AB4|BLuiAFsws5P8u+ZW_kL$*R4kljE0fH zui$u^g<-pFH$WHwPoT>^tf~qZqclVaaxE9v>Jn~9hTR_l*g??r^+Ny$EHb&CJiZroe;Kxwgl)=VL`}6SSALUL^or=ND>@Cp9`Qm3$zgiP!~tQ2|-KW2Ay{m z(`YenK+uLXKpHrlpJ!AHS$m#1xl+3#IT!WCE#Y>TD~y8PuXSkqJq|yz-Dq^-%$H%Z z^_b!*qWOoslE>t$n=ZdRe?_}w_?ML|t;rcZ!O6L=9TD<;=27Ctq!p7D{G_MGVjDLt zx_;gA0_)1MQC)LtP{M~JtPb<-_WcXi5xs7`5xo~DimWP%M)OA$YGx?c`>%Xvcbgm$ zRdQ*#I$~O6`nA9%V$mm}_ez^`S+Co&;>eK&jX^V)PsFnmg)p7`C-k$4{1NS%X)_nt z>+|m`il9rxlH>?kWWK0j1z$5r-r8$!JxjKp1Tp-2BDFtdX=Mgq`Etz`=Iu$bk2gFy zzh%RBp;Kb(Pi?>kD9&WoQe@4unY-BughKFbmKxk#lb|%p6c67%}fM2jlG2S1+gUIc;X0r7c-Nz0DZ&c zP*_+TgoLXZ2D8V(T_(t8eJaPq5R=h()Te~^>+^IYAP&To_ydCE;Fu54Q2PAQa4~7& zNp>2$Fj>{N(?>!mFODQUVk`iD+_2hf&_%d%fUvqs+ktcv-pkB50$z8qZr1nq8_QHX z4B2}F7v&22fD|pfUCz-r3|_As^V!qi%jcTi`8lxa{DJLT4t%#;)|I>5+B17vH$$n4s5A!=>dM@_%jkl|bB+ScAaN<=IbRYCv_Gx^e zJP~y3JMacC%wDrl9n)L!{I*-|lcBS>x%lG9$jcyeoz0-G(1- zz0!WtDUon1BiD4trVF9>)S~+qByRQ1E05&G$1PWMY4q%CnhS~wTP!b3oRhq~z^!Zd zCi`W$Jn>vT{&pD9QwB2D76zKe zn7UMusHLG(q4q{S%-46Zwr=n&o#f;yy5Ur^k5#k1@`&xQoE!V|(Pg$aa_#I2`)Bvf zDb}6ji7t1^l5vG4pXMn=_K*d#fKFJ>venTa?Yuao=PP~X{%IKou&u~_wo z){;i&%Udo&ArI;w4hiLoEU7`Y8>K(JQPt4U;5U~z`d+vpPPV1Eg_Kh+t?3(d6eq|G zq7NJ=$mDx!>_y*hE!#;Ne=13)udlpKfY-JO*U|l6`aNj84r3@D;)w&`_dK=R&H`jg zOK(qza&nuTZ=g)Q1Cs?cL4stbpH5-o%6#tECG02%nt3s4*Rik?M~q2#cUg5d5))l&=FbgJ9|zRv_ijAJ9R3eai@%We9*4zF)xv z3Yi2ylj$pmNi2@Y%b=&BWdVRQ{9^vAF+J#5oV4A!hB|7TqCvLBLk|}}Ds+)g^>QHn zu6cq#NuLA74|>14nVzAl_efP$BSy`n>4*BU^LZ17LryU9(7ko#H-rX6bz=k?GA*YjJ?GA(&ztz;okrb8 z#+@?VYeT-A)3+wRUS|62B8&V$88ucg$37-cZ+-k)RPVqu-@C;tR@I1Zil60i~}A3+>U3udlR6&$M1x z;#~YGbK0S)=||x}STvpze!=%8XV>zSXT{heoCk zGuoHa^u@XZ1miYd9ARQ#Y4>lQE+hvb*Ip8}KZ~(kP@0LVUJ~Q%mGmr_ zy)?Tw_c}iF`tzg(lg%!#%o2*t*SK#kTKRY?C^;qI7}kj>Fdv{FFzaA;;<2iqe5G#c}(QR3p(&1Z_%+k7VxirOP{(5wxzhChGPq zClPely-x4~b?56FD6hcF@K^Ovf{hZ#Vy%RCNPgcInAII%OwSqvF|M*q&61Av;pqU@pOU46Oh{R6kC0(N6e3*ykveLu zs>V*=T=1r9Ot~P*qpu6B#CdpLS{K2cIqVx00M_T2swIc7Z=7VPH2l;LSrCCBk{!@Q z1TE{c^3wGJ(zH*p?jChi=#ac5ZeW}8`N4QN;;6}lBVc-j`!QP~EFudPjxi9rw=eL! zr@WoEE|?Z=ZcH5?|9y%5?ZX5`W`d&F%lq9)e8ae>&%o8sN6YtVFn2`~ zaqZQU`6({9-#6=ioQ>R^el)&yc(#J0OK|41!#)L%EWvsfkI+)n6Q4tN6%&?;ckJ0DGuTXzCnAP zG-cyMl3;gICo<8{1U!hsgQutuI$71TblED&p*pCop!NafL3~&lJh_O^-O`}nCR>bY z9P#ak99U#pj-cP6AD14spo4=V(AJhw_fQoC^q~VOt9-ZccHjcFTwF+5G@u8K>4DL* zAowJIy@<9?^?A9}IGMUo#2{u#X90hgq@_pWGya534(tgsM=cM=`5V*XKb4Dvdy5)d z25Dj_^t89+%1}opA}b783UC>aj8f4y5=jPR3e(7##AzFYdIX=nOITGEs)KD&=S#A) z^+%%9h6xaIIq3B~AfD)2?9}O*Ku@A~CN}7(5B1>U15@Eb(33$gTN22T$RQXe$YKY@ zvc^-l%-bwG;tS7|eEpz`)1xcxb|kAzlS#_~*JXx-fO>3jJ8zfz%iw4ktIwr-Q_VJs z=v-FDiR3BnR(}ybc1Uo|$;OBS&79TOMY3decxpCsX82gRl;0Y8_vdkl;L}vf)pq4E z2k-Kyr~MmW6&1m#I{7E~*Ijc_s%hN$>ZAlJpYFWy>KBK@cWE~qG&fl8EVi5yHKs3V z(RftVqJ>-Ffx(TT9hxH6-KW#MKmghezdjc+t21qFMQs%6T-&*K;# zjfdM+z6Xz)+R|fEdPEkO|5cG0t>?+i$WYaQ7M6(*=E_WphaUZ@95YLP`gwVzEUHg?JE2k9sgV6t9UU+)f=7 z74zKQ9Luy6yr%BbrO-ENg^h`0Pd<-W7}avV$SYl0_t=zM=~3*!@dMjh#$GqqNJN+! z26Rt6JNy$H?>i{&5Z{ur=~m_QVbZC1qbj!buTM**N1xfvbNHtpHr;{`4+P}5vUzLR z1PaS&=6kD$@Sbu0X@eEuI&9ttMa~62@mM!>#}Fup5j|Fg=39V&y_`UWfZ^Q@C(-4rKXvv zwi9-s>iPXXi2T9Z&Qsmh?I&l_?%p|c$icW=c5g>M_l&P7#P{mk;Q#u)NJ!D ziH({LZ-~b38keTxcsw)cJg0q{#BRw5F#`os?F?{X6QGrI8+lxLW$Y`J%6VL6>@Y@@ z{*BZC5D`%yQULqWT79PRAC0Uc*&VH4A%+65K#fZ!3ny$4tvYZ0jU^VYb&OH3<^|kv zbpfXLb)^iPP5{tV-kmgNz()asJqs}HH=y#U#-*I}vkNL)BA&2>n%e=~+GIsNs$L}) z9n^b?MWCjei+Y6`v8$&=Q8j_8)dQfXA(pPr^DC7Myp(G(3EnQ!3|)(kqO>Rd^1p#;%_X569*KHuxf8TQHPr*k=6bNb2`mBm6cV5wqz zaOvyeTesc?d=)rlcIetE9x2gv-=Qit(ah_2t-@dMuYVv>Al4Ul_}-6KMBkZdjT_$0 z59u`HM2oWpjrFj&RNk1aR}7c0@#%9LTnz(QN?Z-STn&S-aIdaGeppLfL7YIYUQ|y@ zU2$5d-Qn*lh2%<-i_F_+%KBu5C^3%q5Qutr3VU^IJYnfQD|PT1->4|lcT($Q`M;~? zGO`AllfqcXNANuMA(@+JC`gUU*tFXNE9P_4G!w(GS7i?o<_ArmM&}(>cLr{8kj8v< zIeR`ps&pPNu;A=oQ77Xe0?7QT{PlC3hG*#03XgkBbYNsx?Z!Yp8Jk~)PioW#nt%q6 z-9;fH!zM;m2u=;+`A8PyHc_*x3DopdKSB)wmj#l9afV?==xbhui1$NkoGt2pVl?>O zZ;Zd%|3Yd4ToNWgAlpa`4q82w!Dj6I8>I;H`xX;HApd|+K=N*MHb4vsR8SAb2dMKv z@8U9wVMBtehV1~9DTd!;JO9`D2&$M2!a<|)b%vyomp?nDu3vw&{>#6ev?^IBQzHb1_b1Y=2yD2Tk+^y9O&2kH#iX1{0KeE&O%I84j6 ze^YlOHJ&du^|TH-Z8}8wu?1!gg1h&8{KssWcDPOJuT_Jk#k3fYv|2}RK^Es#O_zk8J9KyG>gbtTpAp*B z6b(5iGWIBw#S7$wMd9Hp#q9|4$+ENEI*9HH3M081rP>c{kEBXLz)(XXop!bwjt9vtD6Qq+sk$MnkY+!zTe8reSmWPmVn!U0I*`Di z{0^#PIWKT*BoBcgNpN75Ev0bHKxA{R$_mClfqKGp(9RgxeoLs3j_Ke>L#zD`ap=H( zV;uJXPXc#$)4KI4%+1>l-L0^^Yy0kd*XJii zV?GGhj2ATL@A(s8aaq73D!k@6XbQh(9ZcKu8r`uZveaIfIQ>b>dAz`S!@d^G$!H{f z>vjJFBbx`ZZEhz986uE3vP!R}pTTS~xC*OXz{m=9GmIj@D{&&V10EHxOEeW!nOJ#SC({a)!)vxr#EXj96$1Awrw=;>w4vv9=S_r=HE@- zt5RL#v}>&Pv%Fxc8RwUjjWucYaaTlN=f4z%)#{Q=YT?4Hb!FRQi|)-J;NqHpv4 zVX4r$yT-sYZLe<~^t-h(HXowL_cAvKk4p-V%k9kfZ`-Y+X5}i$!wElTExBTQ92|b+ z^*fysvF@P1NRX1^+R%L|@XG~PcayrijL)XR`6&|CPadw}9CO*vdgGPoUzVNX$(>f- zEOY1c<&{meT^r&E<9{G85C)`c3qgV_3KF=o#m<5&y%oG^05p9OECbO%fGYVmj_)F3 z7JFaFCzpn=b72IlonfRmk z!z{n?^!SHPP9_2X=f;PXQ_H|*w=;ow4Pm*eBrQY_0Go#KXxbJiJ6IZ#D-aeU*hw0P zvw>@Y&^J*Ni~A4%omFcN1I!F!*VTv^q5`-FMD*bh`+KWUfVbr z#}O|M*8mp-v|geXM3LxSJPKsuA6i0~p_YZ=e5w`@pbCp{yn#bn^TQsFZ#*=37#^a5 zj`g#PvD@Fc#;JDq1jdB777S0?dz~K8rMzo7(p2Lx>7^^E{K3S!j*X4=iO==R2D$03 z0)B&sS=J^E`NuPzNPfZce!x&Kck8oCtq_{2(X;mhB?A|@P9*#FCHoBwa9TMT9(9`j z2%AiQvRh-y`SGTaDJQmHUvl(-1S}B;jI3$V>JNCSHneAI4K984BFFrn=3+};y@A;l zQ?&-u;upzYA1|949!D!fjmzeX%Od;sd?iOkd|Avg)i_NXU5vzY#Wg$&(SBR9Tfy(R zs1TZx(NMWiV099a!#Q7{Z3?wLG$H5Ysjuw`kCI6E13=1v$Gw<2R+iHlKyn&1ZcPn? zW7igZgnP4Mtn$n2>xB5#?Jc*tm^Hl#>U}lB?hMmznvQf#N=F7MPM>me z8%+um*mnRX-VFToqAcvvoX?5$4Pl`cMz_!Y7$(6C?_VmO+z=*Ka+X!f=msrDdh3lU zu2b-}SjmO5Qf?N0nG3X14HkiDnYZ;KhlA$$WzON^H9P~gWOjDOcn9%H(@NQS0bHXB1 zrAFGcoRgcl_+X-zev_W?tg4!@Fd*&mvt3BI{;j6+2S7ujERUxw#ZOfS5&^nV^?;&y zqGq5>OL2l2!hJ9y%FMB#$03>t$klS0H)=ov@uB&}qY?8G2n=PqEATEPDtM;# zlPBXzz^SPNA5LjXNp0thO%MD2c6tUz7t-yJF6S~^{n~s_GH9T}bpLwB zJiny&hu**uQ;@e`m-)FSU{%G+K+rc`nlKMqEK|NzktmsE<9Fk)Ynf{4chj| z7(4{ebF*Eoqvf)>&f@1!R6+OK1Kkz?Bpgq@?s_NRG7t!8^Yh0bqXSb+(wIcCU=kJb z7rx#q*97uU5I#oAXhwuhxFb?bV`b4h_*F?5#qt|UmY}GguuC5@OCBN?q^CcAzmpTR zCn<{xxD?^j-=VVe@AZ&=DW^e?56%_^m`WHj2#{g`j0$NT6L({JvZ$}WAt$IM2Y(Vu z3;Amm4Weg2QozDv;t~r#!;B&S5Mbo+NI>-fOoyqmKPH*jnZW*Nn@9*j8yQ(05>O92 zF^wl%7mULN89-$aXe2n^Z=hMUg+*tDWrK87{I;Kk&hEW#`Lo-3M$e+L0Bv1cu=U&- z&+H;|(cuPXjmP~QZWc`4lgkRDx~asQbtz$|JSU4ss?cx%D`i5nTZecAZc{G)yjbJI z*iAOs`Te%Yw@U|?E-KR2O%P24{XZL)&A;Dvl%LTQytwH=(ADcxzJ1EZ0*%wZ^x)=v zX4I95OP&Y$BjeVLuqTRSFVu$BmL8?dQ`IS#zjFVg5i6y<6)&~2KIqemb=xrh*|sb7 z>k=nyF1?*5e>^%+<2xHO%zehfw}kQ~xUcpJ@x=B10Jrn}pNCaly@^+Up7L3Uh@La` z$+B$6;U8Php3Nh+PV4QDy}I@268rFDdGaQ*R8VdEHl;bfdGSvR8WmE+%2_|9+k)W~ z%ESl3Qr*YH2kC!!jaxVv`FFx67JmMaEyBPVRwy*&uisvcvE#WxC< z+M|3=v8&DGc+%6=!b@LJ4o)0MWA^X7W>js;zYaHSh zcy)FhaeQpqfa~=99@nvj80x`&_S%H%8Onp8@XH5_W;}Vf%|#uoG$(rCRk90?Mw{L- zp5=R4+~{+;GwB9hTt3AKRUaWd3hjde!1Q7W3RieewVxM?J;HDvWpBcuhVBGZ`;+* z7I7E9n>s#KU}#9Vn)1Po(ofF#$)@B)1#l8PnfT>Kwe4lUdG zM_5vhJ=V7^dG$F!>-@1y4#S_Jqz-9nabJMCHOrAV3my>agKrSIBaG;se_a`O&U$MF zn64K11AR1r0oZ)GC}98pdG?q!T+~Uu;LO#Y4ZXY>>;H#s;WEG^5>BeBc8MTQ1IL3g zGC#nJdoy#<(``R*QF&FyZaqFFSl>J>aC=zcW~*I3(P5hAATn)odx-B{EWUWlDAR}0 z9oK*C&~+$|TvzOLZ;c{zD`)+$ZL0ljfXbtBc(RcSD*7 zH(FXmiqs};g5%WVc#qlA;?*OtZ()PGq}Qam8bCoGr}WUAmYFbv_(?%_rtXjPh6QJj z)g#}+{2*n#$RJWsS!uO++r6>+*X2?ZdBc!MkHRY__wvv=KRxQ4pQ<^tZ>*~RIX!AS zxbq3sATRfLn!g5Nk&z=(n|p$Ob6>H_L}^gK29PIJwkk6uWXC@>Qz2l<(FZCUAGM;9Xvjs=`gEatq6$@Sn_)g*=Wq)>1N&oF!!?AO!UBc9| zu|LH{t6mQw1M@?|kR2d_>j8gwe9@~+8ZL<^7RZx;U|mk!RbtBb_G&x*Lbr!6G(Wz$ z=)d01Tj}6Fb33o=*E9M=Nv?RlXJ$=KOUA`dm9jP*xc2a1P$5Nl~Qv2l@r}nz12d?ElITkd>319B=g0EDb9>>U(qxH<-W*iHY zmwEb8L?>|V-kl9Gz_B1UWf*68IK=7~_yqH)?+Vej){8s#%;;IjxsSQ3&rC)xFS$94 z_b*$W5gtz(7hU`A1w}UP@);&X!d_g_4V-sBzpGYa*H_o)d!~vE_f{|_icf{Ld0UiJ z8Tqes3rpv+7;IFz`OO1481~#+S2rl!an6BSmp7Z;oi}R`wV%(uo1o?1V@$2V;q2lF z=a0n^YLUeCqy&jKLGo*V=ij3xp8g74oxEiN^j4teY_oSk>fSlX4!R-Jau|%RtKoZk ztZjlsnF3FR*sor09#3XsNA{6ilW52`;3jI|cv`7*Yq>M+Ofs zcE1-EmVmqrXZ-}rXzHMjxJ?fzzYJjY?7I^{((aL>TR`fdCn!1wSh_*aIO13ydb@%@ z5mB$Z>6r=&0&)pjP7IXvD%-vbrN{VpgR7y1GOREGX@vY$kP80_F-wkEbV^ndnne z!7`R?iOq`fU#i%Ew@9wwQ54Jp2lhm3Yd-uv}FDeh|n0|A>D3mP?J4JPi0l zjdLs$IR|f$*uW=Q^fYAZdBLbcq7AaGA}C!CLQHAY_duBSaSJ=TJaq-uEGmb~J25Eb zi{>SZ#7ai<8I{+}kuqE6K6jpWNZQ(EV0d!MqogS==T#^%TRg3KpF;E+9fcKA)}<@k!rG2N-cx}VW^*^`W*d|1~c1?(fc~e3%WkT^-J8kN9 zH3v@lmCA(!#OeHf@}B#y3w3!ia*}b6=!D={K0A41EGh49Ev-yZa5Wr6^~>8nfgPgP!eq7P~7q6hU+h*PdZa} z@Uwil>w56D&n?#-w-n_c-%WoV$wBe@u~TzaAA2YC_rj2`qDA;r z)yA~+9J58uxqi!)kZS`>0QUn#Uy#(2fRG10YEPSNe>q$?#Qw-9Sal10gN~K&2X%^q zzW@gGa|nNtnIt&oQ~?)%#YG|B{T2uMqr5M9$DvpJ4gtEky>d&vJ=3oE%j3#juZnVJlo>@^l?Mvw zjblWwIt^{6;h$@1>+;t1Y3zyEsKnv%-L;^w>o|VP=W=fuOh-;IHeTSg43Lm|^_C&_ z$pF3+YaD3mP1g{Bc?xJ18k#{;jscrzzGH|41nq{c=+D4c{xgo0cf{?B_r`T=1a+Uf zvww*CW!|TFRset3^HBL_DaV@uuPXD|Ubac>X7F1EI0i|V%T@3&wwg>gHC(-XyrTV5 z?1}A~OSiSFsv5%@sMJUETED)ug}_00$gpAkPe}v)-a}jgogrV%h#9ECkxMv)b*LCd^hcT;fNN5>EZWaNm;Gg z-VaFtizAg>F5MX~Z3l3C(C~1x?Ga&dJCh@_Er2~@0X#>7i*pN!FEhyomSzz+cKoMI zLR(v)LLQjCBLtGTopEEfvn*TyoXuDSS`xuvvIC+{j@B@B<8W z03Zl-U(|e%MF)RW!IB>XQ)>YdBbxqj>Y z-G0rf*(q|%zpv2$>%kL+FGaZw6{=#n?$;|ioc?pU zWmtfM%`skcW6r(s)Z}dg)}Gpl9DIa(QDM9E2PYA>Q+fRtQa<+1n|^nxh5zbdUadnf zZ3zTfs-FAF5%uTCj-5JY0K)-EUCLjZ)^SI2YfP+yR85Bf;fC#^A5=&QyfAKtOfH=L zXu0%_YT&MwI*)3tV>@ib$)RV(@51j`o$*cT+8{?%%VWEXDwLIsf|1V7abUCL0VA!S zhgwynUp6zEa3o*6GyV~voG3)DvMdj)byn#0NVW4F9v;eSXcmU{s4s;qP-#FcA&W1f z4YKn<2J472hsL`Jvdp41wv91P_^VX&YaEu*P6*H9dN=@9(82XoZo4if<`m(Rs5xWHV&8)=-h3*>}?JjwNeR1pcncXNm@It`+ zUd<08T7kO&V~_bIPz%01D0HW|`0W`fsoiJZ-9y=dDGMjrJwh%~-rqg*<=y?9uJQb+ z9qaI~8&9lmHv_tGa_ep@M>Qj}IsDyeS0_(xZD&vepZ)@;D_i_a#Tmm07-Ko9_-5Iuu1=si-$Br6c? zBh*FxoqD0ZAs08|_XN4NgfkikHD(vHZVQqFYsVfE@eLtC`pc~>8S!0ir#^pjJ00MW zQPGo-71<1Vn9sin1f+&m9x-9su?EQn_l=)4yn`kW|8#=$-fGGyo72a8LP5{c&Nx4< zi^)}gAaGHkVfWshbs~C5DlnPY%Erd_U{x}>`Ba}@$PmPin{zd!EK_@#(tIJkBCm6MB1_EUg#yZ@3rih|KvHcPt%3wn0| zGD3d|4JMp{r3IWL1hOchm-Mwj℞d(+lRc&9?Y6V`uy-o*?%hku86P%;f6A;v9h# zHisPHGD7@AJt%ma1s??wA~u*;{(n*Os0kR}SWq9B+W0*(XiJtYAMAO!Pl;7*#GTAJ zNOkTUdopMI1B0|9mvz|7yF;T*%Pny@-g7|D+EzYOGg0eKl965rK~L;>=pU$a8vIHK<*0M21U(^81F1(fUo?-{+oT?DnAu!X8$Z*a^D z-gyaW#W?`d0gza({INyBy(iC}wOc-Wh2z;fy<9b|IJ1ODBRQFu=uWef&yI^;LCBdY z3%2{*i)sAbIZ5}R-ptaNoVdc>fB{hd5=6ddfCmgUyY2i~4gmubmU%ZsW+5~Ph!i%U z$`OxJ_o^lJ{E0t;Wt}7~Ko?pQD|uR0leD2i_e5r%I0<|a2qyVR@iY!dH2y~?TK^#f zDj#2gM)?OX`cL#6=F|pVK?w&BZ3Cl4IO0UkyFws`s#bW>ci`;+X%fu4%GqIv0ttC& zf96lzF@~-kxzE;U1-1w^wJfqaSP2-46$$?O5GsBvd<2sRRV~uL(YoOI|Lc$vloa4) z7{1Iqg=;jVDL=`max-lDm9{u?j{f~V@ zXRg1vFy9&2ZmMivqnjKBl~xXo@`v0_=MC!$LnaZ%`uj3389kfguPoXHJ`b#5K|WCL zQ6qDWv)0cgx_MPy`i6r)i)exs>Z^~2-LVBco`756+j#soNUn$Z=Xnlr=f-BIc7^VS z%z)>C6|_&Q#ND@byTsbJh6XGhqR}s2iLN=@xB=?B>w>vo3lnf0&4B1sK;zD7W75;y z{|P0jV@?NB+N!FDK{7(2G6Zz6IPhT*g{b~F>=4#g|JC?)Izj%HF^D7O0UbloatIO! zcN+3I(1>vVoecGmH)@HHNDv2L2&9f{hO1)j51AyO4%HjV!Al2c33K89A}~klp$L

UME(AT%xi+!!byH(+^F#)3HUvMV}b4X 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 IA$Feff8vmgGynhq literal 165219 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 P8t-ieKU_Tbfg [#uses=0] +%str = external global [32 x sbyte] ; <[32 x sbyte]*> [#uses=0] +%str = external global [12 x sbyte] ; <[12 x sbyte]*> [#uses=0] +%C.0.2294 = external global %struct.charsequence ; <%struct.charsequence*> [#uses=3] +%t = external global %struct.trie_s* ; <%struct.trie_s**> [#uses=0] +%str = external global [3 x sbyte] ; <[3 x sbyte]*> [#uses=0] +%str = external global [26 x sbyte] ; <[26 x sbyte]*> [#uses=0] + +implementation ; Functions: + +declare void %charsequence_reset(%struct.charsequence*) +declare void %free(sbyte*) +declare void %charsequence_push(%struct.charsequence*, sbyte) +declare sbyte* %charsequence_val(%struct.charsequence*) +declare int %_IO_getc(%struct.FILE*) +declare int %tolower(int) +declare %struct.trie_s* %trie_insert(%struct.trie_s*, sbyte*) +declare int %feof(%struct.FILE*) + +void %addfile(%struct.trie_s* %t, %struct.FILE* %f) { +entry: + %t_addr = alloca %struct.trie_s* ; <%struct.trie_s**> [#uses=2] + %f_addr = alloca %struct.FILE* ; <%struct.FILE**> [#uses=3] + %c = alloca sbyte, align 1 ; [#uses=7] + %wstate = alloca int, align 4 ; [#uses=4] + %cs = alloca %struct.charsequence, align 16 ; <%struct.charsequence*> [#uses=7] + %str = alloca sbyte*, align 4 ; [#uses=3] + "alloca point" = bitcast int 0 to int ; [#uses=0] + store %struct.trie_s* %t, %struct.trie_s** %t_addr + store %struct.FILE* %f, %struct.FILE** %f_addr + store int 0, int* %wstate + %tmp = getelementptr %struct.charsequence* %cs, uint 0, uint 0 ; [#uses=1] + %tmp1 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 0 ; [#uses=1] + %tmp = load sbyte** %tmp1 ; [#uses=1] + store sbyte* %tmp, sbyte** %tmp + %tmp = getelementptr %struct.charsequence* %cs, uint 0, uint 1 ; [#uses=1] + %tmp2 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 1 ; [#uses=1] + %tmp = load uint* %tmp2 ; [#uses=1] + store uint %tmp, uint* %tmp + %tmp3 = getelementptr %struct.charsequence* %cs, uint 0, uint 2 ; [#uses=1] + %tmp4 = getelementptr %struct.charsequence* %C.0.2294, uint 0, uint 2 ; [#uses=1] + %tmp5 = load uint* %tmp4 ; [#uses=1] + store uint %tmp5, uint* %tmp3 + br label %bb33 + +bb: ; preds = %bb33 + %tmp = load %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] + %tmp = call int %_IO_getc( %struct.FILE* %tmp ) ; [#uses=1] + %tmp6 = call int %tolower( int %tmp ) ; [#uses=1] + %tmp6 = trunc int %tmp6 to sbyte ; [#uses=1] + store sbyte %tmp6, sbyte* %c + %tmp7 = load int* %wstate ; [#uses=1] + %tmp = icmp ne int %tmp7, 0 ; [#uses=1] + br bool %tmp, label %cond_true, label %cond_false + +cond_true: ; preds = %bb + %tmp = load sbyte* %c ; [#uses=1] + %tmp8 = icmp sle sbyte %tmp, 96 ; [#uses=1] + br bool %tmp8, label %cond_true9, label %cond_next + +cond_true9: ; preds = %cond_true + br label %bb16 + +cond_next: ; preds = %cond_true + %tmp10 = load sbyte* %c ; [#uses=1] + %tmp11 = icmp sgt sbyte %tmp10, 122 ; [#uses=1] + br bool %tmp11, label %cond_true12, label %cond_next13 + +cond_true12: ; preds = %cond_next + br label %bb16 + +cond_next13: ; preds = %cond_next + %tmp14 = load sbyte* %c ; [#uses=1] + %tmp14 = sext sbyte %tmp14 to int ; [#uses=1] + %tmp1415 = trunc int %tmp14 to sbyte ; [#uses=1] + call void %charsequence_push( %struct.charsequence* %cs, sbyte %tmp1415 ) + br label %bb21 + +bb16: ; preds = %cond_true12, %cond_true9 + %tmp17 = call sbyte* %charsequence_val( %struct.charsequence* %cs ) ; [#uses=1] + store sbyte* %tmp17, sbyte** %str + %tmp = load %struct.trie_s** %t_addr ; <%struct.trie_s*> [#uses=1] + %tmp18 = load sbyte** %str ; [#uses=1] + %tmp19 = call %struct.trie_s* %trie_insert( %struct.trie_s* %tmp, sbyte* %tmp18 ) ; <%struct.trie_s*> [#uses=0] + %tmp20 = load sbyte** %str ; [#uses=1] + call void %free( sbyte* %tmp20 ) + store int 0, int* %wstate + br label %bb21 + +bb21: ; preds = %bb16, %cond_next13 + br label %cond_next32 + +cond_false: ; preds = %bb + %tmp22 = load sbyte* %c ; [#uses=1] + %tmp23 = icmp sgt sbyte %tmp22, 96 ; [#uses=1] + br bool %tmp23, label %cond_true24, label %cond_next31 + +cond_true24: ; preds = %cond_false + %tmp25 = load sbyte* %c ; [#uses=1] + %tmp26 = icmp sle sbyte %tmp25, 122 ; [#uses=1] + br bool %tmp26, label %cond_true27, label %cond_next30 + +cond_true27: ; preds = %cond_true24 + call void %charsequence_reset( %struct.charsequence* %cs ) + %tmp28 = load sbyte* %c ; [#uses=1] + %tmp28 = sext sbyte %tmp28 to int ; [#uses=1] + %tmp2829 = trunc int %tmp28 to sbyte ; [#uses=1] + call void %charsequence_push( %struct.charsequence* %cs, sbyte %tmp2829 ) + store int 1, int* %wstate + br label %cond_next30 + +cond_next30: ; preds = %cond_true27, %cond_true24 + br label %cond_next31 + +cond_next31: ; preds = %cond_next30, %cond_false + br label %cond_next32 + +cond_next32: ; preds = %cond_next31, %bb21 + br label %bb33 + +bb33: ; preds = %cond_next32, %entry + %tmp34 = load %struct.FILE** %f_addr ; <%struct.FILE*> [#uses=1] + %tmp35 = call int %feof( %struct.FILE* %tmp34 ) ; [#uses=1] + %tmp36 = icmp eq int %tmp35, 0 ; [#uses=1] + br bool %tmp36, label %bb, label %bb37 + +bb37: ; preds = %bb33 + br label %return + +return: ; preds = %bb37 + ret void +} + diff --git a/test/Transforms/SimplifyCFG/DeadSetCC.ll b/test/Transforms/SimplifyCFG/DeadSetCC.ll index b180700d4f1..96337f7c3ca 100644 --- a/test/Transforms/SimplifyCFG/DeadSetCC.ll +++ b/test/Transforms/SimplifyCFG/DeadSetCC.ll @@ -1,4 +1,4 @@ -; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep seteq +; RUN: llvm-upgrade < %s | llvm-as | opt -simplifycfg | llvm-dis | not grep 'icmp eq' ; Check that simplifycfg deletes a dead 'seteq' instruction when it ; folds a conditional branch into a switch instruction. diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index f6743241803..344d350b29d 100644 --- a/tools/bugpoint/Miscompilation.cpp +++ b/tools/bugpoint/Miscompilation.cpp @@ -724,8 +724,8 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test, // Check to see if we already looked up the value. Value *CachedVal = new LoadInst(Cache, "fpcache", EntryBB); - Value *IsNull = new SetCondInst(Instruction::SetEQ, CachedVal, - NullPtr, "isNull", EntryBB); + Value *IsNull = new ICmpInst(ICmpInst::ICMP_EQ, CachedVal, + NullPtr, "isNull", EntryBB); new BranchInst(LookupBB, DoCallBB, IsNull, EntryBB); // Resolve the call to function F via the JIT API: diff --git a/tools/llvm-upgrade/UpgradeParser.cpp b/tools/llvm-upgrade/UpgradeParser.cpp index 96cae3b3e60..debb995a794 100644 --- a/tools/llvm-upgrade/UpgradeParser.cpp +++ b/tools/llvm-upgrade/UpgradeParser.cpp @@ -368,7 +368,7 @@ /* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 14 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" #include "ParserInternals.h" #include @@ -381,8 +381,6 @@ #define YYERROR_VERBOSE 1 #define YYINCLUDED_STDLIB_H #define YYDEBUG 1 -#define UPGRADE_SETCOND_OPS 0 -#define GENERATE_FCMP_INSTS 0 int yylex(); // declaration" of xxx warnings. int yyparse(); @@ -552,11 +550,7 @@ static std::string getCastUpgrade( // the original intent by replace the cast with a setne const char* comparator = SrcTy.isPointer() ? ", null" : (SrcTy.isFloatingPoint() ? ", 0.0" : ", 0"); -#if UPGRADE_SETCOND_OPS - const char* compareOp = SrcTy.isFloatingPoint() ? "setne " : "icmp ne "; -#else - const char* compareOp = "setne"; -#endif + const char* compareOp = SrcTy.isFloatingPoint() ? "fcmp one " : "icmp ne "; if (isConst) { Result = "(" + Source + comparator + ")"; Result = compareOp + Result; @@ -612,16 +606,12 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { result[6] = cc1; result[7] = cc2; if (TI.isFloatingPoint()) { -#if GENERATE_FCMP_INSTS result[0] = 'f'; - result[5] = 'o'; // FIXME: Always map to ordered comparison ? + result[5] = 'o'; if (cc1 == 'n') result[5] = 'u'; // NE maps to unordered else result[5] = 'o'; // everything else maps to ordered -#else - result = setcc; -#endif } else if (TI.isIntegral() || TI.isPointer()) { result[0] = 'i'; if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e')) @@ -657,7 +647,7 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { std::string* String; TypeInfo Type; @@ -666,7 +656,7 @@ typedef union YYSTYPE { ValueList* ValList; } YYSTYPE; /* Line 196 of yacc.c. */ -#line 670 "UpgradeParser.tab.c" +#line 660 "UpgradeParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -678,7 +668,7 @@ typedef union YYSTYPE { /* Line 219 of yacc.c. */ -#line 682 "UpgradeParser.tab.c" +#line 672 "UpgradeParser.tab.c" #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ @@ -1032,36 +1022,36 @@ static const short int yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 348, 348, 348, 349, 349, 353, 353, 353, 353, - 353, 353, 353, 354, 354, 354, 354, 355, 355, 355, - 356, 356, 356, 356, 356, 356, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 359, 359, 359, 359, - 359, 359, 360, 360, 360, 360, 361, 361, 361, 361, - 361, 361, 361, 362, 362, 362, 362, 362, 362, 367, - 367, 367, 367, 368, 368, 368, 368, 369, 369, 370, - 370, 373, 376, 381, 381, 381, 381, 381, 381, 382, - 383, 386, 386, 386, 386, 386, 387, 388, 393, 398, - 399, 402, 403, 411, 417, 418, 421, 422, 431, 432, - 445, 445, 446, 446, 447, 451, 451, 451, 451, 451, - 451, 451, 452, 452, 452, 452, 452, 454, 458, 462, - 465, 470, 476, 484, 492, 498, 502, 513, 516, 524, - 525, 530, 533, 543, 549, 554, 560, 566, 572, 577, - 583, 589, 595, 601, 607, 613, 619, 625, 631, 639, - 653, 665, 670, 676, 681, 689, 694, 699, 707, 712, - 717, 727, 732, 737, 737, 747, 752, 755, 760, 764, - 768, 770, 770, 773, 785, 790, 795, 804, 813, 822, - 831, 836, 841, 846, 848, 848, 851, 856, 863, 868, - 875, 882, 887, 888, 896, 896, 897, 897, 899, 906, - 910, 914, 917, 922, 925, 927, 947, 948, 950, 959, - 960, 962, 970, 971, 972, 976, 989, 990, 993, 993, - 993, 993, 993, 993, 993, 994, 995, 1000, 1001, 1010, - 1010, 1014, 1020, 1031, 1037, 1040, 1048, 1052, 1057, 1060, - 1066, 1066, 1068, 1073, 1078, 1083, 1091, 1098, 1104, 1124, - 1129, 1135, 1140, 1148, 1157, 1164, 1172, 1176, 1183, 1184, - 1188, 1193, 1196, 1202, 1207, 1215, 1220, 1225, 1230, 1238, - 1252, 1257, 1262, 1267, 1272, 1277, 1282, 1299, 1304, 1305, - 1309, 1310, 1313, 1320, 1327, 1334, 1341, 1346, 1353, 1360 + 0, 338, 338, 338, 339, 339, 343, 343, 343, 343, + 343, 343, 343, 344, 344, 344, 344, 345, 345, 345, + 346, 346, 346, 346, 346, 346, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, + 348, 348, 348, 348, 348, 348, 349, 349, 349, 349, + 349, 349, 350, 350, 350, 350, 351, 351, 351, 351, + 351, 351, 351, 352, 352, 352, 352, 352, 352, 357, + 357, 357, 357, 358, 358, 358, 358, 359, 359, 360, + 360, 363, 366, 371, 371, 371, 371, 371, 371, 372, + 373, 376, 376, 376, 376, 376, 377, 378, 383, 388, + 389, 392, 393, 401, 407, 408, 411, 412, 421, 422, + 435, 435, 436, 436, 437, 441, 441, 441, 441, 441, + 441, 441, 442, 442, 442, 442, 442, 444, 448, 452, + 455, 460, 466, 474, 482, 488, 492, 503, 506, 514, + 515, 520, 523, 533, 539, 544, 550, 556, 562, 567, + 573, 579, 585, 591, 597, 603, 609, 615, 621, 629, + 643, 655, 660, 666, 671, 677, 682, 687, 695, 700, + 705, 715, 720, 725, 725, 735, 740, 743, 748, 752, + 756, 758, 758, 761, 773, 778, 783, 792, 801, 810, + 819, 824, 829, 834, 836, 836, 839, 844, 851, 856, + 863, 870, 875, 876, 884, 884, 885, 885, 887, 894, + 898, 902, 905, 910, 913, 915, 935, 936, 938, 947, + 948, 950, 958, 959, 960, 964, 977, 978, 981, 981, + 981, 981, 981, 981, 981, 982, 983, 988, 989, 998, + 998, 1002, 1008, 1019, 1025, 1028, 1036, 1040, 1045, 1048, + 1054, 1054, 1056, 1061, 1066, 1071, 1079, 1086, 1092, 1112, + 1117, 1123, 1128, 1136, 1145, 1152, 1160, 1164, 1171, 1172, + 1176, 1181, 1184, 1190, 1195, 1201, 1206, 1211, 1216, 1224, + 1238, 1243, 1248, 1253, 1258, 1263, 1268, 1285, 1290, 1291, + 1295, 1296, 1299, 1306, 1313, 1320, 1327, 1332, 1339, 1346 }; #endif @@ -2408,26 +2398,26 @@ yyreduce: switch (yyn) { case 81: -#line 373 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 363 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[-1].String); ;} break; case 82: -#line 376 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 366 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 90: -#line 383 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 373 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 97: -#line 388 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 378 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2436,27 +2426,27 @@ yyreduce: break; case 98: -#line 393 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 383 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 99: -#line 398 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 388 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 100: -#line 399 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 389 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); (yyval.String) = (yyvsp[-1].String); ;} break; case 101: -#line 402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 392 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 102: -#line 403 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 393 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, ", "); *(yyvsp[-1].String) += " " + *(yyvsp[0].String); @@ -2466,7 +2456,7 @@ yyreduce: break; case 103: -#line 411 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 401 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2475,17 +2465,17 @@ yyreduce: break; case 104: -#line 417 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 407 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 106: -#line 421 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 411 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 107: -#line 422 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 412 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, ", "); if (!(yyvsp[0].String)->empty()) @@ -2496,7 +2486,7 @@ yyreduce: break; case 109: -#line 432 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 422 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2505,7 +2495,7 @@ yyreduce: break; case 127: -#line 454 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 444 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type).newTy = (yyvsp[0].String); (yyval.Type).oldTy = OpaqueTy; @@ -2513,7 +2503,7 @@ yyreduce: break; case 128: -#line 458 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 448 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type).newTy = (yyvsp[0].String); (yyval.Type).oldTy = UnresolvedTy; @@ -2521,14 +2511,14 @@ yyreduce: break; case 129: -#line 462 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 452 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type) = (yyvsp[0].Type); ;} break; case 130: -#line 465 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 455 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Type UpReference (yyvsp[0].String)->insert(0, "\\"); (yyval.Type).newTy = (yyvsp[0].String); @@ -2537,7 +2527,7 @@ yyreduce: break; case 131: -#line 470 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 460 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function derived type? *(yyvsp[-3].Type).newTy += "( " + *(yyvsp[-1].String) + " )"; delete (yyvsp[-1].String); @@ -2547,7 +2537,7 @@ yyreduce: break; case 132: -#line 476 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 466 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Sized array type? (yyvsp[-3].String)->insert(0,"[ "); *(yyvsp[-3].String) += " x " + *(yyvsp[-1].Type).newTy + " ]"; @@ -2559,7 +2549,7 @@ yyreduce: break; case 133: -#line 484 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 474 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Packed array type? (yyvsp[-3].String)->insert(0,"< "); *(yyvsp[-3].String) += " x " + *(yyvsp[-1].Type).newTy + " >"; @@ -2571,7 +2561,7 @@ yyreduce: break; case 134: -#line 492 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 482 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Structure type? (yyvsp[-1].String)->insert(0, "{ "); *(yyvsp[-1].String) += " }"; @@ -2581,7 +2571,7 @@ yyreduce: break; case 135: -#line 498 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 488 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Empty structure type? (yyval.Type).newTy = new std::string("{}"); (yyval.Type).oldTy = StructTy; @@ -2589,7 +2579,7 @@ yyreduce: break; case 136: -#line 502 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 492 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Pointer type? *(yyvsp[-1].Type).newTy += '*'; (yyval.Type).elemTy = (yyvsp[-1].Type).oldTy; @@ -2599,14 +2589,14 @@ yyreduce: break; case 137: -#line 513 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 503 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].Type).newTy; ;} break; case 138: -#line 516 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 506 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].Type).newTy; delete (yyvsp[0].Type).newTy; @@ -2615,7 +2605,7 @@ yyreduce: break; case 140: -#line 525 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 515 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", ..."; delete (yyvsp[0].String); @@ -2624,21 +2614,21 @@ yyreduce: break; case 141: -#line 530 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 520 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 142: -#line 533 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 523 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 143: -#line 543 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 533 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2648,7 +2638,7 @@ yyreduce: break; case 144: -#line 549 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 539 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2657,7 +2647,7 @@ yyreduce: break; case 145: -#line 554 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 544 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2667,7 +2657,7 @@ yyreduce: break; case 146: -#line 560 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 550 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2677,7 +2667,7 @@ yyreduce: break; case 147: -#line 566 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 556 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2687,7 +2677,7 @@ yyreduce: break; case 148: -#line 572 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 562 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2696,7 +2686,7 @@ yyreduce: break; case 149: -#line 577 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 567 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2706,7 +2696,7 @@ yyreduce: break; case 150: -#line 583 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 573 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2716,7 +2706,7 @@ yyreduce: break; case 151: -#line 589 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 579 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2726,7 +2716,7 @@ yyreduce: break; case 152: -#line 595 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 585 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2736,7 +2726,7 @@ yyreduce: break; case 153: -#line 601 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 591 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2746,7 +2736,7 @@ yyreduce: break; case 154: -#line 607 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 597 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2756,7 +2746,7 @@ yyreduce: break; case 155: -#line 613 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 603 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2766,7 +2756,7 @@ yyreduce: break; case 156: -#line 619 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 609 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2776,7 +2766,7 @@ yyreduce: break; case 157: -#line 625 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 615 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2786,7 +2776,7 @@ yyreduce: break; case 158: -#line 631 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 621 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Float & Double constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2796,7 +2786,7 @@ yyreduce: break; case 159: -#line 639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 629 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { std::string source = *(yyvsp[-3].Const).cnst; TypeInfo DstTy = (yyvsp[-1].Type); @@ -2814,7 +2804,7 @@ yyreduce: break; case 160: -#line 653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 643 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-4].String) += "(" + *(yyvsp[-2].Const).cnst; for (unsigned i = 0; i < (yyvsp[-1].ValList)->size(); ++i) { @@ -2830,7 +2820,7 @@ yyreduce: break; case 161: -#line 665 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 655 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2839,7 +2829,7 @@ yyreduce: break; case 162: -#line 670 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 660 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* op = getDivRemOpcode(*(yyvsp[-5].String), (yyvsp[-3].Const).type); (yyval.String) = new std::string(op); @@ -2849,7 +2839,7 @@ yyreduce: break; case 163: -#line 676 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 666 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2858,11 +2848,9 @@ yyreduce: break; case 164: -#line 681 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 671 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { -#if UPGRADE_SETCOND_OPS *(yyvsp[-5].String) = getCompareOp(*(yyvsp[-5].String), (yyvsp[-3].Const).type); -#endif *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); (yyval.String) = (yyvsp[-5].String); @@ -2870,7 +2858,7 @@ yyreduce: break; case 165: -#line 689 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 677 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += "(" + *(yyvsp[-5].String) + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2879,7 +2867,7 @@ yyreduce: break; case 166: -#line 694 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 682 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += "(" + *(yyvsp[-5].String) + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2888,7 +2876,7 @@ yyreduce: break; case 167: -#line 699 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 687 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* shiftop = (yyvsp[-5].String)->c_str(); if (*(yyvsp[-5].String) == "shr") @@ -2900,7 +2888,7 @@ yyreduce: break; case 168: -#line 707 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 695 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2909,7 +2897,7 @@ yyreduce: break; case 169: -#line 712 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 700 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2918,7 +2906,7 @@ yyreduce: break; case 170: -#line 717 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 705 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2927,7 +2915,7 @@ yyreduce: break; case 171: -#line 727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].Const).cnst; (yyvsp[0].Const).destroy(); @@ -2936,25 +2924,25 @@ yyreduce: break; case 172: -#line 732 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 720 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(*(yyvsp[0].Const).cnst); (yyvsp[0].Const).destroy(); ;} break; case 175: -#line 747 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 735 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 176: -#line 752 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 177: -#line 755 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 743 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -2963,7 +2951,7 @@ yyreduce: break; case 178: -#line 760 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 748 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << "module asm " << " " << *(yyvsp[0].String) << "\n"; (yyval.String) = 0; @@ -2971,7 +2959,7 @@ yyreduce: break; case 179: -#line 764 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 752 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << "implementation\n"; (yyval.String) = 0; @@ -2979,17 +2967,17 @@ yyreduce: break; case 180: -#line 768 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 756 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 182: -#line 770 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 758 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); *(yyval.String) = "external"; ;} break; case 183: -#line 773 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 761 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { EnumeratedTypes.push_back((yyvsp[0].Type)); if (!(yyvsp[-2].String)->empty()) { @@ -3005,7 +2993,7 @@ yyreduce: break; case 184: -#line 785 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 773 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function prototypes can be in const pool *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3014,7 +3002,7 @@ yyreduce: break; case 185: -#line 790 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 778 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Asm blocks can be in the const pool *O << *(yyvsp[-2].String) << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-2].String); delete (yyvsp[-1].String); delete (yyvsp[0].String); @@ -3023,7 +3011,7 @@ yyreduce: break; case 186: -#line 795 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 783 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3036,7 +3024,7 @@ yyreduce: break; case 187: -#line 804 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 792 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3049,7 +3037,7 @@ yyreduce: break; case 188: -#line 813 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 801 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3062,7 +3050,7 @@ yyreduce: break; case 189: -#line 822 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 810 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3075,7 +3063,7 @@ yyreduce: break; case 190: -#line 831 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 819 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[-1].String) << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-1].String); delete (yyvsp[0].String); @@ -3084,7 +3072,7 @@ yyreduce: break; case 191: -#line 836 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 824 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[-2].String) << " = " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-2].String); delete (yyvsp[0].String); @@ -3093,14 +3081,14 @@ yyreduce: break; case 192: -#line 841 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 829 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 196: -#line 851 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 839 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3109,7 +3097,7 @@ yyreduce: break; case 197: -#line 856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 844 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); if (*(yyvsp[0].String) == "64") @@ -3120,7 +3108,7 @@ yyreduce: break; case 198: -#line 863 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 851 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3129,7 +3117,7 @@ yyreduce: break; case 199: -#line 868 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 856 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3138,7 +3126,7 @@ yyreduce: break; case 200: -#line 875 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 863 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, "[ "); *(yyvsp[-1].String) += " ]"; @@ -3147,7 +3135,7 @@ yyreduce: break; case 201: -#line 882 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 870 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3156,19 +3144,19 @@ yyreduce: break; case 203: -#line 888 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 876 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 207: -#line 897 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 885 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 208: -#line 899 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 887 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3178,7 +3166,7 @@ yyreduce: break; case 209: -#line 906 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 894 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3186,21 +3174,21 @@ yyreduce: break; case 210: -#line 910 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 898 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 211: -#line 914 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 902 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 212: -#line 917 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 905 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", ..."; (yyval.String) = (yyvsp[-2].String); @@ -3209,19 +3197,19 @@ yyreduce: break; case 213: -#line 922 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 910 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 214: -#line 925 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 913 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 215: -#line 928 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 916 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-7].String)->empty()) { *(yyvsp[-7].String) += " "; @@ -3243,17 +3231,17 @@ yyreduce: break; case 216: -#line 947 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 935 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("{"); delete (yyvsp[0].String); ;} break; case 217: -#line 948 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 936 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string ("{"); ;} break; case 218: -#line 950 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 938 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-2].String)->empty()) { *O << *(yyvsp[-2].String) << " "; @@ -3265,17 +3253,17 @@ yyreduce: break; case 219: -#line 959 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 947 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("}"); delete (yyvsp[0].String); ;} break; case 220: -#line 960 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 948 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("}"); ;} break; case 221: -#line 962 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 950 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-1].String)) *O << *(yyvsp[-1].String); @@ -3285,12 +3273,12 @@ yyreduce: break; case 222: -#line 970 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 958 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 225: -#line 976 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 964 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-1].String)->empty()) *(yyvsp[-2].String) += " " + *(yyvsp[-1].String); @@ -3302,12 +3290,12 @@ yyreduce: break; case 226: -#line 989 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 977 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 236: -#line 995 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 983 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, "<"); *(yyvsp[-1].String) += ">"; @@ -3316,7 +3304,7 @@ yyreduce: break; case 238: -#line 1001 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 989 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-3].String)->empty()) { *(yyvsp[-4].String) += " " + *(yyvsp[-3].String); @@ -3328,7 +3316,7 @@ yyreduce: break; case 241: -#line 1014 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1002 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value).val = (yyvsp[0].String); (yyval.Value).constant = false; @@ -3338,7 +3326,7 @@ yyreduce: break; case 242: -#line 1020 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1008 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value).val = (yyvsp[0].String); (yyval.Value).constant = true; @@ -3348,7 +3336,7 @@ yyreduce: break; case 243: -#line 1031 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1019 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value) = (yyvsp[0].Value); (yyval.Value).type = (yyvsp[-1].Type); @@ -3357,28 +3345,28 @@ yyreduce: break; case 244: -#line 1037 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1025 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 245: -#line 1040 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1028 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Do not allow functions with 0 basic blocks (yyval.String) = 0; ;} break; case 246: -#line 1048 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1036 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 247: -#line 1052 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1040 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3387,14 +3375,14 @@ yyreduce: break; case 248: -#line 1057 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1045 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 249: -#line 1060 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1048 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3403,12 +3391,12 @@ yyreduce: break; case 251: -#line 1066 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1054 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); *(yyval.String) = "unwind"; ;} break; case 252: -#line 1068 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1056 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with a result... *O << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].Value).val << "\n"; delete (yyvsp[-1].String); (yyvsp[0].Value).destroy(); @@ -3417,7 +3405,7 @@ yyreduce: break; case 253: -#line 1073 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1061 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with no result... *O << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].Type).newTy << "\n"; delete (yyvsp[-1].String); (yyvsp[0].Type).destroy(); @@ -3426,7 +3414,7 @@ yyreduce: break; case 254: -#line 1078 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1066 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Unconditional Branch... *O << " " << *(yyvsp[-2].String) << " " << *(yyvsp[-1].Type).newTy << " " << *(yyvsp[0].Value).val << "\n"; delete (yyvsp[-2].String); (yyvsp[-1].Type).destroy(); (yyvsp[0].Value).destroy(); @@ -3435,7 +3423,7 @@ yyreduce: break; case 255: -#line 1083 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1071 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-8].String) << " " << *(yyvsp[-7].Type).newTy << " " << *(yyvsp[-6].Value).val << ", " << *(yyvsp[-4].Type).newTy << " " << *(yyvsp[-3].Value).val << ", " << *(yyvsp[-1].Type).newTy << " " @@ -3447,7 +3435,7 @@ yyreduce: break; case 256: -#line 1091 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1079 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-8].String) << " " << *(yyvsp[-7].Type).newTy << " " << *(yyvsp[-6].Value).val << ", " << *(yyvsp[-4].Type).newTy << " " << *(yyvsp[-3].Value).val << " [" << *(yyvsp[-1].String) << " ]\n"; @@ -3458,7 +3446,7 @@ yyreduce: break; case 257: -#line 1098 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1086 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-7].String) << " " << *(yyvsp[-6].Type).newTy << " " << *(yyvsp[-5].Value).val << ", " << *(yyvsp[-3].Type).newTy << " " << *(yyvsp[-2].Value).val << "[]\n"; @@ -3468,7 +3456,7 @@ yyreduce: break; case 258: -#line 1105 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1093 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " "; if (!(yyvsp[-13].String)->empty()) @@ -3491,7 +3479,7 @@ yyreduce: break; case 259: -#line 1124 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1112 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3500,7 +3488,7 @@ yyreduce: break; case 260: -#line 1129 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1117 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3509,7 +3497,7 @@ yyreduce: break; case 261: -#line 1135 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1123 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + " " + *(yyvsp[-3].String) + ", " + *(yyvsp[-1].Type).newTy + " " + *(yyvsp[0].Value).val; (yyvsp[-4].Type).destroy(); delete (yyvsp[-3].String); (yyvsp[-1].Type).destroy(); (yyvsp[0].Value).destroy(); @@ -3518,7 +3506,7 @@ yyreduce: break; case 262: -#line 1140 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1128 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-3].String)->insert(0, *(yyvsp[-4].Type).newTy + " " ); *(yyvsp[-3].String) += ", " + *(yyvsp[-1].Type).newTy + " " + *(yyvsp[0].Value).val; @@ -3528,7 +3516,7 @@ yyreduce: break; case 263: -#line 1148 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1136 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-1].String)->empty()) *(yyvsp[-1].String) += " = "; @@ -3539,7 +3527,7 @@ yyreduce: break; case 264: -#line 1157 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1145 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for PHI nodes (yyvsp[-3].Value).val->insert(0, *(yyvsp[-5].Type).newTy + "["); *(yyvsp[-3].Value).val += "," + *(yyvsp[-1].Value).val + "]"; @@ -3550,7 +3538,7 @@ yyreduce: break; case 265: -#line 1164 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1152 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += ", [" + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + "]"; (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3559,7 +3547,7 @@ yyreduce: break; case 266: -#line 1172 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1160 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); (yyval.ValList)->push_back((yyvsp[0].Value)); @@ -3567,7 +3555,7 @@ yyreduce: break; case 267: -#line 1176 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1164 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-2].ValList)->push_back((yyvsp[0].Value)); (yyval.ValList) = (yyvsp[-2].ValList); @@ -3575,17 +3563,17 @@ yyreduce: break; case 268: -#line 1183 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1171 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = (yyvsp[0].ValList); ;} break; case 269: -#line 1184 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1172 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); ;} break; case 270: -#line 1188 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1176 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3594,7 +3582,7 @@ yyreduce: break; case 272: -#line 1196 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1184 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* op = getDivRemOpcode(*(yyvsp[-4].String), (yyvsp[-3].Type)); (yyval.String) = new std::string(op); @@ -3604,7 +3592,7 @@ yyreduce: break; case 273: -#line 1202 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1190 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-4].String) += " " + *(yyvsp[-3].Type).newTy + " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-3].Type).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3613,11 +3601,9 @@ yyreduce: break; case 274: -#line 1207 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1195 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { -#if UPGRADE_SETCOND_OPS *(yyvsp[-4].String) = getCompareOp(*(yyvsp[-4].String), (yyvsp[-3].Type)); -#endif *(yyvsp[-4].String) += " " + *(yyvsp[-3].Type).newTy + " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-3].Type).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); (yyval.String) = (yyvsp[-4].String); @@ -3625,7 +3611,7 @@ yyreduce: break; case 275: -#line 1215 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1201 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += " " + *(yyvsp[-5].String) + " " + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3634,7 +3620,7 @@ yyreduce: break; case 276: -#line 1220 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1206 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += " " + *(yyvsp[-5].String) + " " + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3643,7 +3629,7 @@ yyreduce: break; case 277: -#line 1225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1211 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].Value).val; (yyvsp[0].Value).destroy(); @@ -3652,7 +3638,7 @@ yyreduce: break; case 278: -#line 1230 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1216 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* shiftop = (yyvsp[-3].String)->c_str(); if (*(yyvsp[-3].String) == "shr") @@ -3664,7 +3650,7 @@ yyreduce: break; case 279: -#line 1238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1224 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { std::string source = *(yyvsp[-2].Value).val; TypeInfo SrcTy = (yyvsp[-2].Value).type; @@ -3682,7 +3668,7 @@ yyreduce: break; case 280: -#line 1252 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1238 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3691,7 +3677,7 @@ yyreduce: break; case 281: -#line 1257 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1243 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-3].String) += " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Type).newTy; (yyvsp[-2].Value).destroy(); (yyvsp[0].Type).destroy(); @@ -3700,7 +3686,7 @@ yyreduce: break; case 282: -#line 1262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1248 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-3].String) += " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3709,7 +3695,7 @@ yyreduce: break; case 283: -#line 1267 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1253 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3718,7 +3704,7 @@ yyreduce: break; case 284: -#line 1272 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3727,7 +3713,7 @@ yyreduce: break; case 285: -#line 1277 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1263 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3736,7 +3722,7 @@ yyreduce: break; case 286: -#line 1282 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1268 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-5].String)->empty()) *(yyvsp[-6].String) += " " + *(yyvsp[-5].String); @@ -3757,22 +3743,22 @@ yyreduce: break; case 288: -#line 1304 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1290 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = (yyvsp[0].ValList); ;} break; case 289: -#line 1305 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1291 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); ;} break; case 291: -#line 1310 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1296 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 292: -#line 1313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1299 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " " + *(yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3783,7 +3769,7 @@ yyreduce: break; case 293: -#line 1320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1306 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + ", " + *(yyvsp[-2].Type).newTy + " " + *(yyvsp[-1].Value).val; if (!(yyvsp[0].String)->empty()) @@ -3794,7 +3780,7 @@ yyreduce: break; case 294: -#line 1327 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1313 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " " + *(yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3805,7 +3791,7 @@ yyreduce: break; case 295: -#line 1334 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1320 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + ", " + *(yyvsp[-2].Type).newTy + " " + *(yyvsp[-1].Value).val; if (!(yyvsp[0].String)->empty()) @@ -3816,7 +3802,7 @@ yyreduce: break; case 296: -#line 1341 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1327 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].Value).val; (yyvsp[0].Value).destroy(); @@ -3825,7 +3811,7 @@ yyreduce: break; case 297: -#line 1346 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1332 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-3].String)->empty()) *(yyvsp[-3].String) += " "; @@ -3836,7 +3822,7 @@ yyreduce: break; case 298: -#line 1353 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-5].String)->empty()) *(yyvsp[-5].String) += " "; @@ -3847,7 +3833,7 @@ yyreduce: break; case 299: -#line 1360 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1346 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Upgrade the indices for (unsigned i = 0; i < (yyvsp[0].ValList)->size(); ++i) { @@ -3878,7 +3864,7 @@ yyreduce: } /* Line 1126 of yacc.c. */ -#line 3882 "UpgradeParser.tab.c" +#line 3868 "UpgradeParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -4146,7 +4132,7 @@ yyreturn: } -#line 1384 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1370 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" int yyerror(const char *ErrorMsg) { diff --git a/tools/llvm-upgrade/UpgradeParser.cpp.cvs b/tools/llvm-upgrade/UpgradeParser.cpp.cvs index 96cae3b3e60..debb995a794 100644 --- a/tools/llvm-upgrade/UpgradeParser.cpp.cvs +++ b/tools/llvm-upgrade/UpgradeParser.cpp.cvs @@ -368,7 +368,7 @@ /* Copy the first part of user declarations. */ -#line 14 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 14 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" #include "ParserInternals.h" #include @@ -381,8 +381,6 @@ #define YYERROR_VERBOSE 1 #define YYINCLUDED_STDLIB_H #define YYDEBUG 1 -#define UPGRADE_SETCOND_OPS 0 -#define GENERATE_FCMP_INSTS 0 int yylex(); // declaration" of xxx warnings. int yyparse(); @@ -552,11 +550,7 @@ static std::string getCastUpgrade( // the original intent by replace the cast with a setne const char* comparator = SrcTy.isPointer() ? ", null" : (SrcTy.isFloatingPoint() ? ", 0.0" : ", 0"); -#if UPGRADE_SETCOND_OPS - const char* compareOp = SrcTy.isFloatingPoint() ? "setne " : "icmp ne "; -#else - const char* compareOp = "setne"; -#endif + const char* compareOp = SrcTy.isFloatingPoint() ? "fcmp one " : "icmp ne "; if (isConst) { Result = "(" + Source + comparator + ")"; Result = compareOp + Result; @@ -612,16 +606,12 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { result[6] = cc1; result[7] = cc2; if (TI.isFloatingPoint()) { -#if GENERATE_FCMP_INSTS result[0] = 'f'; - result[5] = 'o'; // FIXME: Always map to ordered comparison ? + result[5] = 'o'; if (cc1 == 'n') result[5] = 'u'; // NE maps to unordered else result[5] = 'o'; // everything else maps to ordered -#else - result = setcc; -#endif } else if (TI.isIntegral() || TI.isPointer()) { result[0] = 'i'; if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e')) @@ -657,7 +647,7 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { std::string* String; TypeInfo Type; @@ -666,7 +656,7 @@ typedef union YYSTYPE { ValueList* ValList; } YYSTYPE; /* Line 196 of yacc.c. */ -#line 670 "UpgradeParser.tab.c" +#line 660 "UpgradeParser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -678,7 +668,7 @@ typedef union YYSTYPE { /* Line 219 of yacc.c. */ -#line 682 "UpgradeParser.tab.c" +#line 672 "UpgradeParser.tab.c" #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ @@ -1032,36 +1022,36 @@ static const short int yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 348, 348, 348, 349, 349, 353, 353, 353, 353, - 353, 353, 353, 354, 354, 354, 354, 355, 355, 355, - 356, 356, 356, 356, 356, 356, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 359, 359, 359, 359, - 359, 359, 360, 360, 360, 360, 361, 361, 361, 361, - 361, 361, 361, 362, 362, 362, 362, 362, 362, 367, - 367, 367, 367, 368, 368, 368, 368, 369, 369, 370, - 370, 373, 376, 381, 381, 381, 381, 381, 381, 382, - 383, 386, 386, 386, 386, 386, 387, 388, 393, 398, - 399, 402, 403, 411, 417, 418, 421, 422, 431, 432, - 445, 445, 446, 446, 447, 451, 451, 451, 451, 451, - 451, 451, 452, 452, 452, 452, 452, 454, 458, 462, - 465, 470, 476, 484, 492, 498, 502, 513, 516, 524, - 525, 530, 533, 543, 549, 554, 560, 566, 572, 577, - 583, 589, 595, 601, 607, 613, 619, 625, 631, 639, - 653, 665, 670, 676, 681, 689, 694, 699, 707, 712, - 717, 727, 732, 737, 737, 747, 752, 755, 760, 764, - 768, 770, 770, 773, 785, 790, 795, 804, 813, 822, - 831, 836, 841, 846, 848, 848, 851, 856, 863, 868, - 875, 882, 887, 888, 896, 896, 897, 897, 899, 906, - 910, 914, 917, 922, 925, 927, 947, 948, 950, 959, - 960, 962, 970, 971, 972, 976, 989, 990, 993, 993, - 993, 993, 993, 993, 993, 994, 995, 1000, 1001, 1010, - 1010, 1014, 1020, 1031, 1037, 1040, 1048, 1052, 1057, 1060, - 1066, 1066, 1068, 1073, 1078, 1083, 1091, 1098, 1104, 1124, - 1129, 1135, 1140, 1148, 1157, 1164, 1172, 1176, 1183, 1184, - 1188, 1193, 1196, 1202, 1207, 1215, 1220, 1225, 1230, 1238, - 1252, 1257, 1262, 1267, 1272, 1277, 1282, 1299, 1304, 1305, - 1309, 1310, 1313, 1320, 1327, 1334, 1341, 1346, 1353, 1360 + 0, 338, 338, 338, 339, 339, 343, 343, 343, 343, + 343, 343, 343, 344, 344, 344, 344, 345, 345, 345, + 346, 346, 346, 346, 346, 346, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, + 348, 348, 348, 348, 348, 348, 349, 349, 349, 349, + 349, 349, 350, 350, 350, 350, 351, 351, 351, 351, + 351, 351, 351, 352, 352, 352, 352, 352, 352, 357, + 357, 357, 357, 358, 358, 358, 358, 359, 359, 360, + 360, 363, 366, 371, 371, 371, 371, 371, 371, 372, + 373, 376, 376, 376, 376, 376, 377, 378, 383, 388, + 389, 392, 393, 401, 407, 408, 411, 412, 421, 422, + 435, 435, 436, 436, 437, 441, 441, 441, 441, 441, + 441, 441, 442, 442, 442, 442, 442, 444, 448, 452, + 455, 460, 466, 474, 482, 488, 492, 503, 506, 514, + 515, 520, 523, 533, 539, 544, 550, 556, 562, 567, + 573, 579, 585, 591, 597, 603, 609, 615, 621, 629, + 643, 655, 660, 666, 671, 677, 682, 687, 695, 700, + 705, 715, 720, 725, 725, 735, 740, 743, 748, 752, + 756, 758, 758, 761, 773, 778, 783, 792, 801, 810, + 819, 824, 829, 834, 836, 836, 839, 844, 851, 856, + 863, 870, 875, 876, 884, 884, 885, 885, 887, 894, + 898, 902, 905, 910, 913, 915, 935, 936, 938, 947, + 948, 950, 958, 959, 960, 964, 977, 978, 981, 981, + 981, 981, 981, 981, 981, 982, 983, 988, 989, 998, + 998, 1002, 1008, 1019, 1025, 1028, 1036, 1040, 1045, 1048, + 1054, 1054, 1056, 1061, 1066, 1071, 1079, 1086, 1092, 1112, + 1117, 1123, 1128, 1136, 1145, 1152, 1160, 1164, 1171, 1172, + 1176, 1181, 1184, 1190, 1195, 1201, 1206, 1211, 1216, 1224, + 1238, 1243, 1248, 1253, 1258, 1263, 1268, 1285, 1290, 1291, + 1295, 1296, 1299, 1306, 1313, 1320, 1327, 1332, 1339, 1346 }; #endif @@ -2408,26 +2398,26 @@ yyreduce: switch (yyn) { case 81: -#line 373 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 363 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[-1].String); ;} break; case 82: -#line 376 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 366 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 90: -#line 383 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 373 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 97: -#line 388 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 378 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2436,27 +2426,27 @@ yyreduce: break; case 98: -#line 393 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 383 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(""); ;} break; case 99: -#line 398 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 388 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 100: -#line 399 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 389 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); (yyval.String) = (yyvsp[-1].String); ;} break; case 101: -#line 402 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 392 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 102: -#line 403 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 393 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, ", "); *(yyvsp[-1].String) += " " + *(yyvsp[0].String); @@ -2466,7 +2456,7 @@ yyreduce: break; case 103: -#line 411 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 401 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2475,17 +2465,17 @@ yyreduce: break; case 104: -#line 417 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 407 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 106: -#line 421 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 411 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 107: -#line 422 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 412 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, ", "); if (!(yyvsp[0].String)->empty()) @@ -2496,7 +2486,7 @@ yyreduce: break; case 109: -#line 432 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 422 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -2505,7 +2495,7 @@ yyreduce: break; case 127: -#line 454 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 444 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type).newTy = (yyvsp[0].String); (yyval.Type).oldTy = OpaqueTy; @@ -2513,7 +2503,7 @@ yyreduce: break; case 128: -#line 458 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 448 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type).newTy = (yyvsp[0].String); (yyval.Type).oldTy = UnresolvedTy; @@ -2521,14 +2511,14 @@ yyreduce: break; case 129: -#line 462 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 452 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Type) = (yyvsp[0].Type); ;} break; case 130: -#line 465 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 455 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Type UpReference (yyvsp[0].String)->insert(0, "\\"); (yyval.Type).newTy = (yyvsp[0].String); @@ -2537,7 +2527,7 @@ yyreduce: break; case 131: -#line 470 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 460 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function derived type? *(yyvsp[-3].Type).newTy += "( " + *(yyvsp[-1].String) + " )"; delete (yyvsp[-1].String); @@ -2547,7 +2537,7 @@ yyreduce: break; case 132: -#line 476 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 466 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Sized array type? (yyvsp[-3].String)->insert(0,"[ "); *(yyvsp[-3].String) += " x " + *(yyvsp[-1].Type).newTy + " ]"; @@ -2559,7 +2549,7 @@ yyreduce: break; case 133: -#line 484 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 474 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Packed array type? (yyvsp[-3].String)->insert(0,"< "); *(yyvsp[-3].String) += " x " + *(yyvsp[-1].Type).newTy + " >"; @@ -2571,7 +2561,7 @@ yyreduce: break; case 134: -#line 492 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 482 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Structure type? (yyvsp[-1].String)->insert(0, "{ "); *(yyvsp[-1].String) += " }"; @@ -2581,7 +2571,7 @@ yyreduce: break; case 135: -#line 498 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 488 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Empty structure type? (yyval.Type).newTy = new std::string("{}"); (yyval.Type).oldTy = StructTy; @@ -2589,7 +2579,7 @@ yyreduce: break; case 136: -#line 502 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 492 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Pointer type? *(yyvsp[-1].Type).newTy += '*'; (yyval.Type).elemTy = (yyvsp[-1].Type).oldTy; @@ -2599,14 +2589,14 @@ yyreduce: break; case 137: -#line 513 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 503 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].Type).newTy; ;} break; case 138: -#line 516 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 506 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].Type).newTy; delete (yyvsp[0].Type).newTy; @@ -2615,7 +2605,7 @@ yyreduce: break; case 140: -#line 525 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 515 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", ..."; delete (yyvsp[0].String); @@ -2624,21 +2614,21 @@ yyreduce: break; case 141: -#line 530 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 520 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 142: -#line 533 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 523 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 143: -#line 543 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 533 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2648,7 +2638,7 @@ yyreduce: break; case 144: -#line 549 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 539 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2657,7 +2647,7 @@ yyreduce: break; case 145: -#line 554 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 544 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2667,7 +2657,7 @@ yyreduce: break; case 146: -#line 560 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 550 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Nonempty unsized arr (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2677,7 +2667,7 @@ yyreduce: break; case 147: -#line 566 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 556 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-3].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-3].Type).newTy); @@ -2687,7 +2677,7 @@ yyreduce: break; case 148: -#line 572 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 562 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-2].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-2].Type).newTy); @@ -2696,7 +2686,7 @@ yyreduce: break; case 149: -#line 577 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 567 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2706,7 +2696,7 @@ yyreduce: break; case 150: -#line 583 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 573 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2716,7 +2706,7 @@ yyreduce: break; case 151: -#line 589 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 579 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2726,7 +2716,7 @@ yyreduce: break; case 152: -#line 595 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 585 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2736,7 +2726,7 @@ yyreduce: break; case 153: -#line 601 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 591 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2746,7 +2736,7 @@ yyreduce: break; case 154: -#line 607 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 597 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2756,7 +2746,7 @@ yyreduce: break; case 155: -#line 613 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 603 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // integral constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2766,7 +2756,7 @@ yyreduce: break; case 156: -#line 619 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 609 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2776,7 +2766,7 @@ yyreduce: break; case 157: -#line 625 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 615 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Boolean constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2786,7 +2776,7 @@ yyreduce: break; case 158: -#line 631 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 621 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Float & Double constants (yyval.Const).type = (yyvsp[-1].Type); (yyval.Const).cnst = new std::string(*(yyvsp[-1].Type).newTy); @@ -2796,7 +2786,7 @@ yyreduce: break; case 159: -#line 639 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 629 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { std::string source = *(yyvsp[-3].Const).cnst; TypeInfo DstTy = (yyvsp[-1].Type); @@ -2814,7 +2804,7 @@ yyreduce: break; case 160: -#line 653 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 643 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-4].String) += "(" + *(yyvsp[-2].Const).cnst; for (unsigned i = 0; i < (yyvsp[-1].ValList)->size(); ++i) { @@ -2830,7 +2820,7 @@ yyreduce: break; case 161: -#line 665 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 655 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2839,7 +2829,7 @@ yyreduce: break; case 162: -#line 670 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 660 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* op = getDivRemOpcode(*(yyvsp[-5].String), (yyvsp[-3].Const).type); (yyval.String) = new std::string(op); @@ -2849,7 +2839,7 @@ yyreduce: break; case 163: -#line 676 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 666 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2858,11 +2848,9 @@ yyreduce: break; case 164: -#line 681 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 671 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { -#if UPGRADE_SETCOND_OPS *(yyvsp[-5].String) = getCompareOp(*(yyvsp[-5].String), (yyvsp[-3].Const).type); -#endif *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); (yyval.String) = (yyvsp[-5].String); @@ -2870,7 +2858,7 @@ yyreduce: break; case 165: -#line 689 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 677 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += "(" + *(yyvsp[-5].String) + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2879,7 +2867,7 @@ yyreduce: break; case 166: -#line 694 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 682 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += "(" + *(yyvsp[-5].String) + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2888,7 +2876,7 @@ yyreduce: break; case 167: -#line 699 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 687 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* shiftop = (yyvsp[-5].String)->c_str(); if (*(yyvsp[-5].String) == "shr") @@ -2900,7 +2888,7 @@ yyreduce: break; case 168: -#line 707 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 695 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += "(" + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2909,7 +2897,7 @@ yyreduce: break; case 169: -#line 712 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 700 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2918,7 +2906,7 @@ yyreduce: break; case 170: -#line 717 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 705 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-7].String) += "(" + *(yyvsp[-5].Const).cnst + "," + *(yyvsp[-3].Const).cnst + "," + *(yyvsp[-1].Const).cnst + ")"; (yyvsp[-5].Const).destroy(); (yyvsp[-3].Const).destroy(); (yyvsp[-1].Const).destroy(); @@ -2927,7 +2915,7 @@ yyreduce: break; case 171: -#line 727 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 715 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].Const).cnst; (yyvsp[0].Const).destroy(); @@ -2936,25 +2924,25 @@ yyreduce: break; case 172: -#line 732 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 720 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(*(yyvsp[0].Const).cnst); (yyvsp[0].Const).destroy(); ;} break; case 175: -#line 747 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 735 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { ;} break; case 176: -#line 752 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 740 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 177: -#line 755 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 743 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -2963,7 +2951,7 @@ yyreduce: break; case 178: -#line 760 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 748 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << "module asm " << " " << *(yyvsp[0].String) << "\n"; (yyval.String) = 0; @@ -2971,7 +2959,7 @@ yyreduce: break; case 179: -#line 764 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 752 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << "implementation\n"; (yyval.String) = 0; @@ -2979,17 +2967,17 @@ yyreduce: break; case 180: -#line 768 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 756 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 182: -#line 770 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 758 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); *(yyval.String) = "external"; ;} break; case 183: -#line 773 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 761 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { EnumeratedTypes.push_back((yyvsp[0].Type)); if (!(yyvsp[-2].String)->empty()) { @@ -3005,7 +2993,7 @@ yyreduce: break; case 184: -#line 785 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 773 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Function prototypes can be in const pool *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3014,7 +3002,7 @@ yyreduce: break; case 185: -#line 790 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 778 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Asm blocks can be in the const pool *O << *(yyvsp[-2].String) << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-2].String); delete (yyvsp[-1].String); delete (yyvsp[0].String); @@ -3023,7 +3011,7 @@ yyreduce: break; case 186: -#line 795 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 783 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3036,7 +3024,7 @@ yyreduce: break; case 187: -#line 804 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 792 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3049,7 +3037,7 @@ yyreduce: break; case 188: -#line 813 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 801 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3062,7 +3050,7 @@ yyreduce: break; case 189: -#line 822 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 810 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-4].String)->empty()) { *O << *(yyvsp[-4].String) << " = "; @@ -3075,7 +3063,7 @@ yyreduce: break; case 190: -#line 831 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 819 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[-1].String) << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-1].String); delete (yyvsp[0].String); @@ -3084,7 +3072,7 @@ yyreduce: break; case 191: -#line 836 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 824 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[-2].String) << " = " << *(yyvsp[0].String) << "\n"; delete (yyvsp[-2].String); delete (yyvsp[0].String); @@ -3093,14 +3081,14 @@ yyreduce: break; case 192: -#line 841 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 829 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 196: -#line 851 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 839 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3109,7 +3097,7 @@ yyreduce: break; case 197: -#line 856 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 844 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); if (*(yyvsp[0].String) == "64") @@ -3120,7 +3108,7 @@ yyreduce: break; case 198: -#line 863 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 851 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3129,7 +3117,7 @@ yyreduce: break; case 199: -#line 868 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 856 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " = " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3138,7 +3126,7 @@ yyreduce: break; case 200: -#line 875 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 863 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, "[ "); *(yyvsp[-1].String) += " ]"; @@ -3147,7 +3135,7 @@ yyreduce: break; case 201: -#line 882 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 870 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3156,19 +3144,19 @@ yyreduce: break; case 203: -#line 888 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 876 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 207: -#line 897 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 885 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 208: -#line 899 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 887 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3178,7 +3166,7 @@ yyreduce: break; case 209: -#line 906 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 894 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3186,21 +3174,21 @@ yyreduce: break; case 210: -#line 910 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 898 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 211: -#line 914 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 902 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 212: -#line 917 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 905 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += ", ..."; (yyval.String) = (yyvsp[-2].String); @@ -3209,19 +3197,19 @@ yyreduce: break; case 213: -#line 922 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 910 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); ;} break; case 214: -#line 925 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 913 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 215: -#line 928 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 916 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-7].String)->empty()) { *(yyvsp[-7].String) += " "; @@ -3243,17 +3231,17 @@ yyreduce: break; case 216: -#line 947 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 935 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("{"); delete (yyvsp[0].String); ;} break; case 217: -#line 948 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 936 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string ("{"); ;} break; case 218: -#line 950 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 938 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-2].String)->empty()) { *O << *(yyvsp[-2].String) << " "; @@ -3265,17 +3253,17 @@ yyreduce: break; case 219: -#line 959 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 947 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("}"); delete (yyvsp[0].String); ;} break; case 220: -#line 960 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 948 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string("}"); ;} break; case 221: -#line 962 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 950 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if ((yyvsp[-1].String)) *O << *(yyvsp[-1].String); @@ -3285,12 +3273,12 @@ yyreduce: break; case 222: -#line 970 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 958 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 225: -#line 976 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 964 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-1].String)->empty()) *(yyvsp[-2].String) += " " + *(yyvsp[-1].String); @@ -3302,12 +3290,12 @@ yyreduce: break; case 226: -#line 989 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 977 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 236: -#line 995 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 983 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-1].String)->insert(0, "<"); *(yyvsp[-1].String) += ">"; @@ -3316,7 +3304,7 @@ yyreduce: break; case 238: -#line 1001 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 989 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-3].String)->empty()) { *(yyvsp[-4].String) += " " + *(yyvsp[-3].String); @@ -3328,7 +3316,7 @@ yyreduce: break; case 241: -#line 1014 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1002 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value).val = (yyvsp[0].String); (yyval.Value).constant = false; @@ -3338,7 +3326,7 @@ yyreduce: break; case 242: -#line 1020 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1008 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value).val = (yyvsp[0].String); (yyval.Value).constant = true; @@ -3348,7 +3336,7 @@ yyreduce: break; case 243: -#line 1031 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1019 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.Value) = (yyvsp[0].Value); (yyval.Value).type = (yyvsp[-1].Type); @@ -3357,28 +3345,28 @@ yyreduce: break; case 244: -#line 1037 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1025 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 245: -#line 1040 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1028 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Do not allow functions with 0 basic blocks (yyval.String) = 0; ;} break; case 246: -#line 1048 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1036 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 247: -#line 1052 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1040 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3387,14 +3375,14 @@ yyreduce: break; case 248: -#line 1057 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1045 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = 0; ;} break; case 249: -#line 1060 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1048 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3403,12 +3391,12 @@ yyreduce: break; case 251: -#line 1066 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1054 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = (yyvsp[0].String); *(yyval.String) = "unwind"; ;} break; case 252: -#line 1068 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1056 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with a result... *O << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].Value).val << "\n"; delete (yyvsp[-1].String); (yyvsp[0].Value).destroy(); @@ -3417,7 +3405,7 @@ yyreduce: break; case 253: -#line 1073 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1061 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Return with no result... *O << " " << *(yyvsp[-1].String) << " " << *(yyvsp[0].Type).newTy << "\n"; delete (yyvsp[-1].String); (yyvsp[0].Type).destroy(); @@ -3426,7 +3414,7 @@ yyreduce: break; case 254: -#line 1078 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1066 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Unconditional Branch... *O << " " << *(yyvsp[-2].String) << " " << *(yyvsp[-1].Type).newTy << " " << *(yyvsp[0].Value).val << "\n"; delete (yyvsp[-2].String); (yyvsp[-1].Type).destroy(); (yyvsp[0].Value).destroy(); @@ -3435,7 +3423,7 @@ yyreduce: break; case 255: -#line 1083 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1071 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-8].String) << " " << *(yyvsp[-7].Type).newTy << " " << *(yyvsp[-6].Value).val << ", " << *(yyvsp[-4].Type).newTy << " " << *(yyvsp[-3].Value).val << ", " << *(yyvsp[-1].Type).newTy << " " @@ -3447,7 +3435,7 @@ yyreduce: break; case 256: -#line 1091 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1079 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-8].String) << " " << *(yyvsp[-7].Type).newTy << " " << *(yyvsp[-6].Value).val << ", " << *(yyvsp[-4].Type).newTy << " " << *(yyvsp[-3].Value).val << " [" << *(yyvsp[-1].String) << " ]\n"; @@ -3458,7 +3446,7 @@ yyreduce: break; case 257: -#line 1098 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1086 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[-7].String) << " " << *(yyvsp[-6].Type).newTy << " " << *(yyvsp[-5].Value).val << ", " << *(yyvsp[-3].Type).newTy << " " << *(yyvsp[-2].Value).val << "[]\n"; @@ -3468,7 +3456,7 @@ yyreduce: break; case 258: -#line 1105 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1093 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " "; if (!(yyvsp[-13].String)->empty()) @@ -3491,7 +3479,7 @@ yyreduce: break; case 259: -#line 1124 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1112 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3500,7 +3488,7 @@ yyreduce: break; case 260: -#line 1129 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1117 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *O << " " << *(yyvsp[0].String) << "\n"; delete (yyvsp[0].String); @@ -3509,7 +3497,7 @@ yyreduce: break; case 261: -#line 1135 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1123 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + " " + *(yyvsp[-3].String) + ", " + *(yyvsp[-1].Type).newTy + " " + *(yyvsp[0].Value).val; (yyvsp[-4].Type).destroy(); delete (yyvsp[-3].String); (yyvsp[-1].Type).destroy(); (yyvsp[0].Value).destroy(); @@ -3518,7 +3506,7 @@ yyreduce: break; case 262: -#line 1140 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1128 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-3].String)->insert(0, *(yyvsp[-4].Type).newTy + " " ); *(yyvsp[-3].String) += ", " + *(yyvsp[-1].Type).newTy + " " + *(yyvsp[0].Value).val; @@ -3528,7 +3516,7 @@ yyreduce: break; case 263: -#line 1148 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1136 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-1].String)->empty()) *(yyvsp[-1].String) += " = "; @@ -3539,7 +3527,7 @@ yyreduce: break; case 264: -#line 1157 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1145 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Used for PHI nodes (yyvsp[-3].Value).val->insert(0, *(yyvsp[-5].Type).newTy + "["); *(yyvsp[-3].Value).val += "," + *(yyvsp[-1].Value).val + "]"; @@ -3550,7 +3538,7 @@ yyreduce: break; case 265: -#line 1164 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1152 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += ", [" + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + "]"; (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3559,7 +3547,7 @@ yyreduce: break; case 266: -#line 1172 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1160 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); (yyval.ValList)->push_back((yyvsp[0].Value)); @@ -3567,7 +3555,7 @@ yyreduce: break; case 267: -#line 1176 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1164 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyvsp[-2].ValList)->push_back((yyvsp[0].Value)); (yyval.ValList) = (yyvsp[-2].ValList); @@ -3575,17 +3563,17 @@ yyreduce: break; case 268: -#line 1183 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1171 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = (yyvsp[0].ValList); ;} break; case 269: -#line 1184 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1172 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); ;} break; case 270: -#line 1188 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1176 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3594,7 +3582,7 @@ yyreduce: break; case 272: -#line 1196 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1184 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* op = getDivRemOpcode(*(yyvsp[-4].String), (yyvsp[-3].Type)); (yyval.String) = new std::string(op); @@ -3604,7 +3592,7 @@ yyreduce: break; case 273: -#line 1202 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1190 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-4].String) += " " + *(yyvsp[-3].Type).newTy + " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-3].Type).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3613,11 +3601,9 @@ yyreduce: break; case 274: -#line 1207 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1195 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { -#if UPGRADE_SETCOND_OPS *(yyvsp[-4].String) = getCompareOp(*(yyvsp[-4].String), (yyvsp[-3].Type)); -#endif *(yyvsp[-4].String) += " " + *(yyvsp[-3].Type).newTy + " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-3].Type).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); (yyval.String) = (yyvsp[-4].String); @@ -3625,7 +3611,7 @@ yyreduce: break; case 275: -#line 1215 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1201 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += " " + *(yyvsp[-5].String) + " " + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3634,7 +3620,7 @@ yyreduce: break; case 276: -#line 1220 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1206 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-6].String) += " " + *(yyvsp[-5].String) + " " + *(yyvsp[-3].Value).val + "," + *(yyvsp[-1].Value).val + ")"; delete (yyvsp[-5].String); (yyvsp[-3].Value).destroy(); (yyvsp[-1].Value).destroy(); @@ -3643,7 +3629,7 @@ yyreduce: break; case 277: -#line 1225 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1211 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].Value).val; (yyvsp[0].Value).destroy(); @@ -3652,7 +3638,7 @@ yyreduce: break; case 278: -#line 1230 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1216 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { const char* shiftop = (yyvsp[-3].String)->c_str(); if (*(yyvsp[-3].String) == "shr") @@ -3664,7 +3650,7 @@ yyreduce: break; case 279: -#line 1238 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1224 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { std::string source = *(yyvsp[-2].Value).val; TypeInfo SrcTy = (yyvsp[-2].Value).type; @@ -3682,7 +3668,7 @@ yyreduce: break; case 280: -#line 1252 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1238 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3691,7 +3677,7 @@ yyreduce: break; case 281: -#line 1257 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1243 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-3].String) += " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Type).newTy; (yyvsp[-2].Value).destroy(); (yyvsp[0].Type).destroy(); @@ -3700,7 +3686,7 @@ yyreduce: break; case 282: -#line 1262 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1248 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-3].String) += " " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3709,7 +3695,7 @@ yyreduce: break; case 283: -#line 1267 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1253 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3718,7 +3704,7 @@ yyreduce: break; case 284: -#line 1272 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1258 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Value).val + ", " + *(yyvsp[-2].Value).val + ", " + *(yyvsp[0].Value).val; (yyvsp[-4].Value).destroy(); (yyvsp[-2].Value).destroy(); (yyvsp[0].Value).destroy(); @@ -3727,7 +3713,7 @@ yyreduce: break; case 285: -#line 1277 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1263 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].String); delete (yyvsp[0].String); @@ -3736,7 +3722,7 @@ yyreduce: break; case 286: -#line 1282 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1268 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-5].String)->empty()) *(yyvsp[-6].String) += " " + *(yyvsp[-5].String); @@ -3757,22 +3743,22 @@ yyreduce: break; case 288: -#line 1304 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1290 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = (yyvsp[0].ValList); ;} break; case 289: -#line 1305 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1291 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.ValList) = new ValueList(); ;} break; case 291: -#line 1310 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1296 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { (yyval.String) = new std::string(); ;} break; case 292: -#line 1313 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1299 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " " + *(yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3783,7 +3769,7 @@ yyreduce: break; case 293: -#line 1320 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1306 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + ", " + *(yyvsp[-2].Type).newTy + " " + *(yyvsp[-1].Value).val; if (!(yyvsp[0].String)->empty()) @@ -3794,7 +3780,7 @@ yyreduce: break; case 294: -#line 1327 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1313 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-2].String) += " " + *(yyvsp[-1].Type).newTy; if (!(yyvsp[0].String)->empty()) @@ -3805,7 +3791,7 @@ yyreduce: break; case 295: -#line 1334 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1320 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-5].String) += " " + *(yyvsp[-4].Type).newTy + ", " + *(yyvsp[-2].Type).newTy + " " + *(yyvsp[-1].Value).val; if (!(yyvsp[0].String)->empty()) @@ -3816,7 +3802,7 @@ yyreduce: break; case 296: -#line 1341 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1327 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { *(yyvsp[-1].String) += " " + *(yyvsp[0].Value).val; (yyvsp[0].Value).destroy(); @@ -3825,7 +3811,7 @@ yyreduce: break; case 297: -#line 1346 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1332 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-3].String)->empty()) *(yyvsp[-3].String) += " "; @@ -3836,7 +3822,7 @@ yyreduce: break; case 298: -#line 1353 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1339 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { if (!(yyvsp[-5].String)->empty()) *(yyvsp[-5].String) += " "; @@ -3847,7 +3833,7 @@ yyreduce: break; case 299: -#line 1360 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1346 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" { // Upgrade the indices for (unsigned i = 0; i < (yyvsp[0].ValList)->size(); ++i) { @@ -3878,7 +3864,7 @@ yyreduce: } /* Line 1126 of yacc.c. */ -#line 3882 "UpgradeParser.tab.c" +#line 3868 "UpgradeParser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -4146,7 +4132,7 @@ yyreturn: } -#line 1384 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 1370 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" int yyerror(const char *ErrorMsg) { diff --git a/tools/llvm-upgrade/UpgradeParser.h b/tools/llvm-upgrade/UpgradeParser.h index 96dcdc426d8..0a62b471e4b 100644 --- a/tools/llvm-upgrade/UpgradeParser.h +++ b/tools/llvm-upgrade/UpgradeParser.h @@ -333,7 +333,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { std::string* String; TypeInfo Type; diff --git a/tools/llvm-upgrade/UpgradeParser.h.cvs b/tools/llvm-upgrade/UpgradeParser.h.cvs index 96dcdc426d8..0a62b471e4b 100644 --- a/tools/llvm-upgrade/UpgradeParser.h.cvs +++ b/tools/llvm-upgrade/UpgradeParser.h.cvs @@ -333,7 +333,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 285 "/proj/llvm/llvm-1/tools/llvm-upgrade/UpgradeParser.y" +#line 275 "/proj/llvm/llvm-3/tools/llvm-upgrade/UpgradeParser.y" typedef union YYSTYPE { std::string* String; TypeInfo Type; diff --git a/tools/llvm-upgrade/UpgradeParser.y b/tools/llvm-upgrade/UpgradeParser.y index 5a4118d8d74..3458c3a0cce 100644 --- a/tools/llvm-upgrade/UpgradeParser.y +++ b/tools/llvm-upgrade/UpgradeParser.y @@ -23,8 +23,6 @@ #define YYERROR_VERBOSE 1 #define YYINCLUDED_STDLIB_H #define YYDEBUG 1 -#define UPGRADE_SETCOND_OPS 0 -#define GENERATE_FCMP_INSTS 0 int yylex(); // declaration" of xxx warnings. int yyparse(); @@ -194,11 +192,7 @@ static std::string getCastUpgrade( // the original intent by replace the cast with a setne const char* comparator = SrcTy.isPointer() ? ", null" : (SrcTy.isFloatingPoint() ? ", 0.0" : ", 0"); -#if UPGRADE_SETCOND_OPS - const char* compareOp = SrcTy.isFloatingPoint() ? "setne " : "icmp ne "; -#else - const char* compareOp = "setne"; -#endif + const char* compareOp = SrcTy.isFloatingPoint() ? "fcmp one " : "icmp ne "; if (isConst) { Result = "(" + Source + comparator + ")"; Result = compareOp + Result; @@ -254,16 +248,12 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { result[6] = cc1; result[7] = cc2; if (TI.isFloatingPoint()) { -#if GENERATE_FCMP_INSTS result[0] = 'f'; - result[5] = 'o'; // FIXME: Always map to ordered comparison ? + result[5] = 'o'; if (cc1 == 'n') result[5] = 'u'; // NE maps to unordered else result[5] = 'o'; // everything else maps to ordered -#else - result = setcc; -#endif } else if (TI.isIntegral() || TI.isPointer()) { result[0] = 'i'; if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e')) @@ -679,9 +669,7 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' { $$ = $1; } | SetCondOps '(' ConstVal ',' ConstVal ')' { -#if UPGRADE_SETCOND_OPS *$1 = getCompareOp(*$1, $3.type); -#endif *$1 += "(" + *$3.cnst + "," + *$5.cnst + ")"; $3.destroy(); $5.destroy(); $$ = $1; @@ -1205,9 +1193,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { $$ = $1; } | SetCondOps Types ValueRef ',' ValueRef { -#if UPGRADE_SETCOND_OPS *$1 = getCompareOp(*$1, $2); -#endif *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val; $2.destroy(); $3.destroy(); $5.destroy(); $$ = $1; diff --git a/tools/llvm-upgrade/UpgradeParser.y.cvs b/tools/llvm-upgrade/UpgradeParser.y.cvs index 5a4118d8d74..3458c3a0cce 100644 --- a/tools/llvm-upgrade/UpgradeParser.y.cvs +++ b/tools/llvm-upgrade/UpgradeParser.y.cvs @@ -23,8 +23,6 @@ #define YYERROR_VERBOSE 1 #define YYINCLUDED_STDLIB_H #define YYDEBUG 1 -#define UPGRADE_SETCOND_OPS 0 -#define GENERATE_FCMP_INSTS 0 int yylex(); // declaration" of xxx warnings. int yyparse(); @@ -194,11 +192,7 @@ static std::string getCastUpgrade( // the original intent by replace the cast with a setne const char* comparator = SrcTy.isPointer() ? ", null" : (SrcTy.isFloatingPoint() ? ", 0.0" : ", 0"); -#if UPGRADE_SETCOND_OPS - const char* compareOp = SrcTy.isFloatingPoint() ? "setne " : "icmp ne "; -#else - const char* compareOp = "setne"; -#endif + const char* compareOp = SrcTy.isFloatingPoint() ? "fcmp one " : "icmp ne "; if (isConst) { Result = "(" + Source + comparator + ")"; Result = compareOp + Result; @@ -254,16 +248,12 @@ getCompareOp(const std::string& setcc, const TypeInfo& TI) { result[6] = cc1; result[7] = cc2; if (TI.isFloatingPoint()) { -#if GENERATE_FCMP_INSTS result[0] = 'f'; - result[5] = 'o'; // FIXME: Always map to ordered comparison ? + result[5] = 'o'; if (cc1 == 'n') result[5] = 'u'; // NE maps to unordered else result[5] = 'o'; // everything else maps to ordered -#else - result = setcc; -#endif } else if (TI.isIntegral() || TI.isPointer()) { result[0] = 'i'; if ((cc1 == 'e' && cc2 == 'q') || (cc1 == 'n' && cc2 == 'e')) @@ -679,9 +669,7 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' { $$ = $1; } | SetCondOps '(' ConstVal ',' ConstVal ')' { -#if UPGRADE_SETCOND_OPS *$1 = getCompareOp(*$1, $3.type); -#endif *$1 += "(" + *$3.cnst + "," + *$5.cnst + ")"; $3.destroy(); $5.destroy(); $$ = $1; @@ -1205,9 +1193,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { $$ = $1; } | SetCondOps Types ValueRef ',' ValueRef { -#if UPGRADE_SETCOND_OPS *$1 = getCompareOp(*$1, $2); -#endif *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val; $2.destroy(); $3.destroy(); $5.destroy(); $$ = $1; diff --git a/tools/llvm2cpp/CppWriter.cpp b/tools/llvm2cpp/CppWriter.cpp index cc04288e745..94391e35eba 100644 --- a/tools/llvm2cpp/CppWriter.cpp +++ b/tools/llvm2cpp/CppWriter.cpp @@ -783,31 +783,63 @@ void CppWriter::printConstant(const Constant *CV) { } Out << "Constant* " << constName << " = ConstantExpr::"; switch (CE->getOpcode()) { - case Instruction::Add: Out << "getAdd"; break; - case Instruction::Sub: Out << "getSub"; break; - case Instruction::Mul: Out << "getMul"; break; - case Instruction::UDiv: Out << "getUDiv"; break; - case Instruction::SDiv: Out << "getSDiv"; break; - case Instruction::FDiv: Out << "getFDiv"; break; - case Instruction::URem: Out << "getURem"; break; - case Instruction::SRem: Out << "getSRem"; break; - case Instruction::FRem: Out << "getFRem"; break; - case Instruction::And: Out << "getAnd"; break; - case Instruction::Or: Out << "getOr"; break; - case Instruction::Xor: Out << "getXor"; break; - case Instruction::SetEQ: Out << "getSetEQ"; break; - case Instruction::SetNE: Out << "getSetNE"; break; - case Instruction::SetLE: Out << "getSetLE"; break; - case Instruction::SetGE: Out << "getSetGE"; break; - case Instruction::SetLT: Out << "getSetLT"; break; - case Instruction::SetGT: Out << "getSetGT"; break; - case Instruction::Shl: Out << "getShl"; break; - case Instruction::LShr: Out << "getLShr"; break; - case Instruction::AShr: Out << "getAShr"; break; - case Instruction::Select: Out << "getSelect"; break; - case Instruction::ExtractElement: Out << "getExtractElement"; break; - case Instruction::InsertElement: Out << "getInsertElement"; break; - case Instruction::ShuffleVector: Out << "getShuffleVector"; break; + case Instruction::Add: Out << "getAdd("; break; + case Instruction::Sub: Out << "getSub("; break; + case Instruction::Mul: Out << "getMul("; break; + case Instruction::UDiv: Out << "getUDiv("; break; + case Instruction::SDiv: Out << "getSDiv("; break; + case Instruction::FDiv: Out << "getFDiv("; break; + case Instruction::URem: Out << "getURem("; break; + case Instruction::SRem: Out << "getSRem("; break; + case Instruction::FRem: Out << "getFRem("; break; + case Instruction::And: Out << "getAnd("; break; + case Instruction::Or: Out << "getOr("; break; + case Instruction::Xor: Out << "getXor("; break; + case Instruction::ICmp: + Out << "getICmp(ICmpInst::ICMP_"; + switch (CE->getPredicate()) { + case ICmpInst::ICMP_EQ: Out << "EQ"; break; + case ICmpInst::ICMP_NE: Out << "NE"; break; + case ICmpInst::ICMP_SLT: Out << "SLT"; break; + case ICmpInst::ICMP_ULT: Out << "ULT"; break; + case ICmpInst::ICMP_SGT: Out << "SGT"; break; + case ICmpInst::ICMP_UGT: Out << "UGT"; break; + case ICmpInst::ICMP_SLE: Out << "SLE"; break; + case ICmpInst::ICMP_ULE: Out << "ULE"; break; + case ICmpInst::ICMP_SGE: Out << "SGE"; break; + case ICmpInst::ICMP_UGE: Out << "UGE"; break; + default: error("Invalid ICmp Predicate"); + } + break; + case Instruction::FCmp: + Out << "getFCmp(FCmpInst::FCMP_"; + switch (CE->getPredicate()) { + case FCmpInst::FCMP_FALSE: Out << "FALSE"; break; + case FCmpInst::FCMP_ORD: Out << "ORD"; break; + case FCmpInst::FCMP_UNO: Out << "UNO"; break; + case FCmpInst::FCMP_OEQ: Out << "OEQ"; break; + case FCmpInst::FCMP_UEQ: Out << "UEQ"; break; + case FCmpInst::FCMP_ONE: Out << "ONE"; break; + case FCmpInst::FCMP_UNE: Out << "UNE"; break; + case FCmpInst::FCMP_OLT: Out << "OLT"; break; + case FCmpInst::FCMP_ULT: Out << "ULT"; break; + case FCmpInst::FCMP_OGT: Out << "OGT"; break; + case FCmpInst::FCMP_UGT: Out << "UGT"; break; + case FCmpInst::FCMP_OLE: Out << "OLE"; break; + case FCmpInst::FCMP_ULE: Out << "ULE"; break; + case FCmpInst::FCMP_OGE: Out << "OGE"; break; + case FCmpInst::FCMP_UGE: Out << "UGE"; break; + case FCmpInst::FCMP_TRUE: Out << "TRUE"; break; + default: error("Invalid FCmp Predicate"); + } + break; + case Instruction::Shl: Out << "getShl("; break; + case Instruction::LShr: Out << "getLShr("; break; + case Instruction::AShr: Out << "getAShr("; break; + case Instruction::Select: Out << "getSelect("; break; + case Instruction::ExtractElement: Out << "getExtractElement("; break; + case Instruction::InsertElement: Out << "getInsertElement("; break; + case Instruction::ShuffleVector: Out << "getShuffleVector("; break; default: error("Invalid constant expression"); break; @@ -1075,21 +1107,46 @@ CppWriter::printInstruction(const Instruction *I, const std::string& bbname) { Out << "\", " << bbname << ");"; break; } - case Instruction::SetEQ: - case Instruction::SetNE: - case Instruction::SetLE: - case Instruction::SetGE: - case Instruction::SetLT: - case Instruction::SetGT: { - Out << "SetCondInst* " << iName << " = new SetCondInst("; - switch (I->getOpcode()) { - case Instruction::SetEQ: Out << "Instruction::SetEQ"; break; - case Instruction::SetNE: Out << "Instruction::SetNE"; break; - case Instruction::SetLE: Out << "Instruction::SetLE"; break; - case Instruction::SetGE: Out << "Instruction::SetGE"; break; - case Instruction::SetLT: Out << "Instruction::SetLT"; break; - case Instruction::SetGT: Out << "Instruction::SetGT"; break; - default: Out << "Instruction::BadOpCode"; break; + case Instruction::FCmp: { + Out << "FCmpInst* " << iName << " = new FCmpInst("; + switch (cast(I)->getPredicate()) { + case FCmpInst::FCMP_FALSE: Out << "FCmpInst::FCMP_FALSE"; break; + case FCmpInst::FCMP_OEQ : Out << "FCmpInst::FCMP_OEQ"; break; + case FCmpInst::FCMP_OGT : Out << "FCmpInst::FCMP_OGT"; break; + case FCmpInst::FCMP_OGE : Out << "FCmpInst::FCMP_OGE"; break; + case FCmpInst::FCMP_OLT : Out << "FCmpInst::FCMP_OLT"; break; + case FCmpInst::FCMP_OLE : Out << "FCmpInst::FCMP_OLE"; break; + case FCmpInst::FCMP_ONE : Out << "FCmpInst::FCMP_ONE"; break; + case FCmpInst::FCMP_ORD : Out << "FCmpInst::FCMP_ORD"; break; + case FCmpInst::FCMP_UNO : Out << "FCmpInst::FCMP_UNO"; break; + case FCmpInst::FCMP_UEQ : Out << "FCmpInst::FCMP_UEQ"; break; + case FCmpInst::FCMP_UGT : Out << "FCmpInst::FCMP_UGT"; break; + case FCmpInst::FCMP_UGE : Out << "FCmpInst::FCMP_UGE"; break; + case FCmpInst::FCMP_ULT : Out << "FCmpInst::FCMP_ULT"; break; + case FCmpInst::FCMP_ULE : Out << "FCmpInst::FCMP_ULE"; break; + case FCmpInst::FCMP_UNE : Out << "FCmpInst::FCMP_UNE"; break; + case FCmpInst::FCMP_TRUE : Out << "FCmpInst::FCMP_TRUE"; break; + default: Out << "FCmpInst::BAD_ICMP_PREDICATE"; break; + } + Out << ", " << opNames[0] << ", " << opNames[1] << ", \""; + printEscapedString(I->getName()); + Out << "\", " << bbname << ");"; + break; + } + case Instruction::ICmp: { + Out << "ICmpInst* " << iName << " = new ICmpInst("; + switch (cast(I)->getPredicate()) { + case ICmpInst::ICMP_EQ: Out << "ICmpInst::ICMP_EQ"; break; + case ICmpInst::ICMP_NE: Out << "ICmpInst::ICMP_NE"; break; + case ICmpInst::ICMP_ULE: Out << "ICmpInst::ICMP_ULE"; break; + case ICmpInst::ICMP_SLE: Out << "ICmpInst::ICMP_SLE"; break; + case ICmpInst::ICMP_UGE: Out << "ICmpInst::ICMP_UGE"; break; + case ICmpInst::ICMP_SGE: Out << "ICmpInst::ICMP_SGE"; break; + case ICmpInst::ICMP_ULT: Out << "ICmpInst::ICMP_ULT"; break; + case ICmpInst::ICMP_SLT: Out << "ICmpInst::ICMP_SLT"; break; + case ICmpInst::ICMP_UGT: Out << "ICmpInst::ICMP_UGT"; break; + case ICmpInst::ICMP_SGT: Out << "ICmpInst::ICMP_SGT"; break; + default: Out << "ICmpInst::BAD_ICMP_PREDICATE"; break; } Out << ", " << opNames[0] << ", " << opNames[1] << ", \""; printEscapedString(I->getName()); -- 2.34.1