From ec8c61efdf9537c16f7f70a1cf6e8018b1d9c664 Mon Sep 17 00:00:00 2001 From: Jay Foad Date: Thu, 8 Apr 2021 12:58:49 +0100 Subject: [PATCH] [AMDGPU] Allow multiple uses of the same literal In GFX10 VOP3 can have a literal, which opens up the possibility of two operands using the same literal value, which is allowed and only counts as one use of the constant bus. AMDGPUAsmParser::validateConstantBusLimitations already knew about this but SIInstrInfo::verifyInstruction did not. Differential Revision: https://reviews.llvm.org/D100770 --- llvm/lib/Target/AMDGPU/SIInstrInfo.cpp | 26 ++++++++++---------- .../CodeGen/AMDGPU/verify-duplicate-literal.mir | 28 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 llvm/test/CodeGen/AMDGPU/verify-duplicate-literal.mir diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp index b7f4505..2ba4e9b 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -3986,7 +3986,8 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI, 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 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI, 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 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr &MI, 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 index 0000000..a6b6a01 --- /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 +... -- 2.7.4