1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
; RUN: opt < %s -debugify -licm -S -o /dev/null
;
; The following test is from https://bugs.llvm.org/show_bug.cgi?id=36238
; This test should pass (not assert or fault). The error that originally
; provoked this test was regarding the LCSSA pass trying to insert a dbg.value
; intrinsic into a catchswitch block.
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.11.0"
%struct.e = type { i32 }
%struct.d = type { i8 }
%class.f = type { %class.b }
%class.b = type { i8 }
%struct.k = type opaque
@"\01?l@@3HA" = local_unnamed_addr global i32 0, align 4
define i32 @"\01?m@@YAJXZ"() personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) {
entry:
%n = alloca %struct.e, align 4
%db = alloca i32, align 4
%o = alloca %struct.d, align 1
%q = alloca i8*, align 8
%r = alloca i32, align 4
%u = alloca i64, align 8
%s = alloca %class.f, align 1
%offset = alloca i64, align 8
%t = alloca i64, align 8
%status = alloca i32, align 4
call void (...) @llvm.localescape(%class.f* nonnull %s, i32* nonnull %status)
%0 = bitcast %struct.e* %n to i8*
%1 = bitcast i32* %db to i8*
%2 = getelementptr inbounds %struct.d, %struct.d* %o, i64 0, i32 0
%3 = bitcast i8** %q to i8*
%4 = bitcast i32* %r to i8*
%5 = bitcast i64* %u to i8*
%6 = getelementptr inbounds %class.f, %class.f* %s, i64 0, i32 0, i32 0
%7 = load i32, i32* @"\01?l@@3HA", align 4, !tbaa !3
%call = call %class.f* @"\01??0f@@QEAA@H@Z"(%class.f* nonnull %s, i32 %7)
%8 = bitcast i64* %offset to i8*
%9 = bitcast i64* %t to i8*
%10 = bitcast i32* %status to i8*
%11 = bitcast %class.f* %s to %struct.d*
%c = getelementptr inbounds %struct.e, %struct.e* %n, i64 0, i32 0
br label %for.cond
for.cond: ; preds = %cleanup.cont, %entry
%p.0 = phi i32 [ undef, %entry ], [ %call2, %cleanup.cont ]
invoke void @"\01?h@@YAXPEAH0HPEAIPEAPEAEPEA_K33PEAUd@@4@Z"(i32* nonnull %db, i32* nonnull %c, i32 undef, i32* nonnull %r, i8** nonnull %q, i64* nonnull %u, i64* nonnull %offset, i64* nonnull %t, %struct.d* nonnull %11, %struct.d* nonnull %o)
to label %__try.cont unwind label %catch.dispatch
catch.dispatch: ; preds = %for.cond
%12 = catchswitch within none [label %__except.ret] unwind label %ehcleanup
__except.ret: ; preds = %catch.dispatch
%13 = catchpad within %12 [i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@m@@" to i8*)]
catchret from %13 to label %cleanup7
__try.cont: ; preds = %for.cond
%tobool = icmp eq i32 %p.0, 0
br i1 %tobool, label %if.end, label %cleanup7
if.end: ; preds = %__try.cont
%call2 = invoke i32 @"\01?a@@YAJXZ"()
to label %cleanup.cont unwind label %ehcleanup
cleanup.cont: ; preds = %if.end
br label %for.cond
ehcleanup: ; preds = %if.end, %catch.dispatch
%14 = cleanuppad within none []
%g.i = getelementptr inbounds %class.f, %class.f* %s, i64 0, i32 0
call void @"\01??1b@@QEAA@XZ"(%class.b* nonnull %g.i) [ "funclet"(token %14) ]
cleanupret from %14 unwind to caller
cleanup7: ; preds = %__try.cont, %__except.ret
%p.2.ph = phi i32 [ 7, %__except.ret ], [ %p.0, %__try.cont ]
%g.i32 = getelementptr inbounds %class.f, %class.f* %s, i64 0, i32 0
call void @"\01??1b@@QEAA@XZ"(%class.b* nonnull %g.i32)
ret i32 %p.2.ph
}
declare %class.f* @"\01??0f@@QEAA@H@Z"(%class.f* returned, i32) unnamed_addr
define internal i32 @"\01?filt$0@0@m@@"(i8* %exception_pointers, i8* %frame_pointer) personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) {
entry:
%0 = tail call i8* @llvm.eh.recoverfp(i8* bitcast (i32 ()* @"\01?m@@YAJXZ" to i8*), i8* %frame_pointer)
%1 = tail call i8* @llvm.localrecover(i8* bitcast (i32 ()* @"\01?m@@YAJXZ" to i8*), i8* %0, i32 0)
%2 = tail call i8* @llvm.localrecover(i8* bitcast (i32 ()* @"\01?m@@YAJXZ" to i8*), i8* %0, i32 1)
%status = bitcast i8* %2 to i32*
%agg.tmp = alloca %class.f, align 1
%3 = bitcast i8* %exception_pointers to i32**
%4 = load i32*, i32** %3, align 8
%5 = load i32, i32* %4, align 4
%6 = bitcast i8* %exception_pointers to %struct.k*
%7 = getelementptr inbounds %class.f, %class.f* %agg.tmp, i64 0, i32 0, i32 0
%8 = load i8, i8* %1, align 1
store i8 %8, i8* %7, align 1
%call = invoke i32 @"\01?j@@YAJVf@@JPEAUk@@PEAH@Z"(i8 %8, i32 %5, %struct.k* %6, i32* %status)
to label %invoke.cont unwind label %ehcleanup
invoke.cont: ; preds = %entry
%g.i = getelementptr inbounds %class.f, %class.f* %agg.tmp, i64 0, i32 0
call void @"\01??1b@@QEAA@XZ"(%class.b* nonnull %g.i)
ret i32 %call
ehcleanup: ; preds = %entry
%9 = cleanuppad within none []
%g.i2 = getelementptr inbounds %class.f, %class.f* %agg.tmp, i64 0, i32 0
call void @"\01??1b@@QEAA@XZ"(%class.b* nonnull %g.i2) [ "funclet"(token %9) ]
cleanupret from %9 unwind to caller
}
declare i8* @llvm.eh.recoverfp(i8*, i8*)
declare i8* @llvm.localrecover(i8*, i8*, i32)
declare i32 @"\01?j@@YAJVf@@JPEAUk@@PEAH@Z"(i8, i32, %struct.k*, i32*) local_unnamed_addr
declare i32 @__C_specific_handler(...)
declare void @"\01?h@@YAXPEAH0HPEAIPEAPEAEPEA_K33PEAUd@@4@Z"(i32*, i32*, i32, i32*, i8**, i64*, i64*, i64*, %struct.d*, %struct.d*) local_unnamed_addr
declare i32 @"\01?a@@YAJXZ"() local_unnamed_addr
declare void @llvm.localescape(...)
declare void @"\01??1b@@QEAA@XZ"(%class.b*) unnamed_addr
!llvm.module.flags = !{!0, !1}
!llvm.ident = !{!2}
!0 = !{i32 1, !"wchar_size", i32 2}
!1 = !{i32 7, !"PIC Level", i32 2}
!2 = !{!"clang"}
!3 = !{!4, !4, i64 0}
!4 = !{!"int", !5, i64 0}
!5 = !{!"omnipotent char", !6, i64 0}
!6 = !{!"Simple C++ TBAA"}
|