-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Statepoints] Initial support for relocating vectors of pointers
Currently, we try to split vectors of pointers back into their component pointer elements during rewrite-statepoints-for-gc. This is less than ideal since presumably the vectorizer chose to vectorize for a reason. :) It's also been a source of bugs - in particular, the relocation logic as currently implemented was recently discovered to be wrong. The alternate approach is to allow gc.relocates of vector-of-pointer type and update the backend to handle them. That's what this patch tries to do. This won't actually enable vector-of-pointers in practice - there are some RS4GC changes needed - but the lowering is standalone and testable so it makes sense to separate. Note that there are some known cases around vector constants which this patch does not handle. Once this is in, I'll send another patch with individual fixes and test cases. Differential Revision: http://reviews.llvm.org/D15632 llvm-svn: 257022
- Loading branch information
Showing
5 changed files
with
154 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,130 @@ | ||
| ; RUN: llc -debug-only=stackmaps < %s | FileCheck %s | ||
|
|
||
| ; Can we lower a single vector? | ||
| define <2 x i8 addrspace(1)*> @test(<2 x i8 addrspace(1)*> %obj) gc "statepoint-example" { | ||
| entry: | ||
| ; CHECK-LABEL: @test | ||
| ; CHECK: subq $24, %rsp | ||
| ; CHECK: movaps %xmm0, (%rsp) | ||
| ; CHECK: callq do_safepoint | ||
| ; CHECK: movaps (%rsp), %xmm0 | ||
| ; CHECK: addq $24, %rsp | ||
| %safepoint_token = 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, <2 x i8 addrspace(1)*> %obj) | ||
| %obj.relocated = call coldcc <2 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v2p1i8(token %safepoint_token, i32 7, i32 7) ; (%obj, %obj) | ||
| ret <2 x i8 addrspace(1)*> %obj.relocated | ||
| } | ||
|
|
||
| ; Can we lower the base, derived pairs if both are vectors? | ||
| define <2 x i8 addrspace(1)*> @test2(<2 x i8 addrspace(1)*> %obj, i64 %offset) gc "statepoint-example" { | ||
| entry: | ||
| ; CHECK-LABEL: @test2 | ||
| ; CHECK: subq $40, %rsp | ||
| ; CHECK: movd %rdi, %xmm1 | ||
| ; CHECK: pshufd $68, %xmm1, %xmm1 # xmm1 = xmm1[0,1,0,1] | ||
| ; CHECK: paddq %xmm0, %xmm1 | ||
| ; CHECK: movdqa %xmm0, 16(%rsp) | ||
| ; CHECK: movdqa %xmm1, (%rsp) | ||
| ; CHECK: callq do_safepoint | ||
| ; CHECK: movaps (%rsp), %xmm0 | ||
| ; CHECK: addq $40, %rsp | ||
| %derived = getelementptr i8, <2 x i8 addrspace(1)*> %obj, i64 %offset | ||
| %safepoint_token = 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, <2 x i8 addrspace(1)*> %obj, <2 x i8 addrspace(1)*> %derived) | ||
| %derived.relocated = call coldcc <2 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v2p1i8(token %safepoint_token, i32 7, i32 8) ; (%obj, %derived) | ||
| ret <2 x i8 addrspace(1)*> %derived.relocated | ||
| } | ||
|
|
||
| ; Originally, this was just a variant of @test2 above, but it ends up | ||
| ; covering a bunch of interesting missed optimizations. Specifically: | ||
| ; - We waste a stack slot for a value that a backend transform pass | ||
| ; CSEd to another spilled one. | ||
| ; - We don't remove the testb even though it serves no purpose | ||
| ; - We could in principal reuse the argument memory (%rsi) and do away | ||
| ; with stack slots entirely. | ||
| define <2 x i64 addrspace(1)*> @test3(i1 %cnd, <2 x i64 addrspace(1)*>* %ptr) gc "statepoint-example" { | ||
| entry: | ||
| ; CHECK-LABEL: @test3 | ||
| ; CHECK: subq $40, %rsp | ||
| ; CHECK: testb $1, %dil | ||
| ; CHECK: movaps (%rsi), %xmm0 | ||
| ; CHECK: movaps %xmm0, 16(%rsp) | ||
| ; CHECK: movaps %xmm0, (%rsp) | ||
| ; CHECK: callq do_safepoint | ||
| ; CHECK: movaps (%rsp), %xmm0 | ||
| ; CHECK: addq $40, %rsp | ||
| br i1 %cnd, label %taken, label %untaken | ||
|
|
||
| taken: ; preds = %entry | ||
| %obja = load <2 x i64 addrspace(1)*>, <2 x i64 addrspace(1)*>* %ptr | ||
| br label %merge | ||
|
|
||
| untaken: ; preds = %entry | ||
| %objb = load <2 x i64 addrspace(1)*>, <2 x i64 addrspace(1)*>* %ptr | ||
| br label %merge | ||
|
|
||
| merge: ; preds = %untaken, %taken | ||
| %obj.base = phi <2 x i64 addrspace(1)*> [ %obja, %taken ], [ %objb, %untaken ] | ||
| %obj = phi <2 x i64 addrspace(1)*> [ %obja, %taken ], [ %objb, %untaken ] | ||
| %safepoint_token = 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, <2 x i64 addrspace(1)*> %obj, <2 x i64 addrspace(1)*> %obj.base) | ||
| %obj.relocated = call coldcc <2 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v2p1i8(token %safepoint_token, i32 8, i32 7) ; (%obj.base, %obj) | ||
| %obj.relocated.casted = bitcast <2 x i8 addrspace(1)*> %obj.relocated to <2 x i64 addrspace(1)*> | ||
| %obj.base.relocated = call coldcc <2 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v2p1i8(token %safepoint_token, i32 8, i32 8) ; (%obj.base, %obj.base) | ||
| %obj.base.relocated.casted = bitcast <2 x i8 addrspace(1)*> %obj.base.relocated to <2 x i64 addrspace(1)*> | ||
| ret <2 x i64 addrspace(1)*> %obj.relocated.casted | ||
| } | ||
|
|
||
| ; CHECK: __LLVM_StackMaps: | ||
|
|
||
| ; CHECK: .Ltmp1-test | ||
| ; Check for the two spill slots | ||
| ; Stack Maps: Loc 3: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0] | ||
| ; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0] | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 0 | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 0 | ||
|
|
||
| ; CHECK: .Ltmp3-test2 | ||
| ; Check for the two spill slots | ||
| ; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16] | ||
| ; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0] | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 16 | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 0 | ||
|
|
||
| ; CHECK: .Ltmp5-test3 | ||
| ; Check for the four spill slots | ||
| ; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16] | ||
| ; Stack Maps: Loc 4: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16] | ||
| ; Stack Maps: Loc 5: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16] | ||
| ; Stack Maps: Loc 6: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0] | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 16 | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 16 | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 16 | ||
| ; CHECK: .byte 3 | ||
| ; CHECK: .byte 16 | ||
| ; CHECK: .short 7 | ||
| ; CHECK: .long 0 | ||
|
|
||
| declare void @do_safepoint() | ||
|
|
||
| declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) | ||
| declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) | ||
| declare <2 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v2p1i8(token, i32, i32) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters