Index: lib/CodeGen/SelectionDAG/InstrEmitter.cpp =================================================================== --- lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -394,11 +394,26 @@ } else if (ConstantFPSDNode *F = dyn_cast(Op)) { MIB.addFPImm(F->getConstantFPValue()); } else if (RegisterSDNode *R = dyn_cast(Op)) { + unsigned VReg = R->getReg(); + MVT OpVT = Op.getSimpleValueType(); + const TargetRegisterClass *OpRC = + TLI->isTypeLegal(OpVT) ? TLI->getRegClassFor(OpVT) : nullptr; + const TargetRegisterClass *IIRC = + II ? TRI->getAllocatableClass(TII->getRegClass(*II, IIOpNum, TRI, *MF)) + : nullptr; + + if (OpRC && IIRC && OpRC != IIRC && + TargetRegisterInfo::isVirtualRegister(VReg)) { + unsigned NewVReg = MRI->createVirtualRegister(IIRC); + BuildMI(*MBB, InsertPos, Op.getNode()->getDebugLoc(), + TII->get(TargetOpcode::COPY), NewVReg).addReg(VReg); + VReg = NewVReg; + } // Turn additional physreg operands into implicit uses on non-variadic // instructions. This is used by call and return instructions passing // arguments in registers. bool Imp = II && (IIOpNum >= II->getNumOperands() && !II->isVariadic()); - MIB.addReg(R->getReg(), getImplRegState(Imp)); + MIB.addReg(VReg, getImplRegState(Imp)); } else if (RegisterMaskSDNode *RM = dyn_cast(Op)) { MIB.addRegMask(RM->getRegMask()); } else if (GlobalAddressSDNode *TGA = dyn_cast(Op)) { Index: test/CodeGen/AMDGPU/r600.work-item-intrinsics.ll =================================================================== --- test/CodeGen/AMDGPU/r600.work-item-intrinsics.ll +++ test/CodeGen/AMDGPU/r600.work-item-intrinsics.ll @@ -10,7 +10,8 @@ } ; FUNC-LABEL: {{^}}tgid_y: -; EG: MEM_RAT_CACHELESS STORE_RAW T1.Y +; EG: MEM_RAT_CACHELESS STORE_RAW [[REG:T[0-9]+]].X +; EG: MOV [[REG]].X, T1.Y define amdgpu_kernel void @tgid_y(i32 addrspace(1)* %out) { entry: %0 = call i32 @llvm.r600.read.tgid.y() #0 @@ -19,7 +20,8 @@ } ; FUNC-LABEL: {{^}}tgid_z: -; EG: MEM_RAT_CACHELESS STORE_RAW T1.Z +; EG: MEM_RAT_CACHELESS STORE_RAW [[REG:T[0-9]+]].X +; EG: MOV [[REG]].X, T1.Z define amdgpu_kernel void @tgid_z(i32 addrspace(1)* %out) { entry: %0 = call i32 @llvm.r600.read.tgid.z() #0 @@ -37,7 +39,8 @@ } ; FUNC-LABEL: {{^}}tidig_y: -; EG: MEM_RAT_CACHELESS STORE_RAW T0.Y +; EG: MEM_RAT_CACHELESS STORE_RAW [[REG:T[0-9]+]].X +; EG: MOV [[REG]].X, T0.Y define amdgpu_kernel void @tidig_y(i32 addrspace(1)* %out) { entry: %0 = call i32 @llvm.r600.read.tidig.y() #0 @@ -46,7 +49,8 @@ } ; FUNC-LABEL: {{^}}tidig_z: -; EG: MEM_RAT_CACHELESS STORE_RAW T0.Z +; EG: MEM_RAT_CACHELESS STORE_RAW [[REG:T[0-9]+]].X +; EG: MOV [[REG]].X, T0.Z define amdgpu_kernel void @tidig_z(i32 addrspace(1)* %out) { entry: %0 = call i32 @llvm.r600.read.tidig.z() #0 Index: test/CodeGen/Mips/tailcall/tailcall.ll =================================================================== --- test/CodeGen/Mips/tailcall/tailcall.ll +++ test/CodeGen/Mips/tailcall/tailcall.ll @@ -10,23 +10,23 @@ ; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | \ ; RUN: FileCheck %s -check-prefixes=ALL,PIC16 -; RUN: llc -march=mipsel -relocation-model=pic -mattr=+micromips -mips-tail-calls=1 < %s | \ -; RUN: FileCheck %s -check-prefixes=ALL,PIC32MM -; RUN: llc -march=mipsel -relocation-model=static -mattr=+micromips \ +; RUN: llc -march=mipsel -relocation-model=pic -mattr=+micromips -verify-machineinstrs \ +; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32MM +; RUN: llc -march=mipsel -relocation-model=static -mattr=+micromips -verify-machineinstrs \ ; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32 -; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mips-tail-calls=1 < %s | \ -; RUN: FileCheck %s -check-prefixes=ALL,PIC32R6 -; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r2 \ +; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -verify-machineinstrs \ +; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32R6 +; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r2 -verify-machineinstrs \ ; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32 -; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r2 \ +; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r2 -verify-machineinstrs \ ; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=PIC64 -; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r6 \ +; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r6 -verify-machineinstrs \ ; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC64 -; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mattr=+micromips \ +; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mattr=+micromips -verify-machineinstrs \ ; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32MM -; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \ +; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 -verify-machineinstrs \ ; RUN: -mattr=+micromips -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32MMR6 @g0 = common global i32 0, align 4