Index: llvm/lib/IR/User.cpp =================================================================== --- llvm/lib/IR/User.cpp +++ llvm/lib/IR/User.cpp @@ -29,7 +29,7 @@ // The side effects of this setOperand call include linking to // "To", adding "this" to the uses list of To, and // most importantly, removing "this" from the use list of "From". - setOperand(i, To); // Fix it now... + setOperand(i, To); } } Index: llvm/unittests/IR/UserTest.cpp =================================================================== --- llvm/unittests/IR/UserTest.cpp +++ llvm/unittests/IR/UserTest.cpp @@ -117,6 +117,38 @@ EXPECT_EQ(IP->value_op_end(), (CI - 2) + 8); } +TEST(UserTest, replaceUseOfWith) { + LLVMContext C; + + const char *ModuleString = "define void @f(i32 %x) {\n" + "entry:\n" + " %v0 = add i32 1, 1\n" + " %v1 = add i32 %x, 2\n" + " ret void\n" + "}\n"; + SMDiagnostic Err; + std::unique_ptr M = parseAssemblyString(ModuleString, Err, C); + Function *F = M->getFunction("f"); + EXPECT_TRUE(F); + EXPECT_TRUE(F->arg_begin() != F->arg_end()); + BasicBlock& entryBB = F->front(); + Instruction& I0 = *(entryBB.begin()); + Instruction& I1 = *(++(entryBB.begin())); + + Argument &X = *F->arg_begin(); + EXPECT_EQ("x", X.getName()); + EXPECT_NE(X.user_begin() ,X.user_end()); + EXPECT_EQ(I0.user_begin() ,I0.user_end()); + + + auto XUser = find(X.users(), &(I1)); + EXPECT_NE(XUser, X.user_end()); + + XUser->replaceUsesOfWith(&X, &I0); + EXPECT_EQ(X.user_begin() ,X.user_end()); + EXPECT_NE(I0.user_begin() ,I0.user_end()); +} + TEST(UserTest, PersonalityUser) { LLVMContext Context; Module M("", Context);