https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/228924
Backport cb474be Requested by: @folkertdev >From 6e4435c3d0a547adcbbcfdb0a03912f0d3db1149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pir=C3=B3g?= <[email protected]> Date: Sat, 3 Oct 2026 14:12:55 +0200 Subject: [PATCH] [X86] Don't skip frame setup/destroy on SEH pseudos and regenerate tests (#225445) As in title. Skipping setting setup/destroy flags caused pseudos to be wrongly reordered by scheduling (cherry picked from commit cb474be5b5702bb48b7a6a31425cbe8497ac52df) --- llvm/lib/Target/X86/X86FrameLowering.cpp | 9 ++- llvm/lib/Target/X86/X86WinEHUnwindV2.cpp | 9 ++- llvm/lib/Target/X86/X86WinEHUnwindV3.cpp | 3 +- .../test/CodeGen/X86/taildup-callsiteinfo.mir | 4 +- .../CodeGen/X86/win64-eh-empty-block-2.mir | 8 +-- .../CodeGen/X86/win64-eh-unwindv2-errors.mir | 56 +++++++-------- ...win64-eh-unwindv2-push-pop-stack-alloc.mir | 36 +++++----- .../win64-eh-unwindv2-too-many-epilogs.mir | 44 ++++++------ .../X86/win64-eh-unwindv2-too-many-instr.mir | 44 +++++++----- .../X86/win64-eh-unwindv3-split-large.ll | 18 +++++ .../win64-eh-unwindv3-too-many-epilog-ops.mir | 68 +++++++++---------- .../win64-eh-unwindv3-too-many-prolog-ops.mir | 4 +- .../MIR/X86/instr-ref-join-def-vphi.mir | 4 +- 13 files changed, 171 insertions(+), 136 deletions(-) diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index a657c7d3873e51a..a27e816b7c8f8e1 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -2711,7 +2711,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF, } // For V3, SEH_BeginEpilogue must be emitted before any epilog SEH pseudos. - BuildMI(MBB, EpilogStart, DL, TII.get(X86::SEH_BeginEpilogue)); + BuildMI(MBB, EpilogStart, DL, TII.get(X86::SEH_BeginEpilogue)) + .setMIFlag(MachineInstr::FrameDestroy); } // If dynamic alloca is used, then reset esp to point to the last callee-saved @@ -2774,7 +2775,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF, // For V1/V2, emit SEH_BeginEpilogue after stack restore code. if (!IsWin64UnwindV3 && NeedsWin64CFI && MF.hasWinCFI()) - BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_BeginEpilogue)); + BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_BeginEpilogue)) + .setMIFlag(MachineInstr::FrameDestroy); if (!HasFP && NeedsDwarfCFI) { MBBI = FirstCSPop; @@ -2821,7 +2823,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF, BuildMI(MBB, Terminator, DL, TII.get(X86::TILERELEASE)); if (NeedsWin64CFI && MF.hasWinCFI()) - BuildMI(MBB, Terminator, DL, TII.get(X86::SEH_EndEpilogue)); + BuildMI(MBB, Terminator, DL, TII.get(X86::SEH_EndEpilogue)) + .setMIFlag(MachineInstr::FrameDestroy); } StackOffset X86FrameLowering::getFrameIndexReference(const MachineFunction &MF, diff --git a/llvm/lib/Target/X86/X86WinEHUnwindV2.cpp b/llvm/lib/Target/X86/X86WinEHUnwindV2.cpp index 79b91206e9d5b12..bfab37f4871c6c4 100644 --- a/llvm/lib/Target/X86/X86WinEHUnwindV2.cpp +++ b/llvm/lib/Target/X86/X86WinEHUnwindV2.cpp @@ -418,13 +418,15 @@ bool runX86WinEHUnwindV2(MachineFunction &MF) { MachineBasicBlock &MBB = *Info.UnwindV2StartLocation->getParent(); const DebugLoc &DL = Info.UnwindV2StartLocation->getDebugLoc(); BuildMI(MBB, Info.UnwindV2StartLocation, DL, - TII->get(X86::SEH_UnwindV2Start)); + TII->get(X86::SEH_UnwindV2Start)) + .setMIFlag(MachineInstr::FrameDestroy); if ((LastUnwindInfoEndPosition - Info.ApproximateInstructionPosition >= InstructionCountThreshold) || (UnwindCodeCount >= UnwindCodeThreshold)) { BuildMI(MBB, MBB.begin(), DL, - TII->get(X86::SEH_SplitChainedAtEndOfBlock)); + TII->get(X86::SEH_SplitChainedAtEndOfBlock)) + .setMIFlag(MachineInstr::FrameDestroy); LastUnwindInfoEndPosition = Info.ApproximateInstructionPosition; // Doesn't reset to 0, as the prolog unwind codes are now in this info. UnwindCodeCount = FI.ApproximatePrologCodeCount + 1; @@ -438,7 +440,8 @@ bool runX86WinEHUnwindV2(MachineFunction &MF) { MachineBasicBlock &FirstMBB = MF.front(); BuildMI(FirstMBB, FirstMBB.front(), findDebugLoc(FirstMBB), TII->get(X86::SEH_UnwindVersion)) - .addImm(2); + .addImm(2) + .setMIFlag(MachineInstr::FrameSetup); return true; } diff --git a/llvm/lib/Target/X86/X86WinEHUnwindV3.cpp b/llvm/lib/Target/X86/X86WinEHUnwindV3.cpp index 4efedcd796f2163..d11b540631c66db 100644 --- a/llvm/lib/Target/X86/X86WinEHUnwindV3.cpp +++ b/llvm/lib/Target/X86/X86WinEHUnwindV3.cpp @@ -310,7 +310,8 @@ bool X86WinEHUnwindV3::runOnMachineFunction(MachineFunction &MF) { auto SplitAfter = [&](const EpilogSplitPoint &Epilog) { MachineBasicBlock *MBB = Epilog.BeginEpilog->getParent(); BuildMI(*MBB, MBB->begin(), Epilog.BeginEpilog->getDebugLoc(), - TII->get(X86::SEH_SplitChainedAtEndOfBlock)); + TII->get(X86::SEH_SplitChainedAtEndOfBlock)) + .setMIFlag(MachineInstr::FrameDestroy); SubFragmentSplits++; Changed = true; }; diff --git a/llvm/test/CodeGen/X86/taildup-callsiteinfo.mir b/llvm/test/CodeGen/X86/taildup-callsiteinfo.mir index 93991799aeb2a9b..8aa25324a8cb3fc 100644 --- a/llvm/test/CodeGen/X86/taildup-callsiteinfo.mir +++ b/llvm/test/CodeGen/X86/taildup-callsiteinfo.mir @@ -68,9 +68,9 @@ body: | liveins: $ecx CALL64pcrel32 @alloc, csr_win64, implicit $rsp, implicit $ssp, implicit $ecx, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri8 $rsp, 40, implicit-def dead $eflags - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue TAILJMPd64 @f2, csr_win64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp ... diff --git a/llvm/test/CodeGen/X86/win64-eh-empty-block-2.mir b/llvm/test/CodeGen/X86/win64-eh-empty-block-2.mir index b97bccd11705d04..6efb7aa59ea861b 100644 --- a/llvm/test/CodeGen/X86/win64-eh-empty-block-2.mir +++ b/llvm/test/CodeGen/X86/win64-eh-empty-block-2.mir @@ -170,10 +170,10 @@ body: | bb.8.return (machine-block-address-taken): $eax = MOV32rm $rbp, 1, $noreg, -12, $noreg :: (load (s32) from %stack.0) - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri8 $rsp, 48, implicit-def dead $eflags $rbp = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 $eax bb.1.if.then: @@ -216,10 +216,10 @@ body: | frame-setup SEH_EndPrologue MOV32mi $rbp, 1, $noreg, -12, $noreg, 1 :: (store (s32) into %stack.0) $rax = LEA64r $rip, 0, $noreg, %bb.8, $noreg - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri8 $rsp, 32, implicit-def dead $eflags $rbp = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue CATCHRET %bb.8, %bb.0 ... diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv2-errors.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv2-errors.mir index c8eee80bd726516..54fa4aaee1ca0b6 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv2-errors.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv2-errors.mir @@ -36,8 +36,8 @@ body: | $rsp = frame-setup SUB64ri32 $rsp, 40, implicit-def dead $eflags frame-setup SEH_StackAlloc 40 frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -74,9 +74,9 @@ body: | frame-setup PUSH64r killed $rdi, implicit-def $rsp, implicit $rsp frame-setup SEH_PushReg 55 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -109,9 +109,9 @@ name: dealloc_no_alloc body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri32 $rsp, 40, implicit-def dead $eflags - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -146,8 +146,8 @@ name: dealloc_after_epilog body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue $rsp = frame-destroy ADD64ri32 $rsp, 40, implicit-def dead $eflags RET64 ... @@ -185,10 +185,10 @@ body: | $rsp = frame-setup SUB64ri32 $rsp, 40, implicit-def dead $eflags frame-setup SEH_StackAlloc 40 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsp = frame-destroy ADD64ri32 $rsp, 40, implicit-def dead $eflags - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -221,9 +221,9 @@ name: mov_no_setframe body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = MOV64rr $rbp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -260,8 +260,8 @@ body: | $rbp = MOV64rr $rsp frame-setup SEH_SetFrame 52, 0 frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue $rsp = MOV64rr $rbp RET64 ... @@ -299,10 +299,10 @@ body: | $rbp = MOV64rr $rsp frame-setup SEH_SetFrame 52, 0 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsp = MOV64rr $rbp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -339,10 +339,10 @@ body: | $rsp = frame-setup SUB64ri32 $rsp, 40, implicit-def dead $eflags frame-setup SEH_StackAlloc 40 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri32 $rsp, 40, implicit-def dead $eflags $rsp = MOV64rr $rbp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -377,10 +377,10 @@ body: | frame-setup PUSH64r killed $rdi, implicit-def $rsp, implicit $rsp frame-setup SEH_PushReg 55 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsi = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -417,10 +417,10 @@ body: | frame-setup PUSH64r killed $rsi, implicit-def $rsp, implicit $rsp frame-setup SEH_PushReg 60 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsi = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... @@ -453,8 +453,8 @@ name: pop_after_epilog body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp RET64 ... @@ -488,8 +488,8 @@ name: instr_after_epilog body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue $ecx = MOV32rr killed $eax RET64 ... @@ -527,10 +527,10 @@ body: | $rsp = frame-setup SUB64ri32 $rsp, 40, implicit-def dead $eflags frame-setup SEH_StackAlloc 40 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri32 $rsp, 20, implicit-def dead $eflags $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsp = frame-destroy ADD64ri32 $rsp, 20, implicit-def dead $eflags - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv2-push-pop-stack-alloc.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv2-push-pop-stack-alloc.mir index 8207ba3d97bd668..cb30162b70d1622 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv2-push-pop-stack-alloc.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv2-push-pop-stack-alloc.mir @@ -12,35 +12,35 @@ # CHECK-LABEL: name: push_pop_same # CHECK: body: # CHECK-NEXT: bb.0 -# CHECK-NEXT: SEH_UnwindVersion 2 +# CHECK-NEXT: frame-setup SEH_UnwindVersion 2 # CHECK-NEXT: frame-setup PUSH64r undef $rax # CHECK-NEXT: frame-setup SEH_StackAlloc 8 # CHECK-NEXT: frame-setup SEH_EndPrologue -# CHECK-NEXT: SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_BeginEpilogue # CHECK-NEXT: $rax = frame-destroy -# CHECK-NEXT: SEH_UnwindV2Start -# CHECK-NEXT: SEH_EndEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue # CHECK-NEXT: RET64 # Pushes and pops a different register. # CHECK-LABEL: name: push_pop_different # CHECK: body: # CHECK-NEXT: bb.0 -# CHECK-NEXT: SEH_UnwindVersion 2 +# CHECK-NEXT: frame-setup SEH_UnwindVersion 2 # CHECK-NEXT: frame-setup PUSH64r undef $rax # CHECK-NEXT: frame-setup SEH_StackAlloc 8 # CHECK-NEXT: frame-setup SEH_EndPrologue -# CHECK: SEH_BeginEpilogue +# CHECK: frame-destroy SEH_BeginEpilogue # CHECK-NEXT: $rcx = frame-destroy POP64r -# CHECK-NEXT: SEH_UnwindV2Start -# CHECK-NEXT: SEH_EndEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue # CHECK-NEXT: RET64 $eax # Pushes in the prolog, adds in the epilog. # CHECK-LABEL: name: push_add # CHECK: body: # CHECK-NEXT: bb.0 -# CHECK-NEXT: SEH_UnwindVersion 2 +# CHECK-NEXT: frame-setup SEH_UnwindVersion 2 # CHECK-NEXT: frame-setup PUSH64r killed $r15 # CHECK-NEXT: frame-setup SEH_PushReg 126 # CHECK-NEXT: frame-setup PUSH64r killed $r14 @@ -54,15 +54,15 @@ # CHECK-NEXT: frame-setup PUSH64r undef $rax # CHECK-NEXT: frame-setup SEH_StackAlloc 8 # CHECK-NEXT: frame-setup SEH_EndPrologue -# CHECK: SEH_BeginEpilogue +# CHECK: frame-destroy SEH_BeginEpilogue # CHECK-NEXT: $rsp = frame-destroy ADD64ri32 $rsp, 8 -# CHECK-NEXT: SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start # CHECK-NEXT: $rbx = frame-destroy POP64r # CHECK-NEXT: $rdi = frame-destroy POP64r # CHECK-NEXT: $rsi = frame-destroy POP64r # CHECK-NEXT: $r14 = frame-destroy POP64r # CHECK-NEXT: $r15 = frame-destroy POP64r -# CHECK-NEXT: SEH_EndEpilogue +# CHECK-NEXT: frame-destroy SEH_EndEpilogue # CHECK-NEXT: RET64 --- | @@ -97,9 +97,9 @@ body: | frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp frame-setup SEH_StackAlloc 8 frame-setup SEH_EndPrologue - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... --- @@ -112,9 +112,9 @@ body: | renamable $edx = KILL $edx, implicit-def $rdx renamable $ecx = KILL $ecx, implicit-def $rcx renamable $eax = LEA64_32r killed renamable $rcx, 1, killed renamable $rdx, 0, $noreg - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rcx = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 $eax ... --- @@ -189,13 +189,13 @@ body: | MOV64mr renamable $r8, 1, $noreg, 8, $noreg, killed renamable $r9 :: (store (s64) into %ir.out + 8, basealign 16) MOV64mr renamable $r8, 1, $noreg, 16, $noreg, killed renamable $rax :: (store (s64) into %ir.out + 16, align 16) MOV64mr killed renamable $r8, 1, $noreg, 24, $noreg, killed renamable $rdx :: (store (s64) into %ir.out + 24, basealign 16) - SEH_BeginEpilogue + frame-destroy SEH_BeginEpilogue $rsp = frame-destroy ADD64ri32 $rsp, 8, implicit-def dead $eflags $rbx = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rsi = frame-destroy POP64r implicit-def $rsp, implicit $rsp $r14 = frame-destroy POP64r implicit-def $rsp, implicit $rsp $r15 = frame-destroy POP64r implicit-def $rsp, implicit $rsp - SEH_EndEpilogue + frame-destroy SEH_EndEpilogue RET64 ... diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-epilogs.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-epilogs.mir index 8edc43c83f1951b..6488f34c0512b5e 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-epilogs.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-epilogs.mir @@ -17,12 +17,14 @@ # RUN: -check-prefixes=ALLOWMORE,CHECK # CHECK-LABEL: too_many_epilogs -# CHECK: SEH_UnwindVersion 2 -# CHECK: SEH_UnwindV2Start +# CHECK: frame-setup SEH_UnwindVersion 2 +# CHECK: frame-destroy SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue # If we restricted the number of unwind codes, then we expect to use chained # infos. -# ALLOWLESS: SEH_SplitChainedAtEndOfBlock +# ALLOWLESS: frame-destroy SEH_SplitChainedAtEndOfBlock # ALLOWMORE-NOT: SEH_SplitChainedAtEndOfBlock --- | @@ -52,40 +54,40 @@ name: too_many_epilogs body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !10 bb.1: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.2: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.3: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.4: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.5: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.6: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.7: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.8: - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 ... diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-instr.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-instr.mir index 44d89356ecae7e9..ea31e65494ea736 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-instr.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv2-too-many-instr.mir @@ -45,25 +45,25 @@ name: too_many_instr body: | bb.0.entry: frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !10 bb.1: $rcx = MOV64rr $rax - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !11 bb.2: $rcx = MOV64rr $rax - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !12 bb.3: $rcx = MOV64rr $rax $rcx = MOV64rr $rax $rcx = MOV64rr $rax - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 debug-location !13 ... @@ -71,26 +71,34 @@ body: | # CHECK-LABEL: too_many_instr # CHECK-LABEL: bb.0.entry: # bb.1 + bb.2 have enough instructions that bb.0 has its own info. -# ALLOWLESS: SEH_SplitChainedAtEndOfBlock +# ALLOWLESS: frame-destroy SEH_SplitChainedAtEndOfBlock # ALLOWMORE-NOT: SEH_SplitChainedAtEndOfBlock -# CHECK: SEH_UnwindV2Start -# CHECK: RET64 debug-location !10 +# CHECK: frame-destroy SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue +# CHECK-NEXT: RET64 debug-location !10 # CHECK-LABEL: bb.1 # bb.2 doesn't fill the current info, so bb.1 gets added as well. # CHECK-NOT: SEH_SplitChainedAtEndOfBlock -# CHECK: SEH_UnwindV2Start -# CHECK: RET64 debug-location !DILocation(line: 3, column: 1, scope: !6) +# CHECK: frame-destroy SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue +# CHECK-NEXT: RET64 debug-location !DILocation(line: 3, column: 1, scope: !6) # CHECK-LABEL: bb.2 # bb.3 has enough instructions by itself that bb.2 needs to split. -# ALLOWLESS-NEXT: SEH_SplitChainedAtEndOfBlock +# ALLOWLESS-NEXT: frame-destroy SEH_SplitChainedAtEndOfBlock # ALLOWMORE-NOT: SEH_SplitChainedAtEndOfBlock -# CHECK: SEH_UnwindV2Start -# CHECK: RET64 debug-location !DILocation(line: 4, column: 1, scope: !6) +# CHECK: frame-destroy SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue +# CHECK-NEXT: RET64 debug-location !DILocation(line: 4, column: 1, scope: !6) # CHECK-LABEL: bb.3 # Never split at the end. # CHECK-NOT: SEH_SplitChainedAtEndOfBlock -# CHECK: SEH_UnwindV2Start -# CHECK: RET64 debug-location !DILocation(line: 5, column: 1, scope: !6) +# CHECK: frame-destroy SEH_BeginEpilogue +# CHECK-NEXT: frame-destroy SEH_UnwindV2Start +# CHECK-NEXT: frame-destroy SEH_EndEpilogue +# CHECK-NEXT: RET64 debug-location !DILocation(line: 5, column: 1, scope: !6) diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv3-split-large.ll b/llvm/test/CodeGen/X86/win64-eh-unwindv3-split-large.ll index 50b36fb9edc1d20..f75891d4cbdd6fa 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv3-split-large.ll +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv3-split-large.ll @@ -3,6 +3,9 @@ ; RUN: llc -mtriple=x86_64-unknown-windows-msvc \ ; RUN: -x86-wineh-unwindv3-instr-avg-size=100000 -filetype=obj %s -o - \ ; RUN: | llvm-readobj --unwind - | FileCheck %s --check-prefix=OBJ +; RUN: llc -mtriple=x86_64-unknown-windows-msvc \ +; RUN: -x86-wineh-unwindv3-instr-avg-size=100000 \ +; RUN: -stop-after=x86-wineh-unwindv3 -o - %s | FileCheck %s --check-prefix=MIR ; Test V3 *size-based* sub-fragment splitting (the "Unwind v2 style" heuristic). ; With a very small distance threshold, every epilog is forced into its own @@ -28,6 +31,21 @@ declare i32 @c(i32) ; CHECK: .seh_endepilogue ; CHECK: .seh_endproc +; MIR-LABEL: name: three_epilogs +; MIR: frame-setup SEH_EndPrologue +; MIR: frame-destroy SEH_SplitChainedAtEndOfBlock +; MIR: frame-destroy SEH_BeginEpilogue +; MIR-NEXT: frame-destroy SEH_StackAlloc 40 +; MIR: frame-destroy SEH_EndEpilogue +; MIR: frame-destroy SEH_SplitChainedAtEndOfBlock +; MIR: frame-destroy SEH_BeginEpilogue +; MIR-NEXT: frame-destroy SEH_StackAlloc 40 +; MIR: frame-destroy SEH_EndEpilogue +; MIR: frame-destroy SEH_SplitChainedAtEndOfBlock +; MIR: frame-destroy SEH_BeginEpilogue +; MIR-NEXT: frame-destroy SEH_StackAlloc 40 +; MIR: frame-destroy SEH_EndEpilogue + ; Each epilog ends up in its own fragment with a small, in-range, tail-relative ; (negative) EpilogOffset. The main fragment holds the prolog; each subsequent ; fragment is an epilog-only chained fragment, and the trailing code after the diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-epilog-ops.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-epilog-ops.mir index 99d72faa834a12b..0c49f6a49874bae 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-epilog-ops.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-epilog-ops.mir @@ -23,39 +23,39 @@ body: | bb.0.entry: frame-setup SEH_PushReg 51 frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_StackAlloc 8 - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_StackAlloc 8 + frame-destroy SEH_EndEpilogue RET64 ... diff --git a/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-prolog-ops.mir b/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-prolog-ops.mir index fcfd32ab006251b..1fa47e443ab9d00 100644 --- a/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-prolog-ops.mir +++ b/llvm/test/CodeGen/X86/win64-eh-unwindv3-too-many-prolog-ops.mir @@ -53,7 +53,7 @@ body: | frame-setup SEH_StackAlloc 8 frame-setup SEH_StackAlloc 8 frame-setup SEH_EndPrologue - SEH_BeginEpilogue - SEH_EndEpilogue + frame-destroy SEH_BeginEpilogue + frame-destroy SEH_EndEpilogue RET64 ... diff --git a/llvm/test/DebugInfo/MIR/X86/instr-ref-join-def-vphi.mir b/llvm/test/DebugInfo/MIR/X86/instr-ref-join-def-vphi.mir index 431325aea7db0bd..16ff022b2c022c9 100644 --- a/llvm/test/DebugInfo/MIR/X86/instr-ref-join-def-vphi.mir +++ b/llvm/test/DebugInfo/MIR/X86/instr-ref-join-def-vphi.mir @@ -233,11 +233,11 @@ body: | liveins: $esi $eax = MOV32rr killed $esi, debug-location !35 - SEH_BeginEpilogue debug-location !35 + frame-destroy SEH_BeginEpilogue debug-location !35 $rsp = frame-destroy ADD64ri8 $rsp, 40, implicit-def dead $eflags, debug-location !35 $rdi = frame-destroy POP64r implicit-def $rsp, implicit $rsp, debug-location !35 $rsi = frame-destroy POP64r implicit-def $rsp, implicit $rsp, debug-location !35 - SEH_EndEpilogue debug-location !35 + frame-destroy SEH_EndEpilogue debug-location !35 RET64 $eax, debug-location !35 ... _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
