diff options
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r-- | llvm/test/Transforms/CodeGenPrepare/catchpad-phi-cast.ll | 52 | ||||
-rw-r--r-- | llvm/test/Transforms/GVN/funclet.ll | 9 | ||||
-rw-r--r-- | llvm/test/Transforms/GVN/pre-load.ll | 26 | ||||
-rw-r--r-- | llvm/test/Transforms/Inline/PR25155.ll | 21 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/token.ll | 24 | ||||
-rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/funclet.ll | 80 | ||||
-rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/pr25541.ll | 13 | ||||
-rw-r--r-- | llvm/test/Transforms/LoopUnswitch/cleanuppad.ll | 44 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll | 155 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll | 48 | ||||
-rw-r--r-- | llvm/test/Transforms/Sink/catchswitch.ll | 37 |
11 files changed, 260 insertions, 249 deletions
diff --git a/llvm/test/Transforms/CodeGenPrepare/catchpad-phi-cast.ll b/llvm/test/Transforms/CodeGenPrepare/catchpad-phi-cast.ll index c0b63b7d6d9..8c5e01e3634 100644 --- a/llvm/test/Transforms/CodeGenPrepare/catchpad-phi-cast.ll +++ b/llvm/test/Transforms/CodeGenPrepare/catchpad-phi-cast.ll @@ -18,9 +18,6 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2 ; CHECK-LABEL: @test( define void @test(i32* %addr) personality i32 (...)* @__CxxFrameHandler3 { -; CHECK: entry: -; CHECK-NEXT: %x = getelementptr i32, i32* %addr, i32 1 -; CHECK-NEXT: %p1 = bitcast i32* %x to i8* entry: %x = getelementptr i32, i32* %addr, i32 1 %p1 = bitcast i32* %x to i8* @@ -29,7 +26,6 @@ entry: ; CHECK: invoke.cont: ; CHECK-NEXT: %y = getelementptr i32, i32* %addr, i32 2 -; CHECK-NEXT: %p2 = bitcast i32* %y to i8* invoke.cont: %y = getelementptr i32, i32* %addr, i32 2 %p2 = bitcast i32* %y to i8* @@ -40,23 +36,31 @@ done: ret void catch1: - %cp1 = catchpad [] to label %catch.dispatch unwind label %catchend1 + %cs1 = catchswitch within none [label %handler1] unwind to caller -catch2: - %cp2 = catchpad [] to label %catch.dispatch unwind label %catchend2 +handler1: + %cp1 = catchpad within %cs1 [] + br label %catch.shared +; CHECK: handler1: +; CHECK-NEXT: catchpad within %cs1 +; CHECK: %[[p1:[0-9]+]] = bitcast i32* %x to i8* -; CHECK: catch.dispatch: -; CHECK-NEXT: %p = phi i8* [ %p1, %catch1 ], [ %p2, %catch2 ] -catch.dispatch: - %p = phi i8* [ %p1, %catch1 ], [ %p2, %catch2 ] +catch2: + %cs2 = catchswitch within none [label %handler2] unwind to caller + +handler2: + %cp2 = catchpad within %cs2 [] + br label %catch.shared +; CHECK: handler2: +; CHECK: catchpad within %cs2 +; CHECK: %[[p2:[0-9]+]] = bitcast i32* %y to i8* + +; CHECK: catch.shared: +; CHECK-NEXT: %p = phi i8* [ %[[p1]], %handler1 ], [ %[[p2]], %handler2 ] +catch.shared: + %p = phi i8* [ %p1, %handler1 ], [ %p2, %handler2 ] call void @g(i8* %p) unreachable - -catchend1: - catchendpad unwind to caller - -catchend2: - catchendpad unwind to caller } ; CodeGenPrepare will want to hoist these llvm.dbg.value calls to the phi, but @@ -75,24 +79,22 @@ ret: catch.dispatch: %p = phi i8* [%a, %entry], [%b, %next] - %cp1 = catchpad [] to label %catch unwind label %catchend + %cs1 = catchswitch within none [label %catch] unwind to caller catch: + %cp1 = catchpad within %cs1 [] tail call void @llvm.dbg.value(metadata i8* %p, i64 0, metadata !11, metadata !13), !dbg !14 - invoke void @g(i8* %p) to label %catchret unwind label %catchend -catchret: - catchret %cp1 to label %ret + call void @g(i8* %p) + catchret from %cp1 to label %ret ; CHECK: catch.dispatch: ; CHECK-NEXT: phi i8 -; CHECK-NEXT: catchpad +; CHECK-NEXT: catchswitch ; CHECK-NOT: llvm.dbg.value ; CHECK: catch: +; CHECK-NEXT: catchpad ; CHECK-NEXT: call void @llvm.dbg.value - -catchend: - catchendpad unwind to caller } !llvm.dbg.cu = !{!0} diff --git a/llvm/test/Transforms/GVN/funclet.ll b/llvm/test/Transforms/GVN/funclet.ll index c9faf8ee4c8..2669256f0bd 100644 --- a/llvm/test/Transforms/GVN/funclet.ll +++ b/llvm/test/Transforms/GVN/funclet.ll @@ -17,12 +17,12 @@ entry: to label %unreachable unwind label %catch.dispatch catch.dispatch: ; preds = %entry - %catchpad = catchpad [i8* null, i32 64, i8* null] - to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind to caller catch: ; preds = %catch.dispatch + %catchpad = catchpad within %cs1 [i8* null, i32 64, i8* null] store i8 5, i8* %b - catchret %catchpad to label %try.cont + catchret from %catchpad to label %try.cont try.cont: ; preds = %catch %load_b = load i8, i8* %b @@ -30,9 +30,6 @@ try.cont: ; preds = %catch %add = add i8 %load_b, %load_c ret i8 %add -catchendblock: ; preds = %catch.dispatch - catchendpad unwind to caller - unreachable: ; preds = %entry unreachable } diff --git a/llvm/test/Transforms/GVN/pre-load.ll b/llvm/test/Transforms/GVN/pre-load.ll index c165a5a4932..685df24f62b 100644 --- a/llvm/test/Transforms/GVN/pre-load.ll +++ b/llvm/test/Transforms/GVN/pre-load.ll @@ -399,7 +399,7 @@ define void @test12(i32* %p) personality i32 (...)* @__CxxFrameHandler3 { ; CHECK-LABEL: @test12( block1: invoke void @f() - to label %block2 unwind label %catch + to label %block2 unwind label %catch.dispatch block2: invoke void @f() @@ -408,31 +408,25 @@ block2: block3: ret void -catch: - %c = catchpad [] - to label %catch.dispatch unwind label %catchend - catch.dispatch: - catchret %c to label %block2 + %cs1 = catchswitch within none [label %catch] unwind label %cleanup2 -; CHECK: catchend: -; CHECK-NOT: load -; CHECK-NEXT: catchendpad -catchend: - catchendpad unwind label %cleanup2 +catch: + %c = catchpad within %cs1 [] + catchret from %c to label %block2 cleanup: - %c1 = cleanuppad [] + %c1 = cleanuppad within none [] store i32 0, i32* %p - cleanupret %c1 unwind label %cleanup2 + cleanupret from %c1 unwind label %cleanup2 ; CHECK: cleanup2: ; CHECK-NOT: phi -; CHECK-NEXT: %c2 = cleanuppad [] +; CHECK-NEXT: %c2 = cleanuppad within none [] ; CHECK-NEXT: %NOTPRE = load i32, i32* %p cleanup2: - %c2 = cleanuppad [] + %c2 = cleanuppad within none [] %NOTPRE = load i32, i32* %p call void @g(i32 %NOTPRE) - cleanupret %c2 unwind to caller + cleanupret from %c2 unwind to caller } diff --git a/llvm/test/Transforms/Inline/PR25155.ll b/llvm/test/Transforms/Inline/PR25155.ll index f2a9ec32fda..aed9a58ab3d 100644 --- a/llvm/test/Transforms/Inline/PR25155.ll +++ b/llvm/test/Transforms/Inline/PR25155.ll @@ -8,21 +8,23 @@ entry: to label %try.cont unwind label %catch.dispatch catch.dispatch: ; preds = %entry - %0 = catchpad [i8* null, i32 64, i8* null] - to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind to caller catch: ; preds = %catch.dispatch + %0 = catchpad within %cs1 [i8* null, i32 64, i8* null] invoke void @dtor() - to label %invoke.cont.1 unwind label %catchendblock + to label %invoke.cont.1 unwind label %ehcleanup invoke.cont.1: ; preds = %catch - catchret %0 to label %try.cont + catchret from %0 to label %try.cont try.cont: ; preds = %entry, %invoke.cont.1 ret void -catchendblock: ; preds = %catch, %catch.dispatch - catchendpad unwind to caller +ehcleanup: + %cp2 = cleanuppad within none [] + call void @g() + cleanupret from %cp2 unwind to caller } ; CHECK-LABEL: define void @f( @@ -31,10 +33,7 @@ catchendblock: ; preds = %catch, %catch.dispa ; CHECK: to label %dtor.exit unwind label %terminate.i ; CHECK: terminate.i: -; CHECK-NEXT: terminatepad [void ()* @terminate] unwind label %catchendblock - -; CHECK: catchendblock: -; CHECK-NEXT: catchendpad unwind to caller +; CHECK-NEXT: terminatepad within %0 [void ()* @terminate] unwind label %ehcleanup declare i32 @__CxxFrameHandler3(...) @@ -47,7 +46,7 @@ invoke.cont: ; preds = %entry ret void terminate: ; preds = %entry - terminatepad [void ()* @terminate] unwind to caller + terminatepad within none [void ()* @terminate] unwind to caller } declare void @g() diff --git a/llvm/test/Transforms/InstCombine/token.ll b/llvm/test/Transforms/InstCombine/token.ll index e47109b6164..0929cf7ebee 100644 --- a/llvm/test/Transforms/InstCombine/token.ll +++ b/llvm/test/Transforms/InstCombine/token.ll @@ -9,14 +9,14 @@ bb: unreachable unreachable: - %cl = cleanuppad [] - cleanupret %cl unwind to caller + %cl = cleanuppad within none [] + cleanupret from %cl unwind to caller } ; CHECK-LABEL: define void @test1( ; CHECK: unreachable: -; CHECK: %cl = cleanuppad [] -; CHECK: cleanupret %cl unwind to caller +; CHECK: %cl = cleanuppad within none [] +; CHECK: cleanupret from %cl unwind to caller define void @test2(i8 %A, i8 %B) personality i32 (...)* @__CxxFrameHandler3 { bb: @@ -33,19 +33,15 @@ cont: catch: %phi = phi i32 [ %X, %bb ], [ %Y, %cont ] - %cl = catchpad [] - to label %doit - unwind label %endpad + %cs = catchswitch within none [label %doit] unwind to caller doit: + %cl = catchpad within %cs [] call void @g(i32 %phi) unreachable unreachable: unreachable - -endpad: - catchendpad unwind to caller } ; CHECK-LABEL: define void @test2( @@ -73,19 +69,15 @@ cont2: catch: %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ] - %cl = catchpad [] - to label %doit - unwind label %endpad + %cs = catchswitch within none [label %doit] unwind to caller doit: + %cl = catchpad within %cs [] call void @g(i32 %phi) unreachable unreachable: unreachable - -endpad: - catchendpad unwind to caller } ; CHECK-LABEL: define void @test3( diff --git a/llvm/test/Transforms/LoopStrengthReduce/funclet.ll b/llvm/test/Transforms/LoopStrengthReduce/funclet.ll index 03799ddfdb5..a2da3208a38 100644 --- a/llvm/test/Transforms/LoopStrengthReduce/funclet.ll +++ b/llvm/test/Transforms/LoopStrengthReduce/funclet.ll @@ -20,19 +20,17 @@ throw: ; preds = %throw, %entry pad: ; preds = %throw %phi2 = phi i8* [ %tmp96, %throw ] - terminatepad [] unwind label %blah + terminatepad within none [] unwind label %blah blah: - catchpad [] to label %unreachable unwind label %blah3 + %cs = catchswitch within none [label %unreachable] unwind label %blah2 unreachable: + catchpad within %cs [] unreachable -blah3: - catchendpad unwind label %blah2 - blah2: - %cleanuppadi4.i.i.i = cleanuppad [] + %cleanuppadi4.i.i.i = cleanuppad within none [] br label %loop_body loop_body: ; preds = %iter, %pad @@ -45,11 +43,11 @@ iter: ; preds = %loop_body br i1 undef, label %unwind_out, label %loop_body unwind_out: ; preds = %iter, %loop_body - cleanupret %cleanuppadi4.i.i.i unwind to caller + cleanupret from %cleanuppadi4.i.i.i unwind to caller } ; CHECK-LABEL: define void @f( -; CHECK: cleanuppad [] +; CHECK: cleanuppad within none [] ; CHECK-NEXT: ptrtoint i8* %phi2 to i32 define void @g() personality i32 (...)* @_except_handler3 { @@ -63,20 +61,18 @@ throw: ; preds = %throw, %entry pad: %phi2 = phi i8* [ %tmp96, %throw ] - catchpad [] to label %unreachable unwind label %blah + %cs = catchswitch within none [label %unreachable, label %blah] unwind to caller unreachable: + catchpad within %cs [] unreachable blah: - %catchpad = catchpad [] to label %loop_body unwind label %blah3 - - -blah3: - catchendpad unwind to caller ;label %blah2 + %catchpad = catchpad within %cs [] + br label %loop_body unwind_out: - catchret %catchpad to label %leave + catchret from %catchpad to label %leave leave: ret void @@ -93,10 +89,7 @@ iter: ; preds = %loop_body ; CHECK-LABEL: define void @g( ; CHECK: blah: -; CHECK-NEXT: catchpad [] -; CHECK-NEXT: to label %loop_body.preheader - -; CHECK: loop_body.preheader: +; CHECK-NEXT: catchpad within %cs [] ; CHECK-NEXT: ptrtoint i8* %phi2 to i32 @@ -110,29 +103,25 @@ throw: ; preds = %throw, %entry to label %throw unwind label %pad pad: - catchpad [] to label %unreachable unwind label %blug + %cs = catchswitch within none [label %unreachable, label %blug] unwind to caller unreachable: + catchpad within %cs [] unreachable blug: %phi2 = phi i8* [ %tmp96, %pad ] - %catchpad = catchpad [] to label %blah2 unwind label %blah3 - -blah2: + %catchpad = catchpad within %cs [] br label %loop_body -blah3: - catchendpad unwind to caller ;label %blah2 - unwind_out: - catchret %catchpad to label %leave + catchret from %catchpad to label %leave leave: ret void loop_body: ; preds = %iter, %pad - %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blah2 ] + %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blug ] %tmp100 = icmp eq i8* %tmp99, undef br i1 %tmp100, label %unwind_out, label %iter @@ -143,10 +132,7 @@ iter: ; preds = %loop_body ; CHECK-LABEL: define void @h( ; CHECK: blug: -; CHECK: catchpad [] -; CHECK-NEXT: to label %blah2 - -; CHECK: blah2: +; CHECK: catchpad within %cs [] ; CHECK-NEXT: ptrtoint i8* %phi2 to i32 define void @i() personality i32 (...)* @_except_handler3 { @@ -160,16 +146,14 @@ throw: ; preds = %throw, %entry catchpad: ; preds = %throw %phi2 = phi i8* [ %tmp96, %throw ] - catchpad [] to label %cp_body unwind label %catchendpad + %cs = catchswitch within none [label %cp_body] unwind label %cleanuppad cp_body: + catchpad within %cs [] br label %loop_head -catchendpad: - catchendpad unwind label %cleanuppad - cleanuppad: - cleanuppad [] + cleanuppad within none [] br label %loop_head loop_head: @@ -205,39 +189,31 @@ for.inc: ; preds = %for.cond br label %for.cond catch.dispatch: ; preds = %for.cond - %0 = catchpad [i8* null, i32 64, i8* null] - to label %catch unwind label %catchendblock - -catchendblock: ; preds = %catch.dispatch - catchendpad unwind label %catch.dispatch.2 + %cs = catchswitch within none [label %catch] unwind label %catch.dispatch.2 catch: ; preds = %catch.dispatch - catchret %0 to label %try.cont + %0 = catchpad within %cs [i8* null, i32 64, i8* null] + catchret from %0 to label %try.cont try.cont: ; preds = %catch invoke void @external(i32* %c) to label %try.cont.7 unwind label %catch.dispatch.2 catch.dispatch.2: ; preds = %try.cont, %catchendblock - %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catchendblock ] - %1 = catchpad [i8* null, i32 64, i8* null] - to label %catch.4 unwind label %catchendblock.3 + %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ] + %cs2 = catchswitch within none [label %catch.4] unwind to caller catch.4: ; preds = %catch.dispatch.2 + catchpad within %cs2 [i8* null, i32 64, i8* null] unreachable try.cont.7: ; preds = %try.cont ret void - -catchendblock.3: ; preds = %catch.dispatch.2 - catchendpad unwind to caller } ; CHECK-LABEL: define void @test1( ; CHECK: for.cond: ; CHECK: %d.0 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.inc ] -; CHECK: catchendpad unwind label %catch.dispatch.2 - ; CHECK: catch.dispatch.2: -; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catchendblock ] +; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ] diff --git a/llvm/test/Transforms/LoopStrengthReduce/pr25541.ll b/llvm/test/Transforms/LoopStrengthReduce/pr25541.ll index fa64875d9af..011998b9089 100644 --- a/llvm/test/Transforms/LoopStrengthReduce/pr25541.ll +++ b/llvm/test/Transforms/LoopStrengthReduce/pr25541.ll @@ -12,10 +12,10 @@ for.cond.i: ; preds = %for.inc.i, %entry to label %for.inc.i unwind label %catch.dispatch.i catch.dispatch.i: ; preds = %for.cond.i - %0 = catchpad [i8* null, i32 64, i8* null] - to label %for.cond.1.preheader.i unwind label %catchendblock.i + %cs = catchswitch within none [label %for.cond.1.preheader.i] unwind to caller for.cond.1.preheader.i: ; preds = %catch.dispatch.i + %0 = catchpad within %cs [i8* null, i32 64, i8* null] %cmp.i = icmp eq i32* %_First.addr.0.i, null br label %for.cond.1.i @@ -23,18 +23,15 @@ for.cond.1.i: ; preds = %for.body.i, %for.co br i1 %cmp.i, label %for.end.i, label %for.body.i for.body.i: ; preds = %for.cond.1.i - invoke void @g() - to label %for.cond.1.i unwind label %catchendblock.i - -catchendblock.i: ; preds = %for.body.i, %catch.dispatch.i - catchendpad unwind to caller + call void @g() + br label %for.cond.1.i for.inc.i: ; preds = %for.cond.i %incdec.ptr.i = getelementptr inbounds i32, i32* %_First.addr.0.i, i64 1 br label %for.cond.i for.end.i: ; preds = %for.cond.1.i - catchret %0 to label %leave + catchret from %0 to label %leave leave: ; preds = %for.end.i ret void diff --git a/llvm/test/Transforms/LoopUnswitch/cleanuppad.ll b/llvm/test/Transforms/LoopUnswitch/cleanuppad.ll new file mode 100644 index 00000000000..b06ebd7235c --- /dev/null +++ b/llvm/test/Transforms/LoopUnswitch/cleanuppad.ll @@ -0,0 +1,44 @@ +; RUN: opt -S -loop-unswitch < %s | FileCheck %s +target triple = "x86_64-pc-win32" + +define void @f(i32 %doit, i1 %x, i1 %y) personality i32 (...)* @__CxxFrameHandler3 { +entry: + %tobool = icmp eq i32 %doit, 0 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + br i1 %x, label %for.body, label %for.end + +for.body: ; preds = %for.cond + br i1 %tobool, label %if.then, label %for.inc + +if.then: ; preds = %for.body + br i1 %y, label %for.inc, label %delete.notnull + +delete.notnull: ; preds = %if.then + invoke void @g() + to label %invoke.cont unwind label %lpad + +invoke.cont: ; preds = %delete.notnull + br label %for.inc + +lpad: ; preds = %delete.notnull + %cp = cleanuppad within none [] + cleanupret from %cp unwind to caller + +for.inc: ; preds = %invoke.cont, %if.then, %for.body + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + +declare void @g() + +declare i32 @__CxxFrameHandler3(...) + +; CHECK-LABEL: define void @f( +; CHECK: cleanuppad within none [] +; CHECK-NOT: cleanuppad + +attributes #0 = { ssp uwtable } diff --git a/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll b/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll index d04c567e503..0ba29043912 100644 --- a/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll +++ b/llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll @@ -31,12 +31,12 @@ invoke.cont: ; preds = %entry ret void ehcleanup: ; preds = %entry - %0 = cleanuppad [] - cleanupret %0 unwind label %ehcleanup.1 + %0 = cleanuppad within none [] + cleanupret from %0 unwind label %ehcleanup.1 ehcleanup.1: ; preds = %ehcleanup - %1 = cleanuppad [] - cleanupret %1 unwind to caller + %1 = cleanuppad within none [] + cleanupret from %1 unwind to caller } @@ -60,15 +60,14 @@ ehcleanup.1: ; preds = %ehcleanup ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: ehcleanup: -; CHECK: cleanuppad +; CHECK: cleanuppad within none ; CHECK: call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %b) -; CHECK: cleanupret %0 unwind label %catch.dispatch +; CHECK: cleanupret from %0 unwind label %catch.dispatch ; CHECK: catch.dispatch: -; CHECK: catchpad +; CHECK: catchswitch within none [label %catch] unwind to caller ; CHECK: catch: +; CHECK: catchpad ; CHECK: catchret -; CHECK: catchendblock: ; preds = %catch.dispatch -; CHECK: catchendpad unwind to caller ; CHECK-NOT: cleanuppad ; CHECK: } ; @@ -81,15 +80,16 @@ invoke.cont: ; preds = %entry br label %try.cont ehcleanup: ; preds = %entry - %0 = cleanuppad [] + %0 = cleanuppad within none [] call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %b) - cleanupret %0 unwind label %catch.dispatch + cleanupret from %0 unwind label %catch.dispatch catch.dispatch: ; preds = %ehcleanup - %1 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup.1 catch: ; preds = %catch.dispatch - catchret %1 to label %catchret.dest + %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] + catchret from %1 to label %catchret.dest catchret.dest: ; preds = %catch br label %try.cont @@ -97,12 +97,9 @@ catchret.dest: ; preds = %catch try.cont: ; preds = %catchret.dest, %invoke.cont ret void -catchendblock: ; preds = %catch.dispatch - catchendpad unwind label %ehcleanup.1 - -ehcleanup.1: ; preds = %catchendblock - %2 = cleanuppad [] - cleanupret %2 unwind to caller +ehcleanup.1: + %2 = cleanuppad within none [] + cleanupret from %2 unwind to caller } @@ -121,21 +118,19 @@ ehcleanup.1: ; preds = %catchendblock ; In this case the inner cleanup pad should be eliminated and the invoke of g() ; should unwind directly to the catchpad. ; -; CHECK: define void @f3() +; CHECK-LABEL: define void @f3() ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: to label %try.cont unwind label %catch.dispatch ; CHECK: catch.dispatch: -; CHECK: catchpad [i8* null, i32 64, i8* null] -; CHECK-NEXT: to label %catch unwind label %catchendblock +; CHECK-NEXT: catchswitch within none [label %catch] unwind label %ehcleanup.1 ; CHECK: catch: +; CHECK: catchpad within %cs1 [i8* null, i32 64, i8* null] ; CHECK: catchret -; CHECK: catchendblock: -; CHECK: catchendpad unwind label %ehcleanup.1 ; CHECK: ehcleanup.1: ; CHECK: cleanuppad ; CHECK: call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) -; CHECK: cleanupret %1 unwind to caller +; CHECK: cleanupret from %cp3 unwind to caller ; CHECK: } ; define void @f3() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { @@ -147,14 +142,15 @@ invoke.cont: ; preds = %entry br label %try.cont ehcleanup: ; preds = %entry - %0 = cleanuppad [] - cleanupret %0 unwind label %catch.dispatch + %0 = cleanuppad within none [] + cleanupret from %0 unwind label %catch.dispatch catch.dispatch: ; preds = %ehcleanup - %1 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup.1 catch: ; preds = %catch.dispatch - catchret %1 to label %catchret.dest + %cp2 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] + catchret from %cp2 to label %catchret.dest catchret.dest: ; preds = %catch br label %try.cont @@ -162,13 +158,10 @@ catchret.dest: ; preds = %catch try.cont: ; preds = %catchret.dest, %invoke.cont ret void -catchendblock: ; preds = %catch.dispatch - catchendpad unwind label %ehcleanup.1 - -ehcleanup.1: ; preds = %catchendblock - %2 = cleanuppad [] +ehcleanup.1: + %cp3 = cleanuppad within none [] call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) - cleanupret %2 unwind to caller + cleanupret from %cp3 unwind to caller } @@ -184,11 +177,10 @@ ehcleanup.1: ; preds = %catchendblock ; } ; ; In this case, the cleanuppad should be eliminated, the invoke outside of the -; call block should be converted to a call and the catchendpad should unwind -; to the caller (that is, that is, exception handling continues with the parent -; frame of the caller).) +; catch block should be converted to a call (that is, that is, exception +; handling continues with the parent frame of the caller).) ; -; CHECK: define void @f4() +; CHECK-LABEL: define void @f4() ; CHECK: entry: ; CHECK: call void @g ; Note: The cleanuppad simplification will insert an unconditional branch here @@ -196,11 +188,10 @@ ehcleanup.1: ; preds = %catchendblock ; CHECK: invoke void @g() ; CHECK: to label %try.cont unwind label %catch.dispatch ; CHECK: catch.dispatch: -; CHECK: catchpad +; CHECK: catchswitch within none [label %catch] unwind to caller ; CHECK: catch: +; CHECK: catchpad ; CHECK: catchret -; CHECK: catchendblock: -; CHECK: catchendpad unwind to caller ; CHECK-NOT: cleanuppad ; CHECK: } ; @@ -214,43 +205,41 @@ invoke.cont: ; preds = %entry to label %try.cont unwind label %catch.dispatch catch.dispatch: ; preds = %invoke.cont - %0 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind label %ehcleanup catch: ; preds = %catch.dispatch - catchret %0 to label %try.cont + %0 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] + catchret from %0 to label %try.cont try.cont: ; preds = %catch, %invoke.cont ret void -catchendblock: ; preds = %catch.dispatch - catchendpad unwind label %ehcleanup - -ehcleanup: ; preds = %catchendblock, %entry - %1 = cleanuppad [] - cleanupret %1 unwind to caller +ehcleanup: + %cp2 = cleanuppad within none [] + cleanupret from %cp2 unwind to caller } ; This tests the case where a terminatepad unwinds to a cleanuppad. ; I'm not sure how this case would arise, but it seems to be syntactically ; legal so I'm testing it. ; -; CHECK: define void @f5() +; CHECK-LABEL: define void @f5() ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: to label %try.cont unwind label %terminate ; CHECK: terminate: -; CHECK: terminatepad [i7 4] unwind to caller +; CHECK: terminatepad within none [i7 4] unwind to caller ; CHECK-NOT: cleanuppad ; CHECK: try.cont: ; CHECK: invoke void @g() ; CHECK: to label %try.cont.1 unwind label %terminate.1 ; CHECK: terminate.1: -; CHECK: terminatepad [i7 4] unwind label %ehcleanup.2 +; CHECK: terminatepad within none [i7 4] unwind label %ehcleanup.2 ; CHECK-NOT: ehcleanup.1: ; CHECK: ehcleanup.2: ; CHECK: [[TMP:\%.+]] = cleanuppad ; CHECK: call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) -; CHECK: cleanupret [[TMP]] unwind to caller +; CHECK: cleanupret from [[TMP]] unwind to caller ; CHECK: } define void @f5() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { entry: @@ -259,27 +248,27 @@ entry: to label %try.cont unwind label %terminate terminate: ; preds = %entry - terminatepad [i7 4] unwind label %ehcleanup + terminatepad within none [i7 4] unwind label %ehcleanup ehcleanup: ; preds = %terminate - %0 = cleanuppad [] - cleanupret %0 unwind to caller + %0 = cleanuppad within none [] + cleanupret from %0 unwind to caller try.cont: ; preds = %entry invoke void @g() to label %try.cont.1 unwind label %terminate.1 terminate.1: ; preds = %try.cont - terminatepad [i7 4] unwind label %ehcleanup.1 + terminatepad within none [i7 4] unwind label %ehcleanup.1 ehcleanup.1: ; preds = %terminate.1 - %1 = cleanuppad [] - cleanupret %1 unwind label %ehcleanup.2 + %1 = cleanuppad within none [] + cleanupret from %1 unwind label %ehcleanup.2 ehcleanup.2: ; preds = %ehcleanup.1 - %2 = cleanuppad [] + %2 = cleanuppad within none [] call void @"\01??1S2@@QEAA@XZ"(%struct.S2* %a) - cleanupret %2 unwind to caller + cleanupret from %2 unwind to caller try.cont.1: ; preds = %try.cont ret void @@ -304,7 +293,7 @@ try.cont.1: ; preds = %try.cont ; In this case, the cleanup pad should be eliminated and the PHI node in the ; cleanup pad should be sunk into the catch dispatch block. ; -; CHECK: define i32 @f6() +; CHECK-LABEL: define i32 @f6() ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: invoke.cont: @@ -325,17 +314,15 @@ invoke.cont: ; preds = %entry ehcleanup: ; preds = %invoke.cont, %entry %state.0 = phi i32 [ 2, %invoke.cont ], [ 1, %entry ] - %0 = cleanuppad [] - cleanupret %0 unwind label %catch.dispatch + %0 = cleanuppad within none [] + cleanupret from %0 unwind label %catch.dispatch catch.dispatch: ; preds = %ehcleanup - %1 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind to caller catch: ; preds = %catch.dispatch - catchret %1 to label %return - -catchendblock: ; preds = %catch.dispatch - catchendpad unwind to caller + %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] + catchret from %1 to label %return return: ; preds = %invoke.cont, %catch %retval.0 = phi i32 [ %state.0, %catch ], [ 0, %invoke.cont ] @@ -363,7 +350,7 @@ return: ; preds = %invoke.cont, %catch ; In this case, the cleanup pad should be eliminated and the PHI node in the ; cleanup pad should be merged with the PHI node in the catch dispatch block. ; -; CHECK: define i32 @f7() +; CHECK-LABEL: define i32 @f7() ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: invoke.cont: @@ -390,18 +377,16 @@ invoke.cont.1: ; preds = %invoke.cont ehcleanup: ; preds = %invoke.cont.1, %invoke.cont %state.0 = phi i32 [ 3, %invoke.cont.1 ], [ 2, %invoke.cont ] - %0 = cleanuppad [] - cleanupret %0 unwind label %catch.dispatch + %0 = cleanuppad within none [] + cleanupret from %0 unwind label %catch.dispatch catch.dispatch: ; preds = %ehcleanup, %entry %state.1 = phi i32 [ %state.0, %ehcleanup ], [ 1, %entry ] - %1 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind to caller catch: ; preds = %catch.dispatch - catchret %1 to label %return - -catchendblock: ; preds = %catch.dispatch - catchendpad unwind to caller + %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] + catchret from %1 to label %return return: ; preds = %invoke.cont.1, %catch %retval.0 = phi i32 [ %state.1, %catch ], [ 0, %invoke.cont.1 ] @@ -435,7 +420,7 @@ return: ; preds = %invoke.cont.1, %cat ; should have an incoming value entry for path from 'foo' that references the ; PHI node itself. ; -; CHECK: define void @f8() +; CHECK-LABEL: define void @f8() ; CHECK: entry: ; CHECK: invoke void @g() ; CHECK: invoke.cont: @@ -456,18 +441,16 @@ invoke.cont: ; preds = %entry ehcleanup: ; preds = %invoke.cont, %entry %x = phi i32 [ 2, %invoke.cont ], [ 1, %entry ] - %0 = cleanuppad [] - cleanupret %0 unwind label %catch.dispatch + %0 = cleanuppad within none [] + cleanupret from %0 unwind label %catch.dispatch catch.dispatch: ; preds = %ehcleanup, %catch.cont - %1 = catchpad [i8* null, i32 u0x40, i8* null] to label %catch unwind label %catchendblock + %cs1 = catchswitch within none [label %catch] unwind to caller catch: ; preds = %catch.dispatch + %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null] call void @use_x(i32 %x) - catchret %1 to label %catch.cont - -catchendblock: ; preds = %catch.dispatch - catchendpad unwind to caller + catchret from %1 to label %catch.cont catch.cont: ; preds = %catch invoke void @g() diff --git a/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll b/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll index 31d567f6492..aa1feb7b171 100644 --- a/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll +++ b/llvm/test/Transforms/SimplifyCFG/wineh-unreachable.ll @@ -12,7 +12,7 @@ entry: exit: ret void unreachable.unwind: - cleanuppad [] + cleanuppad within none [] unreachable } @@ -22,24 +22,21 @@ entry: invoke void @f() to label %exit unwind label %catch.pad catch.pad: - ; CHECK: catchpad [] - ; CHECK-NEXT: to label %catch.body unwind label %catch.end - %catch = catchpad [] - to label %catch.body unwind label %catch.end + %cs1 = catchswitch within none [label %catch.body] unwind label %unreachable.unwind + ; CHECK: catch.pad: + ; CHECK-NEXT: catchswitch within none [label %catch.body] unwind to caller catch.body: ; CHECK: catch.body: + ; CHECK-NEXT: catchpad within %cs1 ; CHECK-NEXT: call void @f() ; CHECK-NEXT: unreachable + %catch = catchpad within %cs1 [] call void @f() - catchret %catch to label %unreachable -catch.end: - ; CHECK: catch.end: - ; CHECK-NEXT: catchendpad unwind to caller - catchendpad unwind label %unreachable.unwind + catchret from %catch to label %unreachable exit: ret void unreachable.unwind: - cleanuppad [] + cleanuppad within none [] unreachable unreachable: unreachable @@ -51,24 +48,20 @@ entry: invoke void @f() to label %exit unwind label %cleanup.pad cleanup.pad: - ; CHECK: %cleanup = cleanuppad [] + ; CHECK: %cleanup = cleanuppad within none [] ; CHECK-NEXT: call void @f() ; CHECK-NEXT: unreachable - %cleanup = cleanuppad [] + %cleanup = cleanuppad within none [] invoke void @f() - to label %cleanup.ret unwind label %cleanup.end + to label %cleanup.ret unwind label %unreachable.unwind cleanup.ret: ; This cleanupret should be rewritten to unreachable, ; and merged into the pred block. - cleanupret %cleanup unwind label %unreachable.unwind -cleanup.end: - ; This cleanupendpad should be rewritten to unreachable, - ; causing the invoke to be rewritten to a call. - cleanupendpad %cleanup unwind label %unreachable.unwind + cleanupret from %cleanup unwind label %unreachable.unwind exit: ret void unreachable.unwind: - cleanuppad [] + cleanuppad within none [] unreachable } @@ -78,12 +71,12 @@ entry: invoke void @f() to label %exit unwind label %terminate.pad terminate.pad: - ; CHECK: terminatepad [] unwind to caller - terminatepad [] unwind label %unreachable.unwind + ; CHECK: terminatepad within none [] unwind to caller + terminatepad within none [] unwind label %unreachable.unwind exit: ret void unreachable.unwind: - cleanuppad [] + cleanuppad within none [] unreachable } @@ -94,14 +87,11 @@ entry: to label %exit unwind label %catch.pad catch.pad: - %catch = catchpad [] - to label %catch.body unwind label %catch.end + %cs1 = catchswitch within none [label %catch.body] unwind to caller catch.body: - catchret %catch to label %exit - -catch.end: - catchendpad unwind to caller + %catch = catchpad within %cs1 [] + catchret from %catch to label %exit exit: unreachable diff --git a/llvm/test/Transforms/Sink/catchswitch.ll b/llvm/test/Transforms/Sink/catchswitch.ll new file mode 100644 index 00000000000..2648f85f3eb --- /dev/null +++ b/llvm/test/Transforms/Sink/catchswitch.ll @@ -0,0 +1,37 @@ +; RUN: opt -sink -S < %s | FileCheck %s + +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i686-pc-windows-msvc" + +define void @h() personality i32 (...)* @__CxxFrameHandler3 { +entry: + %call = call i32 @g(i32 1) readnone + invoke void @_CxxThrowException(i8* null, i8* null) noreturn + to label %unreachable unwind label %catch.dispatch + +catch.dispatch: ; preds = %entry + %cs = catchswitch within none [label %catch] unwind to caller + +catch: ; preds = %catch.dispatch + %cp = catchpad within %cs [i8* null, i32 64, i8* null] + catchret from %cp to label %try.cont + +try.cont: ; preds = %catch + call void @k(i32 %call) + ret void + +unreachable: ; preds = %entry + unreachable +} + +declare x86_stdcallcc void @_CxxThrowException(i8*, i8*) + +declare i32 @__CxxFrameHandler3(...) + +declare i32 @g(i32) readnone + +declare void @k(i32) + +; CHECK-LABEL: define void @h( +; CHECK: call i32 @g(i32 1) +; CHECK-NEXT: invoke void @_CxxThrowException( |