diff --git a/llvm/lib/CodeGen/StackMaps.cpp b/llvm/lib/CodeGen/StackMaps.cpp --- a/llvm/lib/CodeGen/StackMaps.cpp +++ b/llvm/lib/CodeGen/StackMaps.cpp @@ -261,7 +261,8 @@ // Create a LiveOutReg for each bit that is set in the register mask. for (unsigned Reg = 0, NumRegs = TRI->getNumRegs(); Reg != NumRegs; ++Reg) if ((Mask[Reg / 32] >> (Reg % 32)) & 1) - LiveOuts.push_back(createLiveOutReg(Reg, TRI)); + if (TRI->isInAllocatableClass(Reg)) + LiveOuts.push_back(createLiveOutReg(Reg, TRI)); // We don't need to keep track of a register if its super-register is already // in the list. Merge entries that refer to the same dwarf register and use diff --git a/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll b/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll --- a/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll +++ b/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll @@ -24,5 +24,17 @@ ret void } +; Check no crash. +; CHECK-LABEL: shadow_optimization_test2: +define void @shadow_optimization_test2() { +entry: + call void @bar() + tail call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 8, i8* null, i32 0) + call void @bar() + call void @bar() + ret void +} + declare void @llvm.experimental.stackmap(i64, i32, ...) +declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...) declare void @bar()