diff options
Diffstat (limited to 'test/CodeGen/WinEH')
-rw-r--r-- | test/CodeGen/WinEH/wineh-cloning.ll | 18 | ||||
-rw-r--r-- | test/CodeGen/WinEH/wineh-demotion.ll | 66 | ||||
-rw-r--r-- | test/CodeGen/WinEH/wineh-multi-parent-cloning.ll | 65 |
3 files changed, 43 insertions, 106 deletions
diff --git a/test/CodeGen/WinEH/wineh-cloning.ll b/test/CodeGen/WinEH/wineh-cloning.ll index 58bf71e62b6..7d6529d6009 100644 --- a/test/CodeGen/WinEH/wineh-cloning.ll +++ b/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/test/CodeGen/WinEH/wineh-demotion.ll b/test/CodeGen/WinEH/wineh-demotion.ll index e849a8ec80c..96f33b0ed1a 100644 --- a/test/CodeGen/WinEH/wineh-demotion.ll +++ b/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/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll b/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll index 8c0aed04310..1e9342d17cb 100644 --- a/test/CodeGen/WinEH/wineh-multi-parent-cloning.ll +++ b/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]] |