2020-07-20 03:55:43 +08:00
|
|
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes --check-attributes
|
2020-08-14 19:51:14 +08:00
|
|
|
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=15 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
|
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
2020-07-29 08:57:21 +08:00
|
|
|
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
2020-04-18 10:09:16 +08:00
|
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
2019-12-02 21:40:09 +08:00
|
|
|
|
2020-02-20 16:06:14 +08:00
|
|
|
|
2019-12-02 21:40:09 +08:00
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
|
|
|
|
declare nonnull i8* @ret_nonnull()
|
2020-04-25 01:46:18 +08:00
|
|
|
declare void @llvm.assume(i1)
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
; Return a pointer trivially nonnull (call return attribute)
|
|
|
|
define i8* @test1() {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test1()
|
|
|
|
; CHECK-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%ret = call i8* @ret_nonnull()
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
; Return a pointer trivially nonnull (argument attribute)
|
|
|
|
define i8* @test2(i8* nonnull %p) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@test2
|
|
|
|
; IS__TUNIT____-SAME: (i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[P]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@test2
|
|
|
|
; IS__CGSCC____-SAME: (i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[P]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
ret i8* %p
|
|
|
|
}
|
|
|
|
|
2020-04-25 01:46:18 +08:00
|
|
|
define i8* @test2A(i1 %c, i8* %ret) {
|
|
|
|
; ATTRIBUTOR: define nonnull i8* @test2A(i1 %c, i8* nofree nonnull readnone returned %ret)
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_OPM: Function Attrs: nounwind willreturn
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@test2A
|
|
|
|
; NOT_CGSCC_OPM-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[RET:%.*]])
|
|
|
|
; NOT_CGSCC_OPM-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
|
|
; NOT_CGSCC_OPM: A:
|
2020-08-11 09:31:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR11:#.*]] [ "nonnull"(i8* [[RET]]) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
; NOT_CGSCC_OPM: B:
|
2020-08-11 09:31:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR11]] [ "nonnull"(i8* [[RET]]) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC_OPM: Function Attrs: nounwind willreturn
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test2A
|
|
|
|
; IS__CGSCC_OPM-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[RET:%.*]])
|
|
|
|
; IS__CGSCC_OPM-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
|
|
; IS__CGSCC_OPM: A:
|
2020-08-11 09:31:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR12:#.*]] [ "nonnull"(i8* [[RET]]) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
; IS__CGSCC_OPM: B:
|
2020-08-11 09:31:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR12]] [ "nonnull"(i8* [[RET]]) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2020-04-25 01:46:18 +08:00
|
|
|
br i1 %c, label %A, label %B
|
|
|
|
A:
|
|
|
|
call void @llvm.assume(i1 true) [ "nonnull"(i8* %ret) ]
|
|
|
|
ret i8* %ret
|
|
|
|
B:
|
|
|
|
call void @llvm.assume(i1 true) [ "nonnull"(i8* %ret) ]
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test2B(i1 %c, i8* %ret) {
|
|
|
|
; ATTRIBUTOR: define nonnull dereferenceable(4) i8* @test2B(i1 %c, i8* nofree nonnull readnone returned dereferenceable(4) %ret)
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_OPM: Function Attrs: nounwind willreturn
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@test2B
|
|
|
|
; NOT_CGSCC_OPM-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[RET:%.*]])
|
|
|
|
; NOT_CGSCC_OPM-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
|
|
; NOT_CGSCC_OPM: A:
|
2020-08-11 09:31:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR11]] [ "dereferenceable"(i8* [[RET]], i32 4) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
; NOT_CGSCC_OPM: B:
|
2020-08-11 09:31:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR11]] [ "dereferenceable"(i8* [[RET]], i32 4) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC_OPM: Function Attrs: nounwind willreturn
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test2B
|
|
|
|
; IS__CGSCC_OPM-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[RET:%.*]])
|
|
|
|
; IS__CGSCC_OPM-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
|
|
; IS__CGSCC_OPM: A:
|
2020-08-11 09:31:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR12]] [ "dereferenceable"(i8* [[RET]], i32 4) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
; IS__CGSCC_OPM: B:
|
2020-08-11 09:31:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR12]] [ "dereferenceable"(i8* [[RET]], i32 4) ]
|
2020-05-04 08:08:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2020-04-25 01:46:18 +08:00
|
|
|
br i1 %c, label %A, label %B
|
|
|
|
A:
|
|
|
|
call void @llvm.assume(i1 true) [ "dereferenceable"(i8* %ret, i32 4) ]
|
|
|
|
ret i8* %ret
|
|
|
|
B:
|
|
|
|
call void @llvm.assume(i1 true) [ "dereferenceable"(i8* %ret, i32 4) ]
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
2019-12-02 21:40:09 +08:00
|
|
|
; Given an SCC where one of the functions can not be marked nonnull,
|
|
|
|
; can we still mark the other one which is trivially nonnull
|
|
|
|
define i8* @scc_binder(i1 %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@scc_binder
|
|
|
|
; CHECK-SAME: (i1 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]
|
|
|
|
; CHECK: rec:
|
|
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call i8* @test3(i1 [[C]])
|
|
|
|
; CHECK-NEXT: br label [[END]]
|
|
|
|
; CHECK: end:
|
|
|
|
; CHECK-NEXT: ret i8* null
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
br i1 %c, label %rec, label %end
|
|
|
|
rec:
|
|
|
|
call i8* @test3(i1 %c)
|
|
|
|
br label %end
|
|
|
|
end:
|
|
|
|
ret i8* null
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test3(i1 %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test3
|
|
|
|
; CHECK-SAME: (i1 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call i8* @scc_binder(i1 [[C]])
|
|
|
|
; CHECK-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: ret i8* [[RET]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call i8* @scc_binder(i1 %c)
|
|
|
|
%ret = call i8* @ret_nonnull()
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
; Given a mutual recursive set of functions, we can mark them
|
|
|
|
; nonnull if neither can ever return null. (In this case, they
|
|
|
|
; just never return period.)
|
|
|
|
define i8* @test4_helper() {
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_NPM: Function Attrs: nofree noreturn nosync nounwind readnone
|
|
|
|
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@test4_helper()
|
|
|
|
; NOT_CGSCC_NPM-NEXT: unreachable
|
|
|
|
;
|
|
|
|
; IS__CGSCC_NPM: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test4_helper()
|
|
|
|
; IS__CGSCC_NPM-NEXT: unreachable
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%ret = call i8* @test4()
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test4() {
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_NPM: Function Attrs: nofree noreturn nosync nounwind readnone
|
|
|
|
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@test4()
|
|
|
|
; NOT_CGSCC_NPM-NEXT: unreachable
|
|
|
|
;
|
|
|
|
; IS__CGSCC_NPM: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test4()
|
|
|
|
; IS__CGSCC_NPM-NEXT: unreachable
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%ret = call i8* @test4_helper()
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
; Given a mutual recursive set of functions which *can* return null
|
|
|
|
; make sure we haven't marked them as nonnull.
|
|
|
|
define i8* @test5_helper(i1 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_NPM: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@test5_helper
|
|
|
|
; NOT_CGSCC_NPM-SAME: (i1 [[C:%.*]])
|
|
|
|
; NOT_CGSCC_NPM-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]
|
|
|
|
; NOT_CGSCC_NPM: rec:
|
|
|
|
; NOT_CGSCC_NPM-NEXT: br label [[END]]
|
|
|
|
; NOT_CGSCC_NPM: end:
|
|
|
|
; NOT_CGSCC_NPM-NEXT: ret i8* null
|
|
|
|
;
|
|
|
|
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test5_helper
|
|
|
|
; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]])
|
|
|
|
; IS__CGSCC_NPM-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]
|
|
|
|
; IS__CGSCC_NPM: rec:
|
|
|
|
; IS__CGSCC_NPM-NEXT: br label [[END]]
|
|
|
|
; IS__CGSCC_NPM: end:
|
|
|
|
; IS__CGSCC_NPM-NEXT: ret i8* null
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
br i1 %c, label %rec, label %end
|
|
|
|
rec:
|
|
|
|
%ret = call i8* @test5(i1 %c)
|
|
|
|
br label %end
|
|
|
|
end:
|
|
|
|
ret i8* null
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test5(i1 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; NOT_CGSCC_NPM: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@test5
|
|
|
|
; NOT_CGSCC_NPM-SAME: (i1 [[C:%.*]])
|
|
|
|
; NOT_CGSCC_NPM-NEXT: ret i8* null
|
|
|
|
;
|
|
|
|
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test5
|
|
|
|
; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]])
|
|
|
|
; IS__CGSCC_NPM-NEXT: ret i8* null
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%ret = call i8* @test5_helper(i1 %c)
|
|
|
|
ret i8* %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
; Local analysis, but going through a self recursive phi
|
|
|
|
define i8* @test6a() {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: noreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test6a()
|
|
|
|
; CHECK-NEXT: entry:
|
|
|
|
; CHECK-NEXT: [[RET:%.*]] = call i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: br label [[LOOP:%.*]]
|
|
|
|
; CHECK: loop:
|
|
|
|
; CHECK-NEXT: unreachable
|
|
|
|
; CHECK: exit:
|
|
|
|
; CHECK-NEXT: unreachable
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
entry:
|
|
|
|
%ret = call i8* @ret_nonnull()
|
|
|
|
br label %loop
|
|
|
|
loop:
|
|
|
|
%phi = phi i8* [%ret, %entry], [%phi, %loop]
|
|
|
|
br i1 undef, label %loop, label %exit
|
|
|
|
exit:
|
|
|
|
ret i8* %phi
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test6b(i1 %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test6b
|
|
|
|
; CHECK-SAME: (i1 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: entry:
|
|
|
|
; CHECK-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: br label [[LOOP:%.*]]
|
|
|
|
; CHECK: loop:
|
|
|
|
; CHECK-NEXT: [[PHI:%.*]] = phi i8* [ [[RET]], [[ENTRY:%.*]] ], [ [[PHI]], [[LOOP]] ]
|
|
|
|
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
|
|
|
|
; CHECK: exit:
|
|
|
|
; CHECK-NEXT: ret i8* [[PHI]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
entry:
|
|
|
|
%ret = call i8* @ret_nonnull()
|
|
|
|
br label %loop
|
|
|
|
loop:
|
|
|
|
%phi = phi i8* [%ret, %entry], [%phi, %loop]
|
|
|
|
br i1 %c, label %loop, label %exit
|
|
|
|
exit:
|
|
|
|
ret i8* %phi
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test7(i8* %a) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@test7
|
|
|
|
; IS__TUNIT____-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[A:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 0
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[B]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@test7
|
|
|
|
; IS__CGSCC____-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[A:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 0
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[B]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%b = getelementptr inbounds i8, i8* %a, i64 0
|
|
|
|
ret i8* %b
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test8(i8* %a) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@test8
|
|
|
|
; IS__TUNIT____-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 1
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[B]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@test8
|
|
|
|
; IS__CGSCC____-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 1
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[B]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%b = getelementptr inbounds i8, i8* %a, i64 1
|
|
|
|
ret i8* %b
|
|
|
|
}
|
|
|
|
|
|
|
|
define i8* @test9(i8* %a, i64 %n) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@test9
|
|
|
|
; IS__TUNIT____-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[B]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@test9
|
|
|
|
; IS__CGSCC____-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[B]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%b = getelementptr inbounds i8, i8* %a, i64 %n
|
|
|
|
ret i8* %b
|
|
|
|
}
|
|
|
|
|
2020-04-25 01:46:18 +08:00
|
|
|
; ATTRIBUTOR_OPM: define i8* @test10
|
|
|
|
; ATTRIBUTOR_NPM: define nonnull i8* @test10
|
2019-12-02 21:40:09 +08:00
|
|
|
define i8* @test10(i8* %a, i64 %n) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test10
|
|
|
|
; CHECK-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]])
|
2020-04-11 12:41:59 +08:00
|
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true)
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]
|
|
|
|
; CHECK-NEXT: ret i8* [[B]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%cmp = icmp ne i64 %n, 0
|
|
|
|
call void @llvm.assume(i1 %cmp)
|
|
|
|
%b = getelementptr inbounds i8, i8* %a, i64 %n
|
|
|
|
ret i8* %b
|
|
|
|
}
|
|
|
|
|
|
|
|
; TEST 11
|
|
|
|
; char* test11(char *p) {
|
|
|
|
; return p? p: nonnull();
|
|
|
|
; }
|
|
|
|
; FIXME: missing nonnull
|
|
|
|
define i8* @test11(i8*) local_unnamed_addr {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test11
|
|
|
|
; CHECK-SAME: (i8* [[TMP0:%.*]]) local_unnamed_addr
|
|
|
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null
|
|
|
|
; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]
|
|
|
|
; CHECK: 3:
|
|
|
|
; CHECK-NEXT: [[TMP4:%.*]] = tail call i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: br label [[TMP5]]
|
|
|
|
; CHECK: 5:
|
|
|
|
; CHECK-NEXT: [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]
|
|
|
|
; CHECK-NEXT: ret i8* [[TMP6]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%2 = icmp eq i8* %0, null
|
|
|
|
br i1 %2, label %3, label %5
|
|
|
|
|
|
|
|
; <label>:3: ; preds = %1
|
|
|
|
%4 = tail call i8* @ret_nonnull()
|
|
|
|
br label %5
|
|
|
|
|
|
|
|
; <label>:5: ; preds = %3, %1
|
|
|
|
%6 = phi i8* [ %4, %3 ], [ %0, %1 ]
|
|
|
|
ret i8* %6
|
|
|
|
}
|
|
|
|
|
|
|
|
; TEST 12
|
|
|
|
; Simple CallSite Test
|
|
|
|
declare void @test12_helper(i8*)
|
|
|
|
define void @test12(i8* nonnull %a) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test12
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]])
|
|
|
|
; CHECK-NEXT: tail call void @test12_helper(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
tail call void @test12_helper(i8* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; TEST 13
|
|
|
|
; Simple Argument Tests
|
|
|
|
declare i8* @unknown()
|
|
|
|
define void @test13_helper() {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@test13_helper()
|
2020-08-22 04:06:14 +08:00
|
|
|
; CHECK-NEXT: [[NONNULLPTR:%.*]] = tail call nonnull i8* @ret_nonnull()
|
|
|
|
; CHECK-NEXT: [[MAYBENULLPTR:%.*]] = tail call i8* @unknown()
|
|
|
|
; CHECK-NEXT: tail call void @test13(i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture nofree readnone [[MAYBENULLPTR]])
|
|
|
|
; CHECK-NEXT: tail call void @test13(i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture nofree readnone [[MAYBENULLPTR]], i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]])
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%nonnullptr = tail call i8* @ret_nonnull()
|
|
|
|
%maybenullptr = tail call i8* @unknown()
|
|
|
|
tail call void @test13(i8* %nonnullptr, i8* %nonnullptr, i8* %maybenullptr)
|
|
|
|
tail call void @test13(i8* %nonnullptr, i8* %maybenullptr, i8* %nonnullptr)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
define internal void @test13(i8* %a, i8* %b, i8* %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@test13
|
2020-08-22 04:06:14 +08:00
|
|
|
; IS__TUNIT____-SAME: (i8* noalias nocapture nofree nonnull readnone [[A:%.*]], i8* noalias nocapture nofree readnone [[B:%.*]], i8* noalias nocapture nofree readnone [[C:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[A]])
|
|
|
|
; IS__TUNIT____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[B]])
|
|
|
|
; IS__TUNIT____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[C]])
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__TUNIT____-NEXT: ret void
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@test13
|
|
|
|
; IS__CGSCC____-SAME: (i8* nocapture nofree readnone [[A:%.*]], i8* nocapture nofree readnone [[B:%.*]], i8* nocapture nofree readnone [[C:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[A]])
|
|
|
|
; IS__CGSCC____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[B]])
|
|
|
|
; IS__CGSCC____-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[C]])
|
|
|
|
; IS__CGSCC____-NEXT: ret void
|
|
|
|
;
|
2019-10-10 14:39:16 +08:00
|
|
|
call void @use_i8_ptr(i8* %a)
|
|
|
|
call void @use_i8_ptr(i8* %b)
|
|
|
|
call void @use_i8_ptr(i8* %c)
|
2019-12-02 21:40:09 +08:00
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
declare nonnull i8* @nonnull()
|
|
|
|
|
|
|
|
; TEST 14
|
|
|
|
; Complex propagation
|
|
|
|
; Argument of f1, f2, f3 can be marked with nonnull.
|
|
|
|
|
|
|
|
; * Argument
|
|
|
|
; 1. In f1:bb6, %arg can be marked with nonnull because of the comparison in bb1
|
|
|
|
; 2. Because f2 is internal function, f2(i32* %arg) -> @f2(i32* nonnull %arg)
|
|
|
|
; 3. In f1:bb4 %tmp5 is nonnull and f3 is internal function.
|
|
|
|
; Then, f3(i32* %arg) -> @f3(i32* nonnull %arg)
|
|
|
|
; 4. We get nonnull in whole f1 call sites so f1(i32* %arg) -> @f1(i32* nonnull %arg)
|
|
|
|
|
|
|
|
|
|
|
|
define internal i32* @f1(i32* %arg) {
|
|
|
|
; FIXME: missing nonnull It should be nonnull @f1(i32* nonnull readonly %arg)
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: argmemonly nofree nosync nounwind readonly
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f1
|
|
|
|
; CHECK-SAME: (i32* nofree readonly [[ARG:%.*]])
|
|
|
|
; CHECK-NEXT: bb:
|
|
|
|
; CHECK-NEXT: [[TMP:%.*]] = icmp eq i32* [[ARG]], null
|
|
|
|
; CHECK-NEXT: br i1 [[TMP]], label [[BB9:%.*]], label [[BB1:%.*]]
|
|
|
|
; CHECK: bb1:
|
|
|
|
; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[ARG]], align 4
|
|
|
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]]
|
|
|
|
; CHECK: bb4:
|
|
|
|
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i64 1
|
2020-08-18 23:01:37 +08:00
|
|
|
; CHECK-NEXT: [[TMP5B:%.*]] = tail call i32* @f3(i32* nofree nonnull readonly [[TMP5]])
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, i32* [[TMP5B]], i64 -1
|
|
|
|
; CHECK-NEXT: br label [[BB9]]
|
|
|
|
; CHECK: bb6:
|
|
|
|
; CHECK-NEXT: [[TMP7:%.*]] = tail call nonnull i32* @f2(i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG]])
|
|
|
|
; CHECK-NEXT: ret i32* [[TMP7]]
|
|
|
|
; CHECK: bb9:
|
|
|
|
; CHECK-NEXT: [[TMP10:%.*]] = phi i32* [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to i32*), [[BB:%.*]] ]
|
|
|
|
; CHECK-NEXT: ret i32* [[TMP10]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
bb:
|
|
|
|
%tmp = icmp eq i32* %arg, null
|
|
|
|
br i1 %tmp, label %bb9, label %bb1
|
|
|
|
|
|
|
|
bb1: ; preds = %bb
|
|
|
|
%tmp2 = load i32, i32* %arg, align 4
|
|
|
|
%tmp3 = icmp eq i32 %tmp2, 0
|
|
|
|
br i1 %tmp3, label %bb6, label %bb4
|
|
|
|
|
|
|
|
bb4: ; preds = %bb1
|
|
|
|
%tmp5 = getelementptr inbounds i32, i32* %arg, i64 1
|
|
|
|
%tmp5b = tail call i32* @f3(i32* %tmp5)
|
|
|
|
%tmp5c = getelementptr inbounds i32, i32* %tmp5b, i64 -1
|
|
|
|
br label %bb9
|
|
|
|
|
|
|
|
bb6: ; preds = %bb1
|
|
|
|
%tmp7 = tail call i32* @f2(i32* %arg)
|
|
|
|
ret i32* %tmp7
|
|
|
|
|
|
|
|
bb9: ; preds = %bb4, %bb
|
|
|
|
%tmp10 = phi i32* [ %tmp5c, %bb4 ], [ inttoptr (i64 4 to i32*), %bb ]
|
|
|
|
ret i32* %tmp10
|
|
|
|
}
|
|
|
|
|
|
|
|
define internal i32* @f2(i32* %arg) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: argmemonly nofree nosync nounwind readonly
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f2
|
|
|
|
; CHECK-SAME: (i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]])
|
|
|
|
; CHECK-NEXT: bb:
|
|
|
|
; CHECK-NEXT: [[TMP:%.*]] = tail call nonnull i32* @f1(i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG]])
|
|
|
|
; CHECK-NEXT: ret i32* [[TMP]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
bb:
|
|
|
|
%tmp = tail call i32* @f1(i32* %arg)
|
|
|
|
ret i32* %tmp
|
|
|
|
}
|
|
|
|
|
|
|
|
define dso_local noalias i32* @f3(i32* %arg) {
|
|
|
|
; FIXME: missing nonnull. It should be nonnull @f3(i32* nonnull readonly %arg)
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: argmemonly nofree nosync nounwind readonly
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f3
|
|
|
|
; CHECK-SAME: (i32* nofree readonly [[ARG:%.*]])
|
|
|
|
; CHECK-NEXT: bb:
|
|
|
|
; CHECK-NEXT: [[TMP:%.*]] = call nonnull i32* @f1(i32* nofree readonly [[ARG]])
|
|
|
|
; CHECK-NEXT: ret i32* [[TMP]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
bb:
|
|
|
|
; FIXME: missing nonnull. It should be @f1(i32* nonnull readonly %arg)
|
|
|
|
%tmp = call i32* @f1(i32* %arg)
|
|
|
|
ret i32* %tmp
|
|
|
|
}
|
|
|
|
|
|
|
|
; TEST 15
|
|
|
|
define void @f15(i8* %arg) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f15
|
|
|
|
; CHECK-SAME: (i8* nonnull dereferenceable(4) [[ARG:%.*]])
|
|
|
|
; CHECK-NEXT: tail call void @use1(i8* nonnull dereferenceable(4) [[ARG]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
tail call void @use1(i8* dereferenceable(4) %arg)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
declare void @fun0() #1
|
|
|
|
declare void @fun1(i8*) #1
|
|
|
|
declare void @fun2(i8*, i8*) #1
|
|
|
|
declare void @fun3(i8*, i8*, i8*) #1
|
|
|
|
; TEST 16 simple path test
|
|
|
|
; if(..)
|
|
|
|
; fun2(nonnull %a, nonnull %b)
|
|
|
|
; else
|
|
|
|
; fun2(nonnull %a, %b)
|
|
|
|
; We can say that %a is nonnull but %b is not.
|
|
|
|
define void @f16(i8* %a, i8 * %b, i8 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f16
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
|
|
|
; CHECK: if.then:
|
|
|
|
; CHECK-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
; CHECK: if.else:
|
|
|
|
; CHECK-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* [[B]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%cmp = icmp eq i8 %c, 0
|
|
|
|
br i1 %cmp, label %if.then, label %if.else
|
|
|
|
if.then:
|
|
|
|
tail call void @fun2(i8* nonnull %a, i8* nonnull %b)
|
|
|
|
ret void
|
|
|
|
if.else:
|
|
|
|
tail call void @fun2(i8* nonnull %a, i8* %b)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
; TEST 17 explore child BB test
|
|
|
|
; if(..)
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; else
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; fun1(nonnull %a)
|
|
|
|
; We can say that %a is nonnull
|
|
|
|
define void @f17(i8* %a, i8 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f17
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
|
|
|
; CHECK: if.then:
|
|
|
|
; CHECK-NEXT: tail call void @fun0()
|
|
|
|
; CHECK-NEXT: br label [[CONT:%.*]]
|
|
|
|
; CHECK: if.else:
|
|
|
|
; CHECK-NEXT: tail call void @fun0()
|
|
|
|
; CHECK-NEXT: br label [[CONT]]
|
|
|
|
; CHECK: cont:
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%cmp = icmp eq i8 %c, 0
|
|
|
|
br i1 %cmp, label %if.then, label %if.else
|
|
|
|
if.then:
|
|
|
|
tail call void @fun0()
|
|
|
|
br label %cont
|
|
|
|
if.else:
|
|
|
|
tail call void @fun0()
|
|
|
|
br label %cont
|
|
|
|
cont:
|
|
|
|
tail call void @fun1(i8* nonnull %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
; TEST 18 More complex test
|
|
|
|
; if(..)
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; else
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; if(..)
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; else
|
|
|
|
; ... (willreturn & nounwind)
|
|
|
|
; fun1(nonnull %a)
|
|
|
|
|
|
|
|
define void @f18(i8* %a, i8* %b, i8 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f18
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[C]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
|
|
|
; CHECK: if.then:
|
|
|
|
; CHECK-NEXT: tail call void @fun0()
|
|
|
|
; CHECK-NEXT: br label [[CONT:%.*]]
|
|
|
|
; CHECK: if.else:
|
|
|
|
; CHECK-NEXT: tail call void @fun0()
|
|
|
|
; CHECK-NEXT: br label [[CONT]]
|
|
|
|
; CHECK: cont:
|
|
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[C]], 1
|
|
|
|
; CHECK-NEXT: br i1 [[CMP2]], label [[CONT_THEN:%.*]], label [[CONT_ELSE:%.*]]
|
|
|
|
; CHECK: cont.then:
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: br label [[CONT2:%.*]]
|
|
|
|
; CHECK: cont.else:
|
|
|
|
; CHECK-NEXT: tail call void @fun0()
|
|
|
|
; CHECK-NEXT: br label [[CONT2]]
|
|
|
|
; CHECK: cont2:
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%cmp1 = icmp eq i8 %c, 0
|
|
|
|
br i1 %cmp1, label %if.then, label %if.else
|
|
|
|
if.then:
|
|
|
|
tail call void @fun0()
|
|
|
|
br label %cont
|
|
|
|
if.else:
|
|
|
|
tail call void @fun0()
|
|
|
|
br label %cont
|
|
|
|
cont:
|
|
|
|
%cmp2 = icmp eq i8 %c, 1
|
|
|
|
br i1 %cmp2, label %cont.then, label %cont.else
|
|
|
|
cont.then:
|
|
|
|
tail call void @fun1(i8* nonnull %b)
|
|
|
|
br label %cont2
|
|
|
|
cont.else:
|
|
|
|
tail call void @fun0()
|
|
|
|
br label %cont2
|
|
|
|
cont2:
|
|
|
|
tail call void @fun1(i8* nonnull %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; TEST 19: Loop
|
|
|
|
|
|
|
|
define void @f19(i8* %a, i8* %b, i8 %c) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@f19
|
|
|
|
; CHECK-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8 [[C:%.*]])
|
|
|
|
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
|
|
|
|
; CHECK: loop.header:
|
|
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[C]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP_BODY:%.*]], label [[LOOP_EXIT:%.*]]
|
|
|
|
; CHECK: loop.body:
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: br label [[LOOP_HEADER]]
|
|
|
|
; CHECK: loop.exit:
|
|
|
|
; CHECK-NEXT: tail call void @fun1(i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
br label %loop.header
|
|
|
|
loop.header:
|
|
|
|
%cmp2 = icmp eq i8 %c, 0
|
|
|
|
br i1 %cmp2, label %loop.body, label %loop.exit
|
|
|
|
loop.body:
|
|
|
|
tail call void @fun1(i8* nonnull %b)
|
|
|
|
tail call void @fun1(i8* nonnull %a)
|
|
|
|
br label %loop.header
|
|
|
|
loop.exit:
|
|
|
|
tail call void @fun1(i8* nonnull %b)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Test propagation of nonnull callsite args back to caller.
|
|
|
|
|
|
|
|
declare void @use1(i8* %x)
|
|
|
|
declare void @use2(i8* %x, i8* %y);
|
|
|
|
declare void @use3(i8* %x, i8* %y, i8* %z);
|
|
|
|
|
|
|
|
declare void @use1nonnull(i8* nonnull %x);
|
|
|
|
declare void @use2nonnull(i8* nonnull %x, i8* nonnull %y);
|
|
|
|
declare void @use3nonnull(i8* nonnull %x, i8* nonnull %y, i8* nonnull %z);
|
|
|
|
|
|
|
|
declare i8 @use1safecall(i8* %x) readonly nounwind ; readonly+nounwind guarantees that execution continues to successor
|
|
|
|
|
|
|
|
; Can't extend non-null to parent for any argument because the 2nd call is not guaranteed to execute.
|
|
|
|
|
|
|
|
define void @parent1(i8* %a, i8* %b, i8* %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent1
|
|
|
|
; CHECK-SAME: (i8* [[A:%.*]], i8* [[B:%.*]], i8* [[C:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use3(i8* [[C]], i8* [[A]], i8* [[B]])
|
|
|
|
; CHECK-NEXT: call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @use3(i8* %c, i8* %a, i8* %b)
|
|
|
|
call void @use3nonnull(i8* %b, i8* %c, i8* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Extend non-null to parent for all arguments.
|
|
|
|
|
|
|
|
define void @parent2(i8* %a, i8* %b, i8* %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent2
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: call void @use3(i8* nonnull [[C]], i8* nonnull [[A]], i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
call void @use3nonnull(i8* %b, i8* %c, i8* %a)
|
|
|
|
call void @use3(i8* %c, i8* %a, i8* %b)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Extend non-null to parent for 1st argument.
|
|
|
|
|
|
|
|
define void @parent3(i8* %a, i8* %b, i8* %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent3
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8* [[C:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: call void @use3(i8* [[C]], i8* [[B]], i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
call void @use1nonnull(i8* %a)
|
|
|
|
call void @use3(i8* %c, i8* %b, i8* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Extend non-null to parent for last 2 arguments.
|
|
|
|
|
|
|
|
define void @parent4(i8* %a, i8* %b, i8* %c) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent4
|
|
|
|
; CHECK-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use2nonnull(i8* nonnull [[C]], i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: call void @use2(i8* [[A]], i8* nonnull [[C]])
|
|
|
|
; CHECK-NEXT: call void @use1(i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
call void @use2nonnull(i8* %c, i8* %b)
|
|
|
|
call void @use2(i8* %a, i8* %c)
|
|
|
|
call void @use1(i8* %b)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; The callsite must execute in order for the attribute to transfer to the parent.
|
|
|
|
; It appears benign to extend non-null to the parent in this case, but we can't do that
|
|
|
|
; because it would incorrectly propagate the wrong information to its callers.
|
|
|
|
|
|
|
|
define void @parent5(i8* %a, i1 %a_is_notnull) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent5
|
|
|
|
; CHECK-SAME: (i8* [[A:%.*]], i1 [[A_IS_NOTNULL:%.*]])
|
|
|
|
; CHECK-NEXT: br i1 [[A_IS_NOTNULL]], label [[T:%.*]], label [[F:%.*]]
|
|
|
|
; CHECK: t:
|
|
|
|
; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
; CHECK: f:
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
br i1 %a_is_notnull, label %t, label %f
|
|
|
|
t:
|
|
|
|
call void @use1nonnull(i8* %a)
|
|
|
|
ret void
|
|
|
|
f:
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; The callsite must execute in order for the attribute to transfer to the parent.
|
|
|
|
; The volatile load can't trap, so we can guarantee that we'll get to the call.
|
|
|
|
|
|
|
|
define i8 @parent6(i8* %a, i8* %b) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent6
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]])
|
2020-05-11 02:16:49 +08:00
|
|
|
; CHECK-NEXT: [[C:%.*]] = load volatile i8, i8* [[B]], align 1
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret i8 [[C]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
%c = load volatile i8, i8* %b
|
|
|
|
call void @use1nonnull(i8* %a)
|
|
|
|
ret i8 %c
|
|
|
|
}
|
|
|
|
|
|
|
|
; The nonnull callsite is guaranteed to execute, so the argument must be nonnull throughout the parent.
|
|
|
|
|
|
|
|
define i8 @parent7(i8* %a) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent7
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]])
|
|
|
|
; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(i8* nonnull readonly [[A]])
|
|
|
|
; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret i8 [[RET]]
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
%ret = call i8 @use1safecall(i8* %a)
|
|
|
|
call void @use1nonnull(i8* %a)
|
|
|
|
ret i8 %ret
|
|
|
|
}
|
|
|
|
|
|
|
|
; Make sure that an invoke works similarly to a call.
|
|
|
|
|
|
|
|
declare i32 @esfp(...)
|
|
|
|
|
|
|
|
define i1 @parent8(i8* %a, i8* %bogus1, i8* %b) personality i8* bitcast (i32 (...)* @esfp to i8*){
|
2020-08-11 09:31:30 +08:00
|
|
|
; CHECK: Function Attrs: nounwind
|
|
|
|
; CHECK-LABEL: define {{[^@]+}}@parent8
|
|
|
|
; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* nocapture nofree readnone [[BOGUS1:%.*]], i8* nonnull [[B:%.*]]) [[ATTR4:#.*]] personality i8* bitcast (i32 (...)* @esfp to i8*)
|
|
|
|
; CHECK-NEXT: entry:
|
|
|
|
; CHECK-NEXT: invoke void @use2nonnull(i8* nonnull [[A]], i8* nonnull [[B]])
|
|
|
|
; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]]
|
|
|
|
; CHECK: cont:
|
2020-08-18 23:03:25 +08:00
|
|
|
; CHECK-NEXT: ret i1 false
|
2020-08-11 09:31:30 +08:00
|
|
|
; CHECK: exc:
|
|
|
|
; CHECK-NEXT: [[LP:%.*]] = landingpad { i8*, i32 }
|
|
|
|
; CHECK-NEXT: filter [0 x i8*] zeroinitializer
|
|
|
|
; CHECK-NEXT: unreachable
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
|
|
|
|
entry:
|
|
|
|
invoke void @use2nonnull(i8* %a, i8* %b)
|
|
|
|
to label %cont unwind label %exc
|
|
|
|
|
|
|
|
cont:
|
|
|
|
%null_check = icmp eq i8* %b, null
|
|
|
|
ret i1 %null_check
|
|
|
|
|
|
|
|
exc:
|
|
|
|
%lp = landingpad { i8*, i32 }
|
|
|
|
filter [0 x i8*] zeroinitializer
|
|
|
|
unreachable
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32* @gep1(i32* %p) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@gep1
|
|
|
|
; IS__TUNIT____-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1
|
|
|
|
; IS__TUNIT____-NEXT: ret i32* [[Q]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@gep1
|
|
|
|
; IS__CGSCC____-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1
|
|
|
|
; IS__CGSCC____-NEXT: ret i32* [[Q]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%q = getelementptr inbounds i32, i32* %p, i32 1
|
|
|
|
ret i32* %q
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32* @gep1_no_null_opt(i32* %p) #0 {
|
|
|
|
; Should't be able to derive nonnull based on gep.
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind null_pointer_is_valid readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@gep1_no_null_opt
|
|
|
|
; IS__TUNIT____-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1
|
|
|
|
; IS__TUNIT____-NEXT: ret i32* [[Q]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@gep1_no_null_opt
|
|
|
|
; IS__CGSCC____-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1
|
|
|
|
; IS__CGSCC____-NEXT: ret i32* [[Q]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%q = getelementptr inbounds i32, i32* %p, i32 1
|
|
|
|
ret i32* %q
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32 addrspace(3)* @gep2(i32 addrspace(3)* %p) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@gep2
|
|
|
|
; IS__TUNIT____-SAME: (i32 addrspace(3)* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32 addrspace(3)* [[P]], i32 1
|
|
|
|
; IS__TUNIT____-NEXT: ret i32 addrspace(3)* [[Q]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@gep2
|
|
|
|
; IS__CGSCC____-SAME: (i32 addrspace(3)* nofree readnone "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: [[Q:%.*]] = getelementptr inbounds i32, i32 addrspace(3)* [[P]], i32 1
|
|
|
|
; IS__CGSCC____-NEXT: ret i32 addrspace(3)* [[Q]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
%q = getelementptr inbounds i32, i32 addrspace(3)* %p, i32 1
|
|
|
|
ret i32 addrspace(3)* %q
|
|
|
|
}
|
|
|
|
|
|
|
|
; FIXME: We should propagate dereferenceable here but *not* nonnull
|
|
|
|
define i32 addrspace(3)* @as(i32 addrspace(3)* dereferenceable(4) %p) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@as
|
|
|
|
; IS__TUNIT____-SAME: (i32 addrspace(3)* nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: ret i32 addrspace(3)* [[P]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@as
|
|
|
|
; IS__CGSCC____-SAME: (i32 addrspace(3)* nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: ret i32 addrspace(3)* [[P]]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
ret i32 addrspace(3)* %p
|
|
|
|
}
|
|
|
|
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NOT: @g2()
|
2019-12-02 21:40:09 +08:00
|
|
|
define internal i32* @g2() {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@g2()
|
|
|
|
; IS__CGSCC____-NEXT: ret i32* inttoptr (i64 4 to i32*)
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
ret i32* inttoptr (i64 4 to i32*)
|
|
|
|
}
|
|
|
|
|
2020-01-12 14:17:08 +08:00
|
|
|
define i32* @g1() {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@g1()
|
|
|
|
; IS__TUNIT____-NEXT: ret i32* inttoptr (i64 4 to i32*)
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@g1()
|
|
|
|
; IS__CGSCC____-NEXT: ret i32* inttoptr (i64 4 to i32*)
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
|
|
|
%c = call i32* @g2()
|
2019-12-02 21:40:09 +08:00
|
|
|
ret i32* %c
|
|
|
|
}
|
|
|
|
|
2020-01-12 14:34:38 +08:00
|
|
|
declare void @use_i32_ptr(i32* readnone nocapture) nounwind
|
2019-12-02 21:40:09 +08:00
|
|
|
define internal void @called_by_weak(i32* %a) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@called_by_weak
|
|
|
|
; IS__TUNIT____-SAME: (i32* noalias nocapture nonnull readnone [[A:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]])
|
|
|
|
; IS__TUNIT____-NEXT: ret void
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@called_by_weak
|
|
|
|
; IS__CGSCC____-SAME: (i32* nocapture nonnull readnone [[A:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]])
|
|
|
|
; IS__CGSCC____-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @use_i32_ptr(i32* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Check we do not annotate the function interface of this weak function.
|
|
|
|
define weak_odr void @weak_caller(i32* nonnull %a) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@weak_caller
|
|
|
|
; CHECK-SAME: (i32* nonnull [[A:%.*]])
|
2020-05-04 08:08:30 +08:00
|
|
|
; CHECK-NEXT: call void @called_by_weak(i32* noalias nocapture nonnull readnone [[A]])
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @called_by_weak(i32* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Expect nonnull
|
|
|
|
define internal void @control(i32* dereferenceable(4) %a) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__TUNIT____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@control
|
|
|
|
; IS__TUNIT____-SAME: (i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A:%.*]])
|
|
|
|
; IS__TUNIT____-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A]])
|
|
|
|
; IS__TUNIT____-NEXT: ret void
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS__CGSCC____: Function Attrs: nounwind
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@control
|
|
|
|
; IS__CGSCC____-SAME: (i32* nocapture nonnull readnone align 16 dereferenceable(8) [[A:%.*]])
|
|
|
|
; IS__CGSCC____-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A]])
|
|
|
|
; IS__CGSCC____-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @use_i32_ptr(i32* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
; Avoid nonnull as we do not touch naked functions
|
|
|
|
define internal void @naked(i32* dereferenceable(4) %a) naked {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: naked
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@naked
|
|
|
|
; CHECK-SAME: (i32* dereferenceable(4) [[A:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use_i32_ptr(i32* [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @use_i32_ptr(i32* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
; Avoid nonnull as we do not touch optnone
|
|
|
|
define internal void @optnone(i32* dereferenceable(4) %a) optnone noinline {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: noinline optnone
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@optnone
|
|
|
|
; CHECK-SAME: (i32* dereferenceable(4) [[A:%.*]])
|
|
|
|
; CHECK-NEXT: call void @use_i32_ptr(i32* [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @use_i32_ptr(i32* %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
define void @make_live(i32* nonnull dereferenceable(8) %a) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@make_live
|
|
|
|
; CHECK-SAME: (i32* nonnull align 16 dereferenceable(8) [[A:%.*]])
|
|
|
|
; CHECK-NEXT: call void @naked(i32* nonnull align 16 dereferenceable(8) [[A]])
|
2020-05-04 08:08:30 +08:00
|
|
|
; CHECK-NEXT: call void @control(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A]])
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-NEXT: call void @optnone(i32* nonnull align 16 dereferenceable(8) [[A]])
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
;
|
2019-12-02 21:40:09 +08:00
|
|
|
call void @naked(i32* nonnull dereferenceable(8) align 16 %a)
|
|
|
|
call void @control(i32* nonnull dereferenceable(8) align 16 %a)
|
|
|
|
call void @optnone(i32* nonnull dereferenceable(8) align 16 %a)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2020-02-20 16:06:14 +08:00
|
|
|
|
2019-12-02 21:40:09 +08:00
|
|
|
;int f(int *u, int n){
|
|
|
|
; for(int i = 0;i<n;i++){
|
|
|
|
; h(u);
|
|
|
|
; }
|
|
|
|
; return g(nonnull u);
|
|
|
|
;}
|
|
|
|
declare void @h(i32*) willreturn nounwind
|
|
|
|
declare i32 @g(i32*) willreturn nounwind
|
|
|
|
define i32 @nonnull_exec_ctx_1(i32* %a, i32 %b) {
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS________OPM: Function Attrs: nounwind
|
|
|
|
; IS________OPM-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1
|
|
|
|
; IS________OPM-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; IS________OPM-NEXT: en:
|
|
|
|
; IS________OPM-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; IS________OPM: ex:
|
|
|
|
; IS________OPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; IS________OPM-NEXT: ret i32 [[TMP5]]
|
|
|
|
; IS________OPM: hd:
|
|
|
|
; IS________OPM-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; IS________OPM-NEXT: tail call void @h(i32* [[A]])
|
|
|
|
; IS________OPM-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; IS________OPM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
|
|
|
;
|
|
|
|
; IS________NPM: Function Attrs: nounwind willreturn
|
|
|
|
; IS________NPM-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1
|
|
|
|
; IS________NPM-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; IS________NPM-NEXT: en:
|
|
|
|
; IS________NPM-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; IS________NPM: ex:
|
|
|
|
; IS________NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; IS________NPM-NEXT: ret i32 [[TMP5]]
|
|
|
|
; IS________NPM: hd:
|
|
|
|
; IS________NPM-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; IS________NPM-NEXT: tail call void @h(i32* [[A]])
|
|
|
|
; IS________NPM-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; IS________NPM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
en:
|
|
|
|
%tmp3 = icmp eq i32 %b, 0
|
|
|
|
br i1 %tmp3, label %ex, label %hd
|
|
|
|
|
|
|
|
ex:
|
|
|
|
%tmp5 = tail call i32 @g(i32* nonnull %a)
|
|
|
|
ret i32 %tmp5
|
|
|
|
|
|
|
|
hd:
|
|
|
|
%tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ]
|
|
|
|
tail call void @h(i32* %a)
|
|
|
|
%tmp8 = add nuw i32 %tmp7, 1
|
|
|
|
%tmp9 = icmp eq i32 %tmp8, %b
|
|
|
|
br i1 %tmp9, label %ex, label %hd
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32 @nonnull_exec_ctx_1b(i32* %a, i32 %b) {
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; IS________OPM: Function Attrs: nounwind
|
|
|
|
; IS________OPM-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b
|
|
|
|
; IS________OPM-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; IS________OPM-NEXT: en:
|
|
|
|
; IS________OPM-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; IS________OPM: ex:
|
|
|
|
; IS________OPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; IS________OPM-NEXT: ret i32 [[TMP5]]
|
|
|
|
; IS________OPM: hd:
|
|
|
|
; IS________OPM-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; IS________OPM-NEXT: tail call void @h(i32* [[A]])
|
|
|
|
; IS________OPM-NEXT: br label [[HD2]]
|
|
|
|
; IS________OPM: hd2:
|
|
|
|
; IS________OPM-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; IS________OPM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
|
|
|
;
|
|
|
|
; IS________NPM: Function Attrs: nounwind willreturn
|
|
|
|
; IS________NPM-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b
|
|
|
|
; IS________NPM-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; IS________NPM-NEXT: en:
|
|
|
|
; IS________NPM-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; IS________NPM: ex:
|
|
|
|
; IS________NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; IS________NPM-NEXT: ret i32 [[TMP5]]
|
|
|
|
; IS________NPM: hd:
|
|
|
|
; IS________NPM-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; IS________NPM-NEXT: tail call void @h(i32* [[A]])
|
|
|
|
; IS________NPM-NEXT: br label [[HD2]]
|
|
|
|
; IS________NPM: hd2:
|
|
|
|
; IS________NPM-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; IS________NPM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
en:
|
|
|
|
%tmp3 = icmp eq i32 %b, 0
|
|
|
|
br i1 %tmp3, label %ex, label %hd
|
|
|
|
|
|
|
|
ex:
|
|
|
|
%tmp5 = tail call i32 @g(i32* nonnull %a)
|
|
|
|
ret i32 %tmp5
|
|
|
|
|
|
|
|
hd:
|
|
|
|
%tmp7 = phi i32 [ %tmp8, %hd2 ], [ 0, %en ]
|
|
|
|
tail call void @h(i32* %a)
|
|
|
|
br label %hd2
|
|
|
|
|
|
|
|
hd2:
|
|
|
|
%tmp8 = add nuw i32 %tmp7, 1
|
|
|
|
%tmp9 = icmp eq i32 %tmp8, %b
|
|
|
|
br i1 %tmp9, label %ex, label %hd
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32 @nonnull_exec_ctx_2(i32* %a, i32 %b) willreturn nounwind {
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2
|
|
|
|
; CHECK-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; CHECK-NEXT: en:
|
|
|
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; CHECK: ex:
|
|
|
|
; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret i32 [[TMP5]]
|
|
|
|
; CHECK: hd:
|
|
|
|
; CHECK-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; CHECK-NEXT: tail call void @h(i32* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; CHECK-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
en:
|
|
|
|
%tmp3 = icmp eq i32 %b, 0
|
|
|
|
br i1 %tmp3, label %ex, label %hd
|
|
|
|
|
|
|
|
ex:
|
|
|
|
%tmp5 = tail call i32 @g(i32* nonnull %a)
|
|
|
|
ret i32 %tmp5
|
|
|
|
|
|
|
|
hd:
|
|
|
|
%tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ]
|
|
|
|
tail call void @h(i32* %a)
|
|
|
|
%tmp8 = add nuw i32 %tmp7, 1
|
|
|
|
%tmp9 = icmp eq i32 %tmp8, %b
|
|
|
|
br i1 %tmp9, label %ex, label %hd
|
|
|
|
}
|
|
|
|
|
|
|
|
define i32 @nonnull_exec_ctx_2b(i32* %a, i32 %b) willreturn nounwind {
|
|
|
|
;
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nounwind willreturn
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b
|
|
|
|
; CHECK-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])
|
|
|
|
; CHECK-NEXT: en:
|
|
|
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0
|
|
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]
|
|
|
|
; CHECK: ex:
|
|
|
|
; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: ret i32 [[TMP5]]
|
|
|
|
; CHECK: hd:
|
|
|
|
; CHECK-NEXT: [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]
|
|
|
|
; CHECK-NEXT: tail call void @h(i32* nonnull [[A]])
|
|
|
|
; CHECK-NEXT: br label [[HD2]]
|
|
|
|
; CHECK: hd2:
|
|
|
|
; CHECK-NEXT: [[TMP8]] = add nuw i32 [[TMP7]], 1
|
|
|
|
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]
|
|
|
|
; CHECK-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
en:
|
|
|
|
%tmp3 = icmp eq i32 %b, 0
|
|
|
|
br i1 %tmp3, label %ex, label %hd
|
|
|
|
|
|
|
|
ex:
|
|
|
|
%tmp5 = tail call i32 @g(i32* nonnull %a)
|
|
|
|
ret i32 %tmp5
|
|
|
|
|
|
|
|
hd:
|
|
|
|
%tmp7 = phi i32 [ %tmp8, %hd2 ], [ 0, %en ]
|
|
|
|
tail call void @h(i32* %a)
|
|
|
|
br label %hd2
|
|
|
|
|
|
|
|
hd2:
|
|
|
|
%tmp8 = add nuw i32 %tmp7, 1
|
|
|
|
%tmp9 = icmp eq i32 %tmp8, %b
|
|
|
|
br i1 %tmp9, label %ex, label %hd
|
|
|
|
}
|
|
|
|
|
|
|
|
; Original from PR43833
|
|
|
|
declare void @sink(i32*)
|
|
|
|
|
|
|
|
; FIXME: the sink argument should be marked nonnull as in @PR43833_simple.
|
|
|
|
define void @PR43833(i32* %0, i32 %1) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@PR43833
|
|
|
|
; CHECK-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])
|
|
|
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], 1
|
|
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]
|
|
|
|
; CHECK: 4:
|
|
|
|
; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64
|
|
|
|
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]
|
|
|
|
; CHECK-NEXT: br label [[TMP8:%.*]]
|
|
|
|
; CHECK: 7:
|
|
|
|
; CHECK-NEXT: ret void
|
|
|
|
; CHECK: 8:
|
|
|
|
; CHECK-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]
|
|
|
|
; CHECK-NEXT: tail call void @sink(i32* [[TMP6]])
|
|
|
|
; CHECK-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1
|
|
|
|
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]
|
|
|
|
; CHECK-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
%3 = icmp sgt i32 %1, 1
|
|
|
|
br i1 %3, label %4, label %7
|
|
|
|
|
|
|
|
4: ; preds = %2
|
|
|
|
%5 = zext i32 %1 to i64
|
|
|
|
%6 = getelementptr inbounds i32, i32* %0, i64 %5
|
|
|
|
br label %8
|
|
|
|
|
|
|
|
7: ; preds = %8, %2
|
|
|
|
ret void
|
|
|
|
|
|
|
|
8: ; preds = %8, %4
|
|
|
|
%9 = phi i32 [ 1, %4 ], [ %10, %8 ]
|
|
|
|
tail call void @sink(i32* %6)
|
|
|
|
%10 = add nuw nsw i32 %9, 1
|
|
|
|
%11 = icmp eq i32 %10, %1
|
|
|
|
br i1 %11, label %7, label %8
|
|
|
|
}
|
|
|
|
|
|
|
|
; Adjusted from PR43833
|
|
|
|
define void @PR43833_simple(i32* %0, i32 %1) {
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS________OPM-LABEL: define {{[^@]+}}@PR43833_simple
|
|
|
|
; IS________OPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])
|
|
|
|
; IS________OPM-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]
|
|
|
|
; IS________OPM: 4:
|
|
|
|
; IS________OPM-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64
|
|
|
|
; IS________OPM-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]
|
|
|
|
; IS________OPM-NEXT: br label [[TMP8:%.*]]
|
|
|
|
; IS________OPM: 7:
|
|
|
|
; IS________OPM-NEXT: ret void
|
|
|
|
; IS________OPM: 8:
|
|
|
|
; IS________OPM-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]
|
|
|
|
; IS________OPM-NEXT: tail call void @sink(i32* [[TMP6]])
|
|
|
|
; IS________OPM-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1
|
|
|
|
; IS________OPM-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]
|
|
|
|
; IS________OPM-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]
|
|
|
|
;
|
|
|
|
; IS________NPM-LABEL: define {{[^@]+}}@PR43833_simple
|
|
|
|
; IS________NPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])
|
|
|
|
; IS________NPM-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]
|
|
|
|
; IS________NPM: 4:
|
|
|
|
; IS________NPM-NEXT: [[TMP5:%.*]] = zext i32 [[TMP1]] to i64
|
|
|
|
; IS________NPM-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]
|
|
|
|
; IS________NPM-NEXT: br label [[TMP8:%.*]]
|
|
|
|
; IS________NPM: 7:
|
|
|
|
; IS________NPM-NEXT: ret void
|
|
|
|
; IS________NPM: 8:
|
|
|
|
; IS________NPM-NEXT: [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]
|
|
|
|
; IS________NPM-NEXT: tail call void @sink(i32* nonnull [[TMP6]])
|
|
|
|
; IS________NPM-NEXT: [[TMP10]] = add nuw nsw i32 [[TMP9]], 1
|
|
|
|
; IS________NPM-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]
|
|
|
|
; IS________NPM-NEXT: br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]
|
2019-12-02 21:40:09 +08:00
|
|
|
;
|
|
|
|
%3 = icmp ne i32 %1, 0
|
|
|
|
br i1 %3, label %4, label %7
|
|
|
|
|
|
|
|
4: ; preds = %2
|
|
|
|
%5 = zext i32 %1 to i64
|
|
|
|
%6 = getelementptr inbounds i32, i32* %0, i64 %5
|
|
|
|
br label %8
|
|
|
|
|
|
|
|
7: ; preds = %8, %2
|
|
|
|
ret void
|
|
|
|
|
|
|
|
8: ; preds = %8, %4
|
|
|
|
%9 = phi i32 [ 1, %4 ], [ %10, %8 ]
|
|
|
|
tail call void @sink(i32* %6)
|
|
|
|
%10 = add nuw nsw i32 %9, 1
|
|
|
|
%11 = icmp eq i32 %10, %1
|
|
|
|
br i1 %11, label %7, label %8
|
|
|
|
}
|
|
|
|
|
2020-01-01 06:09:12 +08:00
|
|
|
declare i8* @strrchr(i8* %0, i32 %1) nofree nounwind readonly
|
|
|
|
|
|
|
|
; We should not mark the return of @strrchr as `nonnull`, it may well be NULL!
|
|
|
|
define i8* @mybasename(i8* nofree readonly %str) {
|
2020-07-20 03:55:43 +08:00
|
|
|
; CHECK: Function Attrs: nofree nounwind readonly
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; CHECK-LABEL: define {{[^@]+}}@mybasename
|
|
|
|
; CHECK-SAME: (i8* nofree readonly [[STR:%.*]])
|
|
|
|
; CHECK-NEXT: [[CALL:%.*]] = call i8* @strrchr(i8* nofree readonly [[STR]], i32 47)
|
|
|
|
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8* [[CALL]], null
|
|
|
|
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 1
|
|
|
|
; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i8* [[ADD_PTR]], i8* [[STR]]
|
|
|
|
; CHECK-NEXT: ret i8* [[COND]]
|
2020-01-01 06:09:12 +08:00
|
|
|
;
|
|
|
|
%call = call i8* @strrchr(i8* %str, i32 47)
|
|
|
|
%tobool = icmp ne i8* %call, null
|
|
|
|
%add.ptr = getelementptr inbounds i8, i8* %call, i64 1
|
|
|
|
%cond = select i1 %tobool, i8* %add.ptr, i8* %str
|
|
|
|
ret i8* %cond
|
|
|
|
}
|
|
|
|
|
2020-02-20 16:06:48 +08:00
|
|
|
define void @nonnull_assume_pos(i8* %arg) {
|
|
|
|
; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_assume_pos
|
|
|
|
; ATTRIBUTOR-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])
|
|
|
|
; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) #11 [ "nonnull"(i8* [[ARG]]) ]
|
|
|
|
; ATTRIBUTOR-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i8* @unknown()
|
|
|
|
; ATTRIBUTOR-NEXT: ret void
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
|
|
|
; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos
|
|
|
|
; NOT_CGSCC_OPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])
|
2020-08-11 09:31:30 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR11]] [ "nonnull"(i8* [[ARG]]) ]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; NOT_CGSCC_OPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; NOT_CGSCC_OPM-NEXT: [[TMP1:%.*]] = call i8* @unknown()
|
|
|
|
; NOT_CGSCC_OPM-NEXT: ret void
|
|
|
|
;
|
|
|
|
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos
|
|
|
|
; IS__CGSCC_OPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])
|
2020-08-11 09:31:30 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [[ATTR12]] [ "nonnull"(i8* [[ARG]]) ]
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
; IS__CGSCC_OPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; IS__CGSCC_OPM-NEXT: [[TMP1:%.*]] = call i8* @unknown()
|
|
|
|
; IS__CGSCC_OPM-NEXT: ret void
|
2020-02-20 16:06:48 +08:00
|
|
|
;
|
|
|
|
call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
|
|
|
|
call void @use_i8_ptr(i8* %arg)
|
|
|
|
call i8* @unknown()
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
define void @nonnull_assume_neg(i8* %arg) {
|
|
|
|
; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_assume_neg
|
|
|
|
; ATTRIBUTOR-SAME: (i8* nocapture nofree readnone [[ARG:%.*]])
|
|
|
|
; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i8* @unknown()
|
|
|
|
; ATTRIBUTOR-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[ARG]])
|
|
|
|
; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
|
|
|
|
; ATTRIBUTOR-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; ATTRIBUTOR-NEXT: [[TMP2:%.*]] = call i8* @unknown()
|
|
|
|
; ATTRIBUTOR-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
|
|
|
|
; ATTRIBUTOR-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; ATTRIBUTOR-NEXT: ret void
|
[Attributor] Unify testing (=updates,prefixes,run configurations,...)
When the Attributor was created the test update scripts were not well
suited to deal with the challenges of IR attribute checking. This
partially improved.
Since then we also added three additional configurations that need
testing; in total we now have the following four:
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }
Finally, the number of developers and tests grew rapidly (partially due
to the addition of ArgumentPromotion and IPConstantProp tests), which
resulted in tests only being run in some configurations, different
prefixes being used, and different "styles" of checks being used.
Due to the above reasons I believed we needed to take another look at
the test update scripts. While we started to use them, via UTC_ARGS:
--enable/disable, the other problems remained. To improve the testing
situation for *all* configurations, to simplify future updates to the
test, and to help identify subtle effects of future changes, we now use
the test update scripts for (almost) all Attributor tests.
An exhaustive prefix list minimizes the number of check lines and makes
it easy to identify and compare configurations.
Tests have been adjusted in the process but we tried to keep their
intend unchanged.
Reviewed By: sstefan1
Differential Revision: https://reviews.llvm.org/D76588
2020-04-09 08:04:57 +08:00
|
|
|
;
|
|
|
|
; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_neg
|
|
|
|
; CHECK-SAME: (i8* nocapture nofree readnone [[ARG:%.*]])
|
|
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call i8* @unknown()
|
|
|
|
; CHECK-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[ARG]])
|
|
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
|
|
|
|
; CHECK-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; CHECK-NEXT: [[TMP2:%.*]] = call i8* @unknown()
|
|
|
|
; CHECK-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
|
|
|
|
; CHECK-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])
|
|
|
|
; CHECK-NEXT: ret void
|
2020-02-20 16:06:48 +08:00
|
|
|
;
|
|
|
|
call i8* @unknown()
|
|
|
|
call void @use_i8_ptr(i8* %arg)
|
|
|
|
call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
|
|
|
|
call void @use_i8_ptr(i8* %arg)
|
|
|
|
call i8* @unknown()
|
|
|
|
call void @use_i8_ptr_ret(i8* %arg)
|
|
|
|
call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
|
|
|
|
call void @use_i8_ptr_ret(i8* %arg)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
declare void @use_i8_ptr(i8* nofree nocapture readnone) nounwind
|
|
|
|
declare void @use_i8_ptr_ret(i8* nofree nocapture readnone) nounwind willreturn
|
|
|
|
|
2020-08-18 08:54:42 +08:00
|
|
|
define i8* @nonnull_function_ptr_1() {
|
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@nonnull_function_ptr_1()
|
|
|
|
; IS__TUNIT____-NEXT: [[BC:%.*]] = bitcast i8* ()* @nonnull_function_ptr_1 to i8*
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[BC]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@nonnull_function_ptr_1()
|
|
|
|
; IS__CGSCC____-NEXT: [[BC:%.*]] = bitcast i8* ()* @nonnull_function_ptr_1 to i8*
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[BC]]
|
|
|
|
;
|
|
|
|
%bc = bitcast i8*()* @nonnull_function_ptr_1 to i8*
|
|
|
|
ret i8* %bc
|
|
|
|
}
|
|
|
|
|
|
|
|
declare i8* @function_decl()
|
|
|
|
define i8* @nonnull_function_ptr_2() {
|
|
|
|
; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@nonnull_function_ptr_2()
|
|
|
|
; IS__TUNIT____-NEXT: [[BC:%.*]] = bitcast i8* ()* @function_decl to i8*
|
|
|
|
; IS__TUNIT____-NEXT: ret i8* [[BC]]
|
|
|
|
;
|
|
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn
|
|
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@nonnull_function_ptr_2()
|
|
|
|
; IS__CGSCC____-NEXT: [[BC:%.*]] = bitcast i8* ()* @function_decl to i8*
|
|
|
|
; IS__CGSCC____-NEXT: ret i8* [[BC]]
|
|
|
|
;
|
|
|
|
%bc = bitcast i8*()* @function_decl to i8*
|
|
|
|
ret i8* %bc
|
|
|
|
}
|
|
|
|
|
2020-04-25 18:57:07 +08:00
|
|
|
attributes #0 = { null_pointer_is_valid }
|
2019-12-02 21:40:09 +08:00
|
|
|
attributes #1 = { nounwind willreturn}
|