summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LCSSA/avoid-intrinsics-in-catchswitch.ll
blob: 55357f1fee55769371c1fbf138510dd299f94ee6 (plain)
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"}
OpenPOWER on IntegriCloud