Index: llvm/trunk/lib/IR/Function.cpp =================================================================== --- llvm/trunk/lib/IR/Function.cpp +++ llvm/trunk/lib/IR/Function.cpp @@ -942,8 +942,7 @@ } void Function::setPersonalityFn(Constant *Fn) { - if (Fn) - setHungoffOperand<0>(Fn); + setHungoffOperand<0>(Fn); setValueSubclassDataBit(3, Fn != nullptr); } @@ -953,8 +952,7 @@ } void Function::setPrefixData(Constant *PrefixData) { - if (PrefixData) - setHungoffOperand<1>(PrefixData); + setHungoffOperand<1>(PrefixData); setValueSubclassDataBit(1, PrefixData != nullptr); } @@ -964,8 +962,7 @@ } void Function::setPrologueData(Constant *PrologueData) { - if (PrologueData) - setHungoffOperand<2>(PrologueData); + setHungoffOperand<2>(PrologueData); setValueSubclassDataBit(2, PrologueData != nullptr); } @@ -986,9 +983,13 @@ template void Function::setHungoffOperand(Constant *C) { - assert(C && "Cannot set hungoff operand to nullptr"); - allocHungoffUselist(); - Op().set(C); + if (C) { + allocHungoffUselist(); + Op().set(C); + } else if (getNumOperands()) { + Op().set( + ConstantPointerNull::get(Type::getInt1PtrTy(getContext(), 0))); + } } void Function::setValueSubclassDataBit(unsigned Bit, bool On) { Index: llvm/trunk/unittests/IR/UserTest.cpp =================================================================== --- llvm/trunk/unittests/IR/UserTest.cpp +++ llvm/trunk/unittests/IR/UserTest.cpp @@ -93,4 +93,28 @@ EXPECT_EQ(P.value_op_end(), (I - 2) + 8); } +TEST(UserTest, PersonalityUser) { + Module M("", getGlobalContext()); + FunctionType *RetVoidTy = + FunctionType::get(Type::getVoidTy(getGlobalContext()), false); + Function *PersonalityF = Function::Create( + RetVoidTy, GlobalValue::ExternalLinkage, "PersonalityFn", &M); + Function *TestF = + Function::Create(RetVoidTy, GlobalValue::ExternalLinkage, "TestFn", &M); + + // Set up the personality function + TestF->setPersonalityFn(PersonalityF); + auto PersonalityUsers = PersonalityF->user_begin(); + + // One user and that user is the Test function + EXPECT_EQ(*PersonalityUsers, TestF); + EXPECT_EQ(++PersonalityUsers, PersonalityF->user_end()); + + // Reset the personality function + TestF->setPersonalityFn(nullptr); + + // No users should remain + EXPECT_TRUE(TestF->user_empty()); +} + } // end anonymous namespace