From: Serguei Katkov Date: Fri, 5 Apr 2019 05:41:08 +0000 (+0000) Subject: [FastISel] Fix crash for gc.relocate lowring X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c39636cc2c6d17453bca3d76cdaba4a458b45ae3;p=platform%2Fupstream%2Fllvm.git [FastISel] Fix crash for gc.relocate lowring Lowering safepoint checks that all gc.relocaes observed in safepoint must be lowered. However Fast-Isel is able to skip dead gc.relocate. To resolve this issue we just ignore dead gc.relocate in the check. Reviewers: reames Reviewed By: reames Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D60184 llvm-svn: 357742 --- diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.h b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.h index a4fdce5..7050793 100644 --- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.h +++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.h @@ -66,13 +66,18 @@ public: /// before the next statepoint. If we don't see it, we'll report /// an assertion. void scheduleRelocCall(const CallInst &RelocCall) { - PendingGCRelocateCalls.push_back(&RelocCall); + // We are not interested in lowering dead instructions. + if (!RelocCall.use_empty()) + PendingGCRelocateCalls.push_back(&RelocCall); } /// Remove this gc_relocate from the list we're expecting to see /// before the next statepoint. If we weren't expecting to see /// it, we'll report an assertion. void relocCallVisited(const CallInst &RelocCall) { + // We are not interested in lowering dead instructions. + if (RelocCall.use_empty()) + return; auto I = llvm::find(PendingGCRelocateCalls, &RelocCall); assert(I != PendingGCRelocateCalls.end() && "Visited unexpected gcrelocate call"); diff --git a/llvm/test/CodeGen/X86/fast-isel-gc-intrinsics.ll b/llvm/test/CodeGen/X86/fast-isel-gc-intrinsics.ll index ac09d75..9943bed 100644 --- a/llvm/test/CodeGen/X86/fast-isel-gc-intrinsics.ll +++ b/llvm/test/CodeGen/X86/fast-isel-gc-intrinsics.ll @@ -29,6 +29,8 @@ entry: %safepoint_token = tail call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, i8 addrspace(1)* %v) %call1 = call zeroext i1 @llvm.experimental.gc.result.i1(token %safepoint_token) %vnew = call i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %safepoint_token, i32 7, i32 7) + br label %exit +exit: ret i1 %call1 }