File: gh114487-crash-in-cgscc-2.ll

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (158 lines) | stat: -rw-r--r-- 6,069 bytes parent folder | download | duplicates (6)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
; RUN: opt -passes="cgscc(coro-annotation-elide)" -S < %s | FileCheck %s

%foo.Frame = type { ptr, ptr, i1 }

@foo.resumers = private constant [3 x ptr] [ptr @foo.resume, ptr @foo.destroy, ptr @foo.cleanup]
@foo.resumers.1 = private constant [4 x ptr] [ptr @foo.resume, ptr @foo.destroy, ptr @foo.cleanup, ptr @foo.noalloc]

; CHECK-LABEL: define void @foo
define void @foo(ptr %agg.result, ptr %this) personality ptr null {
entry:
  %0 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers.1)
  %1 = call noalias nonnull ptr @llvm.coro.begin(token %0, ptr null)
  %resume.addr = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 0
  store ptr @foo.resume, ptr %resume.addr, align 8
  %destroy.addr = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 1
  store ptr @foo.destroy, ptr %destroy.addr, align 8
  br label %AllocaSpillBB

AllocaSpillBB:                                    ; preds = %entry
  br label %PostSpill

PostSpill:                                        ; preds = %AllocaSpillBB
  br label %CoroSave

CoroSave:                                         ; preds = %PostSpill
  %index.addr1 = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 2
  store i1 false, ptr %index.addr1, align 1
  br label %CoroSuspend

CoroSuspend:                                      ; preds = %CoroSave
  br label %resume.0.landing

resume.0.landing:                                 ; preds = %CoroSuspend
  br label %AfterCoroSuspend

AfterCoroSuspend:                                 ; preds = %resume.0.landing
  ret void
}

; CHECK-LABEL: define internal void @bar
; Function Attrs: presplitcoroutine
define internal void @bar() #0 personality ptr null {
entry:
  ; CHECK: %[[CALLEE_FRAME:.+]] = alloca [24 x i8], align 8
  %0 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @bar, ptr null)
  %1 = call i1 @llvm.coro.alloc(token %0)
  call void @foo(ptr null, ptr null) #4
  ; CHECK: %[[FOO_ID:.+]] = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers)
  ; CHECK-NEXT: store ptr @foo.resume, ptr %[[CALLEE_FRAME]], align 8
  ; CHECK-NEXT: %[[DESTROY_ADDR:.+]] = getelementptr inbounds nuw %foo.Frame, ptr %[[CALLEE_FRAME]], i32 0, i32 1
  ; CHECK-NEXT: store ptr @foo.destroy, ptr %[[DESTROY_ADDR]], align 8
  ; CHECK-NEXT: %[[INDEX_ADDR:.+]] = getelementptr inbounds nuw %foo.Frame, ptr %[[CALLEE_FRAME]], i32 0, i32 2
  ; CHECK-NEXT: store i1 false, ptr %[[INDEX_ADDR]], align 1
  ; CHECK: ret void
  ret void
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: read)
declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1

; Function Attrs: nounwind
declare i1 @llvm.coro.alloc(token) #2

; Function Attrs: nounwind
declare ptr @llvm.coro.begin(token, ptr writeonly) #2

; Function Attrs: nomerge nounwind
declare token @llvm.coro.save(ptr) #3

; Function Attrs: nounwind
declare i8 @llvm.coro.suspend(token, i1) #2

define internal fastcc void @foo.resume(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {
entry.resume:
  br label %resume.entry

resume.0:                                         ; preds = %resume.entry
  br label %resume.0.landing

resume.0.landing:                                 ; preds = %resume.0
  br label %AfterCoroSuspend

AfterCoroSuspend:                                 ; preds = %resume.0.landing
  unreachable

resume.entry:                                     ; preds = %entry.resume
  br label %resume.0
}

define internal fastcc void @foo.destroy(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {
entry.destroy:
  br label %resume.entry

resume.0:                                         ; preds = %resume.entry
  br label %resume.0.landing

resume.0.landing:                                 ; preds = %resume.0
  br label %AfterCoroSuspend

AfterCoroSuspend:                                 ; preds = %resume.0.landing
  unreachable

resume.entry:                                     ; preds = %entry.destroy
  br label %resume.0
}

define internal fastcc void @foo.cleanup(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {
entry.cleanup:
  br label %resume.entry

resume.0:                                         ; preds = %resume.entry
  br label %resume.0.landing

resume.0.landing:                                 ; preds = %resume.0
  br label %AfterCoroSuspend

AfterCoroSuspend:                                 ; preds = %resume.0.landing
  unreachable

resume.entry:                                     ; preds = %entry.cleanup
  br label %resume.0
}

define internal void @foo.noalloc(ptr %0, ptr %1, ptr noundef nonnull align 8 dereferenceable(24) %2) personality ptr null {
entry:
  %3 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers)
  %resume.addr = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 0
  store ptr @foo.resume, ptr %resume.addr, align 8
  %destroy.addr = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 1
  store ptr @foo.destroy, ptr %destroy.addr, align 8
  br label %AllocaSpillBB

AllocaSpillBB:                                    ; preds = %entry
  br label %PostSpill

PostSpill:                                        ; preds = %AllocaSpillBB
  br label %CoroSave

CoroSave:                                         ; preds = %PostSpill
  %index.addr1 = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 2
  store i1 false, ptr %index.addr1, align 1
  br label %CoroSuspend

CoroSuspend:                                      ; preds = %CoroSave
  br label %resume.0.landing

resume.0.landing:                                 ; preds = %CoroSuspend
  br label %AfterCoroSuspend

AfterCoroSuspend:                                 ; preds = %resume.0.landing
  ret void
}

attributes #0 = { presplitcoroutine }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: read) }
attributes #2 = { nounwind }
attributes #3 = { nomerge nounwind }
attributes #4 = { coro_elide_safe }