Index: llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -1407,6 +1407,12 @@ : selectVaStartAAPCS(I, MF, MRI); case TargetOpcode::G_IMPLICIT_DEF: I.setDesc(TII.get(TargetOpcode::IMPLICIT_DEF)); + const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); + const unsigned DstReg = I.getOperand(0).getReg(); + const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); + const TargetRegisterClass *DstRC = + getRegClassForTypeOnBank(DstTy, DstRB, RBI); + RBI.constrainGenericRegister(DstReg, *DstRC, MRI); return true; } Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/select-implicit-def.mir =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/select-implicit-def.mir +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/select-implicit-def.mir @@ -5,6 +5,7 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" define void @implicit_def() { ret void } + define void @implicit_def_copy() { ret void } ... --- @@ -25,3 +26,21 @@ %1(s32) = G_ADD %0, %0 $w0 = COPY %1(s32) ... +--- +name: implicit_def_copy +legalized: true +regBankSelected: true +registers: + - { id: 0, class: gpr } + - { id: 1, class: gpr } + +body: | + bb.0: + ; CHECK-LABEL: name: implicit_def_copy + ; CHECK: [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF + ; CHECK: [[COPY:%[0-9]+]]:gpr32all = COPY [[DEF]] + ; CHECK: %w0 = COPY [[COPY]] + %0(s32) = G_IMPLICIT_DEF + %1(s32) = COPY %0(s32) + %w0 = COPY %1(s32) +...