From: Manuel Jacob Date: Mon, 28 Dec 2015 20:14:05 +0000 (+0000) Subject: [RS4GC] Fix rematerialization of bitcast of bitcast. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=912373de69045e491d6a301611ce31a2914a7d43 [RS4GC] Fix rematerialization of bitcast of bitcast. Summary: Previously, only the outer (last) bitcast was rematerialized, resulting in a use of the unrelocated inner (first) bitcast after the statepoint. See the test case for an example. Reviewers: igor-laevsky, reames Subscribers: reames, alex, llvm-commits, sanjoy Differential Revision: http://reviews.llvm.org/D15789 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256520 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index a077ba01a92..a9dc8d8eec0 100644 --- a/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -2101,16 +2101,12 @@ static bool findRematerializableChainToBasePointer( } if (CastInst *CI = dyn_cast(CurrentValue)) { - Value *Def = CI->stripPointerCasts(); - - // This two checks are basically similar. First one is here for the - // consistency with findBasePointers logic. - assert(!isa(Def) && "not a pointer cast found"); if (!CI->isNoopCast(CI->getModule()->getDataLayout())) return false; ChainToBase.push_back(CI); - return findRematerializableChainToBasePointer(ChainToBase, Def, BaseValue); + return findRematerializableChainToBasePointer(ChainToBase, + CI->getOperand(0), BaseValue); } // Not supported instruction in the chain diff --git a/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll b/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll index a20cfdd3df8..445ab7bd768 100644 --- a/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll +++ b/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll @@ -47,6 +47,40 @@ entry: ret void } +define void @"test_bitcast_bitcast"(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK-LABEL: test_bitcast_bitcast +entry: + %ptr1 = bitcast i32 addrspace(1)* %base to i64 addrspace(1)* + %ptr2 = bitcast i64 addrspace(1)* %ptr1 to i16 addrspace(1)* + ; CHECK: bitcast i32 addrspace(1)* %base to i64 addrspace(1)* + ; CHECK: bitcast i64 addrspace(1)* %ptr1 to i16 addrspace(1)* + %sp = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) + ; CHECK: %base.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %sp, i32 7, i32 7) + ; CHECK: %base.relocated.casted = bitcast i8 addrspace(1)* %base.relocated to i32 addrspace(1)* + ; CHECK: bitcast i32 addrspace(1)* %base.relocated.casted to i64 addrspace(1)* + ; CHECK: bitcast i64 addrspace(1)* %ptr1.remat to i16 addrspace(1)* + call void @use_obj32(i32 addrspace(1)* %base) + call void @use_obj16(i16 addrspace(1)* %ptr2) + ret void +} + +define void @"test_addrspacecast_addrspacecast"(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK-LABEL: test_addrspacecast_addrspacecast +entry: + %ptr1 = addrspacecast i32 addrspace(1)* %base to i32* + %ptr2 = addrspacecast i32* %ptr1 to i32 addrspace(1)* + ; CHECK: addrspacecast i32 addrspace(1)* %base to i32* + ; CHECK: addrspacecast i32* %ptr1 to i32 addrspace(1)* + %sp = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) + ; CHECK: %base.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %sp, i32 7, i32 7) + ; CHECK: %base.relocated.casted = bitcast i8 addrspace(1)* %base.relocated to i32 addrspace(1)* + ; CHECK: %ptr2.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %sp, i32 7, i32 8) + ; CHECK: %ptr2.relocated.casted = bitcast i8 addrspace(1)* %ptr2.relocated to i32 addrspace(1)* + call void @use_obj32(i32 addrspace(1)* %base) + call void @use_obj32(i32 addrspace(1)* %ptr2) + ret void +} + define void @"test_bitcast_gep"(i32 addrspace(1)* %base) gc "statepoint-example" { ; CHECK-LABEL: test_bitcast_gep entry: