diff options
-rw-r--r-- | include/llvm/Constants.h | 13 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 10 | ||||
-rw-r--r-- | lib/Transforms/Scalar/PredicateSimplifier.cpp | 31 | ||||
-rw-r--r-- | lib/VMCore/Constants.cpp | 22 | ||||
-rw-r--r-- | lib/VMCore/LLVMContext.cpp | 8 | ||||
-rw-r--r-- | lib/VMCore/LLVMContextImpl.h | 21 |
6 files changed, 49 insertions, 56 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 487dd67..8106d91 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -93,16 +93,6 @@ public: return Val == V; } - /// getTrue/getFalse - Return the singleton true/false values. - static inline ConstantInt *getTrue() { - if (TheTrueVal) return TheTrueVal; - return CreateTrueFalseVals(true); - } - static inline ConstantInt *getFalse() { - if (TheFalseVal) return TheFalseVal; - return CreateTrueFalseVals(false); - } - /// getType - Specialize the getType() method to always return an IntegerType, /// which reduces the amount of casting needed in parts of the compiler. /// @@ -200,9 +190,6 @@ public: static bool classof(const Value *V) { return V->getValueID() == ConstantIntVal; } - static void ResetTrueFalse() { TheTrueVal = TheFalseVal = 0; } -private: - static ConstantInt *CreateTrueFalseVals(bool WhichOne); }; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index 3fa6047..0a7b105 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -1149,7 +1149,7 @@ SelectionDAGLowering::EmitBranchForMergedCondition(Value *Cond, } // Create a CaseBlock record representing this branch. - CaseBlock CB(ISD::SETEQ, Cond, ConstantInt::getTrue(), + CaseBlock CB(ISD::SETEQ, Cond, DAG.getContext()->getConstantIntTrue(), NULL, TBB, FBB, CurBB); SwitchCases.push_back(CB); } @@ -1304,7 +1304,7 @@ void SelectionDAGLowering::visitBr(BranchInst &I) { } // Create a CaseBlock record representing this branch. - CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(), + CaseBlock CB(ISD::SETEQ, CondVal, DAG.getContext()->getConstantIntTrue(), NULL, Succ0MBB, Succ1MBB, CurMBB); // Use visitSwitchCase to actually insert the fast branch sequence for this // cond branch. @@ -1322,9 +1322,11 @@ void SelectionDAGLowering::visitSwitchCase(CaseBlock &CB) { if (CB.CmpMHS == NULL) { // Fold "(X == true)" to X and "(X == false)" to !X to // handle common cases produced by branch lowering. - if (CB.CmpRHS == ConstantInt::getTrue() && CB.CC == ISD::SETEQ) + if (CB.CmpRHS == DAG.getContext()->getConstantIntTrue() && + CB.CC == ISD::SETEQ) Cond = CondLHS; - else if (CB.CmpRHS == ConstantInt::getFalse() && CB.CC == ISD::SETEQ) { + else if (CB.CmpRHS == DAG.getContext()->getConstantIntFalse() && + CB.CC == ISD::SETEQ) { SDValue True = DAG.getConstant(1, CondLHS.getValueType()); Cond = DAG.getNode(ISD::XOR, dl, CondLHS.getValueType(), CondLHS, True); } else diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 9845f5f..df397ce 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -1690,8 +1690,8 @@ namespace { bool isRelatedBy(Value *V1, Value *V2, ICmpInst::Predicate Pred) const { if (Constant *C1 = dyn_cast<Constant>(V1)) if (Constant *C2 = dyn_cast<Constant>(V2)) - return ConstantExpr::getCompare(Pred, C1, C2) == - ConstantInt::getTrue(); + return Context->getConstantExprCompare(Pred, C1, C2) == + Context->getConstantIntTrue(); unsigned n1 = VN.valueNumber(V1, Top); unsigned n2 = VN.valueNumber(V2, Top); @@ -1803,10 +1803,10 @@ namespace { // "icmp ult i32 %a, %y" EQ true then %a u< y // etc. - if (Canonical == ConstantInt::getTrue()) { + if (Canonical == Context->getConstantIntTrue()) { add(IC->getOperand(0), IC->getOperand(1), IC->getPredicate(), NewContext); - } else if (Canonical == ConstantInt::getFalse()) { + } else if (Canonical == Context->getConstantIntFalse()) { add(IC->getOperand(0), IC->getOperand(1), ICmpInst::getInversePredicate(IC->getPredicate()), NewContext); } @@ -1822,11 +1822,11 @@ namespace { if (isRelatedBy(True, False, ICmpInst::ICMP_NE)) { if (Canonical == VN.canonicalize(True, Top) || isRelatedBy(Canonical, False, ICmpInst::ICMP_NE)) - add(SI->getCondition(), ConstantInt::getTrue(), + add(SI->getCondition(), Context->getConstantIntTrue(), ICmpInst::ICMP_EQ, NewContext); else if (Canonical == VN.canonicalize(False, Top) || isRelatedBy(Canonical, True, ICmpInst::ICMP_NE)) - add(SI->getCondition(), ConstantInt::getFalse(), + add(SI->getCondition(), Context->getConstantIntFalse(), ICmpInst::ICMP_EQ, NewContext); } } else if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(I)) { @@ -2050,9 +2050,10 @@ namespace { ICmpInst::Predicate Pred = IC->getPredicate(); if (isRelatedBy(Op0, Op1, Pred)) - add(IC, ConstantInt::getTrue(), ICmpInst::ICMP_EQ, NewContext); + add(IC, Context->getConstantIntTrue(), ICmpInst::ICMP_EQ, NewContext); else if (isRelatedBy(Op0, Op1, ICmpInst::getInversePredicate(Pred))) - add(IC, ConstantInt::getFalse(), ICmpInst::ICMP_EQ, NewContext); + add(IC, Context->getConstantIntFalse(), + ICmpInst::ICMP_EQ, NewContext); } else if (SelectInst *SI = dyn_cast<SelectInst>(I)) { if (I->getType()->isFPOrFPVector()) return; @@ -2063,9 +2064,9 @@ namespace { // %b EQ %c then %a EQ %b Value *Canonical = VN.canonicalize(SI->getCondition(), Top); - if (Canonical == ConstantInt::getTrue()) { + if (Canonical == Context->getConstantIntTrue()) { add(SI, SI->getTrueValue(), ICmpInst::ICMP_EQ, NewContext); - } else if (Canonical == ConstantInt::getFalse()) { + } else if (Canonical == Context->getConstantIntFalse()) { add(SI, SI->getFalseValue(), ICmpInst::ICMP_EQ, NewContext); } else if (VN.canonicalize(SI->getTrueValue(), Top) == VN.canonicalize(SI->getFalseValue(), Top)) { @@ -2154,8 +2155,8 @@ namespace { // the BB as unreachable if so. if (Constant *CI_L = dyn_cast<Constant>(O.LHS)) { if (Constant *CI_R = dyn_cast<Constant>(O.RHS)) { - if (ConstantExpr::getCompare(O.Op, CI_L, CI_R) == - ConstantInt::getFalse()) + if (Context->getConstantExprCompare(O.Op, CI_L, CI_R) == + Context->getConstantIntFalse()) UB.mark(TopBB); WorkList.pop_front(); @@ -2446,6 +2447,8 @@ namespace { return; } + LLVMContext *Context = BI.getParent()->getContext(); + for (DomTreeDFS::Node::iterator I = DTNode->begin(), E = DTNode->end(); I != E; ++I) { BasicBlock *Dest = (*I)->getBlock(); @@ -2455,7 +2458,7 @@ namespace { if (Dest == TrueDest) { DOUT << "(" << DTNode->getBlock()->getName() << ") true set:\n"; VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, Dest); - VRP.add(ConstantInt::getTrue(), Condition, ICmpInst::ICMP_EQ); + VRP.add(Context->getConstantIntTrue(), Condition, ICmpInst::ICMP_EQ); VRP.solve(); DEBUG(VN.dump()); DEBUG(IG.dump()); @@ -2463,7 +2466,7 @@ namespace { } else if (Dest == FalseDest) { DOUT << "(" << DTNode->getBlock()->getName() << ") false set:\n"; VRPSolver VRP(VN, IG, UB, VR, PS->DTDFS, PS->modified, Dest); - VRP.add(ConstantInt::getFalse(), Condition, ICmpInst::ICMP_EQ); + VRP.add(Context->getConstantIntFalse(), Condition, ICmpInst::ICMP_EQ); VRP.solve(); DEBUG(VN.dump()); DEBUG(IG.dump()); diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 71e9837..347cd16 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -169,28 +169,6 @@ ConstantInt::ConstantInt(const IntegerType *Ty, const APInt& V) assert(V.getBitWidth() == Ty->getBitWidth() && "Invalid constant for type"); } -ConstantInt *ConstantInt::TheTrueVal = 0; -ConstantInt *ConstantInt::TheFalseVal = 0; - -namespace llvm { - void CleanupTrueFalse(void *) { - ConstantInt::ResetTrueFalse(); - } -} - -static ManagedCleanup<llvm::CleanupTrueFalse> TrueFalseCleanup; - -ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) { - assert(TheTrueVal == 0 && TheFalseVal == 0); - TheTrueVal = getGlobalContext().getConstantInt(Type::Int1Ty, 1); - TheFalseVal = getGlobalContext().getConstantInt(Type::Int1Ty, 0); - - // Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal. - TrueFalseCleanup.Register(); - - return WhichOne ? TheTrueVal : TheFalseVal; -} - //===----------------------------------------------------------------------===// // ConstantFP //===----------------------------------------------------------------------===// diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index 4d847a7..bb3762b 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -81,11 +81,15 @@ UndefValue* LLVMContext::getUndef(const Type* Ty) { // ConstantInt accessors. ConstantInt* LLVMContext::getConstantIntTrue() { - return ConstantInt::getTrue(); + assert(this && "Context not initialized!"); + assert(pImpl && "Context not initialized!"); + return pImpl->getConstantIntTrue(); } ConstantInt* LLVMContext::getConstantIntFalse() { - return ConstantInt::getFalse(); + assert(this && "Context not initialized!"); + assert(pImpl && "Context not initialized!"); + return pImpl->getConstantIntFalse(); } Constant* LLVMContext::getConstantInt(const Type* Ty, uint64_t V, diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index 129a759..5571995 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -15,6 +15,8 @@ #ifndef LLVM_LLVMCONTEXT_IMPL_H #define LLVM_LLVMCONTEXT_IMPL_H +#include "llvm/LLVMContext.h" +#include "llvm/DerivedTypes.h" #include "llvm/System/RWMutex.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" @@ -100,10 +102,13 @@ class LLVMContextImpl { FoldingSet<MDNode> MDNodeSet; LLVMContext &Context; + ConstantInt *TheTrueVal; + ConstantInt *TheFalseVal; + LLVMContextImpl(); LLVMContextImpl(const LLVMContextImpl&); public: - LLVMContextImpl(LLVMContext &C) : Context(C) { } + LLVMContextImpl(LLVMContext &C) : Context(C), TheTrueVal(0), TheFalseVal(0) {} /// Return a ConstantInt with the specified value and an implied Type. The /// type is the integer type that corresponds to the bit width of the value. @@ -115,6 +120,20 @@ public: MDNode *getMDNode(Value*const* Vals, unsigned NumVals); + ConstantInt *getConstantIntTrue() { + if (TheTrueVal) + return TheTrueVal; + else + return (TheTrueVal = Context.getConstantInt(IntegerType::get(1), 1)); + } + + ConstantInt *getConstantIntFalse() { + if (TheFalseVal) + return TheFalseVal; + else + return (TheFalseVal = Context.getConstantInt(IntegerType::get(1), 0)); + } + void erase(MDString *M); void erase(MDNode *M); }; |