[PATCH] D15789: [RS4GC] Fix rematerialization of bitcast of bitcast.

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 28 12:10:45 PST 2015


LGTM.

On 12/28/2015 12:07 PM, Manuel Jacob wrote:
> mjacob updated this revision to Diff 43699.
> mjacob added a comment.
>
> Only rematerialize noop casts, add test for this.
>
>
> http://reviews.llvm.org/D15789
>
> Files:
>    lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
>    test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll
>
> Index: test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll
> ===================================================================
> --- test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll
> +++ test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll
> @@ -47,6 +47,40 @@
>     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:
> Index: lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> ===================================================================
> --- lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> +++ lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> @@ -2101,16 +2101,12 @@
>     }
>   
>     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
>
>



More information about the llvm-commits mailing list