Index: lib/Transforms/Utils/BasicBlockUtils.cpp =================================================================== --- lib/Transforms/Utils/BasicBlockUtils.cpp +++ lib/Transforms/Utils/BasicBlockUtils.cpp @@ -626,11 +626,17 @@ Clone2->setName(Twine("lpad") + Suffix2); NewBB2->getInstList().insert(NewBB2->getFirstInsertionPt(), Clone2); - // Create a PHI node for the two cloned landingpad instructions. - PHINode *PN = PHINode::Create(LPad->getType(), 2, "lpad.phi", LPad); - PN->addIncoming(Clone1, NewBB1); - PN->addIncoming(Clone2, NewBB2); - LPad->replaceAllUsesWith(PN); + // Create a PHI node for the two cloned landingpad instructions only + // if the original landingpad instruction has some uses. + if (!LPad->use_empty()) { + assert(!LPad->getType()->isTokenTy() && + "Split cannot be applied if LPad is token type. Otherwise an " + "invalid PHINode of token type would be created."); + PHINode *PN = PHINode::Create(LPad->getType(), 2, "lpad.phi", LPad); + PN->addIncoming(Clone1, NewBB1); + PN->addIncoming(Clone2, NewBB2); + LPad->replaceAllUsesWith(PN); + } LPad->eraseFromParent(); } else { // There is no second clone. Just replace the landing pad with the first Index: test/Transforms/RewriteStatepointsForGC/two-invokes-one-landingpad.ll =================================================================== --- /dev/null +++ test/Transforms/RewriteStatepointsForGC/two-invokes-one-landingpad.ll @@ -0,0 +1,33 @@ +; RUN: opt %s -rewrite-statepoints-for-gc -rs4gc-use-deopt-bundles -S | FileCheck %s + +declare void @some_call(i64 addrspace(1)*) + +declare i32 @"dummy_personality_function"() + +define i64 addrspace(1)* @test(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) + gc "statepoint-example" + personality i32 ()* @"dummy_personality_function" { +entry: + invoke void @some_call(i64 addrspace(1)* %obj) [ "deopt"() ] + to label %second_invoke unwind label %exceptional_return + +second_invoke: ; preds = %entry + invoke void @some_call(i64 addrspace(1)* %obj) [ "deopt"() ] + to label %normal_return unwind label %exceptional_return + +normal_return: ; preds = %second_invoke + ret i64 addrspace(1)* %obj + +; CHECK: exceptional_return1: +; CHECK-NEXT: %lpad2 = landingpad token + +; CHECK: exceptional_return.split-lp: +; CHECK-NEXT: %lpad.split-lp = landingpad token + +; CHECK: exceptional_return: +; CHECK-NOT: phi token + +exceptional_return: ; preds = %second_invoke, %entry + %lpad = landingpad token cleanup + ret i64 addrspace(1)* %obj1 +}