diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -61,6 +61,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/PatternMatch.h" +#include "llvm/IR/Statepoint.h" #include "llvm/IR/Type.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" @@ -2403,6 +2404,10 @@ if (CI.countOperandBundlesOfType(LLVMContext::OB_cfguardtarget)) return false; + // FIXME: support statepoints and related. + if (isa(U)) + return false; + if (CI.isInlineAsm()) return translateInlineAsm(CI, MIRBuilder); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -141,6 +141,21 @@ ret i1 %obit } +; FALLBACK-WITH-REPORT-ERR: remark: :0:0: unable to translate instruction: {{.*}}llvm.experimental.gc.statepoint{{.*}} (in function: gc_intr) +; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for gc_intr +; FALLBACK-WITH-REPORT-OUT-LABEL: gc_intr + +declare token @llvm.experimental.gc.statepoint.p0(i64 immarg, i32 immarg, i32()*, i32 immarg, i32 immarg, ...) +declare i32 @llvm.experimental.gc.result(token) + +declare i32 @extern_returning_i32() + +define i32 @gc_intr() gc "statepoint-example" { + %statepoint_token = call token (i64, i32, i32()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, i32()* elementtype(i32 ()) @extern_returning_i32, i32 0, i32 0, i32 0, i32 0) [ "deopt"() ] + %ret = call i32 (token) @llvm.experimental.gc.result(token %statepoint_token) + ret i32 %ret +} + attributes #1 = { "target-features"="+sve" } attributes #2 = { "target-features"="+ls64" } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/pr57349.ll b/llvm/test/CodeGen/AArch64/GlobalISel/pr57349.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/pr57349.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -global-isel -global-isel-abort=2 -mtriple aarch64-unknown-unknown -verify-machineinstrs %s -o - | FileCheck %s + +define i32 @__init__() gc "statepoint-example" { +; CHECK-LABEL: __init__: +; CHECK: // %bb.0: +; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: .cfi_offset w30, -16 +; CHECK-NEXT: bl builtins.__init__ +; CHECK-NEXT: .Ltmp0: +; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload +; CHECK-NEXT: ret + %statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(i32 ()) @builtins.__init__, i32 0, i32 0, i32 0, i32 0) [ "deopt"() ] + %ret = call i32 (token) @llvm.experimental.gc.result(token %statepoint_token) + ret i32 %ret +} + +declare i32 @builtins.__init__() + +declare token @llvm.experimental.gc.statepoint.p0(i64 immarg, i32 immarg, ptr, i32 immarg, i32 immarg, ...) +declare i32 @llvm.experimental.gc.result(token)