xref: /llvm-project/llvm/test/Transforms/ExpandVariadics/invoke.ll (revision 8516f54e6a984a79d1a988ec66a414b5cfbd7ec7)
1*8516f54eSJon Chesterfield; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*8516f54eSJon Chesterfield; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=optimize < %s | FileCheck %s -check-prefixes=CHECK
3*8516f54eSJon Chesterfield; RUN: not --crash opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=lowering < %s 2>&1 | FileCheck %s -check-prefixes=ERROR
4*8516f54eSJon Chesterfield; REQUIRES: webassembly-registered-target
5*8516f54eSJon Chesterfieldtarget datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
6*8516f54eSJon Chesterfield
7*8516f54eSJon Chesterfield; ERROR: LLVM ERROR: Cannot lower callbase instruction
8*8516f54eSJon Chesterfield
9*8516f54eSJon Chesterfield@_ZTIi = external constant ptr
10*8516f54eSJon Chesterfield
11*8516f54eSJon Chesterfield; Function Attrs: mustprogress
12*8516f54eSJon Chesterfielddefine hidden void @test0(i32 noundef %x) #0 personality ptr @__gxx_wasm_personality_v0 {
13*8516f54eSJon Chesterfield; CHECK-LABEL: @test0(
14*8516f54eSJon Chesterfield; CHECK-NEXT:  entry:
15*8516f54eSJon Chesterfield; CHECK-NEXT:    invoke void (...) @may_throw(i32 noundef [[X:%.*]])
16*8516f54eSJon Chesterfield; CHECK-NEXT:            to label [[TRY_CONT:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
17*8516f54eSJon Chesterfield; CHECK:       catch.dispatch:
18*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP0:%.*]] = catchswitch within none [label %catch.start] unwind to caller
19*8516f54eSJon Chesterfield; CHECK:       catch.start:
20*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP1:%.*]] = catchpad within [[TMP0]] [ptr @_ZTIi]
21*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP2:%.*]] = tail call ptr @llvm.wasm.get.exception(token [[TMP1]])
22*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.wasm.get.ehselector(token [[TMP1]])
23*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @llvm.eh.typeid.for.p0(ptr nonnull @_ZTIi)
24*8516f54eSJon Chesterfield; CHECK-NEXT:    [[MATCHES:%.*]] = icmp eq i32 [[TMP3]], [[TMP4]]
25*8516f54eSJon Chesterfield; CHECK-NEXT:    br i1 [[MATCHES]], label [[CATCH:%.*]], label [[RETHROW:%.*]]
26*8516f54eSJon Chesterfield; CHECK:       catch:
27*8516f54eSJon Chesterfield; CHECK-NEXT:    [[TMP5:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP2]]) [ "funclet"(token [[TMP1]]) ]
28*8516f54eSJon Chesterfield; CHECK-NEXT:    call void (...) @dont_throw(i32 noundef [[X]]) [ "funclet"(token [[TMP1]]) ]
29*8516f54eSJon Chesterfield; CHECK-NEXT:    call void @__cxa_end_catch() [ "funclet"(token [[TMP1]]) ]
30*8516f54eSJon Chesterfield; CHECK-NEXT:    catchret from [[TMP1]] to label [[TRY_CONT]]
31*8516f54eSJon Chesterfield; CHECK:       rethrow:
32*8516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.wasm.rethrow() [ "funclet"(token [[TMP1]]) ]
33*8516f54eSJon Chesterfield; CHECK-NEXT:    unreachable
34*8516f54eSJon Chesterfield; CHECK:       try.cont:
35*8516f54eSJon Chesterfield; CHECK-NEXT:    ret void
36*8516f54eSJon Chesterfield;
37*8516f54eSJon Chesterfieldentry:
38*8516f54eSJon Chesterfield  invoke void (...) @may_throw(i32 noundef %x)
39*8516f54eSJon Chesterfield  to label %try.cont unwind label %catch.dispatch
40*8516f54eSJon Chesterfield
41*8516f54eSJon Chesterfieldcatch.dispatch:                                   ; preds = %entry
42*8516f54eSJon Chesterfield  %0 = catchswitch within none [label %catch.start] unwind to caller
43*8516f54eSJon Chesterfield
44*8516f54eSJon Chesterfieldcatch.start:                                      ; preds = %catch.dispatch
45*8516f54eSJon Chesterfield  %1 = catchpad within %0 [ptr @_ZTIi]
46*8516f54eSJon Chesterfield  %2 = tail call ptr @llvm.wasm.get.exception(token %1)
47*8516f54eSJon Chesterfield  %3 = tail call i32 @llvm.wasm.get.ehselector(token %1)
48*8516f54eSJon Chesterfield  %4 = tail call i32 @llvm.eh.typeid.for.p0(ptr nonnull @_ZTIi)
49*8516f54eSJon Chesterfield  %matches = icmp eq i32 %3, %4
50*8516f54eSJon Chesterfield  br i1 %matches, label %catch, label %rethrow
51*8516f54eSJon Chesterfield
52*8516f54eSJon Chesterfieldcatch:                                            ; preds = %catch.start
53*8516f54eSJon Chesterfield  %5 = call ptr @__cxa_begin_catch(ptr %2) #6 [ "funclet"(token %1) ]
54*8516f54eSJon Chesterfield  call void (...) @dont_throw(i32 noundef %x) #6 [ "funclet"(token %1) ]
55*8516f54eSJon Chesterfield  call void @__cxa_end_catch() #6 [ "funclet"(token %1) ]
56*8516f54eSJon Chesterfield  catchret from %1 to label %try.cont
57*8516f54eSJon Chesterfield
58*8516f54eSJon Chesterfieldrethrow:                                          ; preds = %catch.start
59*8516f54eSJon Chesterfield  call void @llvm.wasm.rethrow() #5 [ "funclet"(token %1) ]
60*8516f54eSJon Chesterfield  unreachable
61*8516f54eSJon Chesterfield
62*8516f54eSJon Chesterfieldtry.cont:                                         ; preds = %entry, %catch
63*8516f54eSJon Chesterfield  ret void
64*8516f54eSJon Chesterfield}
65*8516f54eSJon Chesterfield
66*8516f54eSJon Chesterfielddeclare void @may_throw(...)
67*8516f54eSJon Chesterfield
68*8516f54eSJon Chesterfielddeclare i32 @__gxx_wasm_personality_v0(...)
69*8516f54eSJon Chesterfield
70*8516f54eSJon Chesterfield; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
71*8516f54eSJon Chesterfielddeclare ptr @llvm.wasm.get.exception(token)
72*8516f54eSJon Chesterfield
73*8516f54eSJon Chesterfield; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
74*8516f54eSJon Chesterfielddeclare i32 @llvm.wasm.get.ehselector(token)
75*8516f54eSJon Chesterfield
76*8516f54eSJon Chesterfield; Function Attrs: nofree nosync nounwind memory(none)
77*8516f54eSJon Chesterfielddeclare i32 @llvm.eh.typeid.for.p0(ptr)
78*8516f54eSJon Chesterfield
79*8516f54eSJon Chesterfielddeclare ptr @__cxa_begin_catch(ptr)
80*8516f54eSJon Chesterfield
81*8516f54eSJon Chesterfield; Function Attrs: nounwind
82*8516f54eSJon Chesterfielddeclare void @dont_throw(...)
83*8516f54eSJon Chesterfield
84*8516f54eSJon Chesterfielddeclare void @__cxa_end_catch()
85*8516f54eSJon Chesterfield
86*8516f54eSJon Chesterfield; Function Attrs: noreturn
87*8516f54eSJon Chesterfielddeclare void @llvm.wasm.rethrow()
88*8516f54eSJon Chesterfield
89*8516f54eSJon Chesterfield
90