| # REQUIRES: x86-registered-target | |
| # RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=none -print-mir2vec -mir2vec-vocab-path=%S/Inputs/mir2vec_classless_vocab.json %s -o /dev/null 2>&1 | FileCheck %s | |
| # RUN: llvm-ir2vec triplets --mode=mir %s -o /dev/null | |
| # Generic (GlobalISel) virtual registers also belong to no register class | |
| # until instruction selection has assigned one -- they instead carry an LLT | |
| # (printed as class `_`) or, after RegBankSelect, a register bank. | |
| # MachineRegisterInfo::getRegClass() asserts in that case, so | |
| # MIRVocabulary::getRegisterOperandIndex() must treat these the same way as | |
| # the classless physical registers in classless-physreg.mir: report no | |
| # vocabulary entry rather than crashing. | |
| --- | | |
| target triple = "x86_64-unknown-linux-gnu" | |
| define i32 @g(i32 %a) { ret i32 0 } | |
| ... | |
| --- | |
| name: g | |
| legalized: true | |
| tracksRegLiveness: true | |
| registers: | |
| - { id: 0, class: _ } | |
| body: | | |
| bb.0: | |
| liveins: $edi | |
| %0:_(s32) = COPY $edi | |
| RET 0 | |
| ... | |
| # The vocabulary gives COPY = [0.5 0.5 0.5], RET = [0.9 0.9 0.9], and the | |
| # common "Immediate" operand = [0.01 0.01 0.01]. Neither the generic | |
| # (classless) vreg %0 nor $edi (a GR32 physical register, for which the | |
| # vocabulary also has no entry) contribute anything, so the COPY embedding is | |
| # exactly its opcode embedding. RET's "0" operand is an immediate, so its | |
| # embedding is the opcode plus the common Immediate operand embedding: | |
| # [0.9 0.9 0.9] + [0.01 0.01 0.01] = [0.91 0.91 0.91] | |
| # CHECK: MIR2Vec embeddings for machine function g: | |
| # CHECK: Machine basic block: g:BB0: | |
| # CHECK-NEXT: [ 1.41 1.41 1.41 ] | |
| # CHECK-NEXT: Machine instruction vectors: | |
| # CHECK-NEXT: Machine instruction: %0:_(s32) = COPY $edi | |
| # CHECK-NEXT: [ 0.50 0.50 0.50 ] | |
| # CHECK-NEXT: Machine instruction: RET 0 | |
| # CHECK-NEXT: [ 0.91 0.91 0.91 ] |