diff options
author | Manuel Jacob <me@manueljacob.de> | 2015-12-28 20:14:05 +0000 |
---|---|---|
committer | Manuel Jacob <me@manueljacob.de> | 2015-12-28 20:14:05 +0000 |
commit | 9db5b93ffc3ba35b107fbc9be04e5c3f5a4379a4 (patch) | |
tree | cd39626a7f6c9b1d156daf077c93b4ac06155740 | |
parent | 549469882803cdfd6e557e979840a80a95169931 (diff) | |
download | bcm5719-llvm-9db5b93ffc3ba35b107fbc9be04e5c3f5a4379a4.tar.gz bcm5719-llvm-9db5b93ffc3ba35b107fbc9be04e5c3f5a4379a4.zip |
[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
llvm-svn: 256520
-rw-r--r-- | llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll | 34 |
2 files changed, 36 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index a077ba01a92..a9dc8d8eec0 100644 --- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -2101,16 +2101,12 @@ static bool findRematerializableChainToBasePointer( } if (CastInst *CI = dyn_cast<CastInst>(CurrentValue)) { - Value *Def = CI->stripPointerCasts(); - - // This two checks are basically similar. First one is here for the - // consistency with findBasePointers logic. - assert(!isa<CastInst>(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/llvm/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll b/llvm/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll index a20cfdd3df8..445ab7bd768 100644 --- a/llvm/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll +++ b/llvm/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: |