[llvm-dev] Are derived pointers caught by RS4GC?
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Tue Jul 20 11:32:38 PDT 2021
Please see my previous email re: rematerialization. This code appears
correct and as expected.
Philip
On 7/20/21 11:22 AM, Kavindu Gimhan Zoysa wrote:
> Hi Philip,
>
> It is the same output I got that make sense. But as explained in this
> example https://llvm.org/docs/Statepoints.html#base-derived-pointers
> <https://llvm.org/docs/Statepoints.html#base-derived-pointers> (the
> example available in this section), I thought *%gep *should be
> included in gc-live operand bundle. Isn't that correct?
>
> Kavindu Gimhan Zoysa,
> BSc(Hons) | ENTC | UoM,
> ATL | WSO2
>
> GitHub <https://github.com/KavinduZoysa> LinkedIn
> <https://www.linkedin.com/in/kavindu-gimhan-zoysa-85939a122/> Medium
> <https://medium.com/@kavindugimhanzoysa>
>
>
> On Tue, 20 Jul 2021 at 22:53, Philip Reames <listmail at philipreames.com
> <mailto:listmail at philipreames.com>> wrote:
>
> $ ./opt -S llvm-dev.ll -rewrite-statepoints-for-gc
> ; ModuleID = 'llvm-dev.ll'
> source_filename = "llvm-dev.ll"
>
> define void @dummy_func() {
> ret void
> }
>
> define i8 addrspace(1)* @test1(i8 addrspace(1)* %obj) gc
> "statepoint-example" {
> %gep = getelementptr i8, i8 addrspace(1)* %obj, i64 20000
> %statepoint_token = call token (i64, i32, void ()*, i32, i32,
> ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000,
> i32 0, void ()* @dummy_func, i32 0, i32 0, i32 0, i32 0) [
> "gc-live"(i8 addrspace(1)* %obj) ]
> *%obj.relocated = call coldcc i8 addrspace(1)*
> @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32
> 0, i32 0) ; (%obj, %obj)*
> *%gep.remat = getelementptr i8, i8 addrspace(1)* %obj.relocated,
> i64 20000*
> %p = getelementptr i8, i8 addrspace(1)* %gep.remat, i64 -20000
> store i8 2, i8 addrspace(1)* %gep.remat, align 1
> ret i8 addrspace(1)* %p
> }
>
> Works for me. This output is entirely correct as we relocated the
> base pointer and then rematerialized the derived pointer
> afterwards. This is almost always profitable over directly
> relocating both obj and derived pointers.
>
> Philip
>
> On 7/20/21 7:45 AM, Kavindu Gimhan Zoysa via llvm-dev wrote:
>>
>> define void @dummy_func() {
>> ret void
>> }
>> define i8 addrspace(1)* @test1(i8 addrspace(1)* %obj) gc
>> "statepoint-example" {
>> %gep = getelementptr i8, i8 addrspace(1)* %obj, i64 20000
>> call void @dummy_func()
>> %p = getelementptr i8, i8 addrspace(1)* %gep, i64 -20000
>> store i8 2, i8 addrspace(1)* %gep
>> ret i8 addrspace(1)* %p
>> }
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210720/a6abe893/attachment.html>
More information about the llvm-dev
mailing list