From: Sanjoy Das Date: Fri, 17 Mar 2017 00:55:53 +0000 (+0000) Subject: [RSForGC] Handle vector GEPs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e740f17e232eb5ff036ab4d911f97ae7e967591;p=llvm [RSForGC] Handle vector GEPs We were not handling getelemenptr instructions of vector type before. Since getelemenptr instructions for vector types follow the same rule as getelementptr instructions for non-vector types, we can just handle them in the same way. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298028 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index 13c3549c238..1b326816d11 100644 --- a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -365,6 +365,11 @@ findBaseDefiningValueOfVector(Value *I) { // for particular sufflevector patterns. return BaseDefiningValueResult(I, false); + // The behavior of getelementptr instructions is the same for vector and + // non-vector data types. + if (auto *GEP = dyn_cast(I)) + return findBaseDefiningValue(GEP->getPointerOperand()); + // A PHI or Select is a base defining value. The outer findBasePointer // algorithm is responsible for constructing a base value for this BDV. assert((isa(I) || isa(I)) && diff --git a/test/Transforms/RewriteStatepointsForGC/base-vector.ll b/test/Transforms/RewriteStatepointsForGC/base-vector.ll index 9026275cf68..c34462f4516 100644 --- a/test/Transforms/RewriteStatepointsForGC/base-vector.ll +++ b/test/Transforms/RewriteStatepointsForGC/base-vector.ll @@ -88,6 +88,7 @@ entry: } declare void @use(i64 addrspace(1)*) "gc-leaf-function" +declare void @use_vec(<4 x i64 addrspace(1)*>) "gc-leaf-function" define void @test5(i1 %cnd, i64 addrspace(1)* %obj) gc "statepoint-example" { ; CHECK-LABEL: @test5 @@ -245,3 +246,17 @@ next: ret i64 addrspace(1)* %bdv } declare void @do_safepoint() + +define void @test11(<4 x i64 addrspace(1)*> %vec1) gc "statepoint-example" { +; CHECK-LABEL: @test11( +; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf{{.*}}<4 x i64 addrspace(1)*> %vec1) +; CHECK: %vec1.relocated = call coldcc <4 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v4p1i8 +; CHECK: %vec1.relocated.casted = bitcast <4 x i8 addrspace(1)*> %vec1.relocated to <4 x i64 addrspace(1)*> +; CHECK: %vec2.remat = getelementptr i64, <4 x i64 addrspace(1)*> %vec1.relocated.casted, i32 1024 +; CHECK: call void @use_vec(<4 x i64 addrspace(1)*> %vec2.remat) +entry: + %vec2 = getelementptr i64, <4 x i64 addrspace(1)*> %vec1, i32 1024 + call void @do_safepoint() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ] + call void @use_vec(<4 x i64 addrspace(1) *> %vec2) + ret void +}