Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2177,6 +2177,13 @@ TLI.getExceptionSelectorRegister(PersonalityFn) == 0) return; + // If landingpad's return type is token type, we don't create DAG nodes + // for its exception pointer and selector value. The extraction of exception + // pointer or selector value from token type landingpads is not currently + // supported. + if (LP.getType()->isTokenTy()) + return; + SmallVector ValueVTs; SDLoc dl = getCurSDLoc(); ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs); Index: test/CodeGen/X86/inconsistent_landingpad.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/inconsistent_landingpad.ll @@ -0,0 +1,30 @@ +; RUN: not llvm-as -disable-output <%s 2>&1 | FileCheck %s + +define void @test() personality i32 (...)* @dummy_personality { +; CHECK: The landingpad instruction should have a consistent result type inside a function +entry: + invoke void @dummy1() + to label %next unwind label %unwind1 + +unwind1: + %lp1 = landingpad token + cleanup + br label %return + +next: + invoke void @dummy2() + to label %return unwind label %unwind2 + +unwind2: + %lp2 = landingpad { i8*, i32 } + cleanup + br label %return + +return: + ret void +} + +declare void @dummy1() +declare void @dummy2() + +declare i32 @dummy_personality(...) Index: test/CodeGen/X86/token_landingpad.ll =================================================================== --- /dev/null +++ test/CodeGen/X86/token_landingpad.ll @@ -0,0 +1,22 @@ +; RUN: llc < %s | FileCheck %s + +; This test verifies that SelectionDAG can handle landingPad of token type. + +define void @test() personality i32 (...)* @dummy_personality { +; CHECK: .cfi_personality 155, _dummy_personality +entry: + invoke void @dummy() + to label %return unwind label %unwind + +unwind: ; preds = %entry + %lp = landingpad token + cleanup + br label %return + +return: ; preds = %entry + ret void +} + +declare void @dummy() + +declare i32 @dummy_personality(...)