[llvm-branch-commits] [llvm] 9678f11 - [StackColoring] Handle fixed object index
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 27 08:54:49 PDT 2023
Author: Nikita Popov
Date: 2023-09-27T17:53:46+02:00
New Revision: 9678f11b057c1f33b9b714105e7c8e34f2f96bed
URL: https://github.com/llvm/llvm-project/commit/9678f11b057c1f33b9b714105e7c8e34f2f96bed
DIFF: https://github.com/llvm/llvm-project/commit/9678f11b057c1f33b9b714105e7c8e34f2f96bed.diff
LOG: [StackColoring] Handle fixed object index
This is a followup to #66988. The implementation there did not
account for the possibility of the catch object frame index
referrring to a fixed object, which is the case on win64.
(cherry picked from commit aa70f4d8cf8f09a2997773156289b16d6a16ec01)
Added:
Modified:
llvm/lib/CodeGen/StackColoring.cpp
llvm/test/CodeGen/X86/stack-coloring-wineh.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/StackColoring.cpp b/llvm/lib/CodeGen/StackColoring.cpp
index 10597daff54fc84..3453b718b453ab0 100644
--- a/llvm/lib/CodeGen/StackColoring.cpp
+++ b/llvm/lib/CodeGen/StackColoring.cpp
@@ -709,7 +709,8 @@ unsigned StackColoring::collectMarkers(unsigned NumSlot) {
if (WinEHFuncInfo *EHInfo = MF->getWinEHFuncInfo())
for (WinEHTryBlockMapEntry &TBME : EHInfo->TryBlockMap)
for (WinEHHandlerType &H : TBME.HandlerArray)
- if (H.CatchObj.FrameIndex != std::numeric_limits<int>::max())
+ if (H.CatchObj.FrameIndex != std::numeric_limits<int>::max() &&
+ H.CatchObj.FrameIndex >= 0)
ConservativeSlots.set(H.CatchObj.FrameIndex);
LLVM_DEBUG(dumpBV("Conservative slots", ConservativeSlots));
diff --git a/llvm/test/CodeGen/X86/stack-coloring-wineh.ll b/llvm/test/CodeGen/X86/stack-coloring-wineh.ll
index 892c81a12dc1acf..79057e0ea78d39a 100644
--- a/llvm/test/CodeGen/X86/stack-coloring-wineh.ll
+++ b/llvm/test/CodeGen/X86/stack-coloring-wineh.ll
@@ -1,74 +1,155 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
-; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s
+; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=I686
+; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X86_64
@type_info = external global ptr
; Make sure %a1 and %a2 don't share the same stack offset.
define void @pr66984(ptr %arg) personality ptr @__CxxFrameHandler3 {
-; CHECK-LABEL: pr66984:
-; CHECK: # %bb.0: # %bb
-; CHECK-NEXT: pushl %ebp
-; CHECK-NEXT: movl %esp, %ebp
-; CHECK-NEXT: pushl %ebx
-; CHECK-NEXT: pushl %edi
-; CHECK-NEXT: pushl %esi
-; CHECK-NEXT: subl $24, %esp
-; CHECK-NEXT: movl %esp, -28(%ebp)
-; CHECK-NEXT: movl $-1, -16(%ebp)
-; CHECK-NEXT: leal -24(%ebp), %eax
-; CHECK-NEXT: movl $___ehhandler$pr66984, -20(%ebp)
-; CHECK-NEXT: movl %fs:0, %ecx
-; CHECK-NEXT: movl %ecx, -24(%ebp)
-; CHECK-NEXT: movl %eax, %fs:0
-; CHECK-NEXT: movl $1, -16(%ebp)
-; CHECK-NEXT: calll _throw
-; CHECK-NEXT: # %bb.1: # %bb14
-; CHECK-NEXT: LBB0_3: # Block address taken
-; CHECK-NEXT: # %bb17
-; CHECK-NEXT: addl $12, %ebp
-; CHECK-NEXT: jmp LBB0_4
-; CHECK-NEXT: LBB0_4: # %exit
-; CHECK-NEXT: $ehgcr_0_4:
-; CHECK-NEXT: movl -24(%ebp), %eax
-; CHECK-NEXT: movl %eax, %fs:0
-; CHECK-NEXT: addl $24, %esp
-; CHECK-NEXT: popl %esi
-; CHECK-NEXT: popl %edi
-; CHECK-NEXT: popl %ebx
-; CHECK-NEXT: popl %ebp
-; CHECK-NEXT: retl
-; CHECK-NEXT: .def "?catch$2@?0?pr66984 at 4HA";
-; CHECK-NEXT: .scl 3;
-; CHECK-NEXT: .type 32;
-; CHECK-NEXT: .endef
-; CHECK-NEXT: .p2align 4, 0x90
-; CHECK-NEXT: "?catch$2@?0?pr66984 at 4HA":
-; CHECK-NEXT: LBB0_2: # %bb17
-; CHECK-NEXT: pushl %ebp
-; CHECK-NEXT: addl $12, %ebp
-; CHECK-NEXT: movl %esp, -28(%ebp)
-; CHECK-NEXT: movl -36(%ebp), %ecx
-; CHECK-NEXT: movl $2, -16(%ebp)
-; CHECK-NEXT: calll _cleanup
-; CHECK-NEXT: movl $LBB0_3, %eax
-; CHECK-NEXT: popl %ebp
-; CHECK-NEXT: retl # CATCHRET
-; CHECK-NEXT: .def "?dtor$5@?0?pr66984 at 4HA";
-; CHECK-NEXT: .scl 3;
-; CHECK-NEXT: .type 32;
-; CHECK-NEXT: .endef
-; CHECK-NEXT: .p2align 4, 0x90
-; CHECK-NEXT: "?dtor$5@?0?pr66984 at 4HA":
-; CHECK-NEXT: LBB0_5: # %bb8
-; CHECK-NEXT: pushl %ebp
-; CHECK-NEXT: addl $12, %ebp
-; CHECK-NEXT: movl 8(%ebp), %eax
-; CHECK-NEXT: movl %eax, -32(%ebp)
-; CHECK-NEXT: leal -32(%ebp), %ecx
-; CHECK-NEXT: calll _foo
-; CHECK-NEXT: popl %ebp
-; CHECK-NEXT: retl # CLEANUPRET
-; CHECK-NEXT: Lfunc_end0:
+; I686-LABEL: pr66984:
+; I686: # %bb.0: # %bb
+; I686-NEXT: pushl %ebp
+; I686-NEXT: movl %esp, %ebp
+; I686-NEXT: pushl %ebx
+; I686-NEXT: pushl %edi
+; I686-NEXT: pushl %esi
+; I686-NEXT: subl $24, %esp
+; I686-NEXT: movl %esp, -28(%ebp)
+; I686-NEXT: movl $-1, -16(%ebp)
+; I686-NEXT: leal -24(%ebp), %eax
+; I686-NEXT: movl $___ehhandler$pr66984, -20(%ebp)
+; I686-NEXT: movl %fs:0, %ecx
+; I686-NEXT: movl %ecx, -24(%ebp)
+; I686-NEXT: movl %eax, %fs:0
+; I686-NEXT: movl $1, -16(%ebp)
+; I686-NEXT: calll _throw
+; I686-NEXT: # %bb.1: # %bb14
+; I686-NEXT: LBB0_3: # Block address taken
+; I686-NEXT: # %bb17
+; I686-NEXT: addl $12, %ebp
+; I686-NEXT: jmp LBB0_4
+; I686-NEXT: LBB0_4: # %exit
+; I686-NEXT: $ehgcr_0_4:
+; I686-NEXT: movl -24(%ebp), %eax
+; I686-NEXT: movl %eax, %fs:0
+; I686-NEXT: addl $24, %esp
+; I686-NEXT: popl %esi
+; I686-NEXT: popl %edi
+; I686-NEXT: popl %ebx
+; I686-NEXT: popl %ebp
+; I686-NEXT: retl
+; I686-NEXT: .def "?catch$2@?0?pr66984 at 4HA";
+; I686-NEXT: .scl 3;
+; I686-NEXT: .type 32;
+; I686-NEXT: .endef
+; I686-NEXT: .p2align 4, 0x90
+; I686-NEXT: "?catch$2@?0?pr66984 at 4HA":
+; I686-NEXT: LBB0_2: # %bb17
+; I686-NEXT: pushl %ebp
+; I686-NEXT: addl $12, %ebp
+; I686-NEXT: movl %esp, -28(%ebp)
+; I686-NEXT: movl -36(%ebp), %ecx
+; I686-NEXT: movl $2, -16(%ebp)
+; I686-NEXT: calll _cleanup
+; I686-NEXT: movl $LBB0_3, %eax
+; I686-NEXT: popl %ebp
+; I686-NEXT: retl # CATCHRET
+; I686-NEXT: .def "?dtor$5@?0?pr66984 at 4HA";
+; I686-NEXT: .scl 3;
+; I686-NEXT: .type 32;
+; I686-NEXT: .endef
+; I686-NEXT: .p2align 4, 0x90
+; I686-NEXT: "?dtor$5@?0?pr66984 at 4HA":
+; I686-NEXT: LBB0_5: # %bb8
+; I686-NEXT: pushl %ebp
+; I686-NEXT: addl $12, %ebp
+; I686-NEXT: movl 8(%ebp), %eax
+; I686-NEXT: movl %eax, -32(%ebp)
+; I686-NEXT: leal -32(%ebp), %ecx
+; I686-NEXT: calll _foo
+; I686-NEXT: popl %ebp
+; I686-NEXT: retl # CLEANUPRET
+; I686-NEXT: Lfunc_end0:
+;
+; X86_64-LABEL: pr66984:
+; X86_64: # %bb.0: # %bb
+; X86_64-NEXT: pushq %rbp
+; X86_64-NEXT: .seh_pushreg %rbp
+; X86_64-NEXT: subq $64, %rsp
+; X86_64-NEXT: .seh_stackalloc 64
+; X86_64-NEXT: leaq {{[0-9]+}}(%rsp), %rbp
+; X86_64-NEXT: .seh_setframe %rbp, 64
+; X86_64-NEXT: .seh_endprologue
+; X86_64-NEXT: movq $-2, -16(%rbp)
+; X86_64-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; X86_64-NEXT: .Ltmp0:
+; X86_64-NEXT: callq throw
+; X86_64-NEXT: .Ltmp1:
+; X86_64-NEXT: # %bb.1: # %bb14
+; X86_64-NEXT: .LBB0_3: # Block address taken
+; X86_64-NEXT: # %exit
+; X86_64-NEXT: $ehgcr_0_3:
+; X86_64-NEXT: nop
+; X86_64-NEXT: addq $64, %rsp
+; X86_64-NEXT: popq %rbp
+; X86_64-NEXT: retq
+; X86_64-NEXT: .seh_handlerdata
+; X86_64-NEXT: .long ($cppxdata$pr66984)@IMGREL
+; X86_64-NEXT: .text
+; X86_64-NEXT: .seh_endproc
+; X86_64-NEXT: .def "?catch$2@?0?pr66984 at 4HA";
+; X86_64-NEXT: .scl 3;
+; X86_64-NEXT: .type 32;
+; X86_64-NEXT: .endef
+; X86_64-NEXT: .p2align 4, 0x90
+; X86_64-NEXT: "?catch$2@?0?pr66984 at 4HA":
+; X86_64-NEXT: .seh_proc "?catch$2@?0?pr66984 at 4HA"
+; X86_64-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except
+; X86_64-NEXT: .LBB0_2: # %bb17
+; X86_64-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
+; X86_64-NEXT: pushq %rbp
+; X86_64-NEXT: .seh_pushreg %rbp
+; X86_64-NEXT: subq $32, %rsp
+; X86_64-NEXT: .seh_stackalloc 32
+; X86_64-NEXT: leaq 64(%rdx), %rbp
+; X86_64-NEXT: .seh_endprologue
+; X86_64-NEXT: movq -8(%rbp), %rcx
+; X86_64-NEXT: callq cleanup
+; X86_64-NEXT: leaq .LBB0_3(%rip), %rax
+; X86_64-NEXT: addq $32, %rsp
+; X86_64-NEXT: popq %rbp
+; X86_64-NEXT: retq # CATCHRET
+; X86_64-NEXT: .seh_handlerdata
+; X86_64-NEXT: .long ($cppxdata$pr66984)@IMGREL
+; X86_64-NEXT: .text
+; X86_64-NEXT: .seh_endproc
+; X86_64-NEXT: .def "?dtor$4@?0?pr66984 at 4HA";
+; X86_64-NEXT: .scl 3;
+; X86_64-NEXT: .type 32;
+; X86_64-NEXT: .endef
+; X86_64-NEXT: .p2align 4, 0x90
+; X86_64-NEXT: "?dtor$4@?0?pr66984 at 4HA":
+; X86_64-NEXT: .seh_proc "?dtor$4@?0?pr66984 at 4HA"
+; X86_64-NEXT: .LBB0_4: # %bb8
+; X86_64-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
+; X86_64-NEXT: pushq %rbp
+; X86_64-NEXT: .seh_pushreg %rbp
+; X86_64-NEXT: subq $32, %rsp
+; X86_64-NEXT: .seh_stackalloc 32
+; X86_64-NEXT: leaq 64(%rdx), %rbp
+; X86_64-NEXT: .seh_endprologue
+; X86_64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
+; X86_64-NEXT: movq %rax, -32(%rbp)
+; X86_64-NEXT: leaq -32(%rbp), %rcx
+; X86_64-NEXT: callq foo
+; X86_64-NEXT: nop
+; X86_64-NEXT: addq $32, %rsp
+; X86_64-NEXT: popq %rbp
+; X86_64-NEXT: retq # CLEANUPRET
+; X86_64-NEXT: .Lfunc_end0:
+; X86_64-NEXT: .seh_handlerdata
+; X86_64-NEXT: .text
+; X86_64-NEXT: .seh_endproc
bb:
%a1 = alloca ptr, align 4
%a2 = alloca ptr, align 4
More information about the llvm-branch-commits
mailing list