aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-12-23 06:05:41 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-12-23 06:05:41 +0000
commite4d87aa2de6e52952dca73716386db09aad5a8fd (patch)
treece8c6e6ddc845de3585020c856118892f4206593 /lib
parentadd2bd7f5941537a97a41e037ae2277fbeed0b4f (diff)
downloadexternal_llvm-e4d87aa2de6e52952dca73716386db09aad5a8fd.zip
external_llvm-e4d87aa2de6e52952dca73716386db09aad5a8fd.tar.gz
external_llvm-e4d87aa2de6e52952dca73716386db09aad5a8fd.tar.bz2
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
Diffstat (limited to 'lib')
-rw-r--r--lib/Analysis/BasicAliasAnalysis.cpp3
-rw-r--r--lib/Analysis/ConstantRange.cpp197
-rw-r--r--lib/Analysis/IPA/Andersens.cpp5
-rw-r--r--lib/Analysis/IPA/GlobalsModRef.cpp4
-rw-r--r--lib/Analysis/LoopInfo.cpp18
-rw-r--r--lib/Analysis/ScalarEvolution.cpp198
-rw-r--r--lib/Analysis/ValueNumbering.cpp5
-rw-r--r--lib/AsmParser/Lexer.cpp.cvs1268
-rw-r--r--lib/AsmParser/Lexer.l6
-rw-r--r--lib/AsmParser/Lexer.l.cvs6
-rw-r--r--lib/AsmParser/llvmAsmParser.cpp.cvs4045
-rw-r--r--lib/AsmParser/llvmAsmParser.h.cvs223
-rw-r--r--lib/AsmParser/llvmAsmParser.y24
-rw-r--r--lib/AsmParser/llvmAsmParser.y.cvs48
-rw-r--r--lib/CodeGen/IntrinsicLowering.cpp4
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp193
-rw-r--r--lib/ExecutionEngine/Interpreter/Execution.cpp441
-rw-r--r--lib/ExecutionEngine/Interpreter/Interpreter.h2
-rw-r--r--lib/Support/ConstantRange.cpp197
-rw-r--r--lib/Target/CBackend/CBackend.cpp401
-rw-r--r--lib/Target/CBackend/Makefile2
-rw-r--r--lib/Target/CBackend/Writer.cpp401
-rw-r--r--lib/Target/README.txt2
-rw-r--r--lib/Transforms/ExprTypeConvert.cpp28
-rw-r--r--lib/Transforms/IPO/GlobalOpt.cpp64
-rw-r--r--lib/Transforms/IPO/SimplifyLibCalls.cpp40
-rw-r--r--lib/Transforms/Instrumentation/RSProfiling.cpp19
-rw-r--r--lib/Transforms/LevelRaise.cpp3
-rw-r--r--lib/Transforms/Scalar/CorrelatedExprs.cpp376
-rw-r--r--lib/Transforms/Scalar/IndVarSimplify.cpp10
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp1704
-rw-r--r--lib/Transforms/Scalar/LICM.cpp2
-rw-r--r--lib/Transforms/Scalar/LoopStrengthReduce.cpp17
-rw-r--r--lib/Transforms/Scalar/LoopUnswitch.cpp7
-rw-r--r--lib/Transforms/Scalar/LowerPacked.cpp43
-rw-r--r--lib/Transforms/Scalar/PredicateSimplifier.cpp344
-rw-r--r--lib/Transforms/Scalar/Reassociate.cpp9
-rw-r--r--lib/Transforms/Scalar/SCCP.cpp88
-rw-r--r--lib/Transforms/Scalar/ScalarReplAggregates.cpp4
-rw-r--r--lib/Transforms/Utils/CloneFunction.cpp12
-rw-r--r--lib/Transforms/Utils/Local.cpp30
-rw-r--r--lib/Transforms/Utils/LowerInvoke.cpp12
-rw-r--r--lib/Transforms/Utils/LowerSwitch.cpp7
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp49
-rw-r--r--lib/VMCore/ConstantFold.cpp1377
-rw-r--r--lib/VMCore/ConstantFold.h4
-rw-r--r--lib/VMCore/ConstantFolding.h4
-rw-r--r--lib/VMCore/Constants.cpp65
-rw-r--r--lib/VMCore/Instruction.cpp54
-rw-r--r--lib/VMCore/Instructions.cpp137
-rw-r--r--lib/VMCore/SymbolTable.cpp2
-rw-r--r--lib/VMCore/Verifier.cpp4
52 files changed, 6666 insertions, 5542 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp
index b1ea196..d37a4b1 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<ConstantBool>(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 762d5c3..69d85c2 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 <ostream>
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<ConstantBool>(CI))
@@ -84,25 +71,30 @@ static ConstantIntegral *Next(ConstantIntegral *CI) {
return cast<ConstantIntegral>(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<ConstantBool>(C) && "Constant folding of integrals not impl??");
return cast<ConstantBool>(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<ConstantBool>(C) && "Constant folding of integrals not impl??");
return cast<ConstantBool>(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<ConstantIntegral>(V)), Upper(Next(cast<ConstantIntegral>(V))) {
-}
+ConstantRange::ConstantRange(Constant *V)
+ : Lower(cast<ConstantIntegral>(V)), Upper(Next(cast<ConstantIntegral>(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<ConstantIntegral>(L)), Upper(cast<ConstantIntegral>(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 5d284118..805e771 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 7c305b7..e34d03b 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<SetCondInst>(*UI)) {
- if (!isa<ConstantPointerNull>(SCI->getOperand(1)))
+ } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(*UI)) {
+ if (!isa<ConstantPointerNull>(ICI->getOperand(1)))
return true; // Allow comparison against null.
} else if (FreeInst *F = dyn_cast<FreeInst>(*UI)) {
Writers.push_back(F->getParent()->getParent());
diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp
index b33e414..27f1750 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<BranchInst>(BackedgeBlock->getTerminator()))
- if (BI->isConditional())
- if (SetCondInst *SCI = dyn_cast<SetCondInst>(BI->getCondition()))
- if (SCI->getOperand(0) == Inc)
+ if (BI->isConditional()) {
+ if (ICmpInst *ICI = dyn_cast<ICmpInst>(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 bc1f9a0..fcfab9e 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<ConstantInt>(
- ConstantExpr::getBitCast(V, NewTy));
+ V = cast<ConstantInt>(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<BranchInst>(ExitingBlock->getTerminator());
if (ExitBr == 0) return UnknownValue;
assert(ExitBr->isConditional() && "If unconditional, it can't be in loop!");
- SetCondInst *ExitCond = dyn_cast<SetCondInst>(ExitBr->getCondition());
- if (ExitCond == 0) // Not a setcc
+ ICmpInst *ExitCond = dyn_cast<ICmpInst>(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<LoadInst>(ExitCond->getOperand(0)))
@@ -1550,12 +1545,12 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) {
Tmp = getSCEVAtScope(RHS, L);
if (!isa<SCEVCouldNotCompute>(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<SCEVConstant>(LHS) && !isa<SCEVConstant>(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<SCEVCouldNotCompute>(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<SCEVCouldNotCompute>(TC)) return TC;
- }
+ SCEVHandle TC = HowFarToZero(SCEV::getMinusSCEV(LHS, RHS), L);
+ if (!isa<SCEVCouldNotCompute>(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<SCEVCouldNotCompute>(TC)) return TC;
- }
+ SCEVHandle TC = HowFarToNonZero(SCEV::getMinusSCEV(LHS, RHS), L);
+ if (!isa<SCEVCouldNotCompute>(TC)) return TC;
break;
- case Instruction::SetLT:
- if (LHS->getType()->isInteger() &&
- ExitCond->getOperand(0)->getType()->isSigned()) {
- SCEVHandle TC = HowManyLessThans(LHS, RHS, L);
- if (!isa<SCEVCouldNotCompute>(TC)) return TC;
- }
+ }
+ case ICmpInst::ICMP_SLT: {
+ SCEVHandle TC = HowManyLessThans(LHS, RHS, L);
+ if (!isa<SCEVCouldNotCompute>(TC)) return TC;
break;
- case Instruction::SetGT:
- if (LHS->getType()->isInteger() &&
- ExitCond->getOperand(0)->getType()->isSigned()) {
- SCEVHandle TC = HowManyLessThans(RHS, LHS, L);
- if (!isa<SCEVCouldNotCompute>(TC)) return TC;
- }
+ }
+ case ICmpInst::ICMP_SGT: {
+ SCEVHandle TC = HowManyLessThans(RHS, LHS, L);
+ if (!isa<SCEVCouldNotCompute>(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<ConstantBool>(Result)) break; // Couldn't decide for sure
if (cast<ConstantBool>(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<BinaryOperator>(I) || isa<ShiftInst>(I) ||
+ if (isa<BinaryOperator>(I) || isa<ShiftInst>(I) || isa<CmpInst>(I) ||
isa<SelectInst>(I) || isa<CastInst>(I) || isa<GetElementPtrInst>(I))
return true;
@@ -1790,11 +1781,18 @@ static Constant *ConstantFold(const Instruction *I,
return ConstantFoldCall(cast<Function>(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<ICmpInst>(I)->getPredicate(), Operands[0], Operands[1]);
+ case Instruction::FCmp:
+ return ConstantExpr::getFCmp(
+ cast<FCmpInst>(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<ConstantBool>(ConstantExpr::getSetLT(R1->getValue(),
- R2->getValue()))) {
+ dyn_cast<ConstantBool>(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<SCEVConstant>(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<SetCondInst>(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<ICmpInst>(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<SCEVAddRecExpr>(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<ConstantInt>(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<ConstantBool>(ConstantExpr::getSetLT(R1->getValue(),
- R2->getValue()))) {
+ dyn_cast<ConstantBool>(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<SCEVConstant>(Val)->getValue()))
+ if (!Range.contains(cast<SCEVConstant>(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 73d7ed3..5c57fb7 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<CmpInst>(&const_cast<Instruction&>(I1)))
+ if (CI1->getPredicate() != cast<CmpInst>(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 a36a753..f480d1c 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,107 +613,105 @@ 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,
@@ -725,21 +719,19 @@ static yyconst short int yy_nxt[1293] =
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 <list>
@@ -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 93b84be..478bfb8 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 93b84be..478bfb8 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 955fb87..50f7a82 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 <stddef.h> /* 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 <libintl.h> /* 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 <stdlib.h> /* 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 <stdlib.h> /* 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 <stddef.h> /* 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<const Type*> Params;
- for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
- E = yyvsp[-1].TypeList->end(); I != E; ++I)
+ for (std::list<llvm::PATypeHolder>::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<const Type*> Elements;
- for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-1].TypeList->begin(),
- E = yyvsp[-1].TypeList->end(); I != E; ++I)
+ for (std::list<llvm::PATypeHolder>::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<const Type*>()));
+ (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>()));
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<const Type*> Elements;
- for (std::list<llvm::PATypeHolder>::iterator I = yyvsp[-2].TypeList->begin(),
- E = yyvsp[-2].TypeList->end(); I != E; ++I)
+ for (std::list<llvm::PATypeHolder>::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<const Type*>(), true));
+ (yyval.TypeVal) = new PATypeHolder(StructType::get(std::vector<const Type*>(), 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<PATypeHolder>();
- yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal;
+ (yyval.TypeList) = new std::list<PATypeHolder>();
+ (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<PATypeHolder>())->push_back(Type::VoidTy);
+ ((yyval.TypeList) = new std::list<PATypeHolder>())->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<PATypeHolder>();
+ (yyval.TypeList) = new std::list<PATypeHolder>();
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<ArrayType>(yyvsp[-3].TypeVal->get());
+ const ArrayType *ATy = dyn_cast<ArrayType>((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<ArrayType>(yyvsp[-2].TypeVal->get());
+ const ArrayType *ATy = dyn_cast<ArrayType>((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<Constant*>());
- delete yyvsp[-2].TypeVal;
+ (yyval.ConstVal) = ConstantArray::get(ATy, std::vector<Constant*>());
+ 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<ArrayType>(yyvsp[-2].TypeVal->get());
+ const ArrayType *ATy = dyn_cast<ArrayType>((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<Constant*> 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<PackedType>(yyvsp[-3].TypeVal->get());
+ const PackedType *PTy = dyn_cast<PackedType>((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<StructType>(yyvsp[-3].TypeVal->get());
+ const StructType *STy = dyn_cast<StructType>((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<StructType>(yyvsp[-2].TypeVal->get());
+ const StructType *STy = dyn_cast<StructType>((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<Constant*>());
- delete yyvsp[-2].TypeVal;
+ (yyval.ConstVal) = ConstantStruct::get(STy, std::vector<Constant*>());
+ 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<PointerType>(yyvsp[-1].TypeVal->get());
+ const PointerType *PTy = dyn_cast<PointerType>((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<PointerType>(yyvsp[-1].TypeVal->get());
+ const PointerType *Ty = dyn_cast<PointerType>((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<GlobalValue>(V);
- delete yyvsp[-1].TypeVal; // Free the type handle
+ (yyval.ConstVal) = cast<GlobalValue>(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<FunctionType>(Ty) || Ty == Type::LabelTy || isa<OpaqueType>(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"
+ 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));
+ CHECK_FOR_ERROR
+ ;}
+ break;
+
+ case 147:
+#line 1489 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y"
{ // integral constants
- if (!ConstantInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val))
+ 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"
+ 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 149:
+#line 1501 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y"
{ // Boolean constants
- yyval.ConstVal = ConstantBool::getTrue();
+ (yyval.ConstVal) = ConstantBool::getTrue();
CHECK_FOR_ERROR
;}
break;
- case 156:
-#line 1505 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y"
+ case 150:
+#line 1505 "/proj/llvm/llvm-3/lib/AsmParser/llvmAsmParser.y"
{ // Boolean constants
- yyval.ConstVal = ConstantBool::getFalse();
+ (yyval.ConstVal) = ConstantBool::getFalse();
CHECK_FOR_ERROR
;}
break;
- case 157:
-#line 1509 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y"
+ 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<PointerType>(yyvsp[-2].ConstVal->getType()))
+ if (!isa<PointerType>((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<Constant*> IdxVec;
- for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i)
- if (Constant *C = dyn_cast<Constant>((*yyvsp[-1].ValueList)[i]))
+ for (unsigned i = 0, e = (yyvsp[-1].ValueList)->size(); i != e; ++i)
+ if (Constant *C = dyn_cast<Constant>((*(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<PackedType>(yyvsp[-3].ConstVal->getType()) ||
- !cast<PackedType>(yyvsp[-3].ConstVal->getType())->getElementType()->isIntegral())
+ if (!(yyvsp[-3].ConstVal)->getType()->isIntegral()) {
+ if (!isa<PackedType>((yyvsp[-3].ConstVal)->getType()) ||
+ !cast<PackedType>((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<Constant*>();
- yyval.ConstVector->push_back(yyvsp[0].ConstVal);
+ (yyval.ConstVector) = new std::vector<Constant*>();
+ (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<PATypeHolder*, char*>(yyvsp[-1].TypeVal, yyvsp[0].StrVal);
+ (yyval.ArgVal) = new std::pair<PATypeHolder*, char*>((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<std::pair<PATypeHolder*,char*> >();
- yyval.ArgList->push_back(*yyvsp[0].ArgVal);
- delete yyvsp[0].ArgVal;
+ (yyval.ArgList) = new std::vector<std::pair<PATypeHolder*,char*> >();
+ (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::pair<PATypeHolder*,
+ (yyval.ArgList) = (yyvsp[-2].ArgList);
+ (yyval.ArgList)->push_back(std::pair<PATypeHolder*,
char*>(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<std::pair<PATypeHolder*,char*> >();
- yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0));
+ (yyval.ArgList) = new std::vector<std::pair<PATypeHolder*,char*> >();
+ (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<const Type*> ParamTypeList;
- if (yyvsp[-3].ArgList) { // If there are arguments...
- for (std::vector<std::pair<PATypeHolder*,char*> >::iterator I = yyvsp[-3].ArgList->begin();
- I != yyvsp[-3].ArgList->end(); ++I)
+ if ((yyvsp[-3].ArgList)) { // If there are arguments...
+ for (std::vector<std::pair<PATypeHolder*,char*> >::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<std::pair<PATypeHolder*,char*> >::iterator I = yyvsp[-3].ArgList->begin();
- I != yyvsp[-3].ArgList->end(); ++I, ++ArgIt) {
+ for (std::vector<std::pair<PATypeHolder*,char*> >::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<CastInst>(yyvsp[0].InstVal))
+ if (CastInst *CI1 = dyn_cast<CastInst>((yyvsp[0].InstVal)))
if (CastInst *CI2 = dyn_cast<CastInst>(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<std::pair<Constant*,BasicBlock*> >::iterator I = yyvsp[-1].JumpTable->begin(),
- E = yyvsp[-1].JumpTable->end();
+ std::vector<std::pair<Constant*,BasicBlock*> >::iterator I = (yyvsp[-1].JumpTable)->begin(),
+ E = (yyvsp[-1].JumpTable)->end();
for (; I != E; ++I) {
if (ConstantInt *CI = dyn_cast<ConstantInt>(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<PointerType>(yyvsp[-10].TypeVal->get())) ||
+ if (!(PFTy = dyn_cast<PointerType>((yyvsp[-10].TypeVal)->get())) ||
!(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
std::vector<const Type*> ParamTypes;
- if (yyvsp[-7].ValueList) {
- for (std::vector<Value*>::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end();
+ if ((yyvsp[-7].ValueList)) {
+ for (std::vector<Value*>::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<Value*>());
+ if (!(yyvsp[-7].ValueList)) { // Has no arguments?
+ (yyval.TermInstVal) = new InvokeInst(V, Normal, Except, std::vector<Value*>());
} else { // Has arguments?
// Loop through FunctionType's arguments and ensure they are specified
// correctly!
//
FunctionType::param_iterator I = Ty->param_begin();
FunctionType::param_iterator E = Ty->param_end();
- std::vector<Value*>::iterator ArgI = yyvsp[-7].ValueList->begin(), ArgE = yyvsp[-7].ValueList->end();
+ std::vector<Value*>::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<InvokeInst>(yyval.TermInstVal)->setCallingConv(yyvsp[-11].UIntVal);
+ cast<InvokeInst>((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<Constant>(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
+ (yyval.JumpTable) = (yyvsp[-5].JumpTable);
+ Constant *V = cast<Constant>(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<std::pair<Constant*, BasicBlock*> >();
- Constant *V = cast<Constant>(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal));
+ (yyval.JumpTable) = new std::vector<std::pair<Constant*, BasicBlock*> >();
+ Constant *V = cast<Constant>(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<std::pair<Value*, BasicBlock*> >();
- Value* tmpVal = getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal);
+ (yyval.PHIList) = new std::list<std::pair<Value*, BasicBlock*> >();
+ 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<Value*>();
- yyval.ValueList->push_back(yyvsp[0].ValueVal);
+ (yyval.ValueList) = new std::vector<Value*>();
+ (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<PackedType>((*yyvsp[-3].TypeVal).get()))
+ if (!(*(yyvsp[-3].TypeVal))->isInteger() && !(*(yyvsp[-3].TypeVal))->isFloatingPoint() &&
+ !isa<PackedType>((*(yyvsp[-3].TypeVal)).get()))
GEN_ERROR(
"Arithmetic operator requires integer, FP, or packed operands!");
- if (isa<PackedType>((*yyvsp[-3].TypeVal).get()) &&
- (yyvsp[-4].BinaryOpVal == Instruction::URem ||
- yyvsp[-4].BinaryOpVal == Instruction::SRem ||
- yyvsp[-4].BinaryOpVal == Instruction::FRem))
+ if (isa<PackedType>((*(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<PackedType>(yyvsp[-3].TypeVal->get()) ||
- !cast<PackedType>(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral())
+ if (!(*(yyvsp[-3].TypeVal))->isIntegral()) {
+ if (!isa<PackedType>((yyvsp[-3].TypeVal)->get()) ||
+ !cast<PackedType>((yyvsp[-3].TypeVal)->get())->getElementType()->isIntegral())
GEN_ERROR("Logical operator requires integral operands!");
}
- 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 = BinaryOperator::create(yyvsp[-4].BinaryOpVal, tmpVal1, tmpVal2);
- if (yyval.InstVal == 0)
- GEN_ERROR("binary operator returned null!");
- delete yyvsp[-3].TypeVal;
- ;}
- break;
-
- case 274:
-#line 2370 "/home/vadve/alenhar2/llvm.old/lib/AsmParser/llvmAsmParser.y"
- {
- if(isa<PackedType>((*yyvsp[-3].TypeVal).get())) {
- GEN_ERROR(
- "PackedTypes currently not supported in setcc instructions!");
- }
- 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 = new SetCondInst(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 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<PackedType>((*yyvsp[-3].TypeVal).get()))
+ if (isa<PackedType>((*(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<PackedType>((*yyvsp[-3].TypeVal).get()))
+ if (isa<PackedType>((*(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<PHINode>(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second);
- yyvsp[0].PHIList->pop_front();
+ cast<PHINode>((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<PointerType>(yyvsp[-4].TypeVal->get())) ||
+ if (!(PFTy = dyn_cast<PointerType>((yyvsp[-4].TypeVal)->get())) ||
!(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) {
// Pull out the types of all of the arguments...
std::vector<const Type*> ParamTypes;
- if (yyvsp[-1].ValueList) {
- for (std::vector<Value*>::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end();
+ if ((yyvsp[-1].ValueList)) {
+ for (std::vector<Value*>::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<Value*>());
+ (yyval.InstVal) = new CallInst(V, std::vector<Value*>());
} 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<Value*>::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end();
+ std::vector<Value*>::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<CallInst>(yyval.InstVal)->setTailCall(yyvsp[-6].BoolVal);
- cast<CallInst>(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal);
- delete yyvsp[-4].TypeVal;
- delete yyvsp[-1].ValueList;
+ cast<CallInst>((yyval.InstVal))->setTailCall((yyvsp[-6].BoolVal));
+ cast<CallInst>((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<Value*>();
+ (yyval.ValueList) = new std::vector<Value*>();
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<PointerType>(yyvsp[0].ValueVal->getType()))
+ if (!isa<PointerType>((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<PointerType>(yyvsp[-1].TypeVal->get()))
+ if (!isa<PointerType>((yyvsp[-1].TypeVal)->get()))
GEN_ERROR("Can't load from nonpointer type: " +
- (*yyvsp[-1].TypeVal)->getDescription());
- if (!cast<PointerType>(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType())
+ (*(yyvsp[-1].TypeVal))->getDescription());
+ if (!cast<PointerType>((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<PointerType>(yyvsp[-1].TypeVal->get());
+ const PointerType *PT = dyn_cast<PointerType>((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<PointerType>(yyvsp[-2].TypeVal->get()))
+ if (!isa<PointerType>((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 24c92b5..1832575 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 41fcb28..fa87821 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -958,9 +958,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
%token <TermOpVal> RET BR SWITCH INVOKE UNWIND UNREACHABLE
// Binary Operators
-%type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories
+%type <BinaryOpVal> ArithmeticOps LogicalOps // Binops Subcatagories
%token <BinaryOpVal> ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR
-%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators
%token <OtherOpVal> ICMP FCMP
%type <IPredicate> IPredicates
%type <FPredicate> 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<PackedType>((*$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<PackedType>((*$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 05fc57d..fa87821 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 <UInt64Val> EUINT64VAL
-%type <SInt64Val> EINT64VAL
%token <SIntVal> SINTVAL // Signed 32 bit ints...
%token <UIntVal> UINTVAL // Unsigned 32 bit ints...
@@ -959,9 +958,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
%token <TermOpVal> RET BR SWITCH INVOKE UNWIND UNREACHABLE
// Binary Operators
-%type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories
+%type <BinaryOpVal> ArithmeticOps LogicalOps // Binops Subcatagories
%token <BinaryOpVal> ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR
-%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators
%token <OtherOpVal> ICMP FCMP
%type <IPredicate> IPredicates
%type <FPredicate> 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<PackedType>((*$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<PackedType>((*$3).get()))
GEN_ERROR("Packed types not supported by icmp instruction");
diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp
index 6db44c4..d6c79ad 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 37d7eeb..911f326 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<BinaryOperator>(Cond);
+ Instruction *BOp = dyn_cast<Instruction>(Cond);
- if (!BOp || (unsigned)BOp->getOpcode() != Opc || !BOp->hasOneUse() ||
+ if (!BOp || !(isa<BinaryOperator>(BOp) || isa<CmpInst>(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<SetCondInst>(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<ICmpInst>(Cond) || isa<FCmpInst>(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<Instruction>(Cond);
+ ISD::CondCode Condition;
+ if (ICmpInst *IC = dyn_cast<ICmpInst>(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<FCmpInst>(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<PackedType>(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<ICmpInst>(&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<ICmpInst>(&I))
+ predicate = IC->getPredicate();
+ else if (ConstantExpr *IC = dyn_cast<ConstantExpr>(&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<FCmpInst>(&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<FCmpInst>(&I))
+ predicate = FC->getPredicate();
+ else if (ConstantExpr *FC = dyn_cast<ConstantExpr>(&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 346b615..3ca5682 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<BasicBlock>(I.getOperand(i+1));
break;
}
diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h
index 58d0ab4..559c7dc 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 762d5c3..69d85c2 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 <ostream>
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<ConstantBool>(CI))
@@ -84,25 +71,30 @@ static ConstantIntegral *Next(ConstantIntegral *CI) {
return cast<ConstantIntegral>(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<ConstantBool>(C) && "Constant folding of integrals not impl??");
return cast<ConstantBool>(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<ConstantBool>(C) && "Constant folding of integrals not impl??");
return cast<ConstantBool>(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<ConstantIntegral>(V)), Upper(Next(cast<ConstantIntegral>(V))) {
-}
+ConstantRange::ConstantRange(Constant *V)
+ : Lower(cast<ConstantIntegral>(V)), Upper(Next(cast<ConstantIntegral>(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<ConstantIntegral>(L)), Upper(cast<ConstantIntegral>(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 13fd574..af56e26 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<SetCondInst>(I)) return true;
+ if (isa<CmpInst>(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<OpaqueType>(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<UndefValue>(CPV) && CPV->getType()->isFirstClassType()) {
Out << "((";
- printType(Out, CPV->getType());
+ printType(Out, CPV->getType()); // sign doesn't matter
Out << ")/*UNDEF*/0)";
return;
}
@@ -740,10 +811,24 @@ void CWriter::printConstant(Constant *CPV) {
Out << (cast<ConstantBool>(CPV)->getValue() ? '1' : '0');
break;
case Type::SByteTyID:
+ case Type::UByteTyID:
+ Out << "((char)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
+ break;
case Type::ShortTyID:
- Out << cast<ConstantInt>(CPV)->getSExtValue();
+ case Type::UShortTyID:
+ Out << "((short)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
break;
case Type::IntTyID:
+ case Type::UIntTyID:
+ Out << "((int)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
+ break;
+ case Type::LongTyID:
+ case Type::ULongTyID:
+ Out << "((long long)" << cast<ConstantInt>(CPV)->getSExtValue() << "ll)";
+ break;
+
+#if 0
+ case Type::IntTyID:
if ((int)cast<ConstantInt>(CPV)->getSExtValue() == (int)0x80000000)
Out << "((int)0x80000000U)"; // Handle MININT specially to avoid warning
else
@@ -767,6 +852,7 @@ void CWriter::printConstant(Constant *CPV) {
case Type::ULongTyID:
Out << cast<ConstantInt>(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<ConstantPointerNull>(CPV)) {
Out << "((";
- printType(Out, CPV->getType());
+ printType(Out, CPV->getType()); // sign doesn't matter
Out << ")/*NULL*/0)";
break;
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(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 052a4eb..fea2494 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 13fd574..af56e26 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<SetCondInst>(I)) return true;
+ if (isa<CmpInst>(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<OpaqueType>(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<UndefValue>(CPV) && CPV->getType()->isFirstClassType()) {
Out << "((";
- printType(Out, CPV->getType());
+ printType(Out, CPV->getType()); // sign doesn't matter
Out << ")/*UNDEF*/0)";
return;
}
@@ -740,10 +811,24 @@ void CWriter::printConstant(Constant *CPV) {
Out << (cast<ConstantBool>(CPV)->getValue() ? '1' : '0');
break;
case Type::SByteTyID:
+ case Type::UByteTyID:
+ Out << "((char)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
+ break;
case Type::ShortTyID:
- Out << cast<ConstantInt>(CPV)->getSExtValue();
+ case Type::UShortTyID:
+ Out << "((short)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
break;
case Type::IntTyID:
+ case Type::UIntTyID:
+ Out << "((int)" << cast<ConstantInt>(CPV)->getSExtValue() << ")";
+ break;
+ case Type::LongTyID:
+ case Type::ULongTyID:
+ Out << "((long long)" << cast<ConstantInt>(CPV)->getSExtValue() << "ll)";
+ break;
+
+#if 0
+ case Type::IntTyID:
if ((int)cast<ConstantInt>(CPV)->getSExtValue() == (int)0x80000000)
Out << "((int)0x80000000U)"; // Handle MININT specially to avoid warning
else
@@ -767,6 +852,7 @@ void CWriter::printConstant(Constant *CPV) {
case Type::ULongTyID:
Out << cast<ConstantInt>(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<ConstantPointerNull>(CPV)) {
Out << "((";
- printType(Out, CPV->getType());
+ printType(Out, CPV->getType()); // sign doesn't matter
Out << ")/*NULL*/0)";
break;
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(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 9738573..9ea0a91 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 d59fb4d..5f6b6ae 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<ICmpInst>(I)->getPredicate() == ICmpInst::ICMP_EQ ||
+ cast<ICmpInst>(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<BinaryOperator>(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<ICmpInst>(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 425bcc5..808a7f8 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<SetCondInst>(I)) {
+ } else if (isa<CmpInst>(I)) {
GS.isNotSuitableForSRA = true;
} else if (isa<MemCpyInst>(I) || isa<MemMoveInst>(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<GetElementPtrInst>(*UI)) {
if (!AllUsesOfValueWillTrapIfNull(GEPI)) return false;
- } else if (isa<SetCondInst>(*UI) &&
+ } else if (isa<ICmpInst>(*UI) &&
isa<ConstantPointerNull>(UI->getOperand(1))) {
// Ignore setcc X, null
} else {
@@ -720,29 +720,33 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
if (LoadInst *LI = dyn_cast<LoadInst>(GV->use_back())) {
while (!LI->use_empty()) {
Use &LoadUse = LI->use_begin().getUse();
- if (!isa<SetCondInst>(LoadUse.getUser()))
+ if (!isa<ICmpInst>(LoadUse.getUser()))
LoadUse = RepValue;
else {
- // Replace the setcc X, 0 with a use of the bool value.
- SetCondInst *SCI = cast<SetCondInst>(LoadUse.getUser());
- Value *LV = new LoadInst(InitBool, InitBool->getName()+".val", SCI);
+ ICmpInst *CI = cast<ICmpInst>(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<LoadInst>(*UI) || isa<SetCondInst>(*UI)) {
+ if (isa<LoadInst>(*UI) || isa<CmpInst>(*UI)) {
// Fine, ignore.
} else if (StoreInst *SI = dyn_cast<StoreInst>(*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<SetCondInst>(*UI)) {
- if (!isa<ConstantPointerNull>(SCI->getOperand(1)))
+ if (ICmpInst *ICI = dyn_cast<ICmpInst>(*UI)) {
+ if (!isa<ConstantPointerNull>(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<SetCondInst>(User)) {
+ if (ICmpInst *SCI = dyn_cast<ICmpInst>(User)) {
assert(isa<ConstantPointerNull>(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<CmpInst>(CurInst)) {
+ InstResult = ConstantExpr::getCompare(CI->getPredicate(),
+ getVal(Values, CI->getOperand(0)),
+ getVal(Values, CI->getOperand(1)));
} else if (CastInst *CI = dyn_cast<CastInst>(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 7cc1a5b..b4e8406 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<BinaryOperator>(ci->use_back()))
+ // Is that single use a icmp operator?
+ if (ICmpInst* bop = dyn_cast<ICmpInst>(ci->use_back()))
// Is it compared against a constant integer?
if (ConstantInt* CI = dyn_cast<ConstantInt>(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<Instruction>(*UI);
- if (User->getOpcode() == Instruction::SetNE ||
- User->getOpcode() == Instruction::SetEQ) {
- if (isa<Constant>(User->getOperand(1)) &&
- cast<Constant>(User->getOperand(1))->isNullValue())
+ if (ICmpInst *IC = dyn_cast<ICmpInst>(User)) {
+ if ((IC->getPredicate() == ICmpInst::ICMP_NE ||
+ IC->getPredicate() == ICmpInst::ICMP_EQ) &&
+ isa<Constant>(IC->getOperand(1)) &&
+ cast<Constant>(IC->getOperand(1))->isNullValue())
continue;
} else if (CastInst *CI = dyn_cast<CastInst>(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 ab570e4..b18d66b 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 9930d1b..f0d3915 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 7ab999f..8d369f2 100644
--- a/lib/Transforms/Scalar/CorrelatedExprs.cpp
+++ b/lib/Transforms/Scalar/CorrelatedExprs.cpp
@@ -45,36 +45,36 @@
#include <algorithm>
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<SetCondInst>(BI->getCondition());
- if (SCI == 0) return false;
+ if (!isa<CmpInst>(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<SetCondInst>(I)) {
- Relation::KnownResult Res = getSetCCResult(SCI, NewRI);
+ } else if (CmpInst *CI = dyn_cast<CmpInst>(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<BranchInst>(*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<SetCondInst>(Inst)) {
+ if (FCmpInst *FCI = dyn_cast<FCmpInst>(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<ICmpInst>(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<ICmpInst>(Op0)||isa<ICmpInst>(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<SetCondInst>(Inst)) {
+ if (CmpInst *CI = dyn_cast<CmpInst>(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<Relation> &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<SetCondInst>(Inst)) {
+ if (CmpInst *CI = dyn_cast<CmpInst>(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<Constant>(Op0)) {
if (isa<Constant>(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<ConstantBool>(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<ICmpInst>(CI))
+ predicate = cast<ICmpInst>(CI)->getSwappedPredicate();
+ else
+ predicate = cast<FCmpInst>(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<ConstantIntegral>(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<ConstantIntegral>(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<ConstantIntegral>(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 91759dc..fac17d1 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 8b6f370..205dfef 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<Constant>(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<CastInst>(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<BinaryOperator>(&I))
New = BinaryOperator::create(BO->getOpcode(), Op0, Op1,SO->getName()+".op");
+ else if (CmpInst *CI = dyn_cast<CmpInst>(&I))
+ New = CmpInst::create(CI->getOpcode(), CI->getPredicate(), Op0, Op1,
+ SO->getName()+".cmp");
else if (ShiftInst *SI = dyn_cast<ShiftInst>(&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<Constant>(PN->getIncomingValue(i))) {
- InV = ConstantExpr::get(I.getOpcode(), InC, C);
+ if (CmpInst *CI = dyn_cast<CmpInst>(&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<BinaryOperator>(&I))
InV = BinaryOperator::create(BO->getOpcode(),
PN->getIncomingValue(i), C, "phitmp",
NonConstBB->getTerminator());
+ else if (CmpInst *CI = dyn_cast<CmpInst>(&I))
+ InV = CmpInst::create(CI->getOpcode(),
+ CI->getPredicate(),
+ PN->getIncomingValue(i), C, "phitmp",
+ NonConstBB->getTerminator());
else if (ShiftInst *SI = dyn_cast<ShiftInst>(&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<ConstantInt>(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<SetCondInst>(BoolCast->getOperand(0))) {
+ if (ICmpInst *SCI = dyn_cast<ICmpInst>(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<ConstantInt>(SCIOp1) &&
- isSignBitCheck(SCI->getOpcode(), SCIOp0, cast<ConstantInt>(SCIOp1))) {
+ isSignBitCheck(SCI->getPredicate(), cast<ConstantInt>(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<SetCondInst>(V))
- return (SCI->getOperand(0) == LHS && SCI->getOperand(1) == RHS ||
- SCI->getOperand(0) == RHS && SCI->getOperand(1) == LHS);
+ if (ICmpInst *ICI = dyn_cast<ICmpInst>(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<SetCondInst>(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<ICmpInst>(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<SetCondInst>(Log.getOperand(1)));
+ unsigned LHSCode = getICmpCode(ICI);
+ unsigned RHSCode = getICmpCode(cast<ICmpInst>(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<Instruction>(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) <u Hi-Lo. This method expects that Lo <= Hi. IB is the location to
+/// (V-Lo) <u Hi-Lo. This method expects that Lo <= Hi. isSigned indicates
+/// whether to treat the V, Lo and HI as signed or not. IB is the location to
/// insert new instructions.
Instruction *InstCombiner::InsertRangeTest(Value *V, Constant *Lo, Constant *Hi,
- bool Inside, Instruction &IB) {
- assert(cast<ConstantBool>(ConstantExpr::getSetLE(Lo, Hi))->getValue() &&
+ bool isSigned, bool Inside,
+ Instruction &IB) {
+ assert(cast<ConstantBool>(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<ConstantIntegral>(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<ConstantIntegral>(Lo)->isMinValue(isSigned)) {
+ ICmpInst::Predicate pred = (isSigned ?
+ ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT);
+ return new ICmpInst(pred, V, Hi);
+ }
+
+ // Emit V-Lo <u Hi-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::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<ConstantInt>(Hi));
+ if (cast<ConstantIntegral>(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<ConstantIntegral>(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<SetCondInst>(Op1)) {
- // (setcc1 A, B) & (setcc2 A, B) --> (setcc3 A, B)
- if (Instruction *R = AssociativeOpt(I, FoldSetCCLogical(*this, RHS)))
+ if (ICmpInst *RHS = dyn_cast<ICmpInst>(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<SetCondInst>(Op0);
+ ICmpInst::Predicate GT = ICmpInst::isSignedPredicate(LHSCC) ?
+ ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
+ Constant *Cmp = ConstantExpr::getICmp(GT, LHSCst, RHSCst);
+ ICmpInst *LHS = cast<ICmpInst>(Op0);
if (cast<ConstantBool>(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) <u 1
+ return InsertRangeTest(LHSVal, AddOne(LHSCst), RHSCst, false,
+ true, I);
+ case ICmpInst::ICMP_SLT: // (X u> 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) <u 1
- return InsertRangeTest(LHSVal, AddOne(LHSCst), RHSCst, true, I);
+ case ICmpInst::ICMP_UGT: // (X s> 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<SetCondInst>(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<ICmpInst>(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<SetCondInst>(Op0);
+ ICmpInst::Predicate GT = ICmpInst::isSignedPredicate(LHSCC) ?
+ ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
+ Constant *Cmp = ConstantExpr::getICmp(GT, LHSCst, RHSCst);
+ ICmpInst *LHS = cast<ICmpInst>(Op0);
if (cast<ConstantBool>(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 <u 2
Constant *AddCST = ConstantExpr::getNeg(LHSCst);
Instruction *Add = BinaryOperator::createAdd(LHSVal, AddCST,
LHSVal->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<ConstantIntegral>(Op1)) {
- if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) {
- // xor (setcc A, B), true = not (setcc A, B) = setncc A, B
- if (SetCondInst *SCI = dyn_cast<SetCondInst>(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<ICmpInst>(Op0))
+ if (RHS == ConstantBool::getTrue() && ICI->hasOneUse())
+ return new ICmpInst(ICI->getInversePredicate(),
+ ICI->getOperand(0), ICI->getOperand(1));
+ if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) {
// ~(c-X) == X-c-1 == X+(-c-1)
if (Op0I->getOpcode() == Instruction::Sub && RHS->isAllOnesValue())
if (Constant *Op0I0C = dyn_cast<Constant>(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<SetCondInst>(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<ICmpInst>(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<Constant>(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<Constant>(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<CastInst>(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<ConstantInt>(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<ConstantExpr>(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<ConstantExpr>(GEPLHS) || GEPLHS->hasOneUse()) &&
(isa<ConstantExpr>(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<UndefValue>(Op1)) // fcmp pred X, undef -> undef
+ return ReplaceInstUsesWith(I, UndefValue::get(Type::BoolTy));
+
+ // Handle fcmp with constant RHS
+ if (Constant *RHSC = dyn_cast<Constant>(Op1)) {
+ if (Instruction *LHSI = dyn_cast<Instruction>(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<Constant>(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<Constant>(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<UndefValue>(Op1)) // X setcc undef -> undef
+ if (isa<UndefValue>(Op1)) // X icmp undef -> undef
return ReplaceInstUsesWith(I, UndefValue::get(Type::BoolTy));
- // setcc <global/alloca*/null>, <global/alloca*/null> - 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<GlobalValue>(Op0))
+ if (GlobalValue *GV1 = dyn_cast<GlobalValue>(Op1))
+ if (!GV0->hasExternalWeakLinkage() || !GV1->hasExternalWeakLinkage())
+ return ReplaceInstUsesWith(I, ConstantBool::get(!isTrueWhenEqual(I)));
+
+ // icmp <global/alloca*/null>, <global/alloca*/null> - Global/Stack value
// addresses never equal each other! We already know that Op0 != Op1.
if ((isa<GlobalValue>(Op0) || isa<AllocaInst>(Op0) ||
isa<ConstantPointerNull>(Op0)) &&
@@ -4131,30 +4380,34 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
isa<ConstantPointerNull>(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<ConstantInt>(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 <u MIN -> 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 <u MAX -> A != MAX
+ return new ICmpInst(ICmpInst::ICMP_NE, Op0,Op1);
+ if (isMinValuePlusOne(CI,false)) // A <u MIN+1 -> 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 <s MIN -> FALSE
return ReplaceInstUsesWith(I, ConstantBool::getFalse());
- if (I.getOpcode() == Instruction::SetLE) // A <= MAX -> TRUE
+ if (CI->isMaxValue(true)) // A <s MAX -> A != MAX
+ return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
+ if (isMinValuePlusOne(CI,true)) // A <s MIN+1 -> 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<Instruction>(Op0))
switch (LHSI->getOpcode()) {
case Instruction::And:
@@ -4289,7 +4576,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
LHSI->getOperand(0)->hasOneUse()) {
ConstantInt *AndCST = cast<ConstantInt>(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<CastInst>(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<ConstantInt>(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<ConstantInt>(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) <u C2. Simply casting the operands and result won't
// work. :( The if statement below tests that condition and bails
// if it finds it.
- const Type *DivRHSTy = DivRHS->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<ConstantInt>(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<Constant>(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<Constant>(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} <intrinsic>, 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<CastInst>(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<ConstantInt>(CI)->getSExtValue() == -1)
- // X > -1 => x < 128
- return BinaryOperator::createSetLT(CastOp,
- ConstantInt::get(SrcTy, 1ULL << (SrcTySize-1)));
- } else {
- ConstantInt *CUI = cast<ConstantInt>(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<ConstantInt>(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<ConstantInt>(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<Constant>(Op1)) {
if (Instruction *LHSI = dyn_cast<Instruction>(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<Constant>(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<Constant>(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<Constant>(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<CastInst>(Op0)) {
Value *CastOp0 = CI->getOperand(0);
@@ -4928,20 +5212,20 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
if (Constant *Op1C = dyn_cast<Constant>(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), <cst>
+ // Handle the special case of: icmp (cast bool to X), <cst>
// 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<ConstantInt>(Op1) || isa<CastInst>(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<CastInst>(SCI.getOperand(0));
+Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
+ const CastInst *LHSCI = cast<CastInst>(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<CastInst>(SCI.getOperand(1))) {
+ if (CastInst *CI = dyn_cast<CastInst>(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<ConstantInt>(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<ConstantInt>(CI)->getSExtValue() < 0)// X < (small) --> false
- Result = ConstantBool::getFalse();
- else
- Result = ConstantBool::getTrue(); // X < (large) --> true
- } else {
- // Unsigned extend and signed comparison.
- if (cast<ConstantInt>(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<Constant>(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<ConstantInt>(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<ConstantInt>(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<Constant>(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<UndefValue>(Op0)) { // undef >>s X -> undef
- if (!isLeftShift && I.getType()->isSigned())
+ if (isa<UndefValue>(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<UndefValue>(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<ConstantInt>(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<Instruction>(Src) || !Src->hasOneUse())
+ Instruction *SrcI = dyn_cast<Instruction>(Src);
+ if (!SrcI || !Src->hasOneUse())
return 0;
// Attempt to propagate the cast into the instruction.
- Instruction *SrcI = cast<Instruction>(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<ZExtInst>(CI) && SrcBitSize == 1 &&
SrcI->getOpcode() == Instruction::Xor &&
Op1 == ConstantBool::getTrue() &&
- (!Op0->hasOneUse() || !isa<SetCondInst>(Op0))) {
+ (!Op0->hasOneUse() || !isa<CmpInst>(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<ConstantInt>(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<ICmpInst>(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<Instruction>(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<ShiftInst>(TI) && !isa<BinaryOperator>(TI))
+ // Only handle binary, compare and shift operators here.
+ if (!isa<ShiftInst>(TI) && !isa<BinaryOperator>(TI) && !isa<CmpInst>(TI))
+ return 0;
+
+ // If the CmpInst predicates don't match, then the instructions aren't the
+ // same and we can't continue.
+ if (isa<CmpInst>(TI) && isa<CmpInst>(FI) &&
+ (cast<CmpInst>(TI)->getPredicate() != cast<CmpInst>(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<SetCondInst>(SI.getCondition())) {
+ if (ICmpInst *IC = dyn_cast<ICmpInst>(SI.getCondition())) {
- // (x <s 0) ? -1 : 0 -> sra x, 31
- // (x >u 2147483647) ? -1 : 0 -> sra x, 31
+ // (x <s 0) ? -1 : 0 -> ashr x, 31
+ // (x >u 2147483647) ? -1 : 0 -> ashr x, 31
if (TrueValC->isAllOnesValue() && FalseValC->isNullValue())
if (ConstantInt *CmpCst = dyn_cast<ConstantInt>(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<ConstantInt>(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<SetCondInst>(CondVal)) {
- if (SCI->getOperand(0) == TrueVal && SCI->getOperand(1) == FalseVal) {
+ if (FCmpInst *FCI = dyn_cast<FCmpInst>(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<ICmpInst>(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<Instruction>(PN.getIncomingValue(0));
assert(isa<BinaryOperator>(FirstInst) || isa<ShiftInst>(FirstInst) ||
- isa<GetElementPtrInst>(FirstInst));
+ isa<GetElementPtrInst>(FirstInst) || isa<CmpInst>(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<Instruction>(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<CmpInst>(I)->getPredicate() !=
+ cast<CmpInst>(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<BinaryOperator>(FirstInst))
return BinaryOperator::create(BinOp->getOpcode(), LHSVal, RHSVal);
+ else if (CmpInst *CIOp = dyn_cast<CmpInst>(FirstInst))
+ return CmpInst::create(CIOp->getOpcode(), CIOp->getPredicate(), LHSVal,
+ RHSVal);
else if (ShiftInst *SI = dyn_cast<ShiftInst>(FirstInst))
return new ShiftInst(SI->getOpcode(), LHSVal, RHSVal);
else {
@@ -7198,9 +7517,10 @@ Instruction *InstCombiner::FoldPHIArgOpIntoPHI(PHINode &PN) {
bool isVolatile = false;
if (isa<CastInst>(FirstInst)) {
CastSrcTy = FirstInst->getOperand(0)->getType();
- } else if (isa<BinaryOperator>(FirstInst) || isa<ShiftInst>(FirstInst)) {
- // Can fold binop or shift here if the RHS is a constant, otherwise call
- // FoldPHIArgBinOpIntoPHI.
+ } else if (isa<BinaryOperator>(FirstInst) || isa<ShiftInst>(FirstInst) ||
+ isa<CmpInst>(FirstInst)) {
+ // Can fold binop, compare or shift here if the RHS is a constant,
+ // otherwise call FoldPHIArgBinOpIntoPHI.
ConstantOp = dyn_cast<Constant>(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<Instruction>(PN.getIncomingValue(i))) return 0;
Instruction *I = cast<Instruction>(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<LoadInst>(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<BinaryOperator>(FirstInst))
return BinaryOperator::create(BinOp->getOpcode(), PhiVal, ConstantOp);
+ else if (CmpInst *CIOp = dyn_cast<CmpInst>(FirstInst))
+ return CmpInst::create(CIOp->getOpcode(), CIOp->getPredicate(),
+ PhiVal, ConstantOp);
else
return new ShiftInst(cast<ShiftInst>(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<Constant>(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<ConstantInt>(Op))
@@ -7589,10 +7908,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
isa<ConstantInt>(Inst->getOperand(1))) {
unsigned ShAmt =
cast<ConstantInt>(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<ConstantInt>(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<FCmpInst>(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<Instruction>(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<SetCondInst>(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<ICmpInst>(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<CmpInst>(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 40f341c..437f7a6 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<BinaryOperator>(I) || isa<ShiftInst>(I) || isa<CastInst>(I) ||
- isa<SelectInst>(I) || isa<GetElementPtrInst>(I);
+ isa<SelectInst>(I) || isa<GetElementPtrInst>(I) || isa<CmpInst>(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 eb58b9e..1908693 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<BranchInst>(LatchBlock->getTerminator());
- if (!TermBr || TermBr->isUnconditional() ||
- !isa<SetCondInst>(TermBr->getCondition()))
+ if (!TermBr || TermBr->isUnconditional() ||
+ !isa<ICmpInst>(TermBr->getCondition()))
return;
- SetCondInst *Cond = cast<SetCondInst>(TermBr->getCondition());
+ ICmpInst *Cond = cast<ICmpInst>(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<SetCondInst>(Cond->clone());
+ Cond = cast<ICmpInst>(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<BinaryOperator>(*(PN->use_begin()));
- if (BO && BO->hasOneUse()) {
- if (PN == *(BO->use_begin())) {
+ Instruction *BO = dyn_cast<Instruction>(*PN->use_begin());
+ if (BO && (isa<BinaryOperator>(BO) || isa<CmpInst>(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 e1d4a33..d0b97e0 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<ConstantBool>(Val)) {
- BranchVal = BinaryOperator::createSetEQ(LIC, Val, "tmp", InsertPt);
- } else if (Val != ConstantBool::getTrue()) {
+ if (!isa<ConstantBool>(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 25de5fb..7763921 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<PackedType>(IC.getOperand(0)->getType())) {
+ std::vector<Value*>& op0Vals = getValues(IC.getOperand(0));
+ std::vector<Value*>& op1Vals = getValues(IC.getOperand(1));
+ std::vector<Value*> 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 8a677c4..6578bcc 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<BinaryOperator>(I) && !isa<SelectInst>(I)) return;
+ if (!isa<BinaryOperator>(I) && !isa<SelectInst>(I) && !isa<CmpInst>(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<FCmpInst>(I)) {
+ Value *Op0 = cIG.canonicalize(CI->getOperand(0)),
+ *Op1 = cIG.canonicalize(CI->getOperand(1));
+
+ ConstantFP *CI1 = dyn_cast<ConstantFP>(Op0),
+ *CI2 = dyn_cast<ConstantFP>(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<ICmpInst>(I)) {
+ Value *Op0 = cIG.canonicalize(CI->getOperand(0)),
+ *Op1 = cIG.canonicalize(CI->getOperand(1));
+
+ ConstantIntegral *CI1 = dyn_cast<ConstantIntegral>(Op0),
+ *CI2 = dyn_cast<ConstantIntegral>(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<SelectInst>(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 69805f8..dab2d2e 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<BinaryOperator>(V);
- if (!BOp || !BOp->use_empty()) return;
+ Instruction *Op = dyn_cast<Instruction>(V);
+ if (!Op || !isa<BinaryOperator>(Op) || !isa<CmpInst>(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<BinaryOperator>(BI) || BI->getType()->isFloatingPoint() ||
+ if (!isa<BinaryOperator>(BI) || BI->getType()->isFloatingPoint() ||
isa<PackedType>(BI->getType()))
continue; // Floating point ops are not associative.
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp
index 7da1615..9b7d271 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<PHINode>(I.getOperand(0)))
+ if (PHINode *PN2 = dyn_cast<PHINode>(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<PHINode*, Instruction*>::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 a92592b..695d4c3 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<Value*> 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 3aa7397..896c399 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<BinaryOperator>(I) || isa<ShiftInst>(I)) {
+ if (isa<CmpInst>(I)) {
+ if (Constant *Op0 = dyn_cast_or_null<Constant>(MapValue(I->getOperand(0),
+ ValueMap)))
+ if (Constant *Op1 = dyn_cast_or_null<Constant>(MapValue(I->getOperand(1),
+ ValueMap)))
+ return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Op0,
+ Op1);
+ return 0;
+ } else if (isa<BinaryOperator>(I) || isa<ShiftInst>(I)) {
if (Constant *Op0 = dyn_cast_or_null<Constant>(MapValue(I->getOperand(0),
ValueMap)))
if (Constant *Op1 = dyn_cast_or_null<Constant>(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 366a95c..236ec4b 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<Constant>(I->getOperand(1));
if (Op1 == 0) return 0; // Not a constant?, can't fold
+ /* FALL THROUGH */
case 1:
Op0 = dyn_cast<Constant>(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<BinaryOperator>(I) || isa<ShiftInst>(I)) {
- if (Constant *Op0 = dyn_cast<Constant>(I->getOperand(0)))
- if (Constant *Op1 = dyn_cast<Constant>(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<ICmpInst>(I)) {
+ return ConstantExpr::getICmp(cast<ICmpInst>(I)->getPredicate(), Op0, Op1);
+ } else if (isa<FCmpInst>(I)) {
+ return ConstantExpr::getFCmp(cast<FCmpInst>(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<Constant*> 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<Constant*> &Ops) {
- if (Opc >= Instruction::BinaryOpsBegin && Opc < Instruction::BinaryOpsEnd)
+ unsigned Opc = I->getOpcode();
+ const Type *DestTy = I->getType();
+
+ // Handle easy binops first
+ if (isa<BinaryOperator>(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<CmpInst>(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 e4117d5..361388c 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 69df51c..b2974a9 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 8d4cb83..b44ab09 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<ConstantInt*> &Values){
if (Instruction *Inst = dyn_cast<Instruction>(V))
- if (Inst->getOpcode() == Instruction::SetEQ) {
+ if (Inst->getOpcode() == Instruction::ICmp &&
+ cast<ICmpInst>(Inst)->getPredicate() == ICmpInst::ICMP_EQ) {
if (ConstantInt *C = dyn_cast<ConstantInt>(Inst->getOperand(1))) {
Values.push_back(C);
return Inst->getOperand(0);
@@ -417,7 +414,8 @@ static Value *GatherConstantSetEQs(Value *V, std::vector<ConstantInt*> &Values){
// being compared, and stick the constant into the Values vector.
static Value *GatherConstantSetNEs(Value *V, std::vector<ConstantInt*> &Values){
if (Instruction *Inst = dyn_cast<Instruction>(V))
- if (Inst->getOpcode() == Instruction::SetNE) {
+ if (Inst->getOpcode() == Instruction::ICmp &&
+ cast<ICmpInst>(Inst)->getPredicate() == ICmpInst::ICMP_NE) {
if (ConstantInt *C = dyn_cast<ConstantInt>(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<BranchInst>(TI))
if (BI->isConditional() && BI->getCondition()->hasOneUse())
- if (SetCondInst *SCI = dyn_cast<SetCondInst>(BI->getCondition()))
- if ((SCI->getOpcode() == Instruction::SetEQ ||
- SCI->getOpcode() == Instruction::SetNE) &&
- isa<ConstantInt>(SCI->getOperand(1)))
- return SCI->getOperand(0);
+ if (ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition()))
+ if ((ICI->getPredicate() == ICmpInst::ICMP_EQ ||
+ ICI->getPredicate() == ICmpInst::ICMP_NE) &&
+ isa<ConstantInt>(ICI->getOperand(1)))
+ return ICI->getOperand(0);
return 0;
}
@@ -525,11 +523,11 @@ GetValueEqualityComparisonCases(TerminatorInst *TI,
}
BranchInst *BI = cast<BranchInst>(TI);
- SetCondInst *SCI = cast<SetCondInst>(BI->getCondition());
- Cases.push_back(std::make_pair(cast<ConstantInt>(SCI->getOperand(1)),
- BI->getSuccessor(SCI->getOpcode() ==
- Instruction::SetNE)));
- return BI->getSuccessor(SCI->getOpcode() == Instruction::SetEQ);
+ ICmpInst *ICI = cast<ICmpInst>(BI->getCondition());
+ Cases.push_back(std::make_pair(cast<ConstantInt>(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<PHINode>(I1) || isa<InvokeInst>(I1))
+ if (I1->getOpcode() != I2->getOpcode() || isa<PHINode>(I1) ||
+ isa<InvokeInst>(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<BinaryOperator>(BI->getCondition()))
- if (Cond->getParent() == BB && &BB->front() == Cond &&
+ if (Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()))
+ if ((isa<CmpInst>(Cond) || isa<BinaryOperator>(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 8af5b89..a7438fc 100644
--- a/lib/VMCore/ConstantFold.cpp
+++ b/lib/VMCore/ConstantFold.cpp
@@ -30,517 +30,6 @@
#include <limits>
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 ArgType, class SubClassName>
-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<Constant, EmptyRules> {
- 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<ConstantBool, BoolRules> {
-
- 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<ConstantPointerNull, NullPointerRules> {
- 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<Constant*> Res;
- for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i)
- Res.push_back(FP(const_cast<Constant*>(V1->getOperand(i)),
- const_cast<Constant*>(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<ConstantPacked, ConstantPackedRules> {
-
- 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<Constant*>(V1->getOperand(i)),
- const_cast<Constant*>(V2->getOperand(i)));
- if (ConstantBool *CB = dyn_cast<ConstantBool>(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<Constant, GeneralPackedRules> {
-};
-} // end anonymous namespace
-
-
-//===----------------------------------------------------------------------===//
-// DirectIntRules Class
-//===----------------------------------------------------------------------===//
-//
-// DirectIntRules provides implementations of functions that are valid on
-// integer types, but not all types in general.
-//
-namespace {
-template <class BuiltinType, Type **Ty>
-struct VISIBILITY_HIDDEN DirectIntRules
- : public TemplateRules<ConstantInt, DirectIntRules<BuiltinType, Ty> > {
-
- 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 <class BuiltinType, Type **Ty>
-struct VISIBILITY_HIDDEN DirectFPRules
- : public TemplateRules<ConstantFP, DirectFPRules<BuiltinType, Ty> > {
-
- 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<BuiltinType>::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<EmptyRules> EmptyR;
-static ManagedStatic<BoolRules> BoolR;
-static ManagedStatic<NullPointerRules> NullPointerR;
-static ManagedStatic<ConstantPackedRules> ConstantPackedR;
-static ManagedStatic<GeneralPackedRules> GeneralPackedR;
-static ManagedStatic<DirectIntRules<signed char , &Type::SByteTy> > SByteR;
-static ManagedStatic<DirectIntRules<unsigned char , &Type::UByteTy> > UByteR;
-static ManagedStatic<DirectIntRules<signed short , &Type::ShortTy> > ShortR;
-static ManagedStatic<DirectIntRules<unsigned short, &Type::UShortTy> > UShortR;
-static ManagedStatic<DirectIntRules<signed int , &Type::IntTy> > IntR;
-static ManagedStatic<DirectIntRules<unsigned int , &Type::UIntTy> > UIntR;
-static ManagedStatic<DirectIntRules<int64_t , &Type::LongTy> > LongR;
-static ManagedStatic<DirectIntRules<uint64_t , &Type::ULongTy> > ULongR;
-static ManagedStatic<DirectFPRules <float , &Type::FloatTy> > FloatR;
-static ManagedStatic<DirectFPRules <double , &Type::DoubleTy> > 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<ConstantExpr>(V1) || isa<ConstantExpr>(V2) ||
- isa<GlobalValue>(V1) || isa<GlobalValue>(V2) ||
- isa<UndefValue>(V1) || isa<UndefValue>(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<ConstantPacked>(V1) && isa<ConstantPacked>(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<Constant*> Res;
+ for (unsigned i = 0, e = V1->getNumOperands(); i != e; ++i)
+ Res.push_back(FP(const_cast<Constant*>(V1->getOperand(i)),
+ const_cast<Constant*>(V2->getOperand(i))));
+ return ConstantPacked::get(Res);
+}
+
+Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
+ const Constant *C1,
+ const Constant *C2) {
+ // Handle UndefValue up front
+ if (isa<UndefValue>(C1) || isa<UndefValue>(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<UndefValue>(C2)) // undef / X -> 0
+ return Constant::getNullValue(C1->getType());
+ return const_cast<Constant*>(C2); // X / undef -> undef
+ case Instruction::Or: // X | undef -> -1
+ return ConstantInt::getAllOnesValue(C1->getType());
+ case Instruction::LShr:
+ if (isa<UndefValue>(C2) && isa<UndefValue>(C1))
+ return const_cast<Constant*>(C1); // undef lshr undef -> undef
+ return Constant::getNullValue(C1->getType()); // X lshr undef -> 0
+ // undef lshr X -> 0
+ case Instruction::AShr:
+ if (!isa<UndefValue>(C2))
+ return const_cast<Constant*>(C1); // undef ashr X --> undef
+ else if (isa<UndefValue>(C1))
+ return const_cast<Constant*>(C1); // undef ashr undef -> undef
+ else
+ return const_cast<Constant*>(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<ConstantExpr>(C1)) {
+ if (isa<ConstantExpr>(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<Constant*>(C1); // X + 0 == X
+ break;
+ case Instruction::Sub:
+ if (C2->isNullValue()) return const_cast<Constant*>(C1); // X - 0 == X
+ break;
+ case Instruction::Mul:
+ if (C2->isNullValue()) return const_cast<Constant*>(C2); // X * 0 == 0
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2))
+ if (CI->getZExtValue() == 1)
+ return const_cast<Constant*>(C1); // X * 1 == X
+ break;
+ case Instruction::UDiv:
+ case Instruction::SDiv:
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2))
+ if (CI->getZExtValue() == 1)
+ return const_cast<Constant*>(C1); // X / 1 == X
+ break;
+ case Instruction::URem:
+ case Instruction::SRem:
+ if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2))
+ if (CI->getZExtValue() == 1)
+ return Constant::getNullValue(CI->getType()); // X % 1 == 0
+ break;
+ case Instruction::And:
+ if (cast<ConstantIntegral>(C2)->isAllOnesValue())
+ return const_cast<Constant*>(C1); // X & -1 == X
+ if (C2->isNullValue()) return const_cast<Constant*>(C2); // X & 0 == 0
+ if (CE1->isCast() && isa<GlobalValue>(CE1->getOperand(0))) {
+ GlobalValue *CPR = cast<GlobalValue>(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<ConstantInt>(C2))
+ if (CI->getZExtValue() < 4 && isa<Function>(CPR))
+ return Constant::getNullValue(CI->getType());
+ }
+ break;
+ case Instruction::Or:
+ if (C2->isNullValue()) return const_cast<Constant*>(C1); // X | 0 == X
+ if (cast<ConstantIntegral>(C2)->isAllOnesValue())
+ return const_cast<Constant*>(C2); // X | -1 == -1
+ break;
+ case Instruction::Xor:
+ if (C2->isNullValue()) return const_cast<Constant*>(C1); // X ^ 0 == X
+ break;
+ }
+ }
+ } else if (isa<ConstantExpr>(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<ConstantBool>(C1)) {
+ if (const ConstantBool *CB2 = dyn_cast<ConstantBool>(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<ConstantInt>(C1)) {
+ if (const ConstantInt *CI2 = dyn_cast<ConstantInt>(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<ConstantFP>(C1)) {
+ if (const ConstantFP *CFP2 = dyn_cast<ConstantFP>(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<double>::infinity());
+ if (CFP2->isExactlyValue(-0.0))
+ return ConstantFP::get(CFP1->getType(),
+ -std::numeric_limits<double>::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<ConstantPacked>(C1)) {
+ if (const ConstantPacked *CP2 = dyn_cast<ConstantPacked>(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<ConstantExpr>(V1) && !isa<GlobalValue>(V1)) {
+ if (!isa<GlobalValue>(V2) && !isa<ConstantExpr>(V2)) {
+ // We distilled this down to a simple case, use the standard constant
+ // folder.
+ ConstantBool *R = dyn_cast<ConstantBool>(
+ ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, V1, V2));
+ if (R && R->getValue())
+ return FCmpInst::FCMP_OEQ;
+ R = dyn_cast<ConstantBool>(
+ ConstantExpr::getFCmp(FCmpInst::FCMP_OLT, V1, V2));
+ if (R && R->getValue())
+ return FCmpInst::FCMP_OLT;
+ R = dyn_cast<ConstantBool>(
+ 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<ConstantExpr>(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<ConstantExpr>(V1) && !isa<GlobalValue>(V1)) {
if (!isa<GlobalValue>(V2) && !isa<ConstantExpr>(V2)) {
// We distilled this down to a simple case, use the standard constant
// folder.
- ConstantBool *R = dyn_cast<ConstantBool>(ConstantExpr::getSetEQ(V1, V2));
- if (R && R->getValue()) return Instruction::SetEQ;
- R = dyn_cast<ConstantBool>(ConstantExpr::getSetLT(V1, V2));
- if (R && R->getValue()) return Instruction::SetLT;
- R = dyn_cast<ConstantBool>(ConstantExpr::getSetGT(V1, V2));
- if (R && R->getValue()) return Instruction::SetGT;
+ ICmpInst::Predicate pred = ICmpInst::ICMP_EQ;
+ ConstantBool *R =
+ dyn_cast<ConstantBool>(ConstantExpr::getICmp(pred, V1, V2));
+ if (R && R->getValue())
+ return pred;
+ pred = isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
+ R = dyn_cast<ConstantBool>(ConstantExpr::getICmp(pred, V1, V2));
+ if (R && R->getValue())
+ return pred;
+ pred = isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
+ R = dyn_cast<ConstantBool>(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<GlobalValue>(V1)) {
if (isa<ConstantExpr>(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<GlobalValue>(V2)) {
if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage())
- return Instruction::SetNE;
+ return ICmpInst::ICMP_NE;
} else {
// GlobalVals can never be null.
assert(isa<ConstantPointerNull>(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<PointerType>(CE1->getType()) || CE1->getType()->isIntegral()))
- return evaluateRelation(CE1Op0,
- Constant::getNullValue(CE1Op0->getType()));
+ (isa<PointerType>(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<ConstantExpr>(V2))
- if (isa<PointerType>(CE1->getType()) && CE2->isCast() &&
+ if (CE2->isCast() && isa<PointerType>(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<ConstantPointerNull>(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<GlobalValue>(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<GlobalValue>(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<GlobalValue>(CE1Op0) && isa<GlobalValue>(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<ConstantIntegral>(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<ConstantIntegral>(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<GlobalValue>(V2))
- if (!GV->hasExternalWeakLinkage())
- return ConstantBool::getFalse();
- // SetEQ(GV,null) -> false
- } else if (V2->isNullValue()) {
- if (const GlobalValue *GV = dyn_cast<GlobalValue>(V1))
- if (!GV->hasExternalWeakLinkage())
+Constant *llvm::ConstantFoldCompareInstruction(unsigned short predicate,
+ Constant *C1, Constant *C2) {
+
+ // Handle some degenerate cases first
+ if (isa<UndefValue>(C1) || isa<UndefValue>(C2))
+ return UndefValue::get(Type::BoolTy);
+
+ // icmp eq/ne(null,GV) -> false/true
+ if (C1->isNullValue()) {
+ if (const GlobalValue *GV = dyn_cast<GlobalValue>(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<GlobalValue>(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<GlobalValue>(V1))
- if (!GV->hasExternalWeakLinkage())
+ // icmp eq/ne(GV,null) -> false/true
+ } else if (C2->isNullValue()) {
+ if (const GlobalValue *GV = dyn_cast<GlobalValue>(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<UndefValue>(V1) || isa<UndefValue>(V2))
- return UndefValue::get(Type::BoolTy);
- switch (evaluateRelation(const_cast<Constant*>(V1),
- const_cast<Constant*>(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<ConstantBool>(C1) && isa<ConstantBool>(C2)) {
+ bool C1Val = cast<ConstantBool>(C1)->getValue();
+ bool C2Val = cast<ConstantBool>(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<UndefValue>(V1) || isa<UndefValue>(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<UndefValue>(V2)) // undef / X -> 0
- return Constant::getNullValue(V1->getType());
- return const_cast<Constant*>(V2); // X / undef -> undef
- case Instruction::Or: // X | undef -> -1
- return ConstantInt::getAllOnesValue(V1->getType());
- case Instruction::LShr:
- if (isa<UndefValue>(V2) && isa<UndefValue>(V1))
- return const_cast<Constant*>(V1); // undef lshr undef -> undef
- return Constant::getNullValue(V1->getType()); // X lshr undef -> 0
- // undef lshr X -> 0
- case Instruction::AShr:
- if (!isa<UndefValue>(V2))
- return const_cast<Constant*>(V1); // undef ashr X --> undef
- else if (isa<UndefValue>(V1))
- return const_cast<Constant*>(V1); // undef ashr undef -> undef
- else
- return const_cast<Constant*>(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<ConstantExpr>(V1)) {
- if (isa<ConstantExpr>(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<ConstantInt>(C1) && isa<ConstantInt>(C2)) {
+ if (ICmpInst::isSignedPredicate(ICmpInst::Predicate(predicate))) {
+ int64_t V1 = cast<ConstantInt>(C1)->getSExtValue();
+ int64_t V2 = cast<ConstantInt>(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<Constant*>(V1); // X + 0 == X
- break;
- case Instruction::Sub:
- if (V2->isNullValue()) return const_cast<Constant*>(V1); // X - 0 == X
- break;
- case Instruction::Mul:
- if (V2->isNullValue()) return const_cast<Constant*>(V2); // X * 0 == 0
- if (const ConstantInt *CI = dyn_cast<ConstantInt>(V2))
- if (CI->getZExtValue() == 1)
- return const_cast<Constant*>(V1); // X * 1 == X
- break;
- case Instruction::UDiv:
- case Instruction::SDiv:
- if (const ConstantInt *CI = dyn_cast<ConstantInt>(V2))
- if (CI->getZExtValue() == 1)
- return const_cast<Constant*>(V1); // X / 1 == X
- break;
- case Instruction::URem:
- case Instruction::SRem:
- if (const ConstantInt *CI = dyn_cast<ConstantInt>(V2))
- if (CI->getZExtValue() == 1)
- return Constant::getNullValue(CI->getType()); // X % 1 == 0
- break;
- case Instruction::And:
- if (cast<ConstantIntegral>(V2)->isAllOnesValue())
- return const_cast<Constant*>(V1); // X & -1 == X
- if (V2->isNullValue()) return const_cast<Constant*>(V2); // X & 0 == 0
- if (CE1->isCast() && isa<GlobalValue>(CE1->getOperand(0))) {
- GlobalValue *CPR = cast<GlobalValue>(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<ConstantInt>(V2))
- if (CI->getZExtValue() < 4 && isa<Function>(CPR))
- return Constant::getNullValue(CI->getType());
+ uint64_t V1 = cast<ConstantInt>(C1)->getZExtValue();
+ uint64_t V2 = cast<ConstantInt>(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<ConstantFP>(C1) && isa<ConstantFP>(C2)) {
+ double C1Val = cast<ConstantFP>(C1)->getValue();
+ double C2Val = cast<ConstantFP>(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<ConstantPacked>(C1)) {
+ if (ConstantPacked *CP2 = dyn_cast<ConstantPacked>(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<Constant*>(CP1->getOperand(i)),
+ const_cast<Constant*>(CP2->getOperand(i)));
+ if (ConstantBool *CB = dyn_cast<ConstantBool>(C))
+ return CB;
}
- break;
- case Instruction::Or:
- if (V2->isNullValue()) return const_cast<Constant*>(V1); // X | 0 == X
- if (cast<ConstantIntegral>(V2)->isAllOnesValue())
- return const_cast<Constant*>(V2); // X | -1 == -1
- break;
- case Instruction::Xor:
- if (V2->isNullValue()) return const_cast<Constant*>(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<Constant*>(CP1->getOperand(i)),
+ const_cast<Constant*>(CP2->getOperand(i)));
+ if (ConstantBool *CB = dyn_cast<ConstantBool>(C))
+ return CB;
+ }
+ // Otherwise, could not decide from any element pairs.
+ return 0;
}
}
+ }
- } else if (isa<ConstantExpr>(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<Constant*>(C1),
+ const_cast<Constant*>(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<ConstantExpr>(C1) && isa<ConstantExpr>(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<Value*> &IdxList) {
if (IdxList.size() == 0 ||
diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h
index ee3c64c..a9e3e58 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<Value*> &IdxList);
} // End llvm namespace
diff --git a/lib/VMCore/ConstantFolding.h b/lib/VMCore/ConstantFolding.h
index ee3c64c..a9e3e58 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<Value*> &IdxList);
} // End llvm namespace
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp
index e7953a9..4bfd1dc 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<const CompareConstantExpr*>(this)->predicate;
@@ -582,6 +557,9 @@ getWithOperands(const std::vector<Constant*> &Ops) const {
std::vector<Constant*> 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<PackedType>(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 d3d2f34..2891269 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<LoadInst>(I)->isVolatile();
if (const StoreInst *SI = dyn_cast<StoreInst>(this))
return SI->isVolatile() == cast<StoreInst>(I)->isVolatile();
+ if (const CmpInst *CI = dyn_cast<CmpInst>(this))
+ return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
+ if (const CallInst *CI = dyn_cast<CallInst>(this))
+ return CI->isTailCall() == cast<CallInst>(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<LoadInst>(this))
+ return LI->isVolatile() == cast<LoadInst>(I)->isVolatile();
+ if (const StoreInst *SI = dyn_cast<StoreInst>(this))
+ return SI->isVolatile() == cast<StoreInst>(I)->isVolatile();
+ if (const CmpInst *CI = dyn_cast<CmpInst>(this))
+ return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
if (const CallInst *CI = dyn_cast<CallInst>(this))
return CI->isTailCall() == cast<CallInst>(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 cf1e5e9..4878409 100644
--- a/lib/VMCore/Instructions.cpp
+++ b/lib/VMCore/Instructions.cpp
@@ -1068,9 +1068,6 @@ void BinaryOperator::init(BinaryOps iType)
cast<PackedType>(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<SetCondInst>(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;
}
@@ -1926,58 +1909,6 @@ BitCastInst::BitCastInst(
}
//===----------------------------------------------------------------------===//
-// 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 06a43a7..7ea3377 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 ea30ca4..70796e5 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<SetCondInst>(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(),