Index: llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp =================================================================== --- llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp +++ llvm/trunk/lib/Target/AMDGPU/SIFoldOperands.cpp @@ -178,7 +178,7 @@ if (!(Fold.ImmToFold & 0xffff)) { Mod.setImm(Mod.getImm() | SISrcMods::OP_SEL_0); Mod.setImm(Mod.getImm() & ~SISrcMods::OP_SEL_1); - Old.ChangeToImmediate(Fold.ImmToFold >> 16); + Old.ChangeToImmediate((Fold.ImmToFold >> 16) & 0xffff); return true; } Mod.setImm(Mod.getImm() & ~SISrcMods::OP_SEL_1); Index: llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.cpp =================================================================== --- llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.cpp +++ llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -2725,6 +2725,7 @@ const int OpIndices[] = { Src0Idx, Src1Idx, Src2Idx }; unsigned ConstantBusCount = 0; + unsigned LiteralCount = 0; if (AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::imm) != -1) ++ConstantBusCount; @@ -2744,6 +2745,7 @@ SGPRUsed = MO.getReg(); } else { ++ConstantBusCount; + ++LiteralCount; } } } @@ -2751,6 +2753,11 @@ ErrInfo = "VOP* instruction uses the constant bus more than once"; return false; } + + if (isVOP3(MI) && LiteralCount) { + ErrInfo = "VOP3 instruction uses literal"; + return false; + } } // Verify misc. restrictions on specific instructions. Index: llvm/trunk/test/CodeGen/AMDGPU/pk_max_f16_literal.ll =================================================================== --- llvm/trunk/test/CodeGen/AMDGPU/pk_max_f16_literal.ll +++ llvm/trunk/test/CodeGen/AMDGPU/pk_max_f16_literal.ll @@ -40,7 +40,7 @@ } ; GCN-LABEL: {{^}}test_pk_max_f16_literal_0_m1: -; GFX9: v_pk_max_f16 v{{[0-9]+}}, -1.0, v{{[0-9]+}} op_sel:[1,0] op_sel_hi:[0,1]{{$}} +; GFX9: v_pk_max_f16 v{{[0-9]+}}, v{{[0-9]+}}, -1.0 op_sel:[0,1] op_sel_hi:[1,0]{{$}} define amdgpu_kernel void @test_pk_max_f16_literal_0_m1(<2 x half> addrspace(1)* nocapture %arg) { bb: %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()