diff --git a/llvm/include/llvm/CodeGen/MachineRegisterInfo.h b/llvm/include/llvm/CodeGen/MachineRegisterInfo.h --- a/llvm/include/llvm/CodeGen/MachineRegisterInfo.h +++ b/llvm/include/llvm/CodeGen/MachineRegisterInfo.h @@ -672,9 +672,9 @@ /// conditions are met: /// 1. Generic virtual registers are created. /// 2. The machine function has not completely been through the - /// instruction selection process. + /// instruction selection process or selected using GlobalISel. /// None of this condition is possible without GlobalISel for now. - /// In other words, if GlobalISel is not used or if the query happens after + /// In other words, if GlobalISel is not used and if the query happens after /// the select pass, using getRegClass is safe. const TargetRegisterClass *getRegClassOrNull(Register Reg) const { const RegClassOrRegBank &Val = VRegInfo[Reg].first; diff --git a/llvm/lib/Target/X86/X86FastPreTileConfig.cpp b/llvm/lib/Target/X86/X86FastPreTileConfig.cpp --- a/llvm/lib/Target/X86/X86FastPreTileConfig.cpp +++ b/llvm/lib/Target/X86/X86FastPreTileConfig.cpp @@ -668,7 +668,8 @@ bool HasVirtTileReg = false; for (unsigned I = 0, E = NumVirtRegs; I != E; ++I) { Register VirtReg = Register::index2VirtReg(I); - if (MRI->getRegClass(VirtReg)->getID() == X86::TILERegClassID) { + const TargetRegisterClass *RC = MRI->getRegClassOrNull(VirtReg); + if (RC && RC->getID() == X86::TILERegClassID) { HasVirtTileReg = true; break; } diff --git a/llvm/test/CodeGen/X86/AMX/amx-fastpreconfig-gisel.mir b/llvm/test/CodeGen/X86/AMX/amx-fastpreconfig-gisel.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/AMX/amx-fastpreconfig-gisel.mir @@ -0,0 +1,57 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 +# RUN: llc -mtriple=x86_64-- -run-pass=fastpretileconfig -o - %s | FileCheck %s + +# GlobalIsel doesn't use all virtual registers and there may be virtual +# registers without class. +# Note that %3 doesn't have a class. +--- | + define i64 @f(i64 %0, i64 %1) { + entry: + %2 = lshr i64 %0, %1 + %3 = add i64 %2, 123456789 + ret i64 %3 + } + +... +--- +name: f +legalized: true +regBankSelected: true +selected: true +failedISel: false +tracksRegLiveness: true +registers: + - { id: 0, class: gr64, preferred-register: '' } + - { id: 1, class: gr64_with_sub_8bit, preferred-register: '' } + - { id: 2, class: gr64, preferred-register: '' } + - { id: 3, class: gpr, preferred-register: '' } + - { id: 4, class: gr64, preferred-register: '' } + - { id: 5, class: gr8, preferred-register: '' } +liveins: + - { reg: '$rdi', virtual-reg: '' } + - { reg: '$rsi', virtual-reg: '' } +body: | + bb.1.entry: + liveins: $rdi, $rsi + + ; CHECK-LABEL: name: f + ; CHECK: liveins: $rdi, $rsi + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi + ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_with_sub_8bit = COPY $rsi + ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit + ; CHECK-NEXT: $cl = COPY [[COPY2]] + ; CHECK-NEXT: [[SHR64rCL:%[0-9]+]]:gr64 = SHR64rCL [[COPY]], implicit-def $eflags, implicit $cl + ; CHECK-NEXT: [[ADD64ri32_:%[0-9]+]]:gr64 = ADD64ri32 [[SHR64rCL]], 123456789, implicit-def $eflags + ; CHECK-NEXT: $rax = COPY [[ADD64ri32_]] + ; CHECK-NEXT: RET 0, implicit $rax + %0:gr64 = COPY $rdi + %1:gr64_with_sub_8bit = COPY $rsi + %5:gr8 = COPY %1.sub_8bit + $cl = COPY %5 + %2:gr64 = SHR64rCL %0, implicit-def $eflags, implicit $cl + %4:gr64 = ADD64ri32 %2, 123456789, implicit-def $eflags + $rax = COPY %4 + RET 0, implicit $rax + +...