[Attributor][NFC] Precommit test

This commit is contained in:
Johannes Doerfert 2023-08-23 09:07:04 -07:00
parent b90d6b237f
commit 81a02b0767
2 changed files with 92 additions and 13 deletions

View File

@ -19,6 +19,7 @@ declare noalias ptr @calloc(i64, i64) allockind("alloc,zeroed") allocsize(0, 1)
; CHECK: @[[GINT3:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 undef, align 4
; CHECK: @[[GINT4:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 0, align 4
; CHECK: @[[GINT5:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 undef, align 4
; CHECK: @[[B:[a-zA-Z0-9_$"\\.-]+]] = global i32 0
;.
define internal void @write1ToGInt1() {
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
@ -48,7 +49,7 @@ define void @entry1(i1 %c, i32 %v) {
; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5:[0-9]+]] {
; TUNIT-NEXT: [[L0:%.*]] = load i32, ptr @GInt1, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L0]])
; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR10:[0-9]+]]
; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR11:[0-9]+]]
; TUNIT-NEXT: [[L1:%.*]] = load i32, ptr @GInt1, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L1]])
; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
@ -60,7 +61,7 @@ define void @entry1(i1 %c, i32 %v) {
; TUNIT: F:
; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt1, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L3]])
; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR10]]
; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR11]]
; TUNIT-NEXT: [[L4:%.*]] = load i32, ptr @GInt1, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L4]])
; TUNIT-NEXT: ret void
@ -70,7 +71,7 @@ define void @entry1(i1 %c, i32 %v) {
; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5:[0-9]+]] {
; CGSCC-NEXT: [[L0:%.*]] = load i32, ptr @GInt1, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L0]])
; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR10:[0-9]+]]
; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR13:[0-9]+]]
; CGSCC-NEXT: [[L1:%.*]] = load i32, ptr @GInt1, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L1]])
; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
@ -82,7 +83,7 @@ define void @entry1(i1 %c, i32 %v) {
; CGSCC: F:
; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt1, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L3]])
; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR10]]
; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR13]]
; CGSCC-NEXT: [[L4:%.*]] = load i32, ptr @GInt1, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L4]])
; CGSCC-NEXT: ret void
@ -113,7 +114,7 @@ define void @entry2(i1 %c, i32 %v) {
; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {
; TUNIT-NEXT: [[L0:%.*]] = load i32, ptr @GInt2, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L0]])
; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR10]]
; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR11]]
; TUNIT-NEXT: [[L1:%.*]] = load i32, ptr @GInt2, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L1]])
; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
@ -125,7 +126,7 @@ define void @entry2(i1 %c, i32 %v) {
; TUNIT: F:
; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt2, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L3]])
; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR10]]
; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR11]]
; TUNIT-NEXT: [[L4:%.*]] = load i32, ptr @GInt2, align 4
; TUNIT-NEXT: call void @useI32(i32 [[L4]])
; TUNIT-NEXT: ret void
@ -135,7 +136,7 @@ define void @entry2(i1 %c, i32 %v) {
; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {
; CGSCC-NEXT: [[L0:%.*]] = load i32, ptr @GInt2, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L0]])
; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR10]]
; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR13]]
; CGSCC-NEXT: [[L1:%.*]] = load i32, ptr @GInt2, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L1]])
; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
@ -147,7 +148,7 @@ define void @entry2(i1 %c, i32 %v) {
; CGSCC: F:
; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt2, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L3]])
; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR10]]
; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR13]]
; CGSCC-NEXT: [[L4:%.*]] = load i32, ptr @GInt2, align 4
; CGSCC-NEXT: call void @useI32(i32 [[L4]])
; CGSCC-NEXT: ret void
@ -790,6 +791,75 @@ define i32 @exclusion_set3(i1 %c) {
ret i32 %final
}
@B = global i32 0
define internal i32 @readI32(ptr %a) {
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none)
; TUNIT-LABEL: define {{[^@]+}}@readI32
; TUNIT-SAME: () #[[ATTR9:[0-9]+]] {
; TUNIT-NEXT: store i32 1, ptr @B, align 4
; TUNIT-NEXT: ret i32 undef
;
; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
; CGSCC-LABEL: define {{[^@]+}}@readI32
; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR9:[0-9]+]] {
; CGSCC-NEXT: [[R:%.*]] = load i32, ptr [[A]], align 4
; CGSCC-NEXT: store i32 1, ptr @B, align 4
; CGSCC-NEXT: ret i32 [[R]]
;
%r = load i32, ptr %a
store i32 1, ptr @B
ret i32 %r
}
define internal i32 @broker(ptr %a) {
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none)
; TUNIT-LABEL: define {{[^@]+}}@broker
; TUNIT-SAME: () #[[ATTR9]] {
; TUNIT-NEXT: [[R:%.*]] = call i32 @readI32() #[[ATTR12:[0-9]+]]
; TUNIT-NEXT: ret i32 undef
;
; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(readwrite, argmem: none)
; CGSCC-LABEL: define {{[^@]+}}@broker
; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] {
; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca i32, align 4
; CGSCC-NEXT: store i32 [[TMP0]], ptr [[A_PRIV]], align 4
; CGSCC-NEXT: [[R:%.*]] = call i32 @readI32(ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_PRIV]]) #[[ATTR14:[0-9]+]]
; CGSCC-NEXT: ret i32 [[R]]
;
%r = call i32 @readI32(ptr %a)
ret i32 %r
}
; FIXME: This function should return 1, not 0
define i32 @two_calls() {
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
; TUNIT-LABEL: define {{[^@]+}}@two_calls
; TUNIT-SAME: () #[[ATTR4]] {
; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4
; TUNIT-NEXT: [[D:%.*]] = call i32 @broker() #[[ATTR12]]
; TUNIT-NEXT: [[R:%.*]] = call i32 @broker() #[[ATTR12]]
; TUNIT-NEXT: ret i32 0
;
; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn
; CGSCC-LABEL: define {{[^@]+}}@two_calls
; CGSCC-SAME: () #[[ATTR11:[0-9]+]] {
; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4
; CGSCC-NEXT: store i32 0, ptr [[A]], align 4
; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr [[A]], align 4
; CGSCC-NEXT: [[D:%.*]] = call i32 @broker(i32 noundef [[TMP1]]) #[[ATTR14]]
; CGSCC-NEXT: store i32 1, ptr [[A]], align 4
; CGSCC-NEXT: [[R:%.*]] = call i32 @broker(i32 noundef 1) #[[ATTR14]]
; CGSCC-NEXT: ret i32 [[R]]
;
%a = alloca i32
store i32 0, ptr %a
%d = call i32 @broker(ptr %a)
store i32 1, ptr %a
%r = call i32 @broker(ptr %a)
ret i32 %r
}
;.
; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync }
@ -800,8 +870,10 @@ define i32 @exclusion_set3(i1 %c) {
; TUNIT: attributes #[[ATTR6]] = { nocallback }
; TUNIT: attributes #[[ATTR7]] = { norecurse }
; TUNIT: attributes #[[ATTR8]] = { nosync }
; TUNIT: attributes #[[ATTR9:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
; TUNIT: attributes #[[ATTR10]] = { nosync nounwind memory(write) }
; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none) }
; TUNIT: attributes #[[ATTR10:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
; TUNIT: attributes #[[ATTR11]] = { nosync nounwind memory(write) }
; TUNIT: attributes #[[ATTR12]] = { nofree nosync nounwind willreturn memory(write) }
;.
; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
; CGSCC: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync }
@ -812,6 +884,10 @@ define i32 @exclusion_set3(i1 %c) {
; CGSCC: attributes #[[ATTR6]] = { norecurse nosync }
; CGSCC: attributes #[[ATTR7]] = { nocallback }
; CGSCC: attributes #[[ATTR8]] = { norecurse }
; CGSCC: attributes #[[ATTR9:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
; CGSCC: attributes #[[ATTR10]] = { nounwind memory(write) }
; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn }
; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree nosync nounwind willreturn memory(readwrite, argmem: none) }
; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree nosync nounwind willreturn }
; CGSCC: attributes #[[ATTR12:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
; CGSCC: attributes #[[ATTR13]] = { nounwind memory(write) }
; CGSCC: attributes #[[ATTR14]] = { nofree nounwind willreturn }
;.

View File

@ -20,6 +20,8 @@
// CHECK-NOT: define
#include <omp.h>
#include <stdio.h>
void f(long *A, int N) {
long i = 0;
#pragma omp target map(A[ : N])
@ -34,5 +36,6 @@ void f(long *A, int N) {
int main() {
long A[1];
f(&A[0], 1);
return A[0];
printf("%li\n", A[0]);
return 0;
}