Skip to content

Commit

Permalink
[FunctionAttrs] Annotate "willreturn" for intrinsics
Browse files Browse the repository at this point in the history
Summary:
In D62801, new function attribute `willreturn` was introduced. In short, a function with `willreturn` is guaranteed to come back to the call site(more precise definition is in LangRef).

In this patch, willreturn is annotated for LLVM intrinsics.

Reviewers: jdoerfert

Reviewed By: jdoerfert

Subscribers: jvesely, nhaehnle, sstefan1, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D64904

llvm-svn: 367184
  • Loading branch information
uenoku committed Jul 28, 2019
1 parent d4ace50 commit cc0a4cd
Show file tree
Hide file tree
Showing 28 changed files with 210 additions and 218 deletions.
2 changes: 1 addition & 1 deletion clang/test/CodeGen/libcalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,4 @@ void test_builtins(double d, float f, long double ld) {
}

// CHECK-NO-DAG: attributes [[NUW_RN]] = { nounwind readnone{{.*}} }
// CHECK-NO-DAG: attributes [[NUW_RNI]] = { nounwind readnone speculatable }
// CHECK-NO-DAG: attributes [[NUW_RNI]] = { nounwind readnone speculatable willreturn }
212 changes: 98 additions & 114 deletions llvm/include/llvm/IR/Intrinsics.td

Large diffs are not rendered by default.

40 changes: 20 additions & 20 deletions llvm/test/Analysis/BasicAA/cs-cs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -364,26 +364,26 @@ entry:
call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
ret void

; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
}

attributes #0 = { argmemonly nounwind }
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Analysis/BasicAA/intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ entry:
declare <8 x i16> @llvm.masked.load.v8i16.p0v8i16(<8 x i16>*, i32, <8 x i1>, <8 x i16>) nounwind readonly
declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>) nounwind

; CHECK: attributes #0 = { argmemonly nounwind readonly }
; CHECK: attributes #1 = { argmemonly nounwind }
; CHECK: attributes #0 = { argmemonly nounwind readonly willreturn }
; CHECK: attributes #1 = { argmemonly nounwind willreturn }
; CHECK: attributes [[ATTR]] = { nounwind }
2 changes: 1 addition & 1 deletion llvm/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1) nounwind
; CHECK: attributes #3 = { nounwind }
; CHECK: attributes #4 = { nounwind readnone }
; CHECK: attributes #5 = { nofree norecurse nounwind }
; CHECK: attributes #6 = { argmemonly nounwind }
; CHECK: attributes #6 = { argmemonly nounwind willreturn }

; Root note.
!0 = !{ }
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Analysis/TypeBasedAliasAnalysis/intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ entry:
declare <8 x i16> @llvm.masked.load.v8i16.p0v8i16(<8 x i16>*, i32, <8 x i1>, <8 x i16>) nounwind readonly
declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>) nounwind

; CHECK: attributes #0 = { argmemonly nounwind readonly }
; CHECK: attributes #1 = { argmemonly nounwind }
; CHECK: attributes #0 = { argmemonly nounwind readonly willreturn }
; CHECK: attributes #1 = { argmemonly nounwind willreturn }
; CHECK: attributes [[NUW]] = { nounwind }

!0 = !{!"tbaa root"}
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Bindings/llvm-c/debug_info.ll
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
; CHECK: ; Function Attrs: nounwind readnone speculatable
; CHECK-NEXT: declare void @llvm.dbg.value(metadata, metadata, metadata) #0

; CHECK: attributes #0 = { nounwind readnone speculatable }
; CHECK: attributes #0 = { nounwind readnone speculatable willreturn }

; CHECK: !llvm.dbg.cu = !{!0}
; CHECK-NEXT: !FooType = !{!16}
Expand Down
11 changes: 6 additions & 5 deletions llvm/test/Bitcode/compatibility-3.6.ll
Original file line number Diff line number Diff line change
Expand Up @@ -981,7 +981,7 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #34
; CHECK: call void @f.nobuiltin() #35

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #11
Expand Down Expand Up @@ -1179,12 +1179,13 @@ define void @intrinsics.codegen() {
; CHECK: attributes #26 = { sspstrong }
; CHECK: attributes #27 = { uwtable }
; CHECK: attributes #28 = { "cpu"="cortex-a8" }
; CHECK: attributes #29 = { nounwind readnone }
; CHECK: attributes #29 = { nounwind readnone willreturn }
; CHECK: attributes #30 = { argmemonly nounwind readonly }
; CHECK: attributes #31 = { argmemonly nounwind }
; CHECK: attributes #32 = { nounwind readonly }
; CHECK: attributes #33 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #34 = { builtin }
; CHECK: attributes #32 = { nounwind readnone }
; CHECK: attributes #33 = { nounwind readonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #35 = { builtin }

;; Metadata

Expand Down
11 changes: 6 additions & 5 deletions llvm/test/Bitcode/compatibility-3.7.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1022,7 +1022,7 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #37
; CHECK: call void @f.nobuiltin() #38

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1242,12 +1242,13 @@ define void @misc.metadata() {
; CHECK: attributes #29 = { "thunk" }
; CHECK: attributes #30 = { uwtable }
; CHECK: attributes #31 = { "cpu"="cortex-a8" }
; CHECK: attributes #32 = { nounwind readnone }
; CHECK: attributes #32 = { nounwind readnone willreturn }
; CHECK: attributes #33 = { argmemonly nounwind readonly }
; CHECK: attributes #34 = { argmemonly nounwind }
; CHECK: attributes #35 = { nounwind readonly }
; CHECK: attributes #36 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #37 = { builtin }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #36 = { nounwind readonly }
; CHECK: attributes #37 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #38 = { builtin }

;; Metadata

Expand Down
11 changes: 6 additions & 5 deletions llvm/test/Bitcode/compatibility-3.8.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1170,7 +1170,7 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #40
; CHECK: call void @f.nobuiltin() #41

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1552,12 +1552,13 @@ normal:
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #40 = { builtin }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #41 = { builtin }

;; Metadata

Expand Down
15 changes: 8 additions & 7 deletions llvm/test/Bitcode/compatibility-3.9.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1241,7 +1241,7 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #41
; CHECK: call void @f.nobuiltin() #42

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1588,7 +1588,7 @@ normal:
}

declare void @f.writeonly() writeonly
; CHECK: declare void @f.writeonly() #39
; CHECK: declare void @f.writeonly() #40

; CHECK: attributes #0 = { alignstack=4 }
; CHECK: attributes #1 = { alignstack=8 }
Expand Down Expand Up @@ -1625,13 +1625,14 @@ declare void @f.writeonly() writeonly
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { writeonly }
; CHECK: attributes #40 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #41 = { builtin }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { writeonly }
; CHECK: attributes #41 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #42 = { builtin }

;; Metadata

Expand Down
15 changes: 8 additions & 7 deletions llvm/test/Bitcode/compatibility-4.0.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1241,7 +1241,7 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #41
; CHECK: call void @f.nobuiltin() #42

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1606,7 +1606,7 @@ normal:


declare void @f.writeonly() writeonly
; CHECK: declare void @f.writeonly() #39
; CHECK: declare void @f.writeonly() #40

;; Constant Expressions

Expand Down Expand Up @@ -1650,13 +1650,14 @@ define i8** @constexpr() {
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { writeonly }
; CHECK: attributes #40 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #41 = { builtin }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { writeonly }
; CHECK: attributes #41 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #42 = { builtin }

;; Metadata

Expand Down
23 changes: 12 additions & 11 deletions llvm/test/Bitcode/compatibility-5.0.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1248,10 +1248,10 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #42
; CHECK: call void @f.nobuiltin() #43

call void @f.strictfp() strictfp
; CHECK: call void @f.strictfp() #43
; CHECK: call void @f.strictfp() #44

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1616,10 +1616,10 @@ normal:


declare void @f.writeonly() writeonly
; CHECK: declare void @f.writeonly() #39
; CHECK: declare void @f.writeonly() #40

declare void @f.speculatable() speculatable
; CHECK: declare void @f.speculatable() #40
; CHECK: declare void @f.speculatable() #41

;; Constant Expressions

Expand Down Expand Up @@ -1663,15 +1663,16 @@ define i8** @constexpr() {
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { writeonly }
; CHECK: attributes #40 = { speculatable }
; CHECK: attributes #41 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #42 = { builtin }
; CHECK: attributes #43 = { strictfp }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { writeonly }
; CHECK: attributes #41 = { speculatable }
; CHECK: attributes #42 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #43 = { builtin }
; CHECK: attributes #44 = { strictfp }

;; Metadata

Expand Down
23 changes: 12 additions & 11 deletions llvm/test/Bitcode/compatibility-6.0.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1259,10 +1259,10 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #42
; CHECK: call void @f.nobuiltin() #43

call void @f.strictfp() strictfp
; CHECK: call void @f.strictfp() #43
; CHECK: call void @f.strictfp() #44

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1627,10 +1627,10 @@ normal:


declare void @f.writeonly() writeonly
; CHECK: declare void @f.writeonly() #39
; CHECK: declare void @f.writeonly() #40

declare void @f.speculatable() speculatable
; CHECK: declare void @f.speculatable() #40
; CHECK: declare void @f.speculatable() #41

;; Constant Expressions

Expand Down Expand Up @@ -1674,15 +1674,16 @@ define i8** @constexpr() {
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { writeonly }
; CHECK: attributes #40 = { speculatable }
; CHECK: attributes #41 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #42 = { builtin }
; CHECK: attributes #43 = { strictfp }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { writeonly }
; CHECK: attributes #41 = { speculatable }
; CHECK: attributes #42 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #43 = { builtin }
; CHECK: attributes #44 = { strictfp }

;; Metadata

Expand Down
23 changes: 12 additions & 11 deletions llvm/test/Bitcode/compatibility.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1351,10 +1351,10 @@ exit:
; CHECK: select <2 x i1> <i1 true, i1 false>, <2 x i8> <i8 2, i8 3>, <2 x i8> <i8 3, i8 2>

call void @f.nobuiltin() builtin
; CHECK: call void @f.nobuiltin() #42
; CHECK: call void @f.nobuiltin() #43

call void @f.strictfp() strictfp
; CHECK: call void @f.strictfp() #43
; CHECK: call void @f.strictfp() #44

call fastcc noalias i32* @f.noalias() noinline
; CHECK: call fastcc noalias i32* @f.noalias() #12
Expand Down Expand Up @@ -1719,10 +1719,10 @@ normal:


declare void @f.writeonly() writeonly
; CHECK: declare void @f.writeonly() #40
; CHECK: declare void @f.writeonly() #41

declare void @f.speculatable() speculatable
; CHECK: declare void @f.speculatable() #41
; CHECK: declare void @f.speculatable() #42

;; Constant Expressions

Expand Down Expand Up @@ -1779,15 +1779,16 @@ declare void @byval_named_type(%named_type* byval(%named_type))
; CHECK: attributes #32 = { norecurse }
; CHECK: attributes #33 = { inaccessiblememonly }
; CHECK: attributes #34 = { inaccessiblemem_or_argmemonly }
; CHECK: attributes #35 = { nounwind readnone }
; CHECK: attributes #35 = { nounwind readnone willreturn }
; CHECK: attributes #36 = { argmemonly nounwind readonly }
; CHECK: attributes #37 = { argmemonly nounwind }
; CHECK: attributes #38 = { nounwind readonly }
; CHECK: attributes #39 = { inaccessiblemem_or_argmemonly nounwind }
; CHECK: attributes #40 = { writeonly }
; CHECK: attributes #41 = { speculatable }
; CHECK: attributes #42 = { builtin }
; CHECK: attributes #43 = { strictfp }
; CHECK: attributes #38 = { nounwind readnone }
; CHECK: attributes #39 = { nounwind readonly }
; CHECK: attributes #40 = { inaccessiblemem_or_argmemonly nounwind willreturn }
; CHECK: attributes #41 = { writeonly }
; CHECK: attributes #42 = { speculatable }
; CHECK: attributes #43 = { builtin }
; CHECK: attributes #44 = { strictfp }

;; Metadata

Expand Down
Loading

0 comments on commit cc0a4cd

Please sign in to comment.