diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 95d61a987f6c1..b775cbb0c7920 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -148,10 +148,18 @@ void Value::destroyValueName() { } bool Value::hasNUses(unsigned N) const { + if (!UseList) + return N == 0; + + // TODO: Disallow for ConstantData and remove !UseList check? return hasNItems(use_begin(), use_end(), N); } bool Value::hasNUsesOrMore(unsigned N) const { + // TODO: Disallow for ConstantData and remove !UseList check? + if (!UseList) + return N == 0; + return hasNItemsOrMore(use_begin(), use_end(), N); } diff --git a/llvm/unittests/IR/ConstantsTest.cpp b/llvm/unittests/IR/ConstantsTest.cpp index 9cb9e1236b2d1..6376165cbe766 100644 --- a/llvm/unittests/IR/ConstantsTest.cpp +++ b/llvm/unittests/IR/ConstantsTest.cpp @@ -29,8 +29,13 @@ TEST(ConstantsTest, UseCounts) { EXPECT_TRUE(Zero->use_empty()); EXPECT_EQ(Zero->getNumUses(), 0u); + EXPECT_TRUE(Zero->hasNUses(0)); EXPECT_FALSE(Zero->hasOneUse()); EXPECT_FALSE(Zero->hasOneUser()); + EXPECT_FALSE(Zero->hasNUses(1)); + EXPECT_FALSE(Zero->hasNUsesOrMore(1)); + EXPECT_FALSE(Zero->hasNUses(2)); + EXPECT_FALSE(Zero->hasNUsesOrMore(2)); std::unique_ptr M(new Module("MyModule", Context)); @@ -45,36 +50,15 @@ TEST(ConstantsTest, UseCounts) { // Still looks like use_empty with uses. EXPECT_TRUE(Zero->use_empty()); EXPECT_EQ(Zero->getNumUses(), 0u); + EXPECT_TRUE(Zero->hasNUses(0)); EXPECT_FALSE(Zero->hasOneUse()); EXPECT_FALSE(Zero->hasOneUser()); + EXPECT_FALSE(Zero->hasNUses(1)); + EXPECT_FALSE(Zero->hasNUsesOrMore(1)); + EXPECT_FALSE(Zero->hasNUses(2)); + EXPECT_FALSE(Zero->hasNUsesOrMore(2)); } -#ifdef GTEST_HAS_DEATH_TEST -#ifndef NDEBUG - -TEST(ConstantsTest, hasNUsesInvalid) { - LLVMContext Context; - Type *Int32Ty = Type::getInt32Ty(Context); - Constant *Zero = ConstantInt::get(Int32Ty, 0); - std::unique_ptr M(new Module("MyModule", Context)); - - // Introduce some uses - new GlobalVariable(*M, Int32Ty, /*isConstant=*/false, - GlobalValue::ExternalLinkage, /*Initializer=*/Zero, - "gv_user0"); - new GlobalVariable(*M, Int32Ty, /*isConstant=*/false, - GlobalValue::ExternalLinkage, /*Initializer=*/Zero, - "gv_user1"); - - for (int I = 0; I != 3; ++I) { - EXPECT_DEATH(Zero->hasNUses(I), "hasUseList\\(\\)"); - EXPECT_DEATH(Zero->hasNUsesOrMore(I), "hasUseList\\(\\)"); - } -} - -#endif -#endif - TEST(ConstantsTest, Integer_i1) { LLVMContext Context; IntegerType *Int1 = IntegerType::get(Context, 1);