[RS4GC] Strip noalias attribute after statepoint rewrite
[oota-llvm.git] / test / Transforms / RewriteStatepointsForGC / deopt-bundles / deref-pointers.ll
index f868d5b83613fcbfab3af00cbefbf9a0dac865bc..f04c6784a8782f7bfbda903be4230ab62870829d 100644 (file)
@@ -3,6 +3,7 @@
 ; CHECK: declare i8 addrspace(1)* @some_function_ret_deref()
 ; CHECK: define i8 addrspace(1)* @test_deref_arg(i8 addrspace(1)* %a)
 ; CHECK: define i8 addrspace(1)* @test_deref_or_null_arg(i8 addrspace(1)* %a)
+; CHECK: define i8 addrspace(1)* @test_noalias_arg(i8 addrspace(1)* %a)
 
 declare void @foo()
 
@@ -11,6 +12,7 @@ declare i8 addrspace(1)* @some_function() "gc-leaf-function"
 declare void @some_function_consumer(i8 addrspace(1)*) "gc-leaf-function"
 
 declare dereferenceable(4) i8 addrspace(1)* @some_function_ret_deref() "gc-leaf-function"
+declare noalias i8 addrspace(1)* @some_function_ret_noalias() "gc-leaf-function"
 
 define i8 addrspace(1)* @test_deref_arg(i8 addrspace(1)* dereferenceable(4) %a) gc "statepoint-example" {
 entry:
@@ -24,6 +26,12 @@ entry:
   ret i8 addrspace(1)* %a
 }
 
+define i8 addrspace(1)* @test_noalias_arg(i8 addrspace(1)* noalias %a) gc "statepoint-example" {
+entry:
+  call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
+  ret i8 addrspace(1)* %a
+}
+
 define i8 addrspace(1)* @test_deref_retval() gc "statepoint-example" {
 ; CHECK-LABEL: @test_deref_retval(
 ; CHECK: %a = call i8 addrspace(1)* @some_function()
@@ -42,6 +50,15 @@ entry:
   ret i8 addrspace(1)* %a
 }
 
+define i8 addrspace(1)* @test_noalias_retval() gc "statepoint-example" {
+; CHECK-LABEL: @test_noalias_retval(
+; CHECK: %a = call i8 addrspace(1)* @some_function()
+entry:
+  %a = call noalias i8 addrspace(1)* @some_function()
+  call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
+  ret i8 addrspace(1)* %a
+}
+
 define i8 @test_md(i8 addrspace(1)* %ptr) gc "statepoint-example" {
 ; CHECK-LABEL: @test_md(
 ; CHECK: %tmp = load i8, i8 addrspace(1)* %ptr, !tbaa !0
@@ -61,6 +78,16 @@ entry:
   ret i8 addrspace(1)* %a
 }
 
+define i8 addrspace(1)* @test_decl_only_noalias(i8 addrspace(1)* %ptr) gc "statepoint-example" {
+; CHECK-LABEL: @test_decl_only_noalias(
+; No change here, but the prototype of some_function_ret_noalias should have changed.
+; CHECK: call i8 addrspace(1)* @some_function_ret_noalias()
+entry:
+  %a = call i8 addrspace(1)* @some_function_ret_noalias()
+  call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
+  ret i8 addrspace(1)* %a
+}
+
 define i8 addrspace(1)* @test_callsite_arg_attribute(i8 addrspace(1)* %ptr) gc "statepoint-example" {
 ; CHECK-LABEL: @test_callsite_arg_attribute(
 ; CHECK: call void @some_function_consumer(i8 addrspace(1)* %ptr)
@@ -68,7 +95,7 @@ define i8 addrspace(1)* @test_callsite_arg_attribute(i8 addrspace(1)* %ptr) gc "
 ; CHECK: !1 = !{!"red", !2}
 ; CHECK: !2 = !{!"blue"}
 entry:
-  call void @some_function_consumer(i8 addrspace(1)* dereferenceable(4) %ptr)
+  call void @some_function_consumer(i8 addrspace(1)* dereferenceable(4) noalias %ptr)
   call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
   ret i8 addrspace(1)* %ptr
 }