[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