diff options
| author | Daniel Neilson <dneilson@azul.com> | 2018-01-30 14:43:41 +0000 |
|---|---|---|
| committer | Daniel Neilson <dneilson@azul.com> | 2018-01-30 14:43:41 +0000 |
| commit | 594f443b06728e6236e2a7db157f5b300e386d23 (patch) | |
| tree | 15eeb12535b2b84331a059c1e2d4ed6957c1ba4d /llvm/test/Transforms/RewriteStatepointsForGC | |
| parent | 26fa1f2be3eb931ee7aeab231fe048e7a7782089 (diff) | |
| download | bcm5719-llvm-594f443b06728e6236e2a7db157f5b300e386d23.tar.gz bcm5719-llvm-594f443b06728e6236e2a7db157f5b300e386d23.zip | |
[RS4GC] Handle call/invoke instructions as base defining values of vectors
Summary:
There's an asymmetry in the definitions of findBaseDefiningValueOfVector() and
findBaseDefiningValue() of RS4GC. The later handles call and invoke instructions,
and the former does not. This appears to be simple oversight. This patch remedies
the oversight by adding the call and invoke cases to findBaseDefiningValueOfVector().
Reviewers: DaniilSuchkov, anna
Reviewed By: anna
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D42653
llvm-svn: 323764
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC')
| -rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/base-vector.ll | 16 | ||||
| -rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll | 26 |
2 files changed, 42 insertions, 0 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/base-vector.ll b/llvm/test/Transforms/RewriteStatepointsForGC/base-vector.ll index d862b82e9af..3b6f32acf3c 100644 --- a/llvm/test/Transforms/RewriteStatepointsForGC/base-vector.ll +++ b/llvm/test/Transforms/RewriteStatepointsForGC/base-vector.ll @@ -261,3 +261,19 @@ entry: call void @use_vec(<4 x i64 addrspace(1) *> %vec2) ret void } + +declare <4 x i64 addrspace(1)*> @def_vec() "gc-leaf-function" + +define void @test12(<4 x i64 addrspace(1)*> %vec1) gc "statepoint-example" { +; CHECK-LABEL: @test12( +; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf{{.*}}<4 x i64 addrspace(1)*> %vec) +; CHECK-NEXT: %vec.relocated = call coldcc <4 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v4p1i8( +; CHECK-NEXT: %vec.relocated.casted = bitcast <4 x i8 addrspace(1)*> %vec.relocated to <4 x i64 addrspace(1)*> +; CHECK-NEXT: call void @use_vec(<4 x i64 addrspace(1)*> %vec.relocated.casted) +; CHECK-NEXT: ret void +entry: + %vec = call <4 x i64 addrspace(1)*> @def_vec() + call void @do_safepoint() [ "deopt"() ] + call void @use_vec(<4 x i64 addrspace(1)*> %vec) + ret void +} diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll b/llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll index d9ebd302913..b87420e801a 100644 --- a/llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll +++ b/llvm/test/Transforms/RewriteStatepointsForGC/invokes.ll @@ -30,6 +30,32 @@ exceptional_return: ret i64 addrspace(1)* %obj1 } +declare <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*>) + +define <4 x i64 addrspace(1)*> @test_basic_vector(<4 x i64 addrspace(1)*> %objs, <4 x i64 addrspace(1)*> %objs1) gc "statepoint-example" personality i32 ()* @personality_function { +; CHECK-LABEL: @test_basic_vector +entry: +; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call + %ret_val = invoke <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*> %objs) + to label %normal_return unwind label %exceptional_return + +; CHECK-LABEL: normal_return: +; CHECK: gc.result +; CHECK: ret <4 x i64 addrspace(1)*> + +normal_return: + ret <4 x i64 addrspace(1)*> %ret_val + +; CHECK-LABEL: exceptional_return: +; CHECK: landingpad +; CHECK: ret <4 x i64 addrspace(1)*> + +exceptional_return: + %landing_pad4 = landingpad token + cleanup + ret <4 x i64 addrspace(1)*> %objs1 +} + define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function { ; CHECK-LABEL: entry: entry: |

