Skip to content

Commit

Permalink
[Statepoint] Return undef value for the statepoint of the none token (l…
Browse files Browse the repository at this point in the history
…lvm#72552)

Helps avoid the crash in verifier when it tries to print the error.
`none` token might be produced by llvm-reduce, since it's a default
value, so by extension this also fixes llvm-reduce crash, allowing it to
just discard invalid IR.

---------

Co-authored-by: arpilipe <apilipenko@azul.com>
  • Loading branch information
danilaml and arpilipe authored Nov 17, 2023
1 parent 2ed1587 commit 44af592
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/IR/IntrinsicInst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,10 @@ const Value *GCProjectionInst::getStatepoint() const {
if (isa<UndefValue>(Token))
return Token;

// Treat none token as if it was undef here
if (isa<ConstantTokenNone>(Token))
return UndefValue::get(Token->getType());

// This takes care both of relocates for call statepoints and relocates
// on normal path of invoke statepoint.
if (!isa<LandingPadInst>(Token))
Expand Down
18 changes: 18 additions & 0 deletions llvm/test/Verifier/gc_none_token.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
; RUN: not opt -passes=verify -S %s 2>&1 | FileCheck %s
; Check that verifier doesn't crash on relocate with none token

target triple = "x86_64-unknown-linux-gnu"

define i32 @check_verify_none_token() gc "statepoint-example" {

entry:
ret i32 0

unreach:
; CHECK: gc relocate is incorrectly tied to the statepoint
; CHECK: (undef, undef)
%token_call = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token none, i32 0, i32 0)
ret i32 1
}

declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)

0 comments on commit 44af592

Please sign in to comment.