llvm.org GIT mirror llvm / 52f6f2c
Allow inaccessiblememonly and inaccessiblemem_or_argmemonly to be overwriten on call site with operand bundle Summary: Similar to argmemonly, readonly and readnone. Fix PR35128 Reviewers: andrew.w.kaylor, chandlerc, hfinkel Reviewed By: hfinkel Subscribers: hfinkel, llvm-commits Differential Revision: https://reviews.llvm.org/D39434 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317201 91177308-0d34-0410-b5e6-96231b3b80d8 Yichao Yu 2 years ago
5 changed file(s) with 162 addition(s) and 21 deletion(s). Raw diff Collapse all Expand all
474474 CALLSITE_DELEGATE_SETTER(setOnlyAccessesArgMemory());
475475 }
476476
477 /// Determine if the function may only access memory that is
478 /// inaccessible from the IR.
479 bool onlyAccessesInaccessibleMemory() const {
480 CALLSITE_DELEGATE_GETTER(onlyAccessesInaccessibleMemory());
481 }
482 void setOnlyAccessesInaccessibleMemory() {
483 CALLSITE_DELEGATE_SETTER(setOnlyAccessesInaccessibleMemory());
484 }
485
486 /// Determine if the function may only access memory that is
487 /// either inaccessible from the IR or pointed to by its arguments.
488 bool onlyAccessesInaccessibleMemOrArgMem() const {
489 CALLSITE_DELEGATE_GETTER(onlyAccessesInaccessibleMemOrArgMem());
490 }
491 void setOnlyAccessesInaccessibleMemOrArgMem() {
492 CALLSITE_DELEGATE_SETTER(setOnlyAccessesInaccessibleMemOrArgMem());
493 }
494
477495 /// Determine if the call cannot return.
478496 bool doesNotReturn() const {
479497 CALLSITE_DELEGATE_GETTER(doesNotReturn());
14791479 default:
14801480 return false;
14811481
1482 case Attribute::InaccessibleMemOrArgMemOnly:
1483 return hasReadingOperandBundles();
1484
1485 case Attribute::InaccessibleMemOnly:
1486 return hasReadingOperandBundles();
1487
14821488 case Attribute::ArgMemOnly:
14831489 return hasReadingOperandBundles();
14841490
18061806 addAttribute(AttributeList::FunctionIndex, Attribute::ArgMemOnly);
18071807 }
18081808
1809 /// @brief Determine if the function may only access memory that is
1810 /// inaccessible from the IR.
1811 bool onlyAccessesInaccessibleMemory() const {
1812 return hasFnAttr(Attribute::InaccessibleMemOnly);
1813 }
1814 void setOnlyAccessesInaccessibleMemory() {
1815 addAttribute(AttributeList::FunctionIndex, Attribute::InaccessibleMemOnly);
1816 }
1817
1818 /// @brief Determine if the function may only access memory that is
1819 /// either inaccessible from the IR or pointed to by its arguments.
1820 bool onlyAccessesInaccessibleMemOrArgMem() const {
1821 return hasFnAttr(Attribute::InaccessibleMemOrArgMemOnly);
1822 }
1823 void setOnlyAccessesInaccessibleMemOrArgMem() {
1824 addAttribute(AttributeList::FunctionIndex, Attribute::InaccessibleMemOrArgMemOnly);
1825 }
1826
18091827 /// Determine if the call cannot return.
18101828 bool doesNotReturn() const { return hasFnAttr(Attribute::NoReturn); }
18111829 void setDoesNotReturn() {
38883906 addAttribute(AttributeList::FunctionIndex, Attribute::ArgMemOnly);
38893907 }
38903908
3909 /// @brief Determine if the function may only access memory that is
3910 /// inaccessible from the IR.
3911 bool onlyAccessesInaccessibleMemory() const {
3912 return hasFnAttr(Attribute::InaccessibleMemOnly);
3913 }
3914 void setOnlyAccessesInaccessibleMemory() {
3915 addAttribute(AttributeList::FunctionIndex, Attribute::InaccessibleMemOnly);
3916 }
3917
3918 /// @brief Determine if the function may only access memory that is
3919 /// either inaccessible from the IR or pointed to by its arguments.
3920 bool onlyAccessesInaccessibleMemOrArgMem() const {
3921 return hasFnAttr(Attribute::InaccessibleMemOrArgMemOnly);
3922 }
3923 void setOnlyAccessesInaccessibleMemOrArgMem() {
3924 addAttribute(AttributeList::FunctionIndex, Attribute::InaccessibleMemOrArgMemOnly);
3925 }
3926
38913927 /// Determine if the call cannot return.
38923928 bool doesNotReturn() const { return hasFnAttr(Attribute::NoReturn); }
38933929 void setDoesNotReturn() {
616616
617617 if (CS.onlyAccessesArgMemory())
618618 Min = FunctionModRefBehavior(Min & FMRB_OnlyAccessesArgumentPointees);
619 else if (CS.onlyAccessesInaccessibleMemory())
620 Min = FunctionModRefBehavior(Min & FMRB_OnlyAccessesInaccessibleMem);
621 else if (CS.onlyAccessesInaccessibleMemOrArgMem())
622 Min = FunctionModRefBehavior(Min & FMRB_OnlyAccessesInaccessibleOrArgMem);
619623
620624 // If CS has operand bundles then aliasing attributes from the function it
621625 // calls do not directly apply to the CallSite. This can be made more
11 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
22 target triple = "arm-apple-ios"
33
4 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
5 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
6
7 declare void @a_readonly_func(i8 *) noinline nounwind readonly
8 declare void @a_writeonly_func(i8 *) noinline nounwind writeonly
9
10 define void @test2(i8* %P, i8* %Q) nounwind ssp {
4 declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i32, i1) #0
5 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #0
6
7 declare void @a_readonly_func(i8*) #1
8 declare void @a_writeonly_func(i8*) #2
9
10 define void @test2(i8* %P, i8* %Q) #3 {
1111 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
1212 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
1313 ret void
2323 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
2424 }
2525
26 define void @test2a(i8* noalias %P, i8* noalias %Q) nounwind ssp {
26 define void @test2a(i8* noalias %P, i8* noalias %Q) #3 {
2727 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
2828 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
2929 ret void
3939 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
4040 }
4141
42 define void @test2b(i8* noalias %P, i8* noalias %Q) nounwind ssp {
42 define void @test2b(i8* noalias %P, i8* noalias %Q) #3 {
4343 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
4444 %R = getelementptr i8, i8* %P, i64 12
4545 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
6060 ; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
6161 }
6262
63 define void @test2c(i8* noalias %P, i8* noalias %Q) nounwind ssp {
63 define void @test2c(i8* noalias %P, i8* noalias %Q) #3 {
6464 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
6565 %R = getelementptr i8, i8* %P, i64 11
6666 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
8181 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
8282 }
8383
84 define void @test2d(i8* noalias %P, i8* noalias %Q) nounwind ssp {
84 define void @test2d(i8* noalias %P, i8* noalias %Q) #3 {
8585 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
8686 %R = getelementptr i8, i8* %P, i64 -12
8787 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
102102 ; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
103103 }
104104
105 define void @test2e(i8* noalias %P, i8* noalias %Q) nounwind ssp {
105 define void @test2e(i8* noalias %P, i8* noalias %Q) #3 {
106106 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
107107 %R = getelementptr i8, i8* %P, i64 -11
108108 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
123123 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
124124 }
125125
126 define void @test3(i8* %P, i8* %Q) nounwind ssp {
126 define void @test3(i8* %P, i8* %Q) #3 {
127127 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
128128 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
129129 ret void
139139 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
140140 }
141141
142 define void @test3a(i8* noalias %P, i8* noalias %Q) nounwind ssp {
142 define void @test3a(i8* noalias %P, i8* noalias %Q) #3 {
143143 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
144144 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
145145 ret void
155155 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
156156 }
157157
158 define void @test4(i8* %P, i8* noalias %Q) nounwind ssp {
158 define void @test4(i8* %P, i8* noalias %Q) #3 {
159159 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
160160 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
161161 ret void
171171 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
172172 }
173173
174 define void @test5(i8* %P, i8* %Q, i8* %R) nounwind ssp {
174 define void @test5(i8* %P, i8* %Q, i8* %R) #3 {
175175 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
176176 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
177177 ret void
191191 ; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
192192 }
193193
194 define void @test6(i8* %P) nounwind ssp {
194 define void @test6(i8* %P) #3 {
195195 call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
196196 call void @a_readonly_func(i8* %P)
197197 ret void
204204 ; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
205205 }
206206
207 define void @test7(i8* %P) nounwind ssp {
207 define void @test7(i8* %P) #3 {
208208 call void @a_writeonly_func(i8* %P)
209209 call void @a_readonly_func(i8* %P)
210210 ret void
217217 ; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @a_writeonly_func(i8* %P)
218218 }
219219
220 declare void @an_inaccessiblememonly_func() nounwind inaccessiblememonly
221 declare void @an_inaccessibleorargmemonly_func(i8 *) nounwind inaccessiblemem_or_argmemonly
222 declare void @an_argmemonly_func(i8 *) nounwind argmemonly
220 declare void @an_inaccessiblememonly_func() #4
221 declare void @an_inaccessibleorargmemonly_func(i8*) #5
222 declare void @an_argmemonly_func(i8*) #0
223223
224224 define void @test8(i8* %p) {
225225 entry:
259259 ; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
260260 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
261261 }
262
263 ;; test that unknown operand bundle has unknown effect to the heap
264 define void @test9(i8* %p) {
265 ; CHECK-LABEL: Function: test9
266 entry:
267 %q = getelementptr i8, i8* %p, i64 16
268 call void @a_readonly_func(i8* %p) [ "unknown"() ]
269 call void @an_inaccessiblememonly_func() [ "unknown"() ]
270 call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
271 call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
272 ret void
273
274 ; CHECK: Both ModRef: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
275 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
276 ; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
277 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
278 ; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
279 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
280 ; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
281 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
282 ; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
283 ; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
284 ; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
285 ; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
286 ; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
287 ; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
288 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
289 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
290 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
291 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
292 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
293 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
294 }
295
296 ;; test callsite overwrite of unknown operand bundle
297 define void @test10(i8* %p) {
298 ; CHECK-LABEL: Function: test10
299 entry:
300 %q = getelementptr i8, i8* %p, i64 16
301 call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
302 call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
303 call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
304 call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
305 ret void
306
307 ; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
308 ; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
309 ; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
310 ; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
311 ; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
312 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
313 ; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
314 ; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
315 ; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
316 ; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
317 ; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
318 ; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
319 ; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
320 ; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
321 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
322 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
323 ; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
324 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
325 ; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
326 ; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
327 }
328
329 attributes #0 = { argmemonly nounwind }
330 attributes #1 = { noinline nounwind readonly }
331 attributes #2 = { noinline nounwind writeonly }
332 attributes #3 = { nounwind ssp }
333 attributes #4 = { inaccessiblememonly nounwind }
334 attributes #5 = { inaccessiblemem_or_argmemonly nounwind }
335 attributes #6 = { readonly }
336 attributes #7 = { inaccessiblememonly }
337 attributes #8 = { inaccessiblemem_or_argmemonly }
338 attributes #9 = { argmemonly }