diff options
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-cloning.ll | 18 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-demotion.ll | 66 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll | 65 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/win-catchpad-varargs.ll | 66 |
4 files changed, 76 insertions, 139 deletions
diff --git a/llvm/test/CodeGen/WinEH/wineh-cloning.ll b/llvm/test/CodeGen/WinEH/wineh-cloning.ll index 58bf71e62b6..7d6529d6009 100644 --- a/llvm/test/CodeGen/WinEH/wineh-cloning.ll +++ b/llvm/test/CodeGen/WinEH/wineh-cloning.ll @@ -29,18 +29,16 @@ endcatch: ; for the use in entry's copy. ; CHECK-LABEL: define void @test1( ; CHECK: entry: -; CHECK: store i32 %x, i32* [[Slot:%[^ ]+]] +; CHECK: %x = call i32 @g() ; CHECK: invoke void @f() ; CHECK: to label %[[EntryCopy:[^ ]+]] unwind label %catch ; CHECK: catch: ; CHECK: catchpad [] ; CHECK-NEXT: to label %[[CatchCopy:[^ ]+]] unwind ; CHECK: [[CatchCopy]]: -; CHECK: [[LoadX2:%[^ ]+]] = load i32, i32* [[Slot]] -; CHECK: call void @h(i32 [[LoadX2]] +; CHECK: call void @h(i32 %x) ; CHECK: [[EntryCopy]]: -; CHECK: [[LoadX1:%[^ ]+]] = load i32, i32* [[Slot]] -; CHECK: call void @h(i32 [[LoadX1]] +; CHECK: call void @h(i32 %x) define void @test2() personality i32 (...)* @__CxxFrameHandler3 { @@ -281,12 +279,14 @@ exit: ; then calls @h, and that the call to @h doesn't return. ; CHECK-LABEL: define void @test6( ; CHECK: left: +; CHECK: %x.for.left = call i32 @g() +; CHECK: invoke void @f() ; CHECK: to label %[[SHARED_CONT_LEFT:.+]] unwind label %[[INNER_LEFT:.+]] ; CHECK: right: +; CHECK: catchpad ; CHECK: to label %right.catch unwind label %right.end ; CHECK: right.catch: ; CHECK: %x = call i32 @g() -; CHECK: store i32 %x, i32* %x.wineh.spillslot ; CHECK: to label %shared.cont unwind label %[[INNER_RIGHT:.+]] ; CHECK: right.end: ; CHECK: catchendpad unwind to caller @@ -296,13 +296,11 @@ exit: ; CHECK: unreachable ; CHECK: [[INNER_RIGHT]]: ; CHECK: [[I_R:\%.+]] = cleanuppad [] -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: cleanupret [[I_R]] unwind label %right.end ; CHECK: [[INNER_LEFT]]: ; CHECK: [[I_L:\%.+]] = cleanuppad [] -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable diff --git a/llvm/test/CodeGen/WinEH/wineh-demotion.ll b/llvm/test/CodeGen/WinEH/wineh-demotion.ll index e849a8ec80c..96f33b0ed1a 100644 --- a/llvm/test/CodeGen/WinEH/wineh-demotion.ll +++ b/llvm/test/CodeGen/WinEH/wineh-demotion.ll @@ -118,49 +118,6 @@ exit: ret void } -; CHECK-LABEL: @test3( -define void @test3(i1 %B) personality i32 (...)* @__CxxFrameHandler3 { -entry: - ; need to spill parameter %B and def %x since they're used in a funclet - ; CHECK: entry: - ; CHECK-DAG: store i1 %B, i1* [[SlotB:%[^ ]+]] - ; CHECK-DAG: store i32 %x, i32* [[SlotX:%[^ ]+]] - ; CHECK: invoke void @f - %x = call i32 @g() - invoke void @f() - to label %exit unwind label %catchpad - -catchpad: - %cp = catchpad [] to label %catch unwind label %catchend - -catch: - ; Need to reload %B here - ; CHECK: catch: - ; CHECK: [[ReloadB:%[^ ]+]] = load i1, i1* [[SlotB]] - ; CHECK: br i1 [[ReloadB]] - br i1 %B, label %left, label %right -left: - ; Use of %x is in a phi, so need reload here in pred - ; CHECK: left: - ; CHECK: [[ReloadX:%[^ ]+]] = load i32, i32* [[SlotX]] - ; CHECK: br label %merge - br label %merge -right: - br label %merge -merge: - ; CHECK: merge: - ; CHECK: %phi = phi i32 [ [[ReloadX]], %left ] - %phi = phi i32 [ %x, %left ], [ 42, %right ] - call void @h(i32 %phi) - catchret %cp to label %exit - -catchend: - catchendpad unwind to caller - -exit: - ret void -} - ; test4: don't need stores for %phi.inner, as its only use is to feed %phi.outer ; %phi.outer needs stores in %left, %right, and %join ; CHECK-LABEL: @test4( @@ -295,20 +252,15 @@ exit: ret void } +; We used to demote %x, but we don't need to anymore. ; CHECK-LABEL: @test6( define void @test6() personality i32 (...)* @__CxxFrameHandler3 { entry: - ; Since %x needs to be stored but the edge to loop is critical, - ; it needs to be split ; CHECK: entry: - ; CHECK: invoke i32 @g - ; CHECK-NEXT: to label %[[SplitBlock:[^ ]+]] unwind label %to_caller + ; CHECK: %x = invoke i32 @g() + ; CHECK-NEXT: to label %loop unwind label %to_caller %x = invoke i32 @g() to label %loop unwind label %to_caller - ; The store should be in the split block - ; CHECK: [[SplitBlock]]: - ; CHECK: store i32 %x, i32* [[SpillSlot:%[^ ]+]] - ; CHECK: br label %loop to_caller: %cp1 = cleanuppad [] cleanupret %cp1 unwind to caller @@ -317,8 +269,7 @@ loop: to label %loop unwind label %cleanup cleanup: ; CHECK: cleanup: - ; CHECK: [[Load:%[^ ]+]] = load i32, i32* [[SpillSlot]] - ; CHECK: call void @h(i32 [[Load]]) + ; CHECK: call void @h(i32 %x) %cp2 = cleanuppad [] call void @h(i32 %x) cleanupret %cp2 unwind to caller @@ -362,18 +313,15 @@ right: ; Edge from %right to %join needs to be split so that ; the load of %y can be inserted *after* the catchret ; CHECK: right: - ; CHECK: store i32 %y, i32* [[SlotY:%[^ ]+]] - ; CHECK: catchret %[[CatchPad]] to label %[[SplitRight:[^ ]+]] + ; CHECK: %y = call i32 @g() + ; CHECK: catchret %[[CatchPad]] to label %join %y = call i32 @g() catchret %cp to label %join - ; CHECK: [[SplitRight]]: - ; CHECK: [[LoadY:%[^ ]+]] = load i32, i32* [[SlotY]] - ; CHECK: br label %join catchend: catchendpad unwind to caller join: ; CHECK: join: - ; CHECK: %phi = phi i32 [ [[LoadX]], %[[SplitLeft]] ], [ [[LoadY]], %[[SplitRight]] ] + ; CHECK: %phi = phi i32 [ [[LoadX]], %[[SplitLeft]] ], [ %y, %right ] %phi = phi i32 [ %x, %left ], [ %y, %right ] call void @h(i32 %phi) br label %exit diff --git a/llvm/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll b/llvm/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll index 8c0aed04310..1e9342d17cb 100644 --- a/llvm/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll +++ b/llvm/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll @@ -51,12 +51,14 @@ exit: ; then calls @h, and that the call to @h doesn't return. ; CHECK-LABEL: define void @test1( ; CHECK: left: +; CHECK: cleanuppad +; CHECK: %x.for.left = call i32 @g() +; CHECK: invoke void @f() ; CHECK: to label %[[SHARED_CONT_LEFT:.+]] unwind label %[[INNER_LEFT:.+]] ; CHECK: right: ; CHECK: to label %right.catch unwind label %right.end ; CHECK: right.catch: ; CHECK: %x = call i32 @g() -; CHECK: store i32 %x, i32* %x.wineh.spillslot ; CHECK: to label %shared.cont unwind label %[[INNER_RIGHT:.+]] ; CHECK: right.end: ; CHECK: catchendpad unwind to caller @@ -66,13 +68,11 @@ exit: ; CHECK: unreachable ; CHECK: [[INNER_RIGHT]]: ; CHECK: [[I_R:\%.+]] = cleanuppad [] -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: cleanupret [[I_R]] unwind label %right.end ; CHECK: [[INNER_LEFT]]: ; CHECK: [[I_L:\%.+]] = cleanuppad [] -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable @@ -118,6 +118,9 @@ exit: ; %right.end (which belongs to the entry funclet). ; CHECK-LABEL: define void @test2( ; CHECK: left: +; CHECK: cleanuppad +; CHECK: %x.for.left = call i32 @g() +; CHECK: invoke void @f() ; CHECK: to label %[[SHARED_CONT_LEFT:.+]] unwind label %[[INNER_LEFT:.+]] ; CHECK: right: ; CHECK: to label %right.catch unwind label %[[RIGHT_END:.+]] @@ -136,12 +139,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_LEFT]]: ; CHECK: catchendpad unwind to caller @@ -190,6 +191,8 @@ exit: ; CHECK-LABEL: define void @test3( ; CHECK: left: ; CHECK: %l = cleanuppad [] +; CHECK: %x.for.left = call i32 @g() +; CHECK: invoke void @f() ; CHECK: to label %[[SHARED_CONT_LEFT:.+]] unwind label %[[INNER_LEFT:.+]] ; CHECK: [[LEFT_END:left.end.*]]: ; CHECK: cleanupendpad %l unwind label %right @@ -210,12 +213,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_LEFT]]: ; CHECK: catchendpad unwind label %[[LEFT_END]] @@ -270,6 +271,8 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %left.catch unwind label %[[LEFT_END:.+]] ; CHECK: left.catch: +; CHECK: %x.for.left = call i32 @g() +; CHECK: invoke void @f() ; CHECK: to label %[[SHARED_CONT_LEFT:.+]] unwind label %[[INNER_LEFT:.+]] ; CHECK: [[LEFT_END]]: ; CHECK: catchendpad unwind label %right @@ -290,12 +293,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind to caller @@ -362,12 +363,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind to caller @@ -446,12 +445,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind to caller @@ -522,12 +519,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind label %[[INNER_SIBLING_RIGHT:.+]] @@ -803,12 +798,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind to caller @@ -875,12 +868,10 @@ exit: ; CHECK: catchpad [] ; CHECK: to label %[[INNER_CATCH_LEFT:.+]] unwind label %[[INNER_END_LEFT:.+]] ; CHECK: [[INNER_CATCH_RIGHT]]: -; CHECK: [[X_RELOAD_R:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_R]]) +; CHECK: call void @h(i32 %x) ; CHECK: unreachable ; CHECK: [[INNER_CATCH_LEFT]]: -; CHECK: [[X_RELOAD_L:\%.+]] = load i32, i32* %x.wineh.spillslot -; CHECK: call void @h(i32 [[X_RELOAD_L]]) +; CHECK: call void @h(i32 %x.for.left) ; CHECK: unreachable ; CHECK: [[INNER_END_RIGHT]]: ; CHECK: catchendpad unwind label %[[RIGHT_END]] diff --git a/llvm/test/CodeGen/X86/win-catchpad-varargs.ll b/llvm/test/CodeGen/X86/win-catchpad-varargs.ll index 03c6c70dc69..a2988a3059e 100644 --- a/llvm/test/CodeGen/X86/win-catchpad-varargs.ll +++ b/llvm/test/CodeGen/X86/win-catchpad-varargs.ll @@ -35,40 +35,34 @@ return: ; preds = %entry, %catch ; X64-LABEL: .seh_proc f ; X64: pushq %rbp -; X64: pushq %rsi -; X64: subq $56, %rsp -; X64: leaq 48(%rsp), %rbp -; X64: movq $-2, (%rbp) +; X64: subq $64, %rsp +; X64: leaq 64(%rsp), %rbp +; X64: movq $-2, -8(%rbp) +; X64: movl $-1, -20(%rbp) # 4-byte Folded Spill ; X64: callq g -; X64: movl %esi, %eax -; X64: addq $56, %rsp -; X64: popq %rsi +; X64: .LBB0_1 +; X64: movl -20(%rbp), %eax # 4-byte Reload +; X64: addq $64, %rsp ; X64: popq %rbp -; X64: movl -4(%rbp), %esi -; X64: jmp - -; X64-LABEL: "?catch$1@?0?f@4HA": -; X64: .seh_proc "?catch$1@?0?f@4HA" +; X64-LABEL: "?catch${{[0-9]}}@?0?f@4HA": +; X64: .seh_proc "?catch${{[0-9]}}@?0?f@4HA" ; X64: movq %rdx, 16(%rsp) ; X64: pushq %rbp -; X64: pushq %rsi -; X64: subq $40, %rsp -; X64: leaq 48(%rdx), %rbp +; X64: subq $32, %rsp +; X64: leaq 64(%rdx), %rbp ; arg2 is at RBP+40: ; start at arg2 ; + 8 for arg1 ; + 8 for retaddr ; + 8 for RBP -; + 8 for RSI -; + 56 for stackalloc -; - 48 for setframe +; + 64 for stackalloc +; - 64 for setframe ; = 40 -; X64: movl 40(%rbp), %eax -; X64: movl %eax, -4(%rbp) -; X64: leaq .LBB0_2(%rip), %rax -; X64: addq $40, %rsp -; X64: popq %rsi +; X64: movl 24(%rbp), %eax +; X64: movl %eax, -20(%rbp) # 4-byte Spill +; X64: leaq .LBB0_1(%rip), %rax +; X64: addq $32, %rsp ; X64: popq %rbp ; X64: retq # CATCHRET @@ -78,27 +72,33 @@ return: ; preds = %entry, %catch ; X86: pushl %ebx ; X86: pushl %edi ; X86: pushl %esi -; X86: subl $28, %esp -; X86: movl $-1, -40(%ebp) +; X86: subl $24, %esp +; X86: movl $-1, -36(%ebp) ; X86: calll _g -; X86: movl -40(%ebp), %eax -; X86: addl $28, %esp +; X86: LBB0_[[retbb:[0-9]+]]: +; X86: movl -36(%ebp), %eax +; X86: addl $24, %esp ; X86: popl %esi ; X86: popl %edi ; X86: popl %ebx ; X86: popl %ebp ; X86: retl -; X86-LABEL: "?catch$1@?0?f@4HA": -; X86: pushl %ebp -; X86: addl $12, %ebp +; X86: LBB0_[[restorebb:[0-9]+]]: # Block address taken +; X86: addl $12, %ebp ; arg2 is at EBP offset 12: ; + 4 for arg1 ; + 4 for retaddr ; + 4 for EBP +; X86: movl 12(%ebp), %eax +; X86: movl %eax, -36(%ebp) +; X86: jmp LBB0_[[retbb]] + +; X86-LABEL: "?catch${{[0-9]}}@?0?f@4HA": +; X86: pushl %ebp +; X86: addl $12, %ebp ; Done due to mov %esp, %ebp -; X86: movl 12(%ebp), %eax -; X86: movl %eax, -32(%ebp) -; X86: movl $LBB0_2, %eax +; X86: leal 12(%ebp), %eax +; X86: movl $LBB0_[[restorebb]], %eax ; X86: popl %ebp ; X86: retl # CATCHRET |

