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