[PATCH] D75598: [InstCombine] Handle gc.relocate(null) in one iteration
Serguei Katkov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 4 02:53:00 PST 2020
skatkov updated this revision to Diff 248132.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75598/new/
https://reviews.llvm.org/D75598
Files:
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/statepoint-null.ll
Index: llvm/test/Transforms/InstCombine/statepoint-null.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/statepoint-null.ll
@@ -0,0 +1,33 @@
+; RUN: opt < %s -instcombine -instcombine-max-iterations=1 -S | FileCheck %s
+; These tests check the optimizations specific to
+; pointers being relocated at a statepoint.
+
+
+declare void @func()
+
+define i1 @test_null(i1 %cond) gc "statepoint-example" {
+entry:
+ br i1 %cond, label %left, label %right
+
+right:
+ br label %merge
+
+left:
+ %safepoint_token = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* null)
+ %pnew = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token, i32 7, i32 7)
+ br label %merge
+
+merge:
+ %pnew_phi = phi i32 addrspace(1)* [null, %right], [%pnew, %left]
+ %safepoint_token2 = tail call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @func, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %pnew_phi)
+ %pnew2 = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %safepoint_token2, i32 7, i32 7)
+ %cmp = icmp eq i32 addrspace(1)* %pnew2, null
+ ret i1 %cmp
+; CHECK-LABEL: test_null
+; CHECK-NOT: %pnew
+; CHECK-NOT: %pnew2
+; CHECK: ret i1 true
+}
+
+declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
+declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -4375,6 +4375,26 @@
/// Improvements for call, callbr and invoke instructions.
Instruction *InstCombiner::visitCallBase(CallBase &Call) {
+ // Special handling of statepoint intrinsic.
+ // Let's we have the following case:
+ // A = gc.relocate(null)
+ // B = statepoint(A)
+ // C = gc.relocate(A)
+ // A will be substituted with null and its user B will be added to worklist.
+ // Statepoint B is not simplified and if C was considered before it will be
+ // re-considered after simplification of A.
+ // To resolve this case while processing statepoint B we add all gc.relocate
+ // users to worklist if they can be simplified to null.
+ // This is mostly to save compile time. Actually C can be transformed on
+ // the next iteration if InstCombine while we want to handle all gc.relocate
+ // chains in one iteraton.
+ if (isStatepoint(Call))
+ for (User *U : Call.users())
+ if (auto *GCR = dyn_cast<GCRelocateInst>(U))
+ if (isa<PointerType>(U->getType()))
+ if (isa<ConstantPointerNull>(GCR->getDerivedPtr()))
+ Worklist.add(GCR);
+
if (isAllocationFn(&Call, &TLI))
annotateAnyAllocSite(Call, &TLI);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75598.248132.patch
Type: text/x-patch
Size: 3041 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200304/434800bd/attachment.bin>
More information about the llvm-commits
mailing list