diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -1670,8 +1670,10 @@ ///===-------------------------- Other Intrinsics --------------------------===// // -def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>, - ClangBuiltin<"__builtin_trap">; +// TODO: We should introduce a new memory kind fo traps (and other side effects +// we only model to keep things alive). +def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold, IntrInaccessibleMemOnly, + IntrWriteMem]>, ClangBuiltin<"__builtin_trap">; def int_debugtrap : Intrinsic<[]>, ClangBuiltin<"__builtin_debugtrap">; def int_ubsantrap : Intrinsic<[], [llvm_i8_ty], diff --git a/llvm/test/Feature/intrinsics.ll b/llvm/test/Feature/intrinsics.ll --- a/llvm/test/Feature/intrinsics.ll +++ b/llvm/test/Feature/intrinsics.ll @@ -70,4 +70,4 @@ } ; CHECK: attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } -; CHECK: attributes #1 = { cold noreturn nounwind } +; CHECK: attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) } diff --git a/llvm/test/Transforms/Attributor/cgscc_bugs.ll b/llvm/test/Transforms/Attributor/cgscc_bugs.ll --- a/llvm/test/Transforms/Attributor/cgscc_bugs.ll +++ b/llvm/test/Transforms/Attributor/cgscc_bugs.ll @@ -23,7 +23,7 @@ ; CHECK-SAME: (i64 [[TMP0:%.*]]) align 2 { ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @f4() ; CHECK-NEXT: [[TMP3:%.*]] = zext i32 [[TMP2]] to i64 -; CHECK-NEXT: call void @f5(i64 [[TMP3]], i64 [[TMP0]]) #[[ATTR0:[0-9]+]] +; CHECK-NEXT: call void @f5(i64 [[TMP3]], i64 [[TMP0]]) #[[ATTR2:[0-9]+]] ; CHECK-NEXT: ret { ptr, i64 } undef ; %2 = call i32 @f4() @@ -40,18 +40,18 @@ } define internal void @f5(i64 %0, i64 %1) { -; CHECK: Function Attrs: nounwind +; CHECK: Function Attrs: nounwind memory(inaccessiblemem: write) ; CHECK-LABEL: define {{[^@]+}}@f5 -; CHECK-SAME: (i64 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0]] { +; CHECK-SAME: (i64 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: br label [[TMP3:%.*]] ; CHECK: 3: -; CHECK-NEXT: call void @f6(i64 [[TMP0]]) #[[ATTR0]] +; CHECK-NEXT: call void @f6(i64 [[TMP0]]) #[[ATTR2]] ; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i64 [[TMP1]], [[TMP0]] ; CHECK-NEXT: br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP6:%.*]] ; CHECK: 5: ; CHECK-NEXT: ret void ; CHECK: 6: -; CHECK-NEXT: call void @f5(i64 [[TMP0]], i64 [[TMP1]]) #[[ATTR0]] +; CHECK-NEXT: call void @f5(i64 [[TMP0]], i64 [[TMP1]]) #[[ATTR2]] ; CHECK-NEXT: br label [[TMP3]] ; br label %3 @@ -70,13 +70,13 @@ } define internal void @f6(i64 %0) { -; CHECK: Function Attrs: nounwind +; CHECK: Function Attrs: nounwind memory(inaccessiblemem: write) ; CHECK-LABEL: define {{[^@]+}}@f6 ; CHECK-SAME: (i64 [[TMP0:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], 0 ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] ; CHECK: 3: -; CHECK-NEXT: call void @llvm.trap() #[[ATTR2:[0-9]+]] +; CHECK-NEXT: call void @llvm.trap() #[[ATTR3:[0-9]+]] ; CHECK-NEXT: unreachable ; CHECK: 4: ; CHECK-NEXT: ret void @@ -98,9 +98,10 @@ attributes #0 = { cold noreturn nounwind } ;. -; CHECK: attributes #[[ATTR0]] = { nounwind } -; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind } -; CHECK: attributes #[[ATTR2]] = { noreturn } +; CHECK: attributes #[[ATTR0]] = { nounwind memory(inaccessiblemem: write) } +; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } +; CHECK: attributes #[[ATTR2]] = { nounwind memory(write) } +; CHECK: attributes #[[ATTR3]] = { noreturn memory(write) } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll b/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll --- a/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll +++ b/llvm/test/Transforms/LowerGlobalDestructors/non-literal-type.ll @@ -32,5 +32,5 @@ ; CHECK-NEXT: ret void ; ;. -; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind } +; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } ;. diff --git a/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll b/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll --- a/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll +++ b/llvm/test/Transforms/SimplifyCFG/switch-on-const-select.ll @@ -158,4 +158,4 @@ declare void @bees.a() nounwind declare void @bees.b() nounwind -; CHECK: attributes #1 = { cold noreturn nounwind } +; CHECK: attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) } diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll @@ -32,5 +32,5 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected @@ -33,7 +33,7 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected @@ -33,7 +33,7 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 @@ -78,7 +78,7 @@ ; CHECK-NEXT: unreachable ; ;. -; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind } +; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } ; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn } ; CHECK: attributes #[[ATTR2]] = { noinline } ;. diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected @@ -53,5 +53,5 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected @@ -56,10 +56,10 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. -; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind } +; CHECK: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } ; CHECK: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn } ; CHECK: attributes #[[ATTR2]] = { noinline } ;. diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll @@ -33,5 +33,5 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected @@ -34,7 +34,7 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected @@ -34,7 +34,7 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. ; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4 @@ -79,7 +79,7 @@ ; REUSE-NEXT: unreachable ; ;. -; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind } +; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } ; REUSE: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn } ; REUSE: attributes #[[ATTR2]] = { noinline } ;. diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected @@ -54,5 +54,5 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected @@ -57,10 +57,10 @@ ret void } -declare void @llvm.trap() noreturn cold +declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write) declare void @_Z10sideeffectv() ;. -; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind } +; REUSE: attributes #[[ATTR0:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) } ; REUSE: attributes #[[ATTR1:[0-9]+]] = { cold minsize noreturn } ; REUSE: attributes #[[ATTR2]] = { noinline } ;.