summaryrefslogtreecommitdiff
path: root/test/CodeGen/WinEH
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2015-11-19 23:23:33 +0000
committerReid Kleckner <rnk@google.com>2015-11-19 23:23:33 +0000
commitd1d6f53a8b4acc14c5fce125035142e0639b44da (patch)
treeef31a4f468b524b01b9fc7a9e8a5c36706bad1e8 /test/CodeGen/WinEH
parent0426ad40b56741117d00e780b07607f120ee1d01 (diff)
[WinEH] Disable most forms of demotion
Now that the register allocator knows about the barriers on funclet entry and exit, testing has shown that this is unnecessary. We still demote PHIs on unsplittable blocks due to the differences between the IR CFG and the Machine CFG. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253619 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/WinEH')
-rw-r--r--test/CodeGen/WinEH/wineh-cloning.ll18
-rw-r--r--test/CodeGen/WinEH/wineh-demotion.ll66
-rw-r--r--test/CodeGen/WinEH/wineh-multi-parent-cloning.ll65
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]]