107 lines · plain
1; RUN: llc -mtriple=x86_64-windows-gnu %s -o - | FileCheck %s2 3; Based on this C++ code:4; struct as {5; as() { at = static_cast<int *>(operator new(sizeof(int))); }6; ~as() { operator delete(at); }7; int *at;8; };9; void am(int) {10; static as au;11; as av;12; throw 0;13; }14 15; optnone was added to ensure that branch folding and block layout are not16; disturbed. The key thing about this test is that it ends in an empty17; unreachable block, which forces us to scan back across blocks.18 19; CHECK: _Z2ami:20; CHECK: callq __cxa_throw21; CHECK: # %eh.resume22; CHECK: callq _Unwind_Resume23; CHECK-NEXT: # %unreachable24; CHECK-NEXT: int325; CHECK-NEXT: .Lfunc_end0:26 27%struct.as = type { ptr }28 29@_ZZ2amiE2au = internal unnamed_addr global %struct.as zeroinitializer, align 830@_ZGVZ2amiE2au = internal global i64 0, align 831@_ZTIi = external constant ptr32 33define dso_local void @_Z2ami(i32 %0) noinline optnone personality ptr @__gxx_personality_seh0 {34entry:35 %1 = load atomic i8, ptr @_ZGVZ2amiE2au acquire, align 836 %guard.uninitialized = icmp eq i8 %1, 037 br i1 %guard.uninitialized, label %init.check, label %init.end38 39init.check: ; preds = %entry40 %2 = tail call i32 @__cxa_guard_acquire(ptr nonnull @_ZGVZ2amiE2au)41 %tobool = icmp eq i32 %2, 042 br i1 %tobool, label %init.end, label %init43 44init: ; preds = %init.check45 %call.i3 = invoke ptr @_Znwy(i64 4)46 to label %invoke.cont unwind label %lpad47 48invoke.cont: ; preds = %init49 store ptr %call.i3, ptr @_ZZ2amiE2au, align 850 %3 = tail call i32 @atexit(ptr nonnull @__dtor__ZZ2amiE2au)51 tail call void @__cxa_guard_release(ptr nonnull @_ZGVZ2amiE2au)52 br label %init.end53 54init.end: ; preds = %init.check, %invoke.cont, %entry55 %call.i = tail call ptr @_Znwy(i64 4)56 %exception = tail call ptr @__cxa_allocate_exception(i64 4)57 store i32 0, ptr %exception, align 1658 invoke void @__cxa_throw(ptr %exception, ptr @_ZTIi, ptr null)59 to label %unreachable unwind label %lpad160 61lpad: ; preds = %init62 %4 = landingpad { ptr, i32 }63 cleanup64 %5 = extractvalue { ptr, i32 } %4, 065 %6 = extractvalue { ptr, i32 } %4, 166 tail call void @__cxa_guard_abort(ptr nonnull @_ZGVZ2amiE2au)67 br label %eh.resume68 69lpad1: ; preds = %init.end70 %7 = landingpad { ptr, i32 }71 cleanup72 %8 = extractvalue { ptr, i32 } %7, 073 %9 = extractvalue { ptr, i32 } %7, 174 tail call void @_ZdlPv(ptr %call.i)75 br label %eh.resume76 77eh.resume: ; preds = %lpad1, %lpad78 %exn.slot.0 = phi ptr [ %8, %lpad1 ], [ %5, %lpad ]79 %ehselector.slot.0 = phi i32 [ %9, %lpad1 ], [ %6, %lpad ]80 %lpad.val = insertvalue { ptr, i32 } undef, ptr %exn.slot.0, 081 %lpad.val2 = insertvalue { ptr, i32 } %lpad.val, i32 %ehselector.slot.0, 182 resume { ptr, i32 } %lpad.val283 84unreachable: ; preds = %init.end85 unreachable86}87 88declare dso_local i32 @__cxa_guard_acquire(ptr)89 90declare dso_local i32 @__gxx_personality_seh0(...)91 92declare dso_local void @__dtor__ZZ2amiE2au()93 94declare dso_local i32 @atexit(ptr)95 96declare dso_local void @__cxa_guard_abort(ptr)97 98declare dso_local void @__cxa_guard_release(ptr)99 100declare dso_local ptr @__cxa_allocate_exception(i64)101 102declare dso_local void @__cxa_throw(ptr, ptr, ptr)103 104declare dso_local noalias ptr @_Znwy(i64)105 106declare dso_local void @_ZdlPv(ptr)107