From b48427578bcd8f54447f85f1d61be7315843c44d Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Tue, 2 Aug 2016 11:41:16 +0000 Subject: [PATCH] [GlobalISel] Don't RegBankSelect target-specific instructions. They don't have types and should be using register classes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277447 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetOpcodes.h | 5 ++++ lib/CodeGen/GlobalISel/RegBankSelect.cpp | 8 ++++++- .../AArch64/GlobalISel/arm64-regbankselect.mir | 27 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/llvm/Target/TargetOpcodes.h b/include/llvm/Target/TargetOpcodes.h index f06af0f0230..33df133a4d5 100644 --- a/include/llvm/Target/TargetOpcodes.h +++ b/include/llvm/Target/TargetOpcodes.h @@ -32,6 +32,11 @@ static inline bool isPreISelGenericOpcode(unsigned Opcode) { return Opcode >= TargetOpcode::PRE_ISEL_GENERIC_OPCODE_START && Opcode <= TargetOpcode::PRE_ISEL_GENERIC_OPCODE_END; } + +/// Check whether the given Opcode is a target-specific opcode. +static inline bool isTargetSpecificOpcode(unsigned Opcode) { + return Opcode > TargetOpcode::PRE_ISEL_GENERIC_OPCODE_END; +} } // end namespace llvm #endif diff --git a/lib/CodeGen/GlobalISel/RegBankSelect.cpp b/lib/CodeGen/GlobalISel/RegBankSelect.cpp index 521bb795682..6248ab46097 100644 --- a/lib/CodeGen/GlobalISel/RegBankSelect.cpp +++ b/lib/CodeGen/GlobalISel/RegBankSelect.cpp @@ -554,7 +554,13 @@ bool RegBankSelect::runOnMachineFunction(MachineFunction &MF) { MII != End;) { // MI might be invalidated by the assignment, so move the // iterator before hand. - assignInstr(*MII++); + MachineInstr &MI = *MII++; + + // Ignore target-specific instructions: they should use proper regclasses. + if (isTargetSpecificOpcode(MI.getOpcode())) + continue; + + assignInstr(MI); } } OptMode = SaveOptMode; diff --git a/test/CodeGen/AArch64/GlobalISel/arm64-regbankselect.mir b/test/CodeGen/AArch64/GlobalISel/arm64-regbankselect.mir index 6eccd085858..76fe671850b 100644 --- a/test/CodeGen/AArch64/GlobalISel/arm64-regbankselect.mir +++ b/test/CodeGen/AArch64/GlobalISel/arm64-regbankselect.mir @@ -54,6 +54,8 @@ entry: ret void } + + define void @ignoreTargetSpecificInst() { ret void } ... --- @@ -327,3 +329,28 @@ body: | %1(64) = COPY %x1 %2(64) = G_OR <2 x s32> %0, %1 ... + +--- +# CHECK-LABEL: name: ignoreTargetSpecificInst +name: ignoreTargetSpecificInst +isSSA: true +# CHECK: registers: +# CHECK-NEXT: - { id: 0, class: gpr64 } +# CHECK-NEXT: - { id: 1, class: gpr64 } +registers: + - { id: 0, class: gpr64 } + - { id: 1, class: gpr64 } +body: | + bb.0: + liveins: %x0 + + ; CHECK: %0 = COPY %x0 + ; CHECK-NEXT: %1 = ADDXrr %0, %0 + ; CHECK-NEXT: %x0 = COPY %1 + ; CHECK-NEXT: RET_ReallyLR implicit %x0 + + %0 = COPY %x0 + %1 = ADDXrr %0, %0 + %x0 = COPY %1 + RET_ReallyLR implicit %x0 +... -- 2.11.0