[llvm] 86126db - [FunctionAttrs] Regenerate test checks (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 13 02:24:21 PDT 2022
Author: Nikita Popov
Date: 2022-10-13T11:24:07+02:00
New Revision: 86126dbc15c5110a9604814ae6f23afd1b2df72e
URL: https://github.com/llvm/llvm-project/commit/86126dbc15c5110a9604814ae6f23afd1b2df72e
DIFF: https://github.com/llvm/llvm-project/commit/86126dbc15c5110a9604814ae6f23afd1b2df72e.diff
LOG: [FunctionAttrs] Regenerate test checks (NFC)
Added:
Modified:
llvm/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll
llvm/test/Transforms/FunctionAttrs/nounwind.ll
llvm/test/Transforms/FunctionAttrs/operand-bundles-scc.ll
llvm/test/Transforms/FunctionAttrs/read-write-scc.ll
llvm/test/Transforms/FunctionAttrs/willreturn.ll
llvm/test/Transforms/FunctionAttrs/writeonly.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll b/llvm/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll
index 073fb97c8da2..b2b46f6f4974 100644
--- a/llvm/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll
+++ b/llvm/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll
@@ -1,26 +1,35 @@
-; RUN: opt -S -o - -function-attrs %s | FileCheck %s
-; RUN: opt -S -o - -passes=function-attrs %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
+; RUN: opt -S -o - -passes=function-attrs < %s | FileCheck %s
; Verify we remove argmemonly/inaccessiblememonly/inaccessiblemem_or_argmemonly
; function attributes when we derive readnone.
-; Function Attrs: argmemonly
define ptr @given_argmem_infer_readnone(ptr %p) #0 {
-; CHECK: define ptr @given_argmem_infer_readnone(ptr readnone returned %p) #0 {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
+; CHECK-LABEL: @given_argmem_infer_readnone(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret ptr [[P:%.*]]
+;
entry:
ret ptr %p
}
-; Function Attrs: inaccessiblememonly
define ptr @given_inaccessible_infer_readnone(ptr %p) #1 {
-; CHECK: define ptr @given_inaccessible_infer_readnone(ptr readnone returned %p) #0 {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
+; CHECK-LABEL: @given_inaccessible_infer_readnone(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret ptr [[P:%.*]]
+;
entry:
ret ptr %p
}
-; Function Attrs: inaccessiblemem_or_argmemonly
define ptr @given_inaccessible_or_argmem_infer_readnone(ptr %p) #2 {
-; CHECK: define ptr @given_inaccessible_or_argmem_infer_readnone(ptr readnone returned %p) #0 {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
+; CHECK-LABEL: @given_inaccessible_or_argmem_infer_readnone(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret ptr [[P:%.*]]
+;
entry:
ret ptr %p
}
@@ -28,5 +37,3 @@ entry:
attributes #0 = { argmemonly }
attributes #1 = { inaccessiblememonly }
attributes #2 = { inaccessiblemem_or_argmemonly }
-; CHECK: attributes #0 = { mustprogress nofree norecurse nosync nounwind readnone willreturn }
-; CHECK-NOT: attributes
diff --git a/llvm/test/Transforms/FunctionAttrs/nounwind.ll b/llvm/test/Transforms/FunctionAttrs/nounwind.ll
index 0b357c954bd9..7987f7477b90 100644
--- a/llvm/test/Transforms/FunctionAttrs/nounwind.ll
+++ b/llvm/test/Transforms/FunctionAttrs/nounwind.ll
@@ -1,37 +1,51 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
; RUN: opt < %s -function-attrs -S | FileCheck %s
; TEST 1
-; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone
-; CHECK-NEXT: define i32 @foo1()
define i32 @foo1() {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
+; CHECK-LABEL: define {{[^@]+}}@foo1
+; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: ret i32 1
+;
ret i32 1
}
; TEST 2
-; CHECK: Function Attrs: nofree nosync nounwind readnone
-; CHECK-NEXT: define i32 @scc1_foo()
define i32 @scc1_foo() {
+; CHECK: Function Attrs: nofree nosync nounwind readnone
+; CHECK-LABEL: define {{[^@]+}}@scc1_foo
+; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: [[TMP1:%.*]] = call i32 @scc1_bar()
+; CHECK-NEXT: ret i32 1
+;
%1 = call i32 @scc1_bar()
ret i32 1
}
; TEST 3
-; CHECK: Function Attrs: nofree nosync nounwind readnone
-; CHECK-NEXT: define i32 @scc1_bar()
define i32 @scc1_bar() {
+; CHECK: Function Attrs: nofree nosync nounwind readnone
+; CHECK-LABEL: define {{[^@]+}}@scc1_bar
+; CHECK-SAME: () #[[ATTR1]] {
+; CHECK-NEXT: [[TMP1:%.*]] = call i32 @scc1_foo()
+; CHECK-NEXT: ret i32 1
+;
%1 = call i32 @scc1_foo()
ret i32 1
}
-; CHECK: declare i32 @non_nounwind()
declare i32 @non_nounwind()
; TEST 4
-; CHECK: define void @call_non_nounwind() {
define void @call_non_nounwind(){
- tail call i32 @non_nounwind()
- ret void
+; CHECK-LABEL: define {{[^@]+}}@call_non_nounwind() {
+; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @non_nounwind()
+; CHECK-NEXT: ret void
+;
+ tail call i32 @non_nounwind()
+ ret void
}
; TEST 5 - throw
@@ -42,8 +56,16 @@ define void @call_non_nounwind(){
; return -1;
; }
-; CHECK: define i32 @maybe_throw(i1 zeroext %0)
define i32 @maybe_throw(i1 zeroext %0) {
+; CHECK-LABEL: define {{[^@]+}}@maybe_throw
+; CHECK-SAME: (i1 zeroext [[TMP0:%.*]]) {
+; CHECK-NEXT: br i1 [[TMP0]], label [[TMP2:%.*]], label [[TMP3:%.*]]
+; CHECK: 2:
+; CHECK-NEXT: tail call void @__cxa_rethrow()
+; CHECK-NEXT: unreachable
+; CHECK: 3:
+; CHECK-NEXT: ret i32 -1
+;
br i1 %0, label %2, label %3
2: ; preds = %1
@@ -65,17 +87,29 @@ declare void @__cxa_rethrow()
; return 1;
; }
-; CHECK: define i32 @catch_thing()
define i32 @catch_thing() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: define {{[^@]+}}@catch_thing() personality ptr @__gxx_personality_v0 {
+; CHECK-NEXT: invoke void @__cxa_rethrow()
+; CHECK-NEXT: to label [[TMP1:%.*]] unwind label [[TMP2:%.*]]
+; CHECK: 1:
+; CHECK-NEXT: unreachable
+; CHECK: 2:
+; CHECK-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT: catch ptr null
+; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 0
+; CHECK-NEXT: [[TMP5:%.*]] = tail call ptr @__cxa_begin_catch(ptr [[TMP4]])
+; CHECK-NEXT: tail call void @__cxa_end_catch()
+; CHECK-NEXT: ret i32 -1
+;
invoke void @__cxa_rethrow() #1
- to label %1 unwind label %2
+ to label %1 unwind label %2
1: ; preds = %0
unreachable
2: ; preds = %0
%3 = landingpad { ptr, i32 }
- catch ptr null
+ catch ptr null
%4 = extractvalue { ptr, i32 } %3, 0
%5 = tail call ptr @__cxa_begin_catch(ptr %4) #2
tail call void @__cxa_end_catch()
@@ -83,6 +117,10 @@ define i32 @catch_thing() personality ptr @__gxx_personality_v0 {
}
define i32 @catch_thing_user() {
+; CHECK-LABEL: define {{[^@]+}}@catch_thing_user() {
+; CHECK-NEXT: [[CATCH_THING_CALL:%.*]] = call i32 @catch_thing()
+; CHECK-NEXT: ret i32 [[CATCH_THING_CALL]]
+;
%catch_thing_call = call i32 @catch_thing()
ret i32 %catch_thing_call
}
diff --git a/llvm/test/Transforms/FunctionAttrs/operand-bundles-scc.ll b/llvm/test/Transforms/FunctionAttrs/operand-bundles-scc.ll
index 92384a60dbda..c1aa14b88f0a 100644
--- a/llvm/test/Transforms/FunctionAttrs/operand-bundles-scc.ll
+++ b/llvm/test/Transforms/FunctionAttrs/operand-bundles-scc.ll
@@ -1,17 +1,24 @@
-; RUN: opt -S -function-attrs < %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
; RUN: opt -S -passes=function-attrs < %s | FileCheck %s
define void @f() {
-; CHECK-LABEL: define void @f() #0 {
- call void @g() [ "unknown"() ]
- ret void
+; CHECK: Function Attrs: nofree nosync nounwind
+; CHECK-LABEL: define {{[^@]+}}@f
+; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: call void @g() [ "unknown"() ]
+; CHECK-NEXT: ret void
+;
+ call void @g() [ "unknown"() ]
+ ret void
}
define void @g() {
-; CHECK-LABEL: define void @g() #0 {
- call void @f()
- ret void
+; CHECK: Function Attrs: nofree nosync nounwind
+; CHECK-LABEL: define {{[^@]+}}@g
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT: call void @f()
+; CHECK-NEXT: ret void
+;
+ call void @f()
+ ret void
}
-
-
-; CHECK: attributes #0 = { nofree nosync nounwind }
diff --git a/llvm/test/Transforms/FunctionAttrs/read-write-scc.ll b/llvm/test/Transforms/FunctionAttrs/read-write-scc.ll
index 788570c84ce6..3640eb59b884 100644
--- a/llvm/test/Transforms/FunctionAttrs/read-write-scc.ll
+++ b/llvm/test/Transforms/FunctionAttrs/read-write-scc.ll
@@ -1,20 +1,30 @@
-; RUN: opt -S -function-attrs < %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
; RUN: opt -S -passes=function-attrs < %s | FileCheck %s
@i = global i32 0
define void @foo() {
-; CHECK-LABEL: define void @foo() #0 {
+; CHECK: Function Attrs: nofree nosync nounwind
+; CHECK-LABEL: define {{[^@]+}}@foo
+; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: store i32 1, ptr @i, align 4
+; CHECK-NEXT: call void @bar()
+; CHECK-NEXT: ret void
+;
store i32 1, ptr @i
call void @bar()
ret void
}
define void @bar() {
-; CHECK-LABEL: define void @bar() #0 {
+; CHECK: Function Attrs: nofree nosync nounwind
+; CHECK-LABEL: define {{[^@]+}}@bar
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT: [[I:%.*]] = load i32, ptr @i, align 4
+; CHECK-NEXT: call void @foo()
+; CHECK-NEXT: ret void
+;
%i = load i32, ptr @i
call void @foo()
ret void
}
-
-; CHECK: attributes #0 = { nofree nosync nounwind }
diff --git a/llvm/test/Transforms/FunctionAttrs/willreturn.ll b/llvm/test/Transforms/FunctionAttrs/willreturn.ll
index f45f59f82e46..3413b9655619 100644
--- a/llvm/test/Transforms/FunctionAttrs/willreturn.ll
+++ b/llvm/test/Transforms/FunctionAttrs/willreturn.ll
@@ -1,8 +1,13 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
; RUN: opt -function-attrs -S %s | FileCheck %s
define void @mustprogress_readnone() mustprogress {
-; CHECK: Function Attrs: {{.*}} noreturn {{.*}} readnone willreturn
-; CHECK-NEXT: define void @mustprogress_readnone()
+; CHECK: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind readnone willreturn
+; CHECK-LABEL: @mustprogress_readnone(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
+; CHECK: while.body:
+; CHECK-NEXT: br label [[WHILE_BODY]]
;
entry:
br label %while.body
@@ -12,8 +17,13 @@ while.body:
}
define i32 @mustprogress_load(ptr %ptr) mustprogress {
-; CHECK: Function Attrs: {{.*}} readonly willreturn
-; CHECK-NEXT: define i32 @mustprogress_load(
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse noreturn nosync nounwind readonly willreturn
+; CHECK-LABEL: @mustprogress_load(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
+; CHECK: while.body:
+; CHECK-NEXT: [[R:%.*]] = load i32, ptr [[PTR:%.*]], align 4
+; CHECK-NEXT: br label [[WHILE_BODY]]
;
entry:
br label %while.body
@@ -24,8 +34,13 @@ while.body:
}
define void @mustprogress_store(ptr %ptr) mustprogress {
-; CHECK-NOT: Function Attrs: {{.*}} willreturn
-; CHECK: define void @mustprogress_store(
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse noreturn nosync nounwind writeonly
+; CHECK-LABEL: @mustprogress_store(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
+; CHECK: while.body:
+; CHECK-NEXT: store i32 0, ptr [[PTR:%.*]], align 4
+; CHECK-NEXT: br label [[WHILE_BODY]]
;
entry:
br label %while.body
@@ -38,16 +53,21 @@ while.body:
declare void @unknown_fn()
define void @mustprogress_call_unknown_fn() mustprogress {
-; CHECK-NOT: Function Attrs: {{.*}} willreturn
-; CHECK: define void @mustprogress_call_unknown_fn(
+; CHECK: Function Attrs: mustprogress
+; CHECK-LABEL: @mustprogress_call_unknown_fn(
+; CHECK-NEXT: call void @unknown_fn()
+; CHECK-NEXT: ret void
;
call void @unknown_fn()
ret void
}
define i32 @mustprogress_call_known_functions(ptr %ptr) mustprogress {
-; CHECK: Function Attrs: {{.*}} readonly willreturn
-; CHECK-NEXT: define i32 @mustprogress_call_known_functions(
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse noreturn nosync nounwind readonly willreturn
+; CHECK-LABEL: @mustprogress_call_known_functions(
+; CHECK-NEXT: call void @mustprogress_readnone()
+; CHECK-NEXT: [[R:%.*]] = call i32 @mustprogress_load(ptr [[PTR:%.*]])
+; CHECK-NEXT: ret i32 [[R]]
;
call void @mustprogress_readnone()
%r = call i32 @mustprogress_load(ptr %ptr)
@@ -57,24 +77,42 @@ define i32 @mustprogress_call_known_functions(ptr %ptr) mustprogress {
declare i32 @__gxx_personality_v0(...)
define i64 @mustprogress_mayunwind() mustprogress personality ptr @__gxx_personality_v0 {
-; CHECK: Function Attrs: {{.*}} readnone willreturn
-; CHECK-NEXT: define i64 @mustprogress_mayunwind(
+; CHECK: Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
+; CHECK-LABEL: @mustprogress_mayunwind(
+; CHECK-NEXT: [[A:%.*]] = invoke i64 @fn_noread()
+; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]]
+; CHECK: A:
+; CHECK-NEXT: ret i64 10
+; CHECK: B:
+; CHECK-NEXT: [[VAL:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT: catch ptr null
+; CHECK-NEXT: ret i64 0
;
%a = invoke i64 @fn_noread()
- to label %A unwind label %B
+ to label %A unwind label %B
A:
ret i64 10
B:
%val = landingpad { ptr, i32 }
- catch ptr null
+ catch ptr null
ret i64 0
}
; Function without loops or non-willreturn calls will return.
define void @willreturn_no_loop(i1 %c, ptr %p) {
; CHECK: Function Attrs: mustprogress willreturn
-; CHECK-NEXT: define void @willreturn_no_loop(
+; CHECK-LABEL: @willreturn_no_loop(
+; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK: if:
+; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[P:%.*]] seq_cst, align 4
+; CHECK-NEXT: call void @fn_willreturn()
+; CHECK-NEXT: br label [[END:%.*]]
+; CHECK: else:
+; CHECK-NEXT: store atomic i32 0, ptr [[P]] seq_cst, align 4
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: ret void
;
br i1 %c, label %if, label %else
@@ -93,8 +131,9 @@ end:
; Calls a function that is not guaranteed to return, not willreturn.
define void @willreturn_non_returning_function(i1 %c, ptr %p) {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define void @willreturn_non_returning_function(
+; CHECK-LABEL: @willreturn_non_returning_function(
+; CHECK-NEXT: call void @unknown_fn()
+; CHECK-NEXT: ret void
;
call void @unknown_fn()
ret void
@@ -102,8 +141,11 @@ define void @willreturn_non_returning_function(i1 %c, ptr %p) {
; Infinite loop without mustprogress, will not return.
define void @willreturn_loop() {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define void @willreturn_loop(
+; CHECK: Function Attrs: nofree norecurse noreturn nosync nounwind readnone
+; CHECK-LABEL: @willreturn_loop(
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: br label [[LOOP]]
;
br label %loop
@@ -114,8 +156,17 @@ loop:
; Finite loop. Could be willreturn but not detected.
; FIXME
define void @willreturn_finite_loop() {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define void @willreturn_finite_loop(
+; CHECK: Function Attrs: nofree norecurse nosync nounwind readnone
+; CHECK-LABEL: @willreturn_finite_loop(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_INC:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[I_INC]] = add nuw i32 [[I]], 1
+; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[I_INC]], 100
+; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[END:%.*]]
+; CHECK: end:
+; CHECK-NEXT: ret void
;
entry:
br label %loop
@@ -132,8 +183,10 @@ end:
; Infinite recursion without mustprogress, will not return.
define void @willreturn_recursion() {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define void @willreturn_recursion(
+; CHECK: Function Attrs: nofree nosync nounwind readnone
+; CHECK-LABEL: @willreturn_recursion(
+; CHECK-NEXT: tail call void @willreturn_recursion()
+; CHECK-NEXT: ret void
;
tail call void @willreturn_recursion()
ret void
@@ -141,8 +194,13 @@ define void @willreturn_recursion() {
; Irreducible infinite loop, will not return.
define void @willreturn_irreducible(i1 %c) {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define void @willreturn_irreducible(
+; CHECK: Function Attrs: nofree norecurse noreturn nosync nounwind readnone
+; CHECK-LABEL: @willreturn_irreducible(
+; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: br label [[BB2]]
+; CHECK: bb2:
+; CHECK-NEXT: br label [[BB1]]
;
br i1 %c, label %bb1, label %bb2
@@ -154,10 +212,12 @@ bb2:
}
define linkonce i32 @square(i32) {
-; CHECK-NOT: Function Attrs: {{.*}}willreturn
-; CHECK: define linkonce i32 @square(
- %2 = mul nsw i32 %0, %0
- ret i32 %2
+; CHECK-LABEL: @square(
+; CHECK-NEXT: [[TMP2:%.*]] = mul nsw i32 [[TMP0:%.*]], [[TMP0]]
+; CHECK-NEXT: ret i32 [[TMP2]]
+;
+ %2 = mul nsw i32 %0, %0
+ ret i32 %2
}
declare i64 @fn_noread() readnone
diff --git a/llvm/test/Transforms/FunctionAttrs/writeonly.ll b/llvm/test/Transforms/FunctionAttrs/writeonly.ll
index ea9007758ef0..7828d2f81bb1 100644
--- a/llvm/test/Transforms/FunctionAttrs/writeonly.ll
+++ b/llvm/test/Transforms/FunctionAttrs/writeonly.ll
@@ -1,14 +1,25 @@
-; RUN: opt < %s -function-attrs -S | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
; RUN: opt < %s -passes=function-attrs -S | FileCheck %s
-; CHECK: define void @nouses-argworn-funrn(ptr nocapture readnone %.aaa) #0 {
define void @nouses-argworn-funrn(ptr writeonly %.aaa) {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn
+; CHECK-LABEL: define {{[^@]+}}@nouses-argworn-funrn
+; CHECK-SAME: (ptr nocapture readnone [[DOTAAA:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: nouses-argworn-funrn_entry:
+; CHECK-NEXT: ret void
+;
nouses-argworn-funrn_entry:
ret void
}
-; CHECK: define void @nouses-argworn-funro(ptr nocapture readnone %.aaa, ptr nocapture readonly %.bbb) #1 {
define void @nouses-argworn-funro(ptr writeonly %.aaa, ptr %.bbb) {
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse nosync nounwind readonly willreturn
+; CHECK-LABEL: define {{[^@]+}}@nouses-argworn-funro
+; CHECK-SAME: (ptr nocapture readnone [[DOTAAA:%.*]], ptr nocapture readonly [[DOTBBB:%.*]]) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: nouses-argworn-funro_entry:
+; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[DOTBBB]], align 4
+; CHECK-NEXT: ret void
+;
nouses-argworn-funro_entry:
%val = load i32 , ptr %.bbb
ret void
@@ -18,50 +29,90 @@ nouses-argworn-funro_entry:
@d-ccc = internal global %_type_of_d-ccc <{ ptr null, i8 1, i8 13, i8 0, i8 -127 }>, align 8
-; CHECK: define void @nouses-argworn-funwo(ptr nocapture readnone %.aaa) #2 {
define void @nouses-argworn-funwo(ptr writeonly %.aaa) {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly
+; CHECK-LABEL: define {{[^@]+}}@nouses-argworn-funwo
+; CHECK-SAME: (ptr nocapture readnone [[DOTAAA:%.*]]) #[[ATTR2:[0-9]+]] {
+; CHECK-NEXT: nouses-argworn-funwo_entry:
+; CHECK-NEXT: store i8 0, ptr getelementptr inbounds ([[_TYPE_OF_D_CCC:%.*]], ptr @d-ccc, i32 0, i32 3), align 1
+; CHECK-NEXT: ret void
+;
nouses-argworn-funwo_entry:
store i8 0, ptr getelementptr inbounds (%_type_of_d-ccc, ptr @d-ccc, i32 0, i32 3)
ret void
}
-; CHECK: define void @test_store(ptr nocapture writeonly %p)
define void @test_store(ptr %p) {
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse nosync nounwind willreturn writeonly
+; CHECK-LABEL: define {{[^@]+}}@test_store
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]]) #[[ATTR3:[0-9]+]] {
+; CHECK-NEXT: store i8 0, ptr [[P]], align 1
+; CHECK-NEXT: ret void
+;
store i8 0, ptr %p
ret void
}
@G = external global ptr
-; CHECK: define i8 @test_store_capture(ptr %p)
define i8 @test_store_capture(ptr %p) {
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
+; CHECK-LABEL: define {{[^@]+}}@test_store_capture
+; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR4:[0-9]+]] {
+; CHECK-NEXT: store ptr [[P]], ptr @G, align 8
+; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr @G, align 8
+; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[P2]], align 1
+; CHECK-NEXT: ret i8 [[V]]
+;
store ptr %p, ptr @G
%p2 = load ptr, ptr @G
%v = load i8, ptr %p2
ret i8 %v
}
-; CHECK: define void @test_addressing(ptr nocapture writeonly %p)
define void @test_addressing(ptr %p) {
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse nosync nounwind willreturn writeonly
+; CHECK-LABEL: define {{[^@]+}}@test_addressing
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]]) #[[ATTR3]] {
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 8
+; CHECK-NEXT: store i32 0, ptr [[GEP]], align 4
+; CHECK-NEXT: ret void
+;
%gep = getelementptr i8, ptr %p, i64 8
store i32 0, ptr %gep
ret void
}
-; CHECK: define void @test_readwrite(ptr nocapture %p)
define void @test_readwrite(ptr %p) {
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse nosync nounwind willreturn
+; CHECK-LABEL: define {{[^@]+}}@test_readwrite
+; CHECK-SAME: (ptr nocapture [[P:%.*]]) #[[ATTR5:[0-9]+]] {
+; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[P]], align 1
+; CHECK-NEXT: store i8 [[V]], ptr [[P]], align 1
+; CHECK-NEXT: ret void
+;
%v = load i8, ptr %p
store i8 %v, ptr %p
ret void
}
-; CHECK: define void @test_volatile(ptr %p)
define void @test_volatile(ptr %p) {
+; CHECK: Function Attrs: argmemonly nofree norecurse nounwind
+; CHECK-LABEL: define {{[^@]+}}@test_volatile
+; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR6:[0-9]+]] {
+; CHECK-NEXT: store volatile i8 0, ptr [[P]], align 1
+; CHECK-NEXT: ret void
+;
store volatile i8 0, ptr %p
ret void
}
-; CHECK: define void @test_atomicrmw(ptr nocapture %p)
define void @test_atomicrmw(ptr %p) {
+; CHECK: Function Attrs: argmemonly mustprogress nofree norecurse nounwind willreturn
+; CHECK-LABEL: define {{[^@]+}}@test_atomicrmw
+; CHECK-SAME: (ptr nocapture [[P:%.*]]) #[[ATTR7:[0-9]+]] {
+; CHECK-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[P]], i8 0 seq_cst, align 1
+; CHECK-NEXT: ret void
+;
atomicrmw add ptr %p, i8 0 seq_cst
ret void
}
@@ -69,8 +120,12 @@ define void @test_atomicrmw(ptr %p) {
declare void @direct1_callee(ptr %p)
-; CHECK: define void @direct1(ptr %p)
define void @direct1(ptr %p) {
+; CHECK-LABEL: define {{[^@]+}}@direct1
+; CHECK-SAME: (ptr [[P:%.*]]) {
+; CHECK-NEXT: call void @direct1_callee(ptr [[P]])
+; CHECK-NEXT: ret void
+;
call void @direct1_callee(ptr %p)
ret void
}
@@ -78,51 +133,78 @@ define void @direct1(ptr %p) {
declare void @direct2_callee(ptr %p) writeonly
; writeonly w/o nocapture is not enough
-; CHECK: define void @direct2(ptr %p)
define void @direct2(ptr %p) {
+; CHECK: Function Attrs: writeonly
+; CHECK-LABEL: define {{[^@]+}}@direct2
+; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR8:[0-9]+]] {
+; CHECK-NEXT: call void @direct2_callee(ptr [[P]])
+; CHECK-NEXT: ret void
+;
call void @direct2_callee(ptr %p)
; read back from global, read through pointer...
ret void
}
-; CHECK: define void @direct2b(ptr nocapture writeonly %p)
define void @direct2b(ptr %p) {
+; CHECK: Function Attrs: writeonly
+; CHECK-LABEL: define {{[^@]+}}@direct2b
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]]) #[[ATTR8]] {
+; CHECK-NEXT: call void @direct2_callee(ptr nocapture [[P]])
+; CHECK-NEXT: ret void
+;
call void @direct2_callee(ptr nocapture %p)
ret void
}
declare void @direct3_callee(ptr nocapture writeonly %p)
-; CHECK: define void @direct3(ptr nocapture writeonly %p)
define void @direct3(ptr %p) {
+; CHECK-LABEL: define {{[^@]+}}@direct3
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]]) {
+; CHECK-NEXT: call void @direct3_callee(ptr [[P]])
+; CHECK-NEXT: ret void
+;
call void @direct3_callee(ptr %p)
ret void
}
-; CHECK: define void @direct3b(ptr %p)
define void @direct3b(ptr %p) {
+; CHECK-LABEL: define {{[^@]+}}@direct3b
+; CHECK-SAME: (ptr [[P:%.*]]) {
+; CHECK-NEXT: call void @direct3_callee(ptr [[P]]) [ "may-read-and-capture"(ptr [[P]]) ]
+; CHECK-NEXT: ret void
+;
call void @direct3_callee(ptr %p) ["may-read-and-capture"(ptr %p)]
ret void
}
-; CHECK: define void @fptr_test1(ptr %p, ptr nocapture readonly %f)
define void @fptr_test1(ptr %p, ptr %f) {
+; CHECK-LABEL: define {{[^@]+}}@fptr_test1
+; CHECK-SAME: (ptr [[P:%.*]], ptr nocapture readonly [[F:%.*]]) {
+; CHECK-NEXT: call void [[F]](ptr [[P]])
+; CHECK-NEXT: ret void
+;
call void %f(ptr %p)
ret void
}
-; CHECK: define void @fptr_test2(ptr nocapture writeonly %p, ptr nocapture readonly %f)
define void @fptr_test2(ptr %p, ptr %f) {
+; CHECK-LABEL: define {{[^@]+}}@fptr_test2
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]], ptr nocapture readonly [[F:%.*]]) {
+; CHECK-NEXT: call void [[F]](ptr nocapture writeonly [[P]])
+; CHECK-NEXT: ret void
+;
call void %f(ptr nocapture writeonly %p)
ret void
}
-; CHECK: define void @fptr_test3(ptr nocapture writeonly %p, ptr nocapture readonly %f)
define void @fptr_test3(ptr %p, ptr %f) {
+; CHECK: Function Attrs: writeonly
+; CHECK-LABEL: define {{[^@]+}}@fptr_test3
+; CHECK-SAME: (ptr nocapture writeonly [[P:%.*]], ptr nocapture readonly [[F:%.*]]) #[[ATTR8]] {
+; CHECK-NEXT: call void [[F]](ptr nocapture [[P]]) #[[ATTR8]]
+; CHECK-NEXT: ret void
+;
call void %f(ptr nocapture %p) writeonly
ret void
}
-
-; CHECK: attributes #0 = { {{.*}}readnone{{.*}} }
-; CHECK: attributes #1 = { {{.*}}readonly{{.*}} }
-; CHECK: attributes #2 = { {{.*}}writeonly{{.*}} }
More information about the llvm-commits
mailing list