diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -3986,7 +3986,8 @@ const int OpIndices[] = { Src0Idx, Src1Idx, Src2Idx }; unsigned ConstantBusCount = 0; - unsigned LiteralCount = 0; + bool UsesLiteral = false; + const MachineOperand *LiteralVal = nullptr; if (AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::imm) != -1) ++ConstantBusCount; @@ -4008,8 +4009,15 @@ SGPRsUsed.push_back(SGPRUsed); } } else { - ++ConstantBusCount; - ++LiteralCount; + if (!UsesLiteral) { + ++ConstantBusCount; + UsesLiteral = true; + LiteralVal = &MO; + } else if (!MO.isIdenticalTo(*LiteralVal)) { + assert(isVOP3(MI)); + ErrInfo = "VOP3 instruction uses more than one literal"; + return false; + } } } } @@ -4033,15 +4041,9 @@ return false; } - if (isVOP3(MI) && LiteralCount) { - if (!ST.hasVOP3Literal()) { - ErrInfo = "VOP3 instruction uses literal"; - return false; - } - if (LiteralCount > 1) { - ErrInfo = "VOP3 instruction uses more than one literal"; - return false; - } + if (isVOP3(MI) && UsesLiteral && !ST.hasVOP3Literal()) { + ErrInfo = "VOP3 instruction uses literal"; + return false; } } diff --git a/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir b/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir @@ -0,0 +1,28 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass machineverifier -o - %s | FileCheck %s + +# Two uses of the same literal only count as one use of the constant bus. + +--- +name: use_duplicate_literal_cndmask +tracksRegLiveness: true +body: | + bb.0: + liveins: $vcc_lo + ; CHECK-LABEL: name: use_duplicate_literal_cndmask + ; CHECK: liveins: $vcc_lo + ; CHECK: $vgpr0 = V_CNDMASK_B32_e64 0, 1234567, 0, 1234567, killed $vcc_lo, implicit $exec + $vgpr0 = V_CNDMASK_B32_e64 0, 1234567, 0, 1234567, killed $vcc_lo, implicit $exec +... + +--- +name: use_duplicate_literal_fma +tracksRegLiveness: true +body: | + bb.0: + liveins: $vgpr0 + ; CHECK-LABEL: name: use_duplicate_literal_fma + ; CHECK: liveins: $vgpr0 + ; CHECK: $vgpr0 = V_FMA_F32_e64 0, $vgpr0, 0, 1077936128, 0, 1077936128, 0, 0, implicit $mode, implicit $exec + $vgpr0 = V_FMA_F32_e64 0, $vgpr0, 0, 1077936128, 0, 1077936128, 0, 0, implicit $mode, implicit $exec +...